не работает drupal_json

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

Аватар пользователя LadyLana LadyLana 8 июня 2010 в 22:18

Доброго времени суток!
Возникла такая проблема: на странице редактирования узала выводится список полей, количество заполнения которых не ограничено. Для этого есть кнопка добавления дополнительных полей заполнения. Соответственно, для каждого поля подвязана кнопка удаления из списка.
Кнопка удаления работает через AHAH, но callback никак не изменяет страницу, хотя drupal_render возвращает правильный html. В чем причина, не могу разобраться.
Буду благодарна за помощь.

$aElement['strip'] = array(
      '#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',
      ),
    );
$aItems['flexifield/ahah/deleteone'] = array(
   '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));

Комментарии

Аватар пользователя xxandeadxx xxandeadxx 8 июня 2010 в 23:37

"LadyLana" wrote:
но...

в файрбаге смотрели что приходит? тут кто-то писал, что при некоторых обстоятельствах, ф-я drupal_json может давать сбой

Аватар пользователя LadyLana LadyLana 9 июня 2010 в 0:10

//...here change $form_state according the task - на месте этого комментария в функции я работаю с массивом данных, который хранится в $form_state :

$i = (int)0;
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]);
Аватар пользователя gorr gorr 9 июня 2010 в 10:25

Еще надо проверить 'wrapper' верно ли указан(после того, как проверить, что приходит с сервера в файрбаге).

Аватар пользователя LadyLana LadyLana 9 июня 2010 в 13:29

в FireBug`е приходит нужный код уже без поля, который удалил пользователь. внешний wrapper тот же, что и навешен на ['#ahah']['wrapper'], только вот в ответе и в html в файрбаге вместо скобок '<>' приходит \x3c. Это так и должно быть? или в этом ошибка?