Доброго времени суток!
Возникла такая проблема: на странице редактирования узала выводится список полей, количество заполнения которых не ограничено. Для этого есть кнопка добавления дополнительных полей заполнения. Соответственно, для каждого поля подвязана кнопка удаления из списка.
Кнопка удаления работает через AHAH, но callback никак не изменяет страницу, хотя drupal_render возвращает правильный html. В чем причина, не могу разобраться.
Буду благодарна за помощь.
'#type' => 'image_button',
'#button_type' => 'button',
'#src' =>'sites/all/modules/flexifield/images/strippable.png',
'#value' => t('Delete this record'),
'#weight' => 1,
'#ahah' => array(
'path' => 'flexifield/ahah/deleteone/' .$aElement['#type_name']. '/' .$aElement['#id']. '/'. implode(':', $aElement['#array_parents']). '/'. implode(':', $aElement['#parents']),
'wrapper' => $aWrap . '-items',
'method' => 'replace',
'effect' => 'fade',
),
);
'file' => 'flexifield-widget.inc',
'page callback' => 'flexifield_ahah_deleteone',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
В итоге этот код обрабатывает данные и должен вернуть обновленный элемент страницы, но...
$form_state = array('submitted' => FALSE);
$form_build_id = $_POST['form_build_id'];
$form = form_get_cache($form_build_id, $form_state);
if (!$form) {
// Invalid form_build_id.
drupal_json(array('data' => ''));
exit;
}
$form_copy = $form;
$form_state_copy = $form_state;
$form_copy['#post'] = array();
form_builder($_POST['form_id'], $form_copy, $form_state_copy);
// Just grab the data we need.
$form_state['values'] = $form_state_copy['values'];
// Reset cached ids, so that they don't affect the actual form we output.
form_clean_id(NULL, TRUE);
//...here change $form_state according the task
$form_element = content_field_form($form, $form_state, $field);
// Let other modules alter it.
drupal_alter('form', $form_element, array(), 'flexifield_deleteone_js');
// Add the new element at the right place in the (original, unbuilt) form.
if (module_exists('fieldgroup') && ($group_name = _fieldgroup_field_get_group($type['type'], $field_name))) {
$form[$group_name][$field_name] = $form_element[$field_name];
}
else {
$form[$field_name] = $form_element[$field_name];
}
// Save the new definition of the form.
$form_state['values'] = array();
form_set_cache($form_build_id, $form, $form_state);
// Build the new form against the incoming $_POST values so that we can
// render the new element.
foreach ($_POST[$field_name] as $delta => $item) {
if($delta!==$iKey){
$i = $i+1;
if($delta>$iKey){
$_POST[$field_name][$delta-1] = $item;
}
}
}
unset($_POST[$field_name][$count]);
$form_state = array('submitted' => FALSE);
$form += array(
'#post' => $_POST,
'#programmed' => FALSE,
);
$form = form_builder($_POST['form_id'], $form, $form_state);
// Render the new output.
$field_form = (!empty($group_name)) ? $form[$group_name][$field_name] : $form[$field_name];
$render = drupal_render($field_form);
drupal_json(array('status' => TRUE, 'data' => $render));
Комментарии
А собственно в каких строках в последнем отрывке кода происходит удаление элемента из массива формы?
в файрбаге смотрели что приходит? тут кто-то писал, что при некоторых обстоятельствах, ф-я drupal_json может давать сбой
//...here change $form_state according the task - на месте этого комментария в функции я работаю с массивом данных, который хранится в $form_state :
foreach ($_POST[$field_name] as $delta => $item) {
if($delta!==$iKey){
$i = $i+1;
if($delta>$iKey){
$form_state['values'][$field_name][$delta-1] = $item;
}
}
}
unset($form_state['values'][$field_name][$i]);
Еще надо проверить 'wrapper' верно ли указан(после того, как проверить, что приходит с сервера в файрбаге).
в FireBug`е приходит нужный код уже без поля, который удалил пользователь. внешний wrapper тот же, что и навешен на ['#ahah']['wrapper'], только вот в ответе и в html в файрбаге вместо скобок '<>' приходит \x3c. Это так и должно быть? или в этом ошибка?
Да, так и должно быть.