Drupal: фатальная ошибка: невозможно переопределить> node_form_submit () (ранее> объявлено в - PullRequest
0 голосов
/ 24 июня 2010

Я хочу перенаправить мою форму после отправки, я пытаюсь использовать хук, но вот что я получаю:

function node_form_submit(&$form, $form_state) {  
    $form_state['redirect'] = 'contentManager/';
}

Неустранимая ошибка: невозможно переопределить node_form_submit () (ранее объявлено в Друпал / модули / узел / node.pages.inc: 451) в Друпала / сайты / все / темы / Bluemarine / template.php на линии 31

Я использую имя модуля "узел" для моего хука. Я думаю, что это неправильно, но я не понимаю, почему

Обновление : Хорошо, я не разрабатываю новый модуль. Я добавил функцию в template.php в своем шаблоне Bluemarine.

function bluemarine_form_alter(&$form, $form_state) {
    $form_state['redirect'] = 'contentManager/';
}

Bluemarine - это название моей темы. "ContentManager" - это страница, которую я создал в своем бэкэнде с представлением со всеми узлами.

Эта функция полностью игнорируется.

Update2 Итак, теперь это мой текущий файл template.php (я уверен, что phptemplate_node_form вызывается)

function phptemplate_node_form($form) {
  $form['#submit'][] = 'myFormSubmit';
}

function myFormSubmit() {
    echo "hello";
    die();
}

Функция myFormSubmit не вызывается.

спасибо

Ответы [ 3 ]

2 голосов
/ 24 июня 2010

PHP не допускает дублирования имен функций. node_form_submit, который на самом деле не является ловушкой, а обработчиком отправки формы, реализован в модуле узла. Вот почему вы получаете ошибку.

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

Если вы хотите добавить в форму обработчик отправки формы, вам нужно использовать hook_form_alter в форме и добавить обработчик отправки в $form['submit'].

Модули:
При разработке модуля вам необходимо использовать файл module_name.module. Вот куда должно идти ядро ​​вашего кода вместе с каждой реализацией хука.

Тема:
При разработке темы вы должны использовать файл template.php для всех функций предварительной обработки, переопределения тем, реализации ловушек и т. Д.

Что не так:
Вы говорите, что у вас обоих есть модуль и тема bluemarine. Если у вас действительно есть оба, вы должны переименовать их.

При использовании hook_form_alter необходимо указать $form_id, чтобы не переопределять все формы.

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

Обновление 2:
Если вы не используете Drupal 7, вы не можете использовать hook_form_alter в файле темы template.php. Вам нужно будет создать собственный модуль для реализации любого хука.

1 голос
/ 24 июня 2010

«Я использую имя модуля« узел »для своей ловушки. Думаю, это неправильно, но я не понимаю, почему»

Вы не можете сделать это, потому что узел уже является модулем, и, следовательно, функции node_ уже определены.

Чтобы использовать хуки, вам нужно создать свой собственный модуль, и тогда соглашение об именах будет mymodule_hookname ().

В модулях, которые имеют свои собственные ловушки, Drupal имеет функцию module_invoke_all, которая вызывает определенный ловушку для всех модулей во время выполнения на основе имени ловушки.

Вы не можете сбросить программирование в template.php, так как это не является его целью. Все это должно быть в модуле и легко достижимо с помощью hook_form_alter, изменением отправки формы и наличием функции mymodule_form_submit ().

0 голосов
/ 24 июня 2010

вы не можете объявить hook_form_alter в теме.Вы должны сделать это в модуле.обратите внимание, что для объявления mymodule_form_alter требуется три аргумента , и вам следует проверить, $ form_id == 'form_name' перед применением изменений (в противном случае вы измените КАЖДУЮ форму в drupal).

если вы не знаете form_id формы, которую вы хотите изменить, вы можете просто положить print_r ($ form_id. '');в вашем крючке, и он будет печатать form_id для каждой формы на странице.Затем вы можете использовать form_id, чтобы объявить более конкретный хук и добавить туда свои изменения.

наконец, если вам нужно изменить перенаправление в форме отправки, вам нужночтобы добавить имя функции в $ form ['# submit'] (добавить, не подставлять, см. формы api docs ) и в этой функции, которая должна запускаться после node_form_submit, изменить $ form ['# redirect'] на все, что угодно.

...