UMIhelp
Разработка дополнительного функционала => Custom макросы => Тема начата: albion от 14 Марта 2013, 17:00:17
-
:o Интересная ситуация происходит. Необходимо сформировать смету на основе товаров в каталоге. Все товары имеют один шаблон данных, который так же является справочником.
Данный справочник подключается через составное поле другого шаблона, по которому и происходит формирование сметы. Т.е. при редактирование страницы из выпадающего списка выбирается товар и в соседнее поле вставляется количество, которое в последствии через Custom перемножается с ценой товара.
Кастом вызывается следующим образом: %custom summ(%price%, %float%)%
Сама функция (упрощенно) выглядит так:
public function summ($price, $colichestvo) {
$summa=$price*$colichestvo;
echo "Сумма: $summa<br>"; /*проверочная запись*/
return "$summa";
}
При редактировании сметы выбрал 3 товара, и открыл страницу со сметой. В итоге все посчиталось нормально, но строка echo "Сумма: $summa<br>"; выполнилась 6 раз, что никуда не годится, т.к. в последствии необходима итоговая сумма, а она получается в 2 раза больше.
Как заставить custom выполняться только один раз?
-
Ну тут вопрос скорее не по разработке кастома, а по формированию шаблона.
Надо смотреть то место, в котором вызывается кастом и смотреть сколько раз оно выполняется. Если выложите весь код, будет явно проще что-то подсказать
-
Показать объект каталога: %catalog viewObject(%id%, 'default')% (больше никакого кода в шаблоне нет).
/tpls/catalog/default.tpl
$FORMS = Array();
$FORMS['view_block'] = <<<END
<table>
<tr>
<td>№</td>
<td>Наименование</td>
<td>Ед. Изм.</td>
<td>Цена</td>
<td>Количество</td>
<td>Сумма</td>
</tr>
%data getProperty(%id%, 'oborudovanie', 'default-data')%
</table>
END;
Ну и файл default-data из папки /tpls/data/:
$FORMS = Array();
/* Опциональные свойства */
$FORMS['optioned_block'] = <<<END
%items%
END;
$FORMS['optioned_item'] = <<<END
<tr>
<td>%object-id%</td>
<td><a href="%link%">%object-name%</a></td>
<td>%varchar%</td>
<td>%price%</td>
<td>%float%</td>
<td>%custom summ(%price%, %float%)%</td>
</tr>
END;
-
Сразу оговорюсь по коду: %link% - не работает, а %varchar% это 3 поле составного списка (как его добавить описано в Wiki).
-
На сколько понял, никто не знает по какой причине такое происходит. Поставил более старую версию CMS и этой ошибки нет. Походу это глюк последней версии UMI-CMS
-
причина очень простая, вы вызываете макрос в блоке который выводит каждую опцию в вашем составном моле, вот она и выполняется несколько раз...
по поводу
Сразу оговорюсь по коду: %link% - не работает, а %varchar% это 3 поле составного списка (как его добавить описано в Wiki).
то загляните в документацию, например макроса data getProperty (http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/shablony_dannyh/data_getproperty/) dj вкладку с описанием блоков для tpl шаблонов и там %link% нет, есть %element-link% и т.д.
а вообще, если не выводиться какой-то минимакрос типа %link%, то вы всегда можете вставить %scope% там, где вы работаете. Он покажет что вообще вы можете вывести в данном блоке (заодно и значение в текущей ситуации этих блоков покажет)
-
причина очень простая, вы вызываете макрос в блоке который выводит каждую опцию в вашем составном моле, вот она и выполняется несколько раз...
по поводу
Сразу оговорюсь по коду: %link% - не работает, а %varchar% это 3 поле составного списка (как его добавить описано в Wiki).
то загляните в документацию, например макроса data getProperty (http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/shablony_dannyh/data_getproperty/) dj вкладку с описанием блоков для tpl шаблонов и там %link% нет, есть %element-link% и т.д.
а вообще, если не выводиться какой-то минимакрос типа %link%, то вы всегда можете вставить %scope% там, где вы работаете. Он покажет что вообще вы можете вывести в данном блоке (заодно и значение в текущей ситуации этих блоков покажет)
Это понятно, что выполняется несколько раз. Вот только есть 3 опции, а выполняется 6 раз. Причем идет своего рода цикл, сначала посчитал первую опцию, потом вторую и третью, и на этом в принципе должен остановиться, но скрипт заново начинает считать первую, вторую и третью опцию.
А по поводу %link% вы мне ответили в соседней ветке. По поводу %element-link% - походу этот макрос ввели в документацию, но реализации его еще в UMI нет.
По поводу %Scope% - знаю.
-
хм... с кодом странно получается, тогда я бы смотрел либо на сам код (хотя пока не могу представить как он может заставить себя выполняться повторно), либо в сторону tpl шаблонизатора, предположу... очень приблизительно конечно, что возможно он умудряется вызывать макрос находясь на разных уровнях обработки блоков tpl шаблона....
P.S. %element-link% еще не ввели
если, есть возможность загляните в код системы, в файл /classes/modules/data/class.php , в функцию private function renderOptioned . Скорее всего, там сразу будет видно что функция отдает и что из этого ссылка на страницу.
-
Возможно, это и ошибка или фича, например, два раза прогоняется шаблонизатор. Но а вам-то это должно быть все равно (исключая нагрузку на БД), вы же в любом случае для одной строки получаете одно значение, второе перезапишет первое. Не так?
-
Кстати, в отношении повторного исполнения кода... Была на 2.7 ситуация, когда у меня дважды подряд выполнялась команда exit("!"); Даже юмисофтам писал. Никто не понял почему. Перестановка вылечила.
-
хм... с кодом странно получается, тогда я бы смотрел либо на сам код (хотя пока не могу представить как он может заставить себя выполняться повторно), либо в сторону tpl шаблонизатора, предположу... очень приблизительно конечно, что возможно он умудряется вызывать макрос находясь на разных уровнях обработки блоков tpl шаблона....
Возможно. Но один факт точно есть - как только с версии 2.8.6.1 перешел на 2.8.5 все сработало корректно, а именно сколько опций, столько раз и выполнился custom.
если, есть возможность загляните в код системы, в файл /classes/modules/data/class.php , в функцию private function renderOptioned . Скорее всего, там сразу будет видно что функция отдает и что из этого ссылка на страницу.
Я сделал проще - просто вставил этот макрос в шаблон, и увидел что этот макрос не обрабатывается и выводится на страницу просто %element-link%. Тоже самое и с %element-id%, и с %element-name%.
Похоже, что в будущих обновлениях системы в качестве опций будет не только выпадающий список, но и ссылка на дерево.
-
Возможно, это и ошибка или фича, например, два раза прогоняется шаблонизатор. Но а вам-то это должно быть все равно (исключая нагрузку на БД), вы же в любом случае для одной строки получаете одно значение, второе перезапишет первое. Не так?
Нет, не так. Каждый подсчет заносится в массив, после необходим вывести сумму всех элементов массива, а если этих элементов там в 2 раза больше, то и итоговая сумма получится в 2 раза больше.
-
а, в реальности в этой функции есть и другие действия? Хорошо... тогда если заносить сумму в массив с ключом от id объекта или опции. Одноименные ключи перезапишутся.
-
а, в реальности в этой функции есть и другие действия? Хорошо... тогда если заносить сумму в массив с ключом от id объекта или опции. Одноименные ключи перезапишутся.
А об этом не подумал :( Спасибо. на будущее запомню. Да и действий там будет полно, включая действия связанные с переменными переданными через $_GET или $_POST (пока не решил) :) .