Hello,

I am trying to identify which rows are selected in a tableselect form. Ultimately, I'd like to drop each selected table from the database. here is what I have so far:

/**
 * 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' => 'newsletter_table_form',
		'page arguments' => array('newsletter_table_form'),
		'access arguments' => array('access administration pages'),
		'#tree' => TRUE,
		'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('Delete Selected'),
		'#submit' => array('newsletter_table_form_delete')
	);
	
  return $form;
}

function newsletter_table_form_delete ($form, $form_state) {
		foreach (($form_state['values']['table']) as $lines => $line) {
			if($line) {
				//$delete = db_delete('sms_newsletter')
				//-> execute();
				drupal_set_message ('' . $lines . '');
			}
		//drupal_set_message ('' . $form_state['values']['table']		. '');
		}
}

Using this code the message I get from Drupal when I select a row is:

Nothing for the first row, I get no message back
1 for the second row
2 for the third row

and if I select the second and third row I get an unordered HTML list that reads

  • 1
  • 2

Again, ultimately I'd like to drop each selected row from the database with a delete button below the table.

Thank you for your help!

Comments

lucasb89’s picture

For anyone hoping for an answer:

I had to specify an array key:

foreach ($results as $line) {
        $rows[] = array( // <-- Had to specify the array key there
            $line->name,
            $line->number,
            $line->email,
        );
    }

So it looks like this in the end

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

So now when something is selected it spits out the rows ID. Awesome!

Thanks to nmc at Stack Overflow!

sergey-shulipa’s picture

Thx a lot, Lucas! It works for me! Awesome!