ВопросДинамическое содержимое формы и AJAX

Суть в следующем: есть форма, которая построчно, циклом, выводит записи из пользовательской таблицы, добавляя под каждый элемент кнопочки "не показывать", "удалить" и "редактировать". Сделано без аякса, с костылями, но, все же, работает. Что нужно сделать: выводить не всё содержимое записи и сразу под ней кнопки, а только заголовки, а если уже на них кликать, то будет раскрываться всё содержимое и кнопочки (как на форумах тег свернуть/показать). Собственно и вопрос - как это можно сделать? :)

Цикл формирования элементов формы

  for ($i = 0; $i < $count; $i++) {
 
    $form['descr' . $i] = array(
      '#markup' => nl2br($jokes[$i]['text']) . '</i><br /><br />',
    );
    $form['text' . $i] = array(
      '#markup' => '<i><b><small>' . $jokes[$i]['descr'] . '</small></b></i><br /><br />',
    );
    if ($jokes[$i]['disabled'] > 0) {
      $value = 'Показывать';
    }
    else {
      $value = 'Не показывать';
    }
    $form['disabled' . $i] = array(
      '#type'   => 'submit',
      '#value'  => $value,
      '#submit' => array('rand_jokes_button_disable'),
      '#name'   => 'dis' . $jokes[$i]['disabled'] . '.' . $jokes[$i]['id'],
    );
    $form['delete' . $i] = array(
      '#type'   => 'submit',
      '#value'  => 'Удалить',
      '#submit' => array('rand_jokes_button_delete'),
      '#name'   => 'del' . $jokes[$i]['id'],
    );
    $form['edit' . $i] = array(
      '#type'   => 'submit',
      '#value'  => 'Редактировать',
      '#submit' => array('rand_jokes_button_edit'),
      '#name'   => 'upd' . $jokes[$i]['id'],
      '#suffix' => '<hr /><br /><br />',
    );
  }
  return $form;

Примеры обработки:

function rand_jokes_button_edit($form, &$form_state) {
  reset($form_state['input']);
  variable_set('rand_jokes_joke_id', substr(key($form_state['input']), 3));
  $form_state['redirect'] = 'admin/config/rand_jokes/update/form';
}
 
function rand_jokes_button_disable($form, &$form_state) {
  $send = new RandJoke();
  reset($form_state['input']);
  $send->jokeid = substr(key($form_state['input']), 5);
  reset($form_state['input']);
  $send->disjoke(substr(key($form_state['input']), 3, 1));
}

Сразу еще спрошу - у меня способ, которым связана текстовая информация с обработками кнопок некрасивый, хоть и работоспособный: через массив $form_state['input'] - ключ его первого элемента идентичен параметру #name элемента, а значение #value элемента. Есть ли более элегантные способы однозначно определить какая кнопка была нажата, если заранее неизвестно даже сколько их будет?

Комментарии

Аватар пользователя Spleshka
Spleshka написал:

Вопрос - вы хотите, чтобы при нажатии на заголовок контент и кнопки подгружались на аяксе, или же просто показывалось до этого скрытое содержимое? Просто если заголовков не сильно много - то проще прятать содержимое на странице а потом его показывать. Но если много - то, конечно, лучше подгружать его порционно.

24.05.2012 19:31
Аватар пользователя Гость
Гость написал:

Ну в идеале, конечно, лучше бы на аяксе, но первый вариант тоже интересен :) Не подскажите как сделать? :)

25.05.2012 07:16
Аватар пользователя Araused
Araused написал:

Нашел такое решение:

  for ($i = 0; $i < $count; $i++) {
    $form['field' . $i] = array(
      '#type' => 'fieldset',
      '#title' => $jokes[$i]['descr'],
      '#collapsible' => TRUE,
      '#collapsed' => TRUE,
    );
    $form['field' . $i]['descr' . $i] = array(
      '#markup' => nl2br($jokes[$i]['text']) . '<br /><br />',
    );
    if ($jokes[$i]['disabled'] > 0) {
      $value = 'Показывать';
    }
    else {
      $value = 'Не показывать';
    }
    $form['field' . $i]['disabled' . $i] = array(
      '#type'   => 'submit',
      '#value'  => $value,
      '#submit' => array('rand_jokes_button_edit_disable'),
      '#name'   => 'dis' . $jokes[$i]['disabled'] . '.' . $jokes[$i]['id'],
    );
    $form['field' . $i]['delete' . $i] = array(
      '#type'   => 'submit',
      '#value'  => 'Удалить',
      '#submit' => array('rand_jokes_button_edit_delete'),
      '#name'   => 'del' . $jokes[$i]['id'],
    );
    $form['field' . $i]['edit' . $i] = array(
      '#type'   => 'submit',
      '#value'  => 'Редактировать',
      '#submit' => array('rand_jokes_button_edit_edit'),
      '#name'   => 'upd' . $jokes[$i]['id'],
    );
  }
  return $form;

Интересно про AJAX, как это можно на нем сделать. Ну и, опять-таки, способ передачи информации функциям обработки - как можно сделать красиво? :) Быть может, как-нибудь в '#submit' можно указать параметры для вызываемой функции?

25.05.2012 11:48
Аватар пользователя Spleshka
Spleshka написал:

Простите, пропустил обновление топика. Тема еще актуальна?

31.05.2012 03:48
Аватар пользователя Гость
Гость написал:

Спасибо за участие, с грехом пополам, но разобрался :)

15.06.2012 16:18

Комментировать