Измените жестко запрограммированную форму параметров на основе уже сохраненного $ user - PullRequest
0 голосов
/ 31 августа 2011

Чего я пытаюсь достичь

Я создаю модуль избранного, и мне нужна возможность:

  • Выберите из выпадающего списка, закодированный список опций
  • Сохранить в базе данных
  • После обновления страницы удалите уже сохраненную опцию из списка опций, чтобы ее нельзя было добавить снова

В третьей части я не уверен, как поступить.

Как настроен мой код

Это моя форма:

/*
 * Implentation of hook_form().
 */
function f25_favorites_form() {
  $listOfPaths = f25_favorites_listOfPaths();

  $form['path_options'] = array(
    '#type' => 'value',
    '#value' => array(
      'default' => $listOfPaths['default']['#title'],
      'concierge' => $listOfPaths['concierge']['#title'],
      'concierge/add' => $listOfPaths['concierge/add']['#title'],
      'survey-questions' => $listOfPaths['survey-questions']['#title'],
      'survey-questions/add' => $listOfPaths['survey-questions/add']['#title'],
      'profiles' => $listOfPaths['profiles']['#title'],
      'profiles/add' => $listOfPaths['profiles/add']['#title'],
      'statistics' => $listOfPaths['statistics']['#title'],
    )
  ); 

  $form['path'] = array(
    '#type' => 'select',
    '#title' => t('Select Page'),
    '#required' => TRUE,
    '#weight' => '11',
    '#options' => $form['path_options']['#value'],
  );

  $form[submit] = array(
    '#type' => 'submit',
    '#weight' => '1000000',
    '#value' => t('Add')
  );

  return $form;
}

Имена путей / опций вызываются через массив ссылок :

/*
 * List of Paths to add to favorites
 */
function f25_favorites_listOfPaths() {
  $list = array();
  $list = array(
    'default' => array(
      '#title' => t('Add to favorites'), 
      ),
    'concierge' => array(
      '#title' => t('Concierge'), 
      '#image' => drupal_get_path('module', 'f25_favorites').'/img/concierge.png',
      '#desc' => t('Concierge'), 
      ),
    'concierge/add' => array(
      '#title' => t('New Concierge'), 
      '#image' => drupal_get_path('module', 'f25_favorites').'/img/concierge.png',
      '#desc' => t('Concierge > Add'), 
      ),
    'survey-questions' => array(
      '#title' => t('Survey Questions'), 
      '#image' => drupal_get_path('module', 'f25_favorites').'/img/survey-questions.png',
      '#desc' => t('Current Survey Questions'), 
      ),
    'survey-questions/add' => array(
      '#title' => t('New Survey Question'), 
      '#image' => drupal_get_path('module', 'f25_favorites').'/img/survey-questions.png',
      '#desc' => t('Survery Question > Add'), 
      ),
    'profiles' => array(
      '#title' => t('Profiles'), 
      '#image' => drupal_get_path('module', 'f25_favorites').'/img/profiles.png',
      '#desc' => t('User Profiles'), 
      ),
    'profiles/add' => array(
      '#title' => t('Add Profile'), 
      '#image' => drupal_get_path('module', 'f25_favorites').'/img/profiles.png',
      '#desc' => t('Profiles > Add'), 
      ),
    'statistics' => array(
      '#title' => t('Statistics'), 
      '#image' => drupal_get_path('module', 'f25_favorites').'/img/statistics.png',
      '#desc' => t('Performance Stats'), 
      ),
  );
  return $list;
}

И все это то, что захватывает данные в базе данных:

/*
 * Write Form data to database
 */
function f25_favorites_form_submit($form, &$form_state){
  global $user;
  $listOfPaths = f25_favorites_listOfPaths();
  $selected = $form_state['values']['path'];

  $data = array(
    'uid' => $user->uid,
    'path' => $selected,
    'title' => $listOfPaths[$selected]['#title'],
    'weight' => 10,
    'timestamp' => time(),
  );

  drupal_write_record(f25_favorites, $data);
}

Возможные решения

Мне сказали, что я могу использовать hook_form_alter () для изменения моего массива, но я не уверен, когда мне следует сравнивать db_query с моим массивом и как соответствующим образом изменить различия.

Я надеюсь, что проделал хорошую работу, объясняя, что я пытаюсь сделать.
Как лучше всего это сделать?

1 Ответ

0 голосов
/ 01 сентября 2011

Вместо того, чтобы писать каждый ответ в f25_fabilities_listOfPaths (), разве вы не должны получать их из базы данных?

Затем вы можете изменить все, что вы хотите в функции отправки в базу данных, чтобы вы не могли извлечь ранее выбранный ответ.

Пример:

function f25_favorites_listOfPaths() {
  return variable_get('f25_favorites_array_' . $user->uid, array(
    // your $list array
  ));
}

function f25_favorites_submit_form($form, &$form_state) {
  // your stuff already
  drupal_write_record(f25_favorites, $data);

  // Now what I propose you to do :)
  variable_set('f25_favorites_array_' . $user->uid, array(
    // new $list array without the favorite selected
  ));
}

Использование variable_get / set (), конечно, должно быть заменено вашей собственной таблицей, если у вас слишком много данных.

P.S. : hook_form () не существует:)

...