Не зарегистрирован
Вход
Забыли пароль?
Регистрация
Подписаться
Сэкономьте время — перед вопросом на форуме узнайте, как найти ответ быстрее
По техническим проблемам необходимо обращаться в Консультационный центр

Поиск по форуму: 

Приглашаем в блог Amiro.CMS. Регулярные обзоры, опыт, решения, практикумы.

Форум  ->   Разработка плагинов, вопросы по API  ->  Вызвать модуль в PHP или шаблона другого модуля

Раздел для разработчиков. Обсуждение создания плагинов, вопросы и пожелания по API Amiro.CMS

Добавлено: 16.07.14 22:40:48 #1



Регистрация: 10.06.14
Сообщений: 35


Обратиться по имени

Добрый вечер, наверное это простой вопрос но что-то я не могу по нему найти информации, я хочу вызвать собственный модуль в шаблоне другого. Пока что единственный способ который нашел это подключить в шаблон php файл или (что удобнее и я сделал сейчас), вызвать функцию из common_functions. В вызываемой функции я знаю как получить свою модель через AMI::getResourceModel, но наверное можно и весь модуль вызвать, не дублировать же код. Или может как-то напрямую в шаблоне вызвать можно. Подскажите пожалуйста как лучше можно сделать.



Добавлено: 17.07.14 09:25:00 #2

Амиро



Регистрация: 21.03.07
Сообщений: 258


Обратиться по имени

Если имеется в виду общедоступная часть сайта, то используйте спецблок модуля, спецблоки предназначены именно для этого.



Добавлено: 17.07.14 12:22:15 #3



Регистрация: 10.06.14
Сообщений: 35


Обратиться по имени

Имеется в виду шаблон другого модуля, конкретно я сейчас хочу вставить в шаблон модуля вывода справочников eshop_reference.tpl список категорий, у меня уже есть модуль который выводит такой список, фильтруя по выбираемых в опциях дополнительному полю и его значению.
<!--#set var="item_details" value="
<TR>
	<TD>
		##name##
		##fdate##
		##value##
		##description##
		##search_links_list##
        ##setvar @test=get_categories_by_size(value_1)##
        ##test##
        ##spec_small_inst_list_ref_005002117##
		<br><br>
		<a href="##script_link##?offset=##offset##">%%back_to_list%%</a>
	</TD>
</TR>
"-->

Я попробовал вставить сюда код спецблока с одной из страниц, но он не отображается. Функция выше отлично работает, но в ней я только могу обратиться к модели с помощью AMI::getResourceModel, я не знаю как и возможно ли обратиться к контроллеру (к AmiClean_FldConf_ItemsViewFrn->get()), чтобы не дублировать в функции его код.



Добавлено: 17.07.14 13:44:35 #4

Амиро



Регистрация: 21.03.07
Сообщений: 258


Обратиться по имени

Выведите спецблок в другом месте, потом средствами client-side (JavaScrip) модифицируйте DOM, переставьте спецблок в другое место.



Добавлено: 17.07.14 17:03:24 #5



Регистрация: 10.06.14
Сообщений: 35


Обратиться по имени

Не получиться, я его вывожу на странице описания значения справочника, а эта страница генерируется не через менеджер сайта, а модулем справочника. Можно было бы послать ajax-запрос на страницу с собственным модулем, но вызов функции удобнее, я немного переформатировал свой модуль, там теперь почти все в модели, так что в принципе весь модуль вызывать и не нужно.
Но неужели в Амиро вне менеджера сайта нет возможности подключить модуль полностью, как например в Битриксе IncludeComponent?



Добавлено: 17.07.14 20:35:59 #6



Регистрация: 10.06.14
Сообщений: 35


Обратиться по имени

Разобрался наконец, конечно же можно . AMI::getResource может получить объект класса и соответственно методы любого модуля (ну так показалось по крайней мере). В моем случае мне нужно было получить объект класса AmiClean_FldConf_ItemsViewFrn, где FldConf - это название моей конфигурации, которая задавалась в генераторе решений, id моего модуля inst_fld_desc_cat, ресурс я получил указав
AMI::getResource('inst_fld_desc_cat/items/view/frn')

собственно весь код вызова модуля:
    $modId='inst_fld_desc_cat';
    AMI::setOption($modId,'field','size');
    AMI::setOption($modId,'field_value',$size_value);
    $controller=AMI::getResource($modId.'/items/view/frn');
    $html=$controller->get();

собственно все просто - сначала устанавливаются опции, потом получается объект и вызывается его нужный метод.
Я сначала попробовал установить настройки модуля через декларатор
$declarator=AMI_ModDeclarator::getInstance();
    $module_instance=$declarator->getModule('inst_fld_desc_cat');
    $module_instance->setOption('field','size');
    $module_instance->setOption('field_value',$size_value);

но почему-то это не срабатывает, хотя в принципе о деклараторе маловато написано и не понятно как он работает, но в процессе поиска решения я наткнулся на возможно старые советы по работе с ним, в которых все методы вызываются статически, в то время как у меня в системе у декларатора статический только getInstance, который и возвращает объект для работы с остальными, поэтому AMI_ModDeclarator::getRegistered() выдаст ошибку, нужно использовать
$declarator=AMI_ModDeclarator::getInstance();
$module_instance=$declarator->getRegistered();

А в апи http://manual.amiro.ru/docs/api6/Module/AMI_ModDeclarator.html getInstance не указан.



Добавлено: 17.07.14 21:00:32 #7



Регистрация: 10.06.14
Сообщений: 35


Обратиться по имени

А, теперь понял, декларатор задает набор настроек и правил для модуля а не хранит их значения, в
    $module_instance->setOption('field','size');
    $module_instance->setOption('field_value',$size_value);
я по сути переобъявлял набор настроек и их дефолтное значение.



Добавлено: 18.07.14 08:42:59 #8

Амиро



Регистрация: 21.03.07
Сообщений: 258


Обратиться по имени

Dmay,
1. опишите задачу, AMI_ModDeclarator не нужно использовать для изменения параметров модуля в run-time;
2. отсутствие AMI_ModDeclarator::getInstance() в документации исправим.



Добавлено: 18.07.14 12:11:44 #9



Регистрация: 10.06.14
Сообщений: 35


Обратиться по имени

Антон:
1. опишите задачу, AMI_ModDeclarator не нужно использовать для изменения параметров модуля в run-time;
Да, это была ошибка, я уже понял что делал неправильно.
Dmay:
я по сути переобъявлял набор настроек и их дефолтное значение.
А AMI::setOption как раз задает параметры для текущего вызова. Задача уже решена, я просто поделился описанием.



Добавлено: 31.07.14 22:11:00 #10



Регистрация: 10.06.14
Сообщений: 35


Обратиться по имени

Скажите пожалуйста еще, можно ли точно так же обратиться к нужному модулю через js API ваше, а именно послать туда ajax-запрос одному из классов. Вот для примера сейчас использую для приема формы:
<?php 
require('ami_env.php');
$resume_controller=AMI::getResource('inst_resume/items/frn');
echo $resume_controller->receive_form();
?>

Метод уже там разбирается - проверяет запрос, пишет данные и отправляет ответ. Но у меня уже несколько модулей, для которых принимается ajax, и надо бы не плодить файлы-получатели. Но по js апи кроме общей информации не нашел особо ничего, попробовал вызвать AMI.Module, но что-то он не подключен, его надо отдельно подключать?



Добавлено: 01.08.14 12:25:48 #11

Амиро



Регистрация: 29.04.11
Сообщений: 13


Обратиться по имени

Какого-то специализированного JS API для работы с данными модулей посредством AJAX на данный момент нет. Класс AMI.Module так же для этого не предназначен.

Возможно, в вашем случае удобнее будет использовать механизм веб-сервисов:
http://manual.amiro.ru/api/introduction/moduli-amirocms/veb-servisy/

В этом примере есть пример обращения к сервису с использованием jQuery:
http://manual.amiro.ru/api/introduction/distribjucija/primery-distributivov/specblok-kto-sejchas-na-sajte/





Создать новую тему

Всего тем: 6587
Всего сообщений: 27636
Всего зарегистрированных пользователей: 47877
Последний зарегистрированный пользователь: user5302684462