Drupal 7 Form Invalid foreach с табличным выбором РЕДАКТИРОВАТЬ - Как удалить выбранные строки из табличного выбора
Я пытаюсь создать список выбора с помощью API формы, где пользователь может выбрать строки и нажать кнопку удаления, которая удаляет выбранные строки из базы данных и перезагружает таблицу с подтверждением того, что выбранные были удалены. С моим текущим кодом, когда я нажимаю кнопку удаления, я получаю эту ошибку:
Предупреждение: неверный аргумент передан для foreach() в form_execute_handlers() (строка 1431 из C:\xampp\htdocs\amaware\includes\form.inc).
Вот код:
/**
* Implements hook_menu().
*/
function smsfeed_menu() {
$items = array();
$items['admin/config/content/smsfeed'] = array(
'title' => 'SMS Messages and Newsletters',
'description' => 'Edit the Setting for the SMS Feed and Newsletter',
'page callback' => 'drupal_get_form',
'page arguments' => array('smsfeed_form'),
'access arguments' => array('access administration pages'),
'type' => MENU_NORMAL_ITEM,
);
$items['admin/config/content/smsfeed/settings'] = array(
'title' => 'Settings',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => 1,
);
$items['admin/config/content/smsfeed/newsletter'] = array(
'title' => 'Newsletter',
'page callback' => 'drupal_get_form',
'page arguments' => array('newsletter_table_form'),
'access arguments' => array('access administration pages'),
'type' => MENU_LOCAL_TASK,
'weigth' => 2,
);
$items['admin/config/content/smsfeed/feed'] = array(
'title' => 'SMS Feed',
'page callback' => 'drupal_get_form',
'page arguments' => array('feed_form'),
'access arguments' => array('access administration pages'),
'type' => MENU_LOCAL_TASK,
'weight' => 3,
);
$items['admin/config/content/smsfeed/questions'] = array(
'title' => 'Questions',
'page callback' => 'drupal_get_form',
'page arguments' => array('questions_form'),
'access arguments' => array('access administration pages'),
'type' => MENU_LOCAL_TASK,
'weigth' => 4,
);
return $items;
}
/**
* Page callback: SMS Settings
*
* @see smsfeed_menu()
*/
function smsfeed_form($form, &$form_state) {
$form['response_time'] = array(
'#type' => 'textfield',
'#title' => t('Response Time (In Days)'),
'#default_value' => variable_get('response_time', 3),
'#size' => 2,
'#maxlength' => 2,
'#description' => t('The response time, in days, that users should expect.'),
);
$form['feed_keyword'] = array(
'#type' => 'textfield',
'#title' => t('Feed Keyword'),
'#default_value' => variable_get('feed_keyword', 'FEED'),
'#size' => 10,
'#maxlength' => 10,
'#description' => t('The keyword users should text to have their message moderated and added to the website feed.'),
);
$form['join_keyword'] = array(
'#type' => 'textfield',
'#title' => t('Join Keyword'),
'#default_value' => variable_get('join_keyword', 'JOIN'),
'#size' => 10,
'#maxlength' => 10,
'#description' => t('The keyword users should text to be added to the newsletter list.'),
);
$form['quit_keyword'] = array(
'#type' => 'textfield',
'#title' => t('Quite Keyword'),
'#default_value' => variable_get('quit_keyword', 'QUIT'),
'#size' => 10,
'#maxlength' => 10,
'#description' => t('The keyword users should text to be removed from the newsletter list.'),
);
return system_settings_form($form);
}
/**
* Page Callback Newsletter
*/
function newsletter_table_form($form, $form_state) {
$rows = array();
$header = array(t('User Name'), t('User Number'), t('User E-mail'),);
$query = db_select('sms_newsletter');
$query->fields('sms_newsletter', array('name', 'number', 'email',))
->orderBy('name', 'ASC');
$results = $query->execute();
foreach ($results as $line) {
$rows[] = array(
$line->name,
$line->number,
$line->email,
);
}
$form['table'] = array(
'#type' => 'tableselect',
'#header' => $header,
'#options' => $rows,
'#empty' => t('No users found'),
);
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delect Selected'),
'#submit' => 'newsletter_table_form_delete'
);
return $form;
}
function newsletter_table_form_delete ($form, &$form_state) {
foreach ($form_state['values']['collections'] as $key => $value) {
if ($value) {
$delete = db_delete('sms_newsletter')
-> execute();
}
}
}
Любая помощь высоко ценится.
РЕДАКТИРОВАТЬ: я отредактировал мою news_letter_table_form, чтобы читать:
function newsletter_table_form_delete ($form, $form_state) {
foreach (($form_state['values']['table']) as $rows) {
//$delete = db_delete('sms_newsletter')
//-> execute();
drupal_set_message ('' . $rows . '');
//drupal_set_message ('' . $form_state['values']['table'] . '');
}
}
И новый вывод оставляет меня озадаченным относительно того, как я могу определить выбранные строки и удалить их из базы данных. Используя вышеупомянутый newsletter_table_form_delete я получаю следующий вывод:
- Если я выбираю верхний ряд, ничего не происходит
- Если я выберу вторую строку, результат будет 1
- Если я выберу третью строку, вывод 2 и так далее
- Если я выбираю несколько строк, выводом является неупорядоченный список выбранных строк в формате html.
Мне интересно, как я могу взять то, что у меня есть сейчас, и изменить его, чтобы я мог удалить выбранные строки из базы данных.
Еще раз спасибо!
2 ответа
Попробуйте изменить
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delect Selected'),
'#submit' => 'newsletter_table_form_delete'
);
в
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delect Selected'),
'#submit' => array('newsletter_table_form_delete') // <-- make this an array
);
Основываясь на дополнительной информации, добавленной при редактировании вашего вопроса, я заметил, что ваш табличный выбор построен без указания ключей массива, таких как:
foreach ($results as $line) {
$rows[] = array( // <-- No array keys specified here
$line->name,
$line->number,
$line->email,
);
}
Поскольку не было указано никаких ключей, по умолчанию в PHP используется индекс на основе 0. Вот почему вы не получаете результатов для верхнего ряда, 1 для второго ряда и так далее.
Смотрите документацию для tableselect
элемент для примера.
Я не знаю, как выглядит структура вашей таблицы базы данных, но вам, вероятно, потребуется запросить первичный ключ для таблицы и включить его в качестве ключей массива для вашей таблицы. $rows
массив. Таким образом, когда вы обрабатываете данные в функции удаления, у вас есть первичный ключ строки, которую вы хотите удалить, и удалите ее.
Для меня это было не сразу понятно, так.
Я просто хотел бы добавить, что, в конце концов, то, что говорил NMC, это то, что вы должны строить свои строки следующим образом, где вы добавляете ключ к строке.
foreach ($results as $line) {
$rows[$line->name] = array(
$line->name,
$line->number,
$line->email,
);