нужна помощь с hook_node_presave

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

Аватар пользователя DJLocksmith DJLocksmith 26 декабря 2013 в 13:27

Добрый день.
Народ, помогите разобраться с hook_node_presave.
Гуглил но толком не понял как им пользоваться. Разобрался что он выполняется перед сохранением ноды, что мне и нужно)
Задача выполнить код перед сохранением:

require_once 'PHPWord/PHPWord.php';

$PHPWord = new PHPWord();

$document = $PHPWord->loadTemplate('Template.docx');
$document->setValue('Value1', $node->field_lastname_ua['und'][0]['value']);

$document->setValue('weekday', date('l'));
$document->setValue('time', date('H:i'));

$document->save('dogovor.docx');

Все файлы находятся в папке /modules/node

Заранее благодарен!

Комментарии

Аватар пользователя DJLocksmith DJLocksmith 26 декабря 2013 в 14:20

q2_faith wrote:
а что не получается?)

код не сработал. На выходе должен получить файл dogovor.docx
по сути мне просто нужно в ставить в тело hook_node_presave свой код и он перед сохранением любой ноды будет выполнятся, так?

Аватар пользователя drupby drupby 26 декабря 2013 в 14:56

"DJLocksmith" wrote:
по сути мне просто нужно в ставить в тело hook_node_presave свой код и он перед сохранением любой ноды будет выполнятся, так?

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

"DJLocksmith" wrote:
Все файлы находятся в папке /modules/node

а вот это неправильно , файлы храните в папке со своим модулем или же в каталоге files и пути правильные пропишите

"DJLocksmith" wrote:
Template.docx

и по идее должно быть Template.dotx ?

Аватар пользователя DJLocksmith DJLocksmith 26 декабря 2013 в 15:01

drupby wrote:
"DJLocksmith" wrote:
по сути мне просто нужно в ставить в тело hook_node_presave свой код и он перед сохранением любой ноды будет выполнятся, так?

hook_node_insert вызовется сразу же после добавления новой ноды (после записи ее в бд) , а hook_node_presave вызовется и при редактировании ноды - у вас создастся еще один файл , а точнее пересохранится старый с новыми данными - я бы формировал имя создаваемого файла динамически
"DJLocksmith" wrote:
Все файлы находятся в папке /modules/node

а вот это неправильно , файлы храните в папке со своим модулем или же в каталоге files и пути правильные пропишите

мне нужно создавать файлы как при создании так и при обновлении ноды. файлы изночально хранились в папке files, когда я использовал rules.
путь должен быть относительно файла node.api.php?

require_once '../sites/default/files/PHPWord/PHPWord.php';

прошу прощения за глупые вопросы, просто уже второй день и голова не варит. сам себе не доверяю))

Аватар пользователя drupby drupby 26 декабря 2013 в 15:15

"DJLocksmith" wrote:
путь должен быть относительно файла node.api.php?

вы когда нибудь писали модули под друпал?

Аватар пользователя DJLocksmith DJLocksmith 26 декабря 2013 в 15:18

drupby wrote:
"DJLocksmith" wrote:
путь должен быть относительно файла node.api.php?

вы когда нибудь писали модули под друпал?

нет. это мой первый опыт работы над хуками и модулями.

Аватар пользователя q2_faith q2_faith 26 декабря 2013 в 15:22

во-первых, оформите это в виде своего модуля, а не вносите изменения в ядро
во-вторых, вам нужно понять на каком этапе происходит ошибка и не создается документ.

Аватар пользователя DJLocksmith DJLocksmith 26 декабря 2013 в 16:01

q2_faith wrote:
во-первых, оформите это в виде своего модуля, а не вносите изменения в ядро
во-вторых, вам нужно понять на каком этапе происходит ошибка и не создается документ.

Решил пока сделать с помощью рулс. Подскажите где почитать про создание модулей и работу с хуками пожалуйста. Нашел много всего но пока не разобрался.
Спасибо за внимание.

Аватар пользователя q2_faith q2_faith 26 декабря 2013 в 16:29

"DJLocksmith" wrote:
Решил пока сделать с помощью рулс. Подскажите где почитать про создание модулей и работу с хуками пожалуйста. Нашел много всего но пока не разобрался.

погуглите. прямо так и забивайте в гугл "создание простого модуля для друпал 7" (например, http://cms-cmf-framework.blogspot.com/2012/06/drupal-7-sozdanie-prostogo...)
у вас модуль будет содержать два файла: один ваш_модуль.info, ваш_модуль.module
в файл ваш_модуль.module добавляете нужные хуки. например, hook_node_insert - в вашем случае будет выглядеть как ваш_модуль_node_insert

Аватар пользователя DJLocksmith DJLocksmith 3 января 2014 в 22:56

Доброго времени суток!)

С предыдущей проблемой справился, теперь снова прошу прошу помощи)

function word_node_update($node) {
$file = '/home/ho4uappc/public_html/sites/default/files/templates/dogovor.docx';

if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
}

Мне нужно после сохранения скачать файл. Файл качается но нода не сохраняется, а остается висеть форма редактирования.

Аватар пользователя Orion76 Orion76 3 января 2014 в 23:07

"DJLocksmith" wrote:
exit;

Вот и не сохраняется-)
А не логичнее на странице просмотра материала разместить кнопку "Скачать документ"?
Еще логичнее добавить к материалу поле "файл" и при сохранении материала генерировать файл и "привязывать" к данному полю.