@EVAL не работает в поле "Значение по умолчанию" у ТВ

modx revo 2.2.7.

Если в поле "Значение по умолчанию" некоторого TV-параметра указать:

@EVAL return $modx->runSnippet('snippet');

то значение по умолчанию при создании ресурса не устанавливается.

Значение по умолчанию в этом случае устанавливается только при нажатии на зелёном кружке.

Если же указать так:

@EVAL return 5;

то значение устанавливается в 5 сразу же при создании ресурса.

Как сделать так, чтобы при использовании EVAL+runSnippet значение по умолчанию устанавливалось сразу (без нажатия на зелёном кружке) ?

============================

Данная проблему на протяжении последних 5 лет поднимали много раз. Но решения так и не было предложено. Последний раз сабжевый вопрос на одном из форумов поднимался полгода назад и опять-таки без решения.

На текущий момент кто-нибудь может подытожить ситуацию ?

Ведь на текущий момент даже неизвестно точно, баг это или нет. Если баг, почему его не исправили за 5 лет ?

Если не баг, то почему при явном указании значения (@EVAL return 5;) значение по умолчанию устанавливается сразу ?

В любом случае, как эту проблему можно исправить или обойти ? Штатными средствами и не очень.

← Предыдущая заметка
Дополнительное поле в свойствах товара в 2 клика
Следующая заметка →
Вывод секций для публикаций Tickets
Комментарии (16)
bezumkinВасилий Наумкин
13.08.2013 08:53

Ни разу так не делал, но сейчас проверил. У меня по умолчанию просто выводится текст, версия 2.2.8

Если же указать список для выбора, и дефолтный вариант - то все нормально работает.

Лично я такие задачи решаю плагином на сохранение документа, который проверяет и приписывает, что мне нужно.

Cyrax_02
13.08.2013 09:39
Если же указать список для выбора, и дефолтный вариант — то все нормально работает.

Так у вас указано "2" в значении по умолчанию. А автоматическое заполнение поля при создании документа не работает только при указании EVAL. Например:

@EVAL return $modx->runSnippet('snippet');

где snippet:

<?php
return 2;

Попробуйте - работать не будет.

Да и без сниппета тоже не работает:

@EVAL return 2;
bezumkinВасилий Наумкин
13.08.2013 09:51

Я же и говорю, что у меня в этом поле "по умолчанию" вообще php не работает, выводится как текст.

Возможно, это только с версии 2.2.8 так стало, не знаю.

Cyrax_02
13.08.2013 09:58

Лично я такие задачи решаю плагином на сохранение документа, который проверяет и приписывает, что мне нужно.

Но в моём случае необходимо, чтобы поле заполнялось при создании документа. А событий на DocCreate, похоже и нет:

OnBeforeDocFormDelete
OnBeforeDocFormSave
OnCreateDocGroup
OnDocFormDelete
OnDocFormPrerender
OnDocFormRender
OnDocFormSave
bezumkinВасилий Наумкин
13.08.2013 10:00

Есть - OnDocFormRender.

Вот пример использования.

Cyrax_02
13.08.2013 10:05

Так ведь это событие генерируется при каждой прорисовке формы. А мне нужно присвоить значение по умолчанию только один раз при создании ресурса.

bezumkinВасилий Наумкин
13.08.2013 11:32

В общем, покопал исходники, и вот что выяснилось: 1. Через плагин это вроде как не сделать, ибо инпут формируется в методе modTemplateVar::renderInput() и работает он со свойствами самого ТВ - значение туда не подсунуть. 2. Этот метод получает и процессит дефолтный текст, но не подставляет его в значение. 3. Если вот тут заменить

$v = $tv->get('default_text');

на

$v = $default;

то все начинает работать.

Не знаю, ошибка это, или нет, но именно из-за таких вещей я и не использую ТВ параметры в своих компонентах.

Однако, я не успокоился и таки решил вопрос через плагин, хоть и не очень красиво:

<?php
switch ($modx->event->name) {
    case 'OnResourceTVFormRender':
        if ($resource !== 0) {return;}
        
        foreach ($categories as & $category) {
            foreach ($category['tvs'] as & $tv) {
                if ($tv->id != 2) {continue;}

                $formElement = $tv->get('formElement');
                $default = $modx->runSnippet('MySnippet');
                $formElement = preg_replace('/value="(.*?)"/', 'value="'.$default.'"', $formElement);
                $tv->set('formElement', $formElement);
            }
        }
    break;
}

При загрузке страницы, этот плагин проверяет id ресурса (у новых он равен 0), затем прогоняет все доступные ТВ параметры по ссылке, и работает с нужными (в примере это параметр c id = 2).

Ну а дальше, все просто - получаем значение из сниппета и меняем в форме value.

Cyrax_02
13.08.2013 13:11

Спасибо. Смысл понятен: а) проверяем id ресурса на 0: если равен 0, значит, ресурс только создаётся б) значение подставляем непосредственно в html-код TV-параметра, минуя высокоуровневые манипуляции со свойствами ресурса

Только вы используете событие 'OnResourceTVFormRender'. А в OnDocFormRender нельзя добраться до html-кода TV-параметра ? Или это слишком геморройно ?

И где можно почитать про это событие ? Вот здесь его нет: http://rtfm.modx.com/revolution/2.x/developing-in-modx/basic-development/plugins/system-events http://wiki.modxcms.com/index.php/System\_Events http://zaswerd.ru/modx/other/system\_event.html

Наверное, эффективнее всего будут вот такие манипуляции: http://blog.agel-nash.ru/2013/5/plugin-develop.html

bezumkinВасилий Наумкин
13.08.2013 13:22

Я на решение твоей проблемы потратил час личного времени.

Выясняй дальше сам, что "эффективнее".

P.S. Все вещи, которых нет в документации, можно найти только в одном месте - в исходном коде системы.

Cyrax_02
13.08.2013 14:21

ok. Только этот ваш час ушёл не только на меня, но и на тысячи разработчиков, которые почитают и воспользуются данной темой. Я руководствуюсь именно этим и привык резюмировать свои вопросы. Ну а от вас я больше ничего и не требую, ведь все ответы идут в добровольном порядке ))

Cyrax_02
18.08.2013 12:26

Вообще, значение по умолчанию в modX - довольно специфичная вещь. И это НЕ "значение, автоматически устанавливаемое при создании ресурса". Смысл его иной. Если значение TV не указывать либо указать значение, равное значению по умолчанию, то в этом случае будем иметь следующее: а) в БД в таблице modx_site_tmplvar_contentvalues соответствующей записи не будет б) значение по умолчанию можно получить только плейсхолдерами в шаблоне ресурса в) при получении данных и БД вручную (чистыми запросами или через xPDO - не важно) для таких значений мы получим null

Следовательно, нужно отказаться от этих значений по умолчанию, т.к. 1. Если изменить значение по умолчанию некоторого TV, то все предыдущие значения (равные значению по умолчанию) станут пустыми. 2. Во всех запросах на извлечение TV добавление проверки/сверки со значением по умолчанию (дополнительный JOIN + IFNULL(site_tmplvar_contentvalues.value, site_tmplvars.default_text)) приведёт к утяжелению запроса

Для себя решил этим чудом не пользоваться. В пользу плагинов.

agel_nashЕвгений Борисов
18.08.2013 12:39

Насколько я помню, вышеописанными проблемами страдал Evo. В Revo значения по умолчанию сохранялись в таблицу values.

Cyrax_02
18.08.2013 13:31

revo 2.2.7. Только что проверил: если значение TV совпадает со значением по умолчанию, из таблицы modx_site_tmplvar_contentvalues это значение удаляется. Если установить значение, отличное от значения по умолчанию - появляется.

agel_nashЕвгений Борисов
18.08.2013 15:05

Хм. Да, проглючил.

Cyrax_02
18.08.2013 16:42

Строго говоря, это не глюк (поэтому и не исправляют уже 5 лет). Просто смысл и механизм работы "значения по умолчанию" в modX отличается от общепринятого. Корректнее было бы: а) назвать его не "Значение по умолчанию", а 'Отображать пустое значение как' б) перенести его на вкладку "Параметры вывода"

Так было бы корректнее. А то вводят людей в заблуждение...

agel_nashЕвгений Борисов
18.08.2013 17:48

Если честно, то я проглючил вот из-за чего. Я когда-то в трекере видел тикет, что хотели в Evo версии 1.1 внести сохранение значений по умолчанию в таблицу values. Примерно в это же время у меня был проект на Revo и я там накидал плагин который эти самые дефолтные значения перебрасывает в ту таблицу. Но спустя время поползли глюки - смена значения по умолчанию требовала запроса на UPDATE в таблице values. И еще по мелочи.

bezumkin
Василий Наумкин
09.04.2024 01:45
Ошибка 500 Это не похоже на ошибку Nginx, это скорее всего ошибка PHP - надо смотреть его логи. Во...
futuris
Futuris
04.04.2024 05:56
Я просто немного запутался. Когда в абзаце &quot;Vesp/Core&quot; ты пишешь про &quot;новый trait Fil...
bezumkin
Василий Наумкин
20.03.2024 18:21
Volledig!
Андрей
14.03.2024 10:47
Василий! Как всегда очень круто! Моё почтение!
russelgal
russel gal
09.03.2024 17:17
А этот стоило написать хотя бы затем, чтобы получить комментарий от юзера, который ничего не писал ...
inetlover
Александр Наумов
27.01.2024 00:06
Василий, спасибо! Извини, тупанул.
bezumkin
Василий Наумкин
22.01.2024 04:43
Давай-давай!
bezumkin
Василий Наумкин
24.12.2023 11:26
Спасибо!
bezumkin
Василий Наумкин
27.11.2023 02:43
Ура!
bezumkin
Василий Наумкин
25.11.2023 08:30
Vesp тянет 2 зависимости: vesp-frontent для фронта и vesp-core для бэкенда. Их можно обновлять, но э...