Отключение обработки php-полей при создании ноды

Главные вкладки

Аватар пользователя Kottov Kottov 21 мая 2014 в 14:18

Возник такой вопрос по пониманию как работает Друпал при создании ноды.

Пользователь может создать ноду в которой используются поля с php кодом где используются данные с полей этой же ноды. Но пока нода не сохранена у ней нет данных этих полей и даже nid пока не присвоен (в этом не уверен, поправте).

код в поле начинается так:

if (arg(0) == 'node' && is_numeric(arg(1))) $nodeid_current = arg(1);
$node = node_load($nodeid_current, null, true);
$amount = ($node->field_amount['und'][0]['value']); // это поле заполняте пользователь при создании ноды

что дает ошибку:

Notice: Undefined variable: nodeid_current в функции eval() (строка 4 в файле C:\OpenServer\domains\international\modules\php\php.module(80) : eval()'d code). - ну и кучу других с ней связанных

Как в полях с php кодом сделать условие чтоб дальнейший код не обрабатывался пока нода не сохранена? (если можно без хуков)

Где бы почитать как вообще работает Друпал? А то все инфа по Друпалу очень фрагментирована. Так например долго не мог понять что нельзя обращатся к данным поля отрытой ноды. Оказывается надо ее специально "увидеть", обозначить и вызвать.

Комментарии

Аватар пользователя Kottov Kottov 29 мая 2014 в 12:49

гланое не сделать, а еще понять как оно работает, тогда можно делать по любому, а не как кому-то "нормально".

похоже понял в чем там загвоздка - опишу сначала:

Пользователь может создать ноду в которой используются поля с php кодом.
(сооздание ноды происходит по ссылке для Entity Reference Autopopulete с агрументом родительской ноды)

код в поле начинается так:

if (arg(0) == 'node' && is_numeric(arg(1))) //
{
$nodeid_current = arg(1);
$node = node_load($nodeid_current, null, true);

Если выбран Английский - все работает нормально.
Если пользователь выбрал Русский и создает ноду - дает ошибку:

Notice: Undefined variable: nodeid_current в функции eval() (строка 4 в файле \modules\php\php.module(80) : eval()'d code). - ну и кучу других с ней связанных

Возможно что префикс языка идет 0-ым аргументомв в agr() и сдвигает все остальные.
http://drupal.stackexchange.com/questions/24506/remove-language-code-fro...

В этом ли дело и как с этим бороться?

Что пробовал:
Убирал "Определение языка на основе URL (домена или префикса)."
Для теста сдвигал аргументы в ручную

Отлележивал какие аргументы задаются при создании ноды:
agr(0)= node
agr(1)= add -- не численный, значит по любому не должен код выполняться - но на Английском все проходит без ошибок
agr(2)= order

получается что при создании ноды на английском php код в полях не выполнятеся, и ошибки не возникает. Затем после сохранения - все работает нормально. - такой вариант меня устраивает.
а при создании ноды на русском php код в полях вдруг начинает работать, и ошибки конечно же лезут так как в строке еще не те аргументы.

Аватар пользователя Kottov Kottov 29 мая 2014 в 14:14

смотрел аргументы так
print_r (arg(0));
echo '
';
print_r (arg(1));
echo '
';
print_r (arg(2));
echo '
';
print_r (arg(3));
echo '
';
print_r (arg(4));
echo '
';

префиксы языков не попали в аргументы

на странице с ссылкой создания ноды:

node
77

на странице создания ноды:

node
add
order

на странице созданной ноды:

node
82

но факт остается фактом - при смене языка начинает обрабатываться php-код в поле уже при создании ноды
(то есть тогда когда пользователь создает ноду и язык переключается в соответсвии с его "предпочтеними" в профиле, или даже если он в ручную заранее переключился)
далее что в созданой ноде php-код в полях затирается результатами, хотя пользователь даже прав не имеет редактировать их

вот ссылка по которой создается нода (собираем ее для Entity Refernce Autopopulate from URL)

<?php
if (arg(0) == 'node' && is_numeric(arg(1))) $nodeid_current = arg(1); // Получаем Node ID текущей станицы из аргумента по URL
$a = 'http://xxxxxxxxxxxxxx.org/node/add/order?field_ordered_from_private_offer='.$nodeid_current;
$a = l(t('Order now'), $a);
print_r ($a);

?>

Аватар пользователя Kottov Kottov 29 мая 2014 в 14:29

инзачально там пусто
туда пользователь должен внести количество заказа, сохранить ноду. В сохраненной ноде в полях с php-кодом расчитывается сумма заказа и собрана ссылка на платежную систему (URI-запросом).

но ошибка возникает сразу при создании ноды, из-за того что php-код уже начинает обрабатываться
а делался он под уже сохраненную ноду - там аргументы соответсвующии должны быть
до использования $node->field_amount код не доходит
первое о что спотыкается о $nodeid_current = arg(1); - так аргумент не тот что нужно, аргумет должнен быть nid сохраненной ноды, а до сохранения там аргумет "add" - добавить материал

обычно у нарoда другая проблема - как сделать вычисления еще до сохранения - решается Computed Field или hook_node_presave

а тут php-код сам стал выполнятся еще до сохранения - конечно мне оно не надо

или хотябы разобраться как этим пользоваться, чтоб отклюлить

Аватар пользователя Kottov Kottov 29 мая 2014 в 19:07

Алиса создает Объявление с полями цены, категории и тп. В нем автоматом генериется ссылка на создание Заказа "Order now".
Боря кликает и создает Заказ с указанием количества. В Заказе есть 2 поля где php-код подсчитывает сумму заказа и собирает ссылку uri-запроса к платежной системе "Pay now".
Алиса (коментом или личным собщением) подтверждает принятие заказа, а Боря кликает на ссылку URI-запроса и оплачивает.

Все в агнлийском варианте работает как часики. Для превода изначально все подготовил до контента и таксонимии. Вот случайно обнаружил что при смене языка идут чудеса.

Аргументы нужны чтоб загрузать ноду и получать данные по полям. Напримет "тянет" адресс кошелька из профиля автора Объявления и вставляет в тот же URI-запрос.

Пока не вижу необходимости переходить на хуки или писать свои модули.

А с "чудесами" по любому надо разобраться.))

Аватар пользователя Kottov Kottov 31 мая 2014 в 0:56

проблема в том что в:
Управление > Конфигурация > Регион и язык > Мультиязычные настройки > Форматы ввода, разрешенные к переводу > PHP code - был включен

каким-то образом это запускало обработку кода уже при создании ноды

мне это было нужно чтоб переводились метки ссылок генерируемых php кодом

с переводом в 7 явные трудности, что-то переводиться, что-то нет. Но нельзя же оставить сайт чуть-чуть непереведенным. Наверное уже и не решиться до 8.