CCK Unlimited values

17.12.2017

Наверняка Вы сталкивались с проблемой unlimited values в составе CCK. Если установить например "Количество значений:" = 10, то при редактировании формы Вы получите 10 полей. это не всегда удобно. А хочется чтобы было одно значение и кнопка "Add value"

Итак очень кратко как это обойти
Для этого введем свои переменные, которые будут содержать реальные настройки полей
"myvariable_hook_cck_field_[имяполя1], myvariable_hook_cck_field_[имяполя2] ..."
Далее в hook_form_alter

Добавляем обработку формы редактирования поля cck

if ('content_field_edit_form' == $form_id) {
$form['field']['multiple']['#options'] = array(
'1' => 'Unlimited',
'0' => '1',
...
'25' => '25',
'30' => '30');

$form['field']['multiple']['#default_value'] = variable_get('myvariable_hook_cck_field_'.$form['#field']['field_name'], 0);
$form['#validate'][] = '_mymodule_setup_cck_counts'; // дополнительный обработчик - установим анлим для поля
}
// добавим обработчик after_build для формы (в моем случае обработка нужна только для некоторых типов контента)
// !!!
$form['#after_build'], '_mymodule_audio_node_form_after_build')

Да, немного топорно, пусть гуру покажут как лучше, но я нашел такой вот способ. при валидации поля я подменяю значение поля на анлим, а в соответствующую переменную пишу реальное количество значений поля
функция _mymodule_setup_cck_counts
function _mymodule_setup_cck_counts($form, &$form_state) {

// запишем в переменную значение выбранное пользователем.
// имя переменной - myvariable_hook_cck_field_[имяполя]
if ($form_state['values']['multiple'] > 1) {
variable_set('myvariable_hook_cck_field_'.$form_state['values']['field_name'], $form_state['values']['multiple']);
// поменяем на анлим для корректной работы кнопки "ADD MORE"
$form_state['values']['multiple'] = 1;
}
return $form_state;
}

Итак сама функция

function _mymodule_audio_node_form_after_build($form, &$form_state) {
// обработчик анлим полей до определенного кол-ва.
// если достигаем критического значения полей - просто отключаем кнопку ADD MORE
$array_fields = array();

foreach ($form['#field_info'] as $k => $v) {
$array_fields[]=$k;
}
$count = 0 ;
foreach ($array_fields as $cckfield) {
$count = variable_get('myvariable_hook_cck_field_'.$cckfield, 0);
if ($count > 1 ) { // если в переменной больше одного значения
if (isset ($form[$cckfield][$count+1])) {
unset($form[$cckfield][$cckfield.'_add_more']);
}
}
}
return $form;
}

P.S. Буду благодарен за комментарии.
P.S.S. Кто нибудь использует Redmine?