Нужно сохранить узел дважды, чтобы получить желаемый результат
Я сделал 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 answers
Рад, что вы решили эту проблему, не обходя ее с помощью AJAX, я думаю, что это было хорошее решение. Я все еще собираюсь продолжить эту тему, хотя, просто из упрямства, пожалуйста, потерпите меня. :-)
Итак, ваша точка входа hook_node_presave в порядке, и во всех практических аспектах вам, вероятно, не нужно будет читать дальше. Однако ваши токены должны были быть доступны с самого начала до Pathauto. Проблема заключалась в том, что, следуя вашему коду из этой редакции , использование функция menu_get_object(). Я предполагаю, что проблема возникла из-за следующего:
- Вы создали и сохранили новый узел с вашим кодом миграции
- Ваша реализация hook_tokens была вызвана из модуля Pathauto во время сохранения узла
- был вызван menu_get_object и ничего не вернул
- Новый узел был создан с неправильным URL-адресом
Причина, по которой menu_get_object ничего не вернул, заключается в том, что новый узел еще не был доступен через маршрутизацию Drupal. Это ожидается, так как все новые узлы должны быть правильно сохранены один раз, чтобы получить маршрут, подобный node/NID). Это также объясняет, почему ваш код работал правильно для существующего узла с зарегистрированным маршрутом.
Ваш код на самом деле работал бы нормально, если бы вы использовали параметр $data, вы могли бы выбрать свой объект узла оттуда следующим образом:
// $node = menu_get_object();
$node = $data['node'];
Я быстро попробовал это в своей песочнице и смог как воспроизвести исходную проблему, так и решить ее.
Вывод: Ваш код, если вы все еще хотите его использовать и избавиться от дополнительной реализации hook_node_presave, должен работать нормально, если вы примените вышеуказанное изменение.
Ура!