Нужно сохранить узел дважды, чтобы получить желаемый результат


Я сделал 2 пользовательских токена, которые я использую для определения псевдонима URL в шаблоне Pathauto. Они тоже отлично работают, но поскольку мои пользовательские токены зависят от определенных полей (таксономии) в узле, они всегда получают "старое" значение поля, когда пользователь их изменяет. Псевдоним URL-адреса неверен до второго сохранения узла. Таким образом, мне нужно "предварительно сохранить" узел немедленно, когда пользователь изменяет значение поля, чтобы новое значение токена принималось во внимание, когда сохранение узла... Как я могу это сделать?

Поскольку изменение выполняется на стороне клиента, мне нужно будет использовать Ajax для вызова node_save или hook_node_presave напрямую при изменении значения поля?

Любая помощь приветствуется:-)

ОТРЕДАКТИРОВАНО: Я понял, что мне, вероятно, нужно написать сценарий JS, который использует ajax для вызова функции php, которая сохраняет узел при изменении поля. Итак, теперь вопрос в том, разумно ли это делать, когда пользователь находится в режиме редактирования...?

Снова отредактировано:

Я наконец-то понял это. Я пропустил решение JS и выбрал использование field_attach_presave ("узел", $узел) и field_attach_update ("узел", $узел) в функции hook_node_presave. Это позволяет сохранить 2 определенных поля программно непосредственно перед тем, как узел будет определенно сохранен пользователем. И Pathauto может использовать эти 2 поля в качестве маркеров для моих URL-адресов. Это тоже работает:-). Есть много причин для этого не прямолинейного решения, немного затянутого, чтобы объясните здесь (миграция связана среди прочего). Но я доволен этим решением. Тем не менее, спасибо за вклад!

 1
Author: TBJ, 2016-03-10

1 answers

Рад, что вы решили эту проблему, не обходя ее с помощью AJAX, я думаю, что это было хорошее решение. Я все еще собираюсь продолжить эту тему, хотя, просто из упрямства, пожалуйста, потерпите меня. :-)

Итак, ваша точка входа hook_node_presave в порядке, и во всех практических аспектах вам, вероятно, не нужно будет читать дальше. Однако ваши токены должны были быть доступны с самого начала до Pathauto. Проблема заключалась в том, что, следуя вашему коду из этой редакции , использование функция menu_get_object(). Я предполагаю, что проблема возникла из-за следующего:

  1. Вы создали и сохранили новый узел с вашим кодом миграции
  2. Ваша реализация hook_tokens была вызвана из модуля Pathauto во время сохранения узла
  3. был вызван menu_get_object и ничего не вернул
  4. Новый узел был создан с неправильным URL-адресом

Причина, по которой menu_get_object ничего не вернул, заключается в том, что новый узел еще не был доступен через маршрутизацию Drupal. Это ожидается, так как все новые узлы должны быть правильно сохранены один раз, чтобы получить маршрут, подобный node/NID). Это также объясняет, почему ваш код работал правильно для существующего узла с зарегистрированным маршрутом.

Ваш код на самом деле работал бы нормально, если бы вы использовали параметр $data, вы могли бы выбрать свой объект узла оттуда следующим образом:

// $node = menu_get_object();
$node = $data['node']; 

Я быстро попробовал это в своей песочнице и смог как воспроизвести исходную проблему, так и решить ее.

Вывод: Ваш код, если вы все еще хотите его использовать и избавиться от дополнительной реализации hook_node_presave, должен работать нормально, если вы примените вышеуказанное изменение.

Ура!

 3
Author: Stefanos Petrakis, 2017-04-13 12:46:59