1

私がやろうとしているのは、フォームAPIを使用して選択リストを作成することです。ユーザーは行を選択し、削除ボタンを押してデータベースから選択した行を削除し、選択した行が削除されたというコンフォメーションでテーブルを再読み込みします。現在のコードでは、削除ボタンを押すと次のエラーが発生します。

警告:form_execute_handlers()のforeach()に無効な引数が指定されました(C:\ xampp \ htdocs \ amaware \ include \ form.incの1431行目)。

コードは次のとおりです。

            /**
             * 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. 2行目を選択すると、出力は1になります。
  3. 3番目の行を選択すると、出力は2になります。
  4. 複数の行を選択すると、出力は選択された行の順序付けられていないhtmlリストになります。

データベースから選択した行を削除できるように、現在持っているものをどのように変更して変更できるのか、今興味があります。

再度、感謝します!

4

2 に答える 2

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
  );

質問の編集で追加された追加情報に基づいて、tableselectが次のような配列キーを指定せずに構築されていることに気付きました。

foreach ($results as $line) {
    $rows[] = array(  // <-- No array keys specified here 
        $line->name,
        $line->number,
        $line->email,
    );
}

キーが指定されていないため、PHPのデフォルトは0ベースのインデックスです。そのため、一番上の行で1、2番目の行で1というように結果が得られません。

例については、要素のドキュメントをtableselect参照してください。

データベーステーブルの構造がどのようになっているのかわかりませんが、テーブルの主キーをクエリして、配列の配列キーとして含める必要があります$rows。これにより、削除機能でデータを処理するときに、削除する行の主キーを取得して削除することができます。

于 2012-08-01T21:35:57.250 に答える
0

私にとって、これはすぐにははっきりしませんでした。

最後に、nmcが言っていたことは、行にキーを追加するこのように行を作成する必要があるということです。

foreach ($results as $line) {
                    $rows[$line->name] = array(
                        $line->name,
                        $line->number,
                        $line->email,
);
于 2014-03-28T10:15:01.327 に答える