<?php
/**
* Implementation of hook_form_alter().
*
* The function is named modulename_form_alter.
*/
function vacancy_form_vacancy_node_form_alter(&$form, &$form_state) {
$form['field_address_vac'][0] = array (
'#type' => text_textfield,
'#title' => t('Adress'),
'#required' => TRUE
);
$form['field_mail_vac'] = array (
'#type' => email_textfield,
'#title' => t('Email'),
'#required' => FALSE
);
$form['field_person_vac'][0] = array (
'#type' => text_textfield,
'#title' => t('Personal information'),
'#required' => TRUE
);
}
?>
Проблема следующая. Необходимо изменить некоторые CCK-поля в форме с их отдельной валидацией. Решил это сделать
через hook_form_FORM_ID_alter (либо через hook_form_alter). Создал модуль. Начал с простого изменения элементов формы.
Именения реализовались (на странице создания). Заполняешь поля, но при просмотре (или сохранении) формы получаю:
Fatal error: Cannot unset string offsets in Z:\home\....\all\modules\cck\content.module on line 1248
Все встало и о валидации и прочем пока говорить не приходится. Искал в сети аналогичную проблему, но ничего конкретного (преимущественно на org'е), да и в англ. я не очень.
Подозреваю, что проблема кроется в специфичности полей CCK. Кто сталкивался с подобной проблемой или видит решение,
просьба - откликнуться.
Комментарии
На друпал.орге много байт исписано, через #after_build надо делать
У меня была мысль об #after_build (это? http://drupal.org/node/726282). Только то на английском и для англичан. Хотелось бы эту проблему отразить в русском сообществе, где о ней практически ничего не сказано.
Что-то мне ваш код не нравится )
То ли в $form['field_mail_vac'] дальше [0] не хватает, то ли в других местах он лишний
Я тоже обратил внимание. Если прописать $form['field_person_vac'][0]['value']['#свойство'] = значение; , то все вроде встает на свои места. Видимо для CCK плей используется только такой формат: $form['field_name'][0]['value']['#свойство'] = значение; Либо его вариация, например, для типов select checkboxes
Вот таким образом код работает.
<?php
/**
* Implementation of hook_form_alter().
*/
function vacancy_form_alter(&$form, $form_state, $form_id) {
// Check for a particular content type's node form.
if ($form_id == 'vacancy_node_form') {
dsm($form);
// Add an after_build function to process when everything's complete.
$form['#after_build'][] = 'vacancy_after_build';
}
}
/**
* Modify CCK form elements on the example node form.
*/
function vacancy_after_build($form, &$form_state) {
// TODO: Stuff!
$form['#value']['field_address_vac'][0]['value']['#type'] = text_textfield;
$form['field_address_vac'][0]['value']['#title'] = t('Adress');
$form['field_address_vac'][0]['value']['#required'] = TRUE;
$form['#value']['field_person_vac'][0]['value']['#type'] = text_textfield;
$form['field_person_vac'][0]['value']['#title'] = t('Personal information');
$form['field_person_vac'][0]['value']['#required'] = TRUE;
return $form;
}
?>
Однако поле...
<?php
$form['field_mail_vac'] = array (
'#type' => email_textfield,
'#title' => t('Email'),
'#required' => FALSE
);
?>
...не работает. Перепробовал различные вариации. По стандарту $form['field_name'][0]['value']['#свойство'] = значение; - работают текстовые поля. Радио и списки - не работают.
Ребят, никто не поможет?
Сделайте print_r($form['field_mail_vac']), если не поможет, то print_r($form) - посмотрите сами на структуру этого поля. Можете сделать serialize в файл и приложить к теме:
<?php
$f = fopen('form.txt', 'w');
fwrite($f, serialize($form));
fclose($f);
?>
[#theme] => content_multiple_values
[#title] => Электронная почта
[#required] => 0
[#description] =>
[0] =>
Array (
[#type] => email_textfield
[#default_value] => Array ( [email] => )
[#title] => Электронная почта
[#description] =>
[#required] =>
[#weight] => 0
[#delta] => 0
[#columns] => Array ( [0] => email )
[#field_name] => field_mail_vac
[#type_name] => vacancy
)
[#field_name] => field_mail_vac
[#tree] => 1
[#weight] => 18
[#access] => 1
[#count] => 5
)
Вот структура поля.
Свершилось! Упустил из виду ...[#default_value] => Array ( [email] => )... Вставив вместо ['value'] -> ['email'] = получил то, что хотел:
<?php
$form['#value']['field_mail_vac'][0]['email']['#type'] = email_textfield;
$form['field_mail_vac'][0]['email']['#title'] = t('Email');
?>
Откликнувшимся, спасибо!