[РЕШЕНО] _form_alter и CCK

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

Аватар пользователя XDmitry XDmitry 28 сентября 2010 в 11:35
<?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. Кто сталкивался с подобной проблемой или видит решение,
просьба - откликнуться.

Комментарии

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 28 сентября 2010 в 12:10

"XDmitry" wrote:
Подозреваю, что проблема кроется в специфичности полей CCK. Кто сталкивался с подобной проблемой или видит решение,

На друпал.орге много байт исписано, через #after_build надо делать

Аватар пользователя XDmitry XDmitry 28 сентября 2010 в 12:50

У меня была мысль об #after_build (это? http://drupal.org/node/726282). Только то на английском и для англичан. Хотелось бы эту проблему отразить в русском сообществе, где о ней практически ничего не сказано.

Аватар пользователя XDmitry XDmitry 28 сентября 2010 в 13:33

Я тоже обратил внимание. Если прописать $form['field_person_vac'][0]['value']['#свойство'] = значение; , то все вроде встает на свои места. Видимо для CCK плей используется только такой формат: $form['field_name'][0]['value']['#свойство'] = значение; Либо его вариация, например, для типов select checkboxes

Аватар пользователя XDmitry XDmitry 28 сентября 2010 в 15:12

Вот таким образом код работает.


<?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']['#свойство'] = значение; - работают текстовые поля. Радио и списки - не работают.

Аватар пользователя G.A. Vinogradov G.A. Vinogradov 28 сентября 2010 в 20:33

Сделайте print_r($form['field_mail_vac']), если не поможет, то print_r($form) - посмотрите сами на структуру этого поля. Можете сделать serialize в файл и приложить к теме:

<?php
$f 
fopen('form.txt''w');
fwrite($fserialize($form));
fclose($f);
?>
Аватар пользователя XDmitry XDmitry 28 сентября 2010 в 21:22
[field_mail_vac] => Array (
        [#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
        )

Вот структура поля.

Аватар пользователя XDmitry XDmitry 28 сентября 2010 в 22:09

Свершилось! Упустил из виду ...[#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');
?>

Откликнувшимся, спасибо!