Рейтинг:0

Как использовать hook_node_insert для автоматической пометки узлов определенного типа контента

флаг pe

Все узлы одного типа контента в моем проекте должны быть автоматически помечены (модулем Flags) при создании. Я знаю, что, вероятно, есть способ сделать это с помощью модуля «Правила», но я пытаюсь создать свой первый в мире пользовательский модуль для этого, потому что а) я не думаю, что мне понадобятся правила для что-нибудь еще в этом проекте и б) хочу попробовать свои силы в создании пользовательских модулей. (У меня работает базовый модуль «hello world».)

Запрос поддержки в модуле «Флажок», по-видимому, обеспечивает простой способ автоматической пометки узлов, но мне кажется, что он будет делать это для узлов всех типов контента. https://www.drupal.org/project/flag/issues/3030288

Для удобства вот код для флага bookmark...

функция your_module_node_insert(Drupal\Core\Entity\EntityInterface $entity){
 $flag = \Drupal::entityTypeManager()->getStorage('flag')->load('bookmark');
 \Drupal::service('flag')->flag($flag, $entity);
}

Страница API для этого хука, похоже, не говорит мне то, что мне нужно знать. (https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21entity.api.php/function/hook_ENTITY_TYPE_insert/9.0.x)

Вопросы: Это даже правильный крючок для этой потребности? Если да, то как я могу ограничить его определенным типом контента?

sonfd avatar
флаг in
См. [документы Node](https://api.drupal.org/api/drupal/core%21modules%21node%21src%21Entity%21Node.php/class/Node/9.2.x). Вы можете получить тип контента (он же пакет) узла с помощью `$entity->bundle()`, который является универсальным и будет работать для всех объектов контента.
sea26.2 avatar
флаг om
Эта ссылка поможет? https://drupal.stackexchange.com/questions/185442/how-can-i-programmatically-create-a-node
флаг pe
Они оба полезны для заполнения пробелов. С моим практически нулевым опытом работы с объектами, классами, методами и т. д. мне в основном нужно понимать синтаксис. Правильный способ сделать это — пройти курс от базовых концепций и выше, но, да, искать короткие пути. Любые дополнительные примеры кода были бы замечательными. Некоторые из них будут ближе к тому, что я пытаюсь сделать. Я могу искать шаблоны, а затем методом проб и ошибок добираться до конца. Наверное.
флаг pe
Я обновил вопрос в свете моих последних тестов.
Jaypan avatar
флаг de
Вы настроили сущность? https://git.drupalcode.org/project/flag/-/tree/8.x-4.x#configuration. Если нет, возможно, вы неправильно диагностируете проблему, попробуйте запустить update.php.
флаг pe
Спасибо. Еще немного покопавшись, я определил, что мой код работает, поэтому я перемещаю его в ответ. Причина, по которой я думал, что это не удается, заключается в том, что задействованный флаг имеет поле ссылки на сущность, и, конечно же, этот код не устанавливает это поле. Тем не менее, он устанавливает флаг.
Рейтинг:0
флаг pe

Это работает для меня...

«rf_tweaks» — это имя машины модуля, «research_note» — тип содержимого узла, а «research_item» — имя флага.

используйте Drupal\node\Entity\Node;

функция rf_tweaks_node_insert (узел $ узел) {
  если ($node->bundle() == 'research_note'){
 $flag = \Drupal::entityTypeManager()->getStorage('flag')->load('research_item');
 \Drupal::service('flag')->flag($flag, $node);
}
}

Для удобства других создателей модулей в первый раз, это находится в файле rf_tweaks.module, и файл начинается с <?php требуется в тех.

флаг pe
Ну, это работало, но теперь это не так. Ошибки... "Флаг не применяется к пакету сущности. в Drupal\flag\FlagService->flag() (строка 294 ...modules/contrib/flag/src/FlagService.php)", за которым «Drupal\Core\Entity\EntityStorageException: флаг не применяется к пакету объекта. /Entity/Sql/SqlContentEntityStorage.php)".
флаг pe
На самом деле все еще работает, но необходимо убедиться, что тип контента остается включенным в конфигурации для этого флага. Это связано с тем, что модуль вызывает флаг api. (Или так меня привели к пониманию.)

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.