Подскажите пожалуйста, как правильно реализовать form_alter
есть нода, в ней есть форма в которую подставляются данные (форма генерируется модулем avalibility_calendar).
необходимо добавить к этой форме всего два поля.
1. E-mail автора ноды на странице которой эта форма находится
2. url ноды на странице которой эта форма находится
не оч селен в написании модулей.
как добавить сам инпут разобрался
<?php
function MYMODULE_form_availability_calendar_booking_formlet_form_alter(&$form, &$form_state, $form_id) {
$form['author_mail'] = array(
'#type' => 'hidden',
'#id' => t('obj_author_mail'),
'#weight' => t('15'),
'#value' => ('MAIL'),
);
?>
А вот как получить данные по автору ноыд и alter'нуть их в форму перед рендером хз.
был бы признателен за кусочек кода и подсказки.
Заранее спасибо!
Комментарии
1. Посмотреть, не добавлен ли объект ноды в массив $form_state. Можно через var_dump, print_r или dpm (если модуль devel установлен). Обычно это $form_state['node'] или $form_state['object']
2. Если ноды в $form_state нет, то загрузить так
<?php$node = node_load(arg(1));?>
. Работать будет только на странице ноды.<?php
function MYMODULE_form_availability_calendar_booking_formlet_form_alter(&$form, &$form_state, $form_id) {
$node; // нода получена одним из способов выше.
$user = user_load($node->uid);
$form['author_mail'] = array(
'#type' => 'hidden',
'#id' => t('obj_author_mail'),
'#weight' => t('15'),
'#defualt_value' => $user->mail,
);
$path = current_path();
?>
Для всех типов полей, кроме 'value', нужно использовать #default_value, а не #value. Иначе при сабмите будет всегда записано значение из кода, а не то, которое было установлено на стороне клиента.
Если же не хотите, чтобы клиент менял значение, и не нужно менять это значение, то не выводите поле совсем - для это ставится тип #value
<?php
function MYMODULE_form_availability_calendar_booking_formlet_form_alter(&$form, &$form_state, $form_id) {
$node; // нода получена одним из способов выше.
$user = user_load($node->uid);
$form['author_mail'] = array(
'#type' => 'value',
'#value' => $user->mail,
);
?>
Все получилось! спасибо огромное, затупил немного
Сработала такая конструкция (может пригодится кому то)
<?php
function MODULENAME_form_availability_calendar_booking_formlet_form_alter(&$form, &$form_state, $form_id) {
$node = node_load(arg(1));
$user = user_load($node->uid); $form['author_mail'] = array(
'#type' => 'hidden',
'#id' => 'obj_author_mail',
'#weight' => 15,
'#value' => $user->mail,
);
}
?>