как написать триггер после сохранения
Крючок node_api предоставляет набор триггеров, которые позволяют настраивать то, что может произойти, например, при предварительном сохранении. Код операции предварительного сохранения node_api запускает действие, которое происходит после нажатия кнопки "Сохранить" узла, но ДО того, как информация в форме узла будет вставлена в базу данных. Я хотел бы создать триггер, который будет триггером после сохранения, для запуска моего пользовательского кода после нажатия кнопки сохранить, но ПОСЛЕ того, как информация об узле будет сохранена в база данных. Есть ли у кого-нибудь идеи о том, как я мог бы создать такой триггер?
(Я прочитал документацию о том, как создать триггер, я просто не знаю, как закодировать триггер, который я описываю выше.)
1 answers
Просто чтобы немного разбить процесс (на основе ваших других вопросов:1,2); когда вы отправляете форму узла:
-
node_form_submit()
звонкиnode_save()
. -
node_save()
немедленно вызываетnode_invoke_nodeapi($node, 'presave');
, чтобы сообщить другим модулям о предварительном сохранении. -
node_save()
затем устанавливает несколько свойств для объекта узла, и запись узла записывается в таблицуnode
в базе данных с помощьюdrupal_write_record()
. - В самом, самом конце функции ( после того, как данные были записаны в таблицу
node
),node_invoke_nodeapi()
вызывается снова с помощью'insert'
или'update'
, в зависимости от выполняемой текущей операции.
Если вы просмотрите эти функции и приведенную выше сводку, вы увидите, что данные узла на 100%, определенно зафиксированы в базе данных до 'insert'
или 'update'
операции выполняются для hook_nodeapi()
.
Если этого не происходит для вашей установки, я бы настоятельно рекомендовал заменить ядро на свежая версия, так как это звучит так, как будто что-то пошло ужасно неправильно!
Переходя к фактическому вопросу; единственный способ добавить крючок после сохранения - это добавить еще одну строку в основную функцию node_save()
для ее вызова. Но вы все равно добавите его сразу после вызова в node_invoke_nodeapi($node, $op);
(где $op
- это 'insert'
или 'update'
), так что я не уверен, что это поможет.