Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
Как создать избранное средствами tpl + custom?

Автор goodprofyРаздел Custom макросы

Ответов: 3
Просмотров: 2413
Последний ответ 16 Июня 2013, 02:17:18
от admin
umiMail не работает в custom макросах

Автор htmllancerРаздел Custom макросы

Ответов: 5
Просмотров: 2604
Последний ответ 28 Марта 2017, 17:26:05
от htmllancer
permissions.custom.php

Автор albionРаздел Custom макросы

Ответов: 1
Просмотров: 3089
Последний ответ 31 Января 2013, 11:34:47
от albion

0 Пользователей и 1 Гость просматривают эту тему.

*

albion

  • ***
  • 109
  • +3/-0
    • Просмотр профиля
    • Веб-Админ
 :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 выполняться только один раз?

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Custom выполняется в 2 раза больше раз
« Ответ #1 : 14 Марта 2013, 17:18:21 »
Ну тут вопрос скорее не по разработке кастома, а по формированию шаблона.
Надо смотреть то место, в котором вызывается кастом и смотреть сколько раз оно выполняется. Если выложите весь код, будет явно проще что-то подсказать

*

albion

  • ***
  • 109
  • +3/-0
    • Просмотр профиля
    • Веб-Админ
Re:Custom выполняется в 2 раза больше раз
« Ответ #2 : 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;

*

albion

  • ***
  • 109
  • +3/-0
    • Просмотр профиля
    • Веб-Админ
Re:Custom выполняется в 2 раза больше раз
« Ответ #3 : 14 Марта 2013, 17:40:11 »
Сразу оговорюсь по коду: %link% - не работает, а %varchar% это 3 поле составного списка (как его добавить описано в Wiki).

*

albion

  • ***
  • 109
  • +3/-0
    • Просмотр профиля
    • Веб-Админ
Re:Custom выполняется в 2 раза больше раз
« Ответ #4 : 15 Марта 2013, 10:16:12 »
На сколько понял, никто не знает по какой причине такое происходит. Поставил более старую версию CMS и этой ошибки нет. Походу это глюк последней версии UMI-CMS

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Custom выполняется в 2 раза больше раз
« Ответ #5 : 15 Марта 2013, 14:22:08 »
причина очень простая, вы вызываете макрос в блоке который выводит каждую опцию в вашем составном моле, вот она и выполняется несколько раз...

по поводу
 
Сразу оговорюсь по коду: %link% - не работает, а %varchar% это 3 поле составного списка (как его добавить описано в Wiki).

то загляните в документацию, например макроса data getProperty dj вкладку с описанием блоков для tpl шаблонов и там  %link% нет, есть %element-link% и т.д.

а вообще, если не выводиться какой-то минимакрос типа %link%, то вы всегда можете вставить %scope% там, где вы работаете. Он покажет что вообще вы можете вывести в данном блоке (заодно и значение в текущей ситуации этих блоков покажет)

*

albion

  • ***
  • 109
  • +3/-0
    • Просмотр профиля
    • Веб-Админ
Re:Custom выполняется в 2 раза больше раз
« Ответ #6 : 15 Марта 2013, 14:39:50 »
причина очень простая, вы вызываете макрос в блоке который выводит каждую опцию в вашем составном моле, вот она и выполняется несколько раз...

по поводу
 
Сразу оговорюсь по коду: %link% - не работает, а %varchar% это 3 поле составного списка (как его добавить описано в Wiki).

то загляните в документацию, например макроса data getProperty dj вкладку с описанием блоков для tpl шаблонов и там  %link% нет, есть %element-link% и т.д.

а вообще, если не выводиться какой-то минимакрос типа %link%, то вы всегда можете вставить %scope% там, где вы работаете. Он покажет что вообще вы можете вывести в данном блоке (заодно и значение в текущей ситуации этих блоков покажет)

Это понятно, что выполняется несколько раз. Вот только есть 3 опции, а выполняется 6 раз. Причем идет своего рода цикл, сначала посчитал первую опцию, потом вторую и третью, и на этом в принципе должен остановиться, но скрипт заново начинает считать первую, вторую и третью опцию.

А по поводу %link% вы мне ответили в соседней ветке. По поводу %element-link% - походу этот макрос ввели в документацию, но реализации его еще в UMI нет.

По поводу %Scope% - знаю.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Custom выполняется в 2 раза больше раз
« Ответ #7 : 15 Марта 2013, 14:46:57 »
хм... с кодом странно получается, тогда я бы смотрел либо на сам код (хотя пока не могу представить как он может заставить себя выполняться повторно), либо в сторону tpl шаблонизатора, предположу... очень приблизительно конечно, что возможно он умудряется вызывать макрос находясь на разных уровнях обработки блоков tpl шаблона....

P.S.
Цитировать
%element-link% еще не ввели
если, есть возможность загляните в код системы, в файл /classes/modules/data/class.php , в функцию private function renderOptioned . Скорее всего, там сразу будет видно что функция отдает и что из этого ссылка на страницу.

*

Vladimir

  • ****
  • 279
  • +48/-0
    • Просмотр профиля
Re:Custom выполняется в 2 раза больше раз
« Ответ #8 : 15 Марта 2013, 15:04:01 »
Возможно, это и ошибка или фича, например, два раза прогоняется шаблонизатор. Но а вам-то это должно быть все равно (исключая нагрузку на БД), вы же в любом случае для одной строки получаете одно значение, второе перезапишет первое. Не так?

*

Vladimir

  • ****
  • 279
  • +48/-0
    • Просмотр профиля
Re:Custom выполняется в 2 раза больше раз
« Ответ #9 : 15 Марта 2013, 15:06:14 »
Кстати, в отношении повторного исполнения кода...  Была на 2.7 ситуация, когда у меня дважды подряд выполнялась команда exit("!");  Даже юмисофтам писал. Никто не понял почему. Перестановка вылечила.

*

albion

  • ***
  • 109
  • +3/-0
    • Просмотр профиля
    • Веб-Админ
Re:Custom выполняется в 2 раза больше раз
« Ответ #10 : 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%.

Похоже, что в будущих обновлениях системы в качестве опций будет не только выпадающий список, но и ссылка на дерево.

*

albion

  • ***
  • 109
  • +3/-0
    • Просмотр профиля
    • Веб-Админ
Re:Custom выполняется в 2 раза больше раз
« Ответ #11 : 15 Марта 2013, 15:08:28 »
Возможно, это и ошибка или фича, например, два раза прогоняется шаблонизатор. Но а вам-то это должно быть все равно (исключая нагрузку на БД), вы же в любом случае для одной строки получаете одно значение, второе перезапишет первое. Не так?

Нет, не так. Каждый подсчет заносится в массив, после необходим вывести сумму всех элементов массива, а если этих элементов там в 2 раза больше, то и итоговая сумма получится в 2 раза больше.

*

Vladimir

  • ****
  • 279
  • +48/-0
    • Просмотр профиля
Re:Custom выполняется в 2 раза больше раз
« Ответ #12 : 15 Марта 2013, 15:12:26 »
а, в реальности в этой функции есть и другие действия? Хорошо... тогда если заносить сумму в массив с ключом от id объекта или опции. Одноименные ключи перезапишутся.

*

albion

  • ***
  • 109
  • +3/-0
    • Просмотр профиля
    • Веб-Админ
Re:Custom выполняется в 2 раза больше раз
« Ответ #13 : 15 Марта 2013, 15:18:47 »
а, в реальности в этой функции есть и другие действия? Хорошо... тогда если заносить сумму в массив с ключом от id объекта или опции. Одноименные ключи перезапишутся.
А об этом не подумал :( Спасибо. на будущее запомню. Да и действий там будет полно, включая действия связанные с переменными переданными через $_GET или $_POST (пока не решил) :) .