UMIhelp

Разработка дополнительного функционала => Custom макросы => Тема начата: albion от 14 Марта 2013, 17:00:17

Название: Custom выполняется в 2 раза больше раз
Отправлено: 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 выполняться только один раз?
Название: Re:Custom выполняется в 2 раза больше раз
Отправлено: Rodogor от 14 Марта 2013, 17:18:21
Ну тут вопрос скорее не по разработке кастома, а по формированию шаблона.
Надо смотреть то место, в котором вызывается кастом и смотреть сколько раз оно выполняется. Если выложите весь код, будет явно проще что-то подсказать
Название: Re:Custom выполняется в 2 раза больше раз
Отправлено: albion от 14 Марта 2013, 17:29:16
Показать объект каталога: %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;
Название: Re:Custom выполняется в 2 раза больше раз
Отправлено: albion от 14 Марта 2013, 17:40:11
Сразу оговорюсь по коду: %link% - не работает, а %varchar% это 3 поле составного списка (как его добавить описано в Wiki).
Название: Re:Custom выполняется в 2 раза больше раз
Отправлено: albion от 15 Марта 2013, 10:16:12
На сколько понял, никто не знает по какой причине такое происходит. Поставил более старую версию CMS и этой ошибки нет. Походу это глюк последней версии UMI-CMS
Название: Re:Custom выполняется в 2 раза больше раз
Отправлено: admin от 15 Марта 2013, 14:22:08
причина очень простая, вы вызываете макрос в блоке который выводит каждую опцию в вашем составном моле, вот она и выполняется несколько раз...

по поводу
 
Сразу оговорюсь по коду: %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% там, где вы работаете. Он покажет что вообще вы можете вывести в данном блоке (заодно и значение в текущей ситуации этих блоков покажет)
Название: Re:Custom выполняется в 2 раза больше раз
Отправлено: albion от 15 Марта 2013, 14:39:50
причина очень простая, вы вызываете макрос в блоке который выводит каждую опцию в вашем составном моле, вот она и выполняется несколько раз...

по поводу
 
Сразу оговорюсь по коду: %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% - знаю.
Название: Re:Custom выполняется в 2 раза больше раз
Отправлено: admin от 15 Марта 2013, 14:46:57
хм... с кодом странно получается, тогда я бы смотрел либо на сам код (хотя пока не могу представить как он может заставить себя выполняться повторно), либо в сторону tpl шаблонизатора, предположу... очень приблизительно конечно, что возможно он умудряется вызывать макрос находясь на разных уровнях обработки блоков tpl шаблона....

P.S.
Цитировать
%element-link% еще не ввели
если, есть возможность загляните в код системы, в файл /classes/modules/data/class.php , в функцию private function renderOptioned . Скорее всего, там сразу будет видно что функция отдает и что из этого ссылка на страницу.
Название: Re:Custom выполняется в 2 раза больше раз
Отправлено: Vladimir от 15 Марта 2013, 15:04:01
Возможно, это и ошибка или фича, например, два раза прогоняется шаблонизатор. Но а вам-то это должно быть все равно (исключая нагрузку на БД), вы же в любом случае для одной строки получаете одно значение, второе перезапишет первое. Не так?
Название: Re:Custom выполняется в 2 раза больше раз
Отправлено: Vladimir от 15 Марта 2013, 15:06:14
Кстати, в отношении повторного исполнения кода...  Была на 2.7 ситуация, когда у меня дважды подряд выполнялась команда exit("!");  Даже юмисофтам писал. Никто не понял почему. Перестановка вылечила.
Название: Re:Custom выполняется в 2 раза больше раз
Отправлено: albion от 15 Марта 2013, 15:06:30
хм... с кодом странно получается, тогда я бы смотрел либо на сам код (хотя пока не могу представить как он может заставить себя выполняться повторно), либо в сторону tpl шаблонизатора, предположу... очень приблизительно конечно, что возможно он умудряется вызывать макрос находясь на разных уровнях обработки блоков tpl шаблона....
Возможно. Но один факт точно есть - как только с версии 2.8.6.1 перешел на 2.8.5 все сработало корректно, а именно сколько опций, столько раз и выполнился custom.
если, есть возможность загляните в код системы, в файл /classes/modules/data/class.php , в функцию private function renderOptioned . Скорее всего, там сразу будет видно что функция отдает и что из этого ссылка на страницу.
Я сделал проще - просто вставил этот макрос в шаблон, и увидел что этот макрос не обрабатывается и выводится на страницу просто %element-link%. Тоже самое и с %element-id%, и с %element-name%.

Похоже, что в будущих обновлениях системы в качестве опций будет не только выпадающий список, но и ссылка на дерево.
Название: Re:Custom выполняется в 2 раза больше раз
Отправлено: albion от 15 Марта 2013, 15:08:28
Возможно, это и ошибка или фича, например, два раза прогоняется шаблонизатор. Но а вам-то это должно быть все равно (исключая нагрузку на БД), вы же в любом случае для одной строки получаете одно значение, второе перезапишет первое. Не так?

Нет, не так. Каждый подсчет заносится в массив, после необходим вывести сумму всех элементов массива, а если этих элементов там в 2 раза больше, то и итоговая сумма получится в 2 раза больше.
Название: Re:Custom выполняется в 2 раза больше раз
Отправлено: Vladimir от 15 Марта 2013, 15:12:26
а, в реальности в этой функции есть и другие действия? Хорошо... тогда если заносить сумму в массив с ключом от id объекта или опции. Одноименные ключи перезапишутся.
Название: Re:Custom выполняется в 2 раза больше раз
Отправлено: albion от 15 Марта 2013, 15:18:47
а, в реальности в этой функции есть и другие действия? Хорошо... тогда если заносить сумму в массив с ключом от id объекта или опции. Одноименные ключи перезапишутся.
А об этом не подумал :( Спасибо. на будущее запомню. Да и действий там будет полно, включая действия связанные с переменными переданными через $_GET или $_POST (пока не решил) :) .