Api Drupal 7 Form Invalid foreach with tableselect EDIT-如何从tableselect中删除选定行

Api Drupal 7 Form Invalid foreach with tableselect EDIT-如何从tableselect中删除选定行,api,drupal-7,form-api,Api,Drupal 7,Form Api,我试图做的是使用表单API创建一个selectlist,用户可以在其中选择行,然后按delete按钮,从数据库中删除所选行,并重新加载表,确认所选行已被删除。对于我当前的代码,当我点击删除按钮时,我得到以下错误: 警告:在C:\xampp\htdocs\amaware\includes\form.inc的表单\u execute\u处理程序第1431行中为foreach提供的参数无效 代码如下: /** * Implements hook_men

我试图做的是使用表单API创建一个selectlist,用户可以在其中选择行,然后按delete按钮,从数据库中删除所选行,并重新加载表,确认所选行已被删除。对于我当前的代码,当我点击删除按钮时,我得到以下错误:

警告:在C:\xampp\htdocs\amaware\includes\form.inc的表单\u execute\u处理程序第1431行中为foreach提供的参数无效

代码如下:

            /**
             * 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();
                    }
                }   
            }
非常感谢您的帮助

编辑: 我编辑了我的新闻信表格,内容如下:

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']       . '');
    }
}
新的输出让我感到困惑,不知如何识别选定的行,并将它们从数据库中删除。使用上面的时事通讯\u table\u form\u delete,我得到以下输出:

如果我选择最上面一行,什么也不会发生 如果选择第二行,则输出为1 如果选择第三行,则输出为2,依此类推 如果我选择了多行,则输出是所选行的无序html列表。 我现在很好奇,我怎么能把我现在拥有的东西改变,这样我就可以从数据库中删除选定的行

再次感谢

试试换衣服

  $form['delete'] = array(
    '#type' => 'submit',
    '#value' => t('Delect Selected'),
        '#submit' => 'newsletter_table_form_delete'
  );

根据问题编辑中添加的其他信息,我注意到您的tableselect是在没有指定数组键的情况下构建的,如:

foreach ($results as $line) {
    $rows[] = array(  // <-- No array keys specified here 
        $line->name,
        $line->number,
        $line->email,
    );
}
由于没有指定键,PHP的默认值是基于0的索引。这就是为什么顶部行没有结果,第二行没有结果,依此类推

有关示例,请参见


我不知道您的数据库表结构是什么样子,但您可能需要查询表的主键,并将其作为数组键包含到$rows数组中。这样,当您在delete函数中处理数据时,您就拥有了要删除的行的主键并将其删除。

对于我来说,这不是立即清除的

我只想补充一点,nmc最后说的是,应该像这样构造行,向行添加一个键

foreach ($results as $line) {
                    $rows[$line->name] = array(
                        $line->name,
                        $line->number,
                        $line->email,
);

当我用它更新代码时,我没有看到任何更改的输出。我所做的是将我的新闻稿(表格)(表格)(表格)(表格)(表格)更新为(表格)(表格)(表格)表格(表格(表格)表格)(表格)表格)(表格)表格)(表格)表格)(表格))表格['table'].;}}}最大的区别是我将形式_state从['delete']更改为['table']。但现在我有了号码responses@LucasHealy你说的数字是什么意思?预期的响应是什么?首先,对不起,评论中的代码太难看了。如果在评论中有更好的方法,请告诉我。但基本上,当我从表选择列表中选择一行并按delete键时,我的模块会生成一条消息。如果我选择表中的第一行,则不会收到任何消息,第二行则显示消息me 1,依此类推。我很难给出这里的全部细节,但没有显示一些代码。如果您仍然感兴趣,我在这里详细地发布了我的问题:我基本上只想知道如何识别选定的行并删除它们,我想我没有得到预期的响应,但我希望我的回答是可以识别并删除所选行的。@LucasHealy可以编辑上面的问题,以提供评论中不易阅读的任何其他信息/代码片段。
foreach ($results as $line) {
                    $rows[$line->name] = array(
                        $line->name,
                        $line->number,
                        $line->email,
);