[РЕШЕНО] Переопределить функцию модуля

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

Аватар пользователя web09 web09 15 октября 2011 в 17:19

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

Вот это читал http://www.drupal.ru/node/45754, но не могу разобраться

Спасибо

Комментарии

Аватар пользователя web09 web09 15 октября 2011 в 17:53

Т.е. если я правильно понял, то к форме я должен прицепить сабмит на другую функцию, в которой и поменять редирект на нужный?

Как правильно назвать эту функцию и где ее разместить нужно?

Аватар пользователя web09 web09 15 октября 2011 в 18:34

Я с этого линка начал разбираться с данным вопросом. Мой вопрос состоит в том, есть ли какие правила названия функций, и абсолютно непонятно где ее размещать. В файле модуля, в template.php или где-то еще?

Если можно на примере, не обязательно на моем, просто так лучше доходит.

P.S. Только осваиваю друпал, поэтому хочется учиться правильно

Аватар пользователя xxandeadxx xxandeadxx 15 октября 2011 в 21:23

"web09" wrote:
есть ли какие правила названия функций, и абсолютно непонятно где ее размещать

там же чёрным по белому
"<a href="http://api.drupal.ru/api/group/hooks/6">http://api.drupal.ru/api/group/hooks/6</a>" wrote:
Хук — это PHP функция, которая имеет название module_name_hook_name(), где «module_name» — название модуля (имя файла module_name.module), а «hook_name» — название самого хука.

Аватар пользователя web09 web09 15 октября 2011 в 21:44

"xxandeadxx" wrote:
Хук — это PHP функция, которая имеет название module_name_hook_name(), где «module_name» — название модуля (имя файла module_name.module), а «hook_name» — название самого хука.

Я прочитал, не знаю сколько раз, но не понял.
Можно попросить пример? Имя модуля понятно, а имя хука? Туда что ставить?

Аватар пользователя web09 web09 15 октября 2011 в 22:16

Вы не поняли. Вот функция

<?php
function email_form_alter(&$form$form_state$form_id) {
    if (
$form_id == 'email-mail-page-form') {     
     
$form['submit'] = array(                
                
'#submit' => array('email_mail_page_form_submit')
        );        
    return 
$form
    }
}
?>

Если я правильно понял вместо email_mail_page_form_submit нужно написать имя функции, в которую внести собственные изменения.

Так вот вопрос. Имя у функции которая заменяет email_mail_page_form_submit должно по правилам как-то называться, или любое?
И где размещать эту новую измененную функцию и email_form_alter? template.php, файлы модуля или где-то еще?

Аватар пользователя Orion76 Orion76 16 октября 2011 в 2:42

в шестерке form_alter вызывается только из модуля...
желательно чтобы и функции валидации и сабмита были тоже в этом модуле...

И вообще... если вам просто надо перейти на нужную страницу после сабмита.. достаточно form['#action'] сменить на нужное (в хуке form_alter)

Аватар пользователя web09 web09 16 октября 2011 в 21:24

Сделал, вот так:

<?php
function email_form_alter(&$form, &$form_state$form_id) {    
    if (
$form_id == 'email_mail_page_form') {
     
$form['submit'] = array(
        
'#type' => 'submit',
        
'#value' => t('Send e-mail'),
        
'#validate' => array('email_mail_page_form_validate'),
        
'#submit' => array('email_mytheme_mail_page_form_submit'),
    );        
    }    
return 
$form;    
}

function 

email_mytheme_mail_page_form_submit($form, &$form_state) {
  
email_mail_page_form_submit($form, &$form_state);
  
$form_state['redirect'] = 'company/staff';
}
?>

Добавил в файл модуля email

Спасибо всем!

Аватар пользователя Orion76 Orion76 17 октября 2011 в 1:39

"web09" wrote:
Добавил в файл модуля email

В таком случае, проще было хакнуть оригинальную функцию сабмита..

а если по правильному... достаточно было добавить свой модуль:
папка модуля
файл ИМЯ_МОДУЛЯ.info
файл ИМЯ_МОДУЛЯ.module

ИМЯ_МОДУЛЯ.info - копируем переименовываем подобный файл другого модуля, меняем параметр имя модуля на свое, и группу (как правильно заполнить ИМЯ_МОДУЛЯ.info есть куча инфы в инете)

ИМЯ_МОДУЛЯ.module - добавляем в него приведенный выше код (незабываем про <?php в начале файла, закрывающий не нужен) меняем наименование функций на нужные (префикc меняем на имя модуля)

и фсе-))

А иначе при следующем обновлении модуля "email", ваши правки "затруться"