2017-02-15 19 views
0

Я работаю над созданием модуля Drupal, который позволяет пользователю выбирать контакт. Если они выбирают контакт и у контакта есть дети, тогда им разрешено выбирать дочернего ребенка, например. Stackoverflow> C++> Марк. Хотя я запрограммировал это на PHP отлично, мне трудно заставить этот код работать в Drupal 7. Любая помощь приветствуется :-). Кажется, у меня проблема с тем, как Drupal обрабатывает формы (например, визуализирует визуализацию формы дважды).Drupal 7 Module Рекурсивные материалы

SQL

CREATE TABLE `contacts` (
    `id` int(11) NOT NULL, 
    `parent_id` int(11) DEFAULT NULL, 
    `title` varchar(100) NOT NULL, 
    `description` text, 
    `link` varchar(250) NOT NULL, 
    `tel` varchar(15) DEFAULT NULL, 
    `tel_toll_free` varchar(15) DEFAULT NULL, 
    `email_address` varchar(50) DEFAULT NULL, 
    `mail_address` varchar(500) DEFAULT NULL, 
    `reply_msg` text, 
    `image` varchar(255) DEFAULT NULL, 
    `relevant_links` text, 
    `fax` varchar(15) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `contacts` (`id`, `parent_id`, `title`, `description`, `link`, `tel`, `tel_toll_free`, `email_address`, `mail_address`, `reply_msg`, `image`, `relevant_links`, `fax`) VALUES 

(1, NULL, 'title', 'description', 'link-1', 'tel', 'tel_toll_free', 'email_address', 'mail_address', 'reply_msg', 'image', 'relevant_links', 'fax'), 
(2, 1, 'title', 'description', 'link-2', 'tel', 'tel_toll_free', 'email_address', 'mail_address', 'reply_msg', 'image', 'relevant_links', 'fax'), 
(3, 2, 'title', 'description', 'link-3', 'tel', 'tel_toll_free', 'email_address', 'mail_address', 'reply_msg', 'image', 'relevant_links', 'fax'), 
(4, 3, 'title', 'description', 'link-4', 'tel', 'tel_toll_free', 'email_address', 'mail_address', 'reply_msg', 'image', 'relevant_links', 'fax'), 
(5, 4, 'title', 'description', 'link-5', 'tel', 'tel_toll_free', 'email_address', 'mail_address', 'reply_msg', 'image', 'relevant_links', 'fax'), 
(6, NULL, 'title', 'description', 'link-6', 'tel', 'tel_toll_free', 'email_address', 'mail_address', 'reply_msg', 'image', 'relevant_links', 'fax'); 

сборки рекурсивный селектор

function contact_us_selector($array, $selected = NULL, $placeholder = false, $parent_id = 0){ 
    if(is_array($array) && count($array) > 0) { 
    $select_box['#type'] = 'select'; 
    $select_box['#attributes'] = array('class'=> 'jumper', 'onchange' => 'this.form.submit();'); 

    if($placeholder){ 
     $select_box['#options']['null'] = t('Please Choose...'); 
     $select_box['#options_attributes']['null'] = array('selected' => 'selected', 'disabled' => 'disabled'); 
    } 
    foreach($array as $row){ 
     $select_box['#options'][$row['link']] = $row['title']; 
     if($row['link'] == $selected){ 
     $select_box['#options_attributes'][$row['link']] = array('selected' => 'selected'); 
     } 
    } 
    if($parent_id==NULL){ 
     $parent_id = 0; 
    } 
    return array('selector_'.$parent_id => $select_box); 
    } else { 
    return null; 
    } 
} 

форма дисплея Функция

function _contact_us_form($form_id, &$form_state, $conf) { 
    error_reporting(-1); 

    $form['#name'] = 'contact_selector'; 
    $form['#prefix'] = '<h1>Contact Us</h1><br/>'; 
    $form['#type'] = 'fieldset'; 

    $form['contact_selector']['#type'] = 'fieldset'; 
    $form['contact_selector']['#prefix'] = 'Who can we help you contact?'; 

    // find out selector's current count 
    if(isset($form_state['values'])){ 
    $counter = 0; 
    while ($form_state['values']['selector_'.($counter+1)]!=NULL){ 
     $counter++; 
    } 
    $contact['link'] = $form_state['values']['selector_'.$counter]; 

    // look up contact, if one is selected 
    if(isset($contact['link'])){ 
     $results = db_query('SELECT `id`, `title`, `description`, `link`, `tel`, `tel_toll_free`, `email_address`, `mail_address`, `reply_msg`, `relevant_links`, `fax` 
     FROM `contacts` 
     WHERE `link` = :link 
     LIMIT 1', 
     array(':link' => $contact['link']) 
    ); 
     if($results->rowCount()>0){ 
     foreach($results as $row){ 
      $contact['id'] = $row->id; 
      $contact['title'] = $row->title; 
      $contact['description'] = $row->description; 
      $contact['link'] = $row->link; 
      $contact['tel'] = $row->tel; 
      $contact['tel_toll_free'] = $row->tel_toll_free; 
      $contact['email_address'] = $row->email_address; 
      $contact['mail_address'] = $row->mail_address; 
      $contact['reply_msg'] = $row->reply_msg; 
      $contact['relevant_links'] = $row->relevant_links; 
      $contact['fax'] = $row->fax; 
     } 
     } 
    } 
    } 
    // generate select boxes for previous items 
    if(isset($contact['id'])){ 
    // look up parents of selected contact 
    $results = db_query('SELECT `T2`.`id`, `T2`.`parent_id`, `T2`.`link`, `T2`.`title` 
     FROM (SELECT @r AS _id, (SELECT @r := `parent_id` FROM `contacts` WHERE `id` = _id) AS `parent_id`, @l := @l +1 AS `lvl` FROM (SELECT @r := :id, @l :=0) vars, `contacts` m WHERE @r <>0) `T1` 
     JOIN `contacts` `T2` ON T1._id = `T2`.`id` 
     ORDER BY `T1`.`lvl` DESC 
     LIMIT 10;', 
     array(':id' => $contact['id']) 
    ); 
    // generate list of parent child elements 
    if($results->rowCount()>0){ 
     $crumb_lvl = 0; 
     foreach($results as $row){ 
     if($row->parent_id == NULL){ 
      $results2 = db_select('contacts') 
      ->fields('contacts', array('title','link')) 
      ->isNull('parent_id') 
      ->orderBy('title', 'ASC') 
      ->execute(); 
     } else { 
      $results2 = db_select('contacts') 
      ->fields('contacts', array('title','link')) 
      ->condition('parent_id',$contact['id'],'=') 
      ->orderBy('title', 'ASC') 
      ->execute(); 
     } 
     if($results2->rowCount()>0){ 
      $array = array(); 
      foreach($results2 as $row2){ 
      $array[] = array('title' => str_repeat('-',$crumb_lvl).' '.$row2->title, 'link' => $row2->link); 
      } 
      $form += contact_us_selector($array,$row->id,false,$row->parent_id); 
     } 
     unset($results2); 
     $crumb_lvl++; 
     } 
    } 
    } 
    // generate current selection 
    if($contact['id'] == NULL){ 
    $results = db_select('contacts') 
     ->fields('contacts', array('title','link')) 
     ->isNull('parent_id') 
     ->orderBy('title', 'ASC') 
     ->execute(); 
    } else { 
    $results = db_select('contacts') 
     ->fields('contacts', array('title','link')) 
     ->condition('parent_id',$contact['id'],'=') 
     ->orderBy('title', 'ASC') 
     ->execute(); 
    } 
    if($results->rowCount()>0){ 
    $array = array(); 
    foreach($results as $row){ 
     $array[] = array('title' => $row->title, 'link' => $row->link); 
    } 
    $form += contact_us_selector($array,null,true); 
    } 

    return $form; 
} 

ответ

0

Этот вопрос с пропуском селектора. Использование значения $ _GET отлично работало.

function contact_us_selector($array, $selected = NULL, $parent_id = 0){ 
    if(is_array($array) && count($array) > 0) { 
    $select_box['#type'] = 'select'; 
    $select_box['#attributes'] = array('class'=> 'jumper', 'onchange' => 'javascript:location.href = this.value;'); 
    $select_box['#default_value'] = "?find={$selected}"; 
    if($selected==NULL){ 
     $select_box['#options']['null'] = t('Please Choose...'); 
     $select_box['#options_attributes']['null'] = array('selected' => 'selected', 'disabled' => 'disabled'); 
    } 
    foreach($array as $row){ 
     $select_box['#options']["?find={$row['link']}"] = $row['title']; 
    } 
    if($parent_id==NULL){ 
     $parent_id = 0; 
    } 
    echo '<pre>'; 
    print_r(array('selector_'.$parent_id => $select_box)); 
    echo '</pre>'; 
    return array('selector_'.$parent_id => $select_box); 
    } else { 
    return; 
    } 
} 

Рендер

function _contact_us_form($form_id, &$form_state, $conf) { 
    error_reporting(-1); 

    //$form_state['config'] = $conf; 
    //$form_state['rebuild'] = TRUE; 
    //$form['#submit'][] = 'contact_us_form_submit'; 

    $form['#name'] = 'contact_selector'; 
    $form['#prefix'] = '<h1>Contact us</h1><br/>'; 
    $form['#type'] = 'fieldset'; 

    $form['contact_selector']['#type'] = 'fieldset'; 
    $form['contact_selector']['#prefix'] = 'Who can we help you contact?'; 

    // find out selector's current count 
    if(isset($_GET['find'])){ 
    $contact['link'] = $_GET['find']; 

    // look up contact, if one is selected 
    if(isset($contact['link'])){ 
     $results = db_query('SELECT `id`, `title`, `description`, `link`, `tel`, `tel_toll_free`, `email_address`, `mail_address`, `reply_msg`, `relevant_links`, `fax` 
     FROM `contacts` 
     WHERE `link` = :link 
     LIMIT 1', 
     array(':link' => $contact['link']) 
    ); 
     if($results->rowCount()>0){ 
     foreach($results as $row){ 
      $contact['id'] = $row->id; 
      $contact['title'] = $row->title; 
      $contact['description'] = $row->description; 
      $contact['link'] = $row->link; 
      $contact['tel'] = $row->tel; 
      $contact['tel_toll_free'] = $row->tel_toll_free; 
      $contact['email_address'] = $row->email_address; 
      $contact['mail_address'] = $row->mail_address; 
      $contact['reply_msg'] = $row->reply_msg; 
      $contact['relevant_links'] = $row->relevant_links; 
      $contact['fax'] = $row->fax; 
     } 
     } 
    } 
    } 

    // generate select boxes for previous items 
    if(isset($contact['id'])){ 
    // look up parents of selected contact 
    $results = db_query('SELECT `T2`.`id`, `T2`.`parent_id`, `T2`.`link`, `T2`.`title` 
     FROM (SELECT @r AS _id, (SELECT @r := `parent_id` FROM `contacts` WHERE `id` = _id) AS `parent_id`, @l := @l +1 AS `lvl` FROM (SELECT @r := :id, @l :=0) vars, `contacts` m WHERE @r <>0) `T1` 
     JOIN `contacts` `T2` ON T1._id = `T2`.`id` 
     ORDER BY `T1`.`lvl` DESC 
     LIMIT 10;', 
     array(':id' => $contact['id']) 
    ); 
    // generate list of parent child elements 
    if($results->rowCount()>0){ 
     $crumb_lvl = 0; 
     foreach($results as $row){ 
     if($row->parent_id==NULL){ 
      $results2 = db_select('contacts') 
      ->fields('contacts',array('title','link')) 
      ->isNull('parent_id') 
      ->orderBy('title', 'ASC') 
      ->execute(); 
     } else { 
      $results2 = db_select('contacts') 
      ->fields('contacts', array('title','link')) 
      ->condition('parent_id',$row->parent_id,'=') 
      ->orderBy('title', 'ASC') 
      ->execute(); 
     } 
     $array = array(); 
     foreach($results2 as $row2){ 
      $array[] = array('title' => str_repeat('-',$crumb_lvl).' '.$row2->title, 'link' => $row2->link); 
     } 
     $select_form_code = contact_us_selector($array,$row->link,$row->parent_id); 
     if(isset($select_form_code)){ 
      $form += $select_form_code; 
     } 
     $crumb_lvl++; 
     } 
    } 
    } 
    // generate current selection 
    if($contact['id'] == NULL){ 
    $results = db_select('contacts') 
     ->fields('contacts', array('title','link')) 
     ->isNull('parent_id') 
     ->orderBy('title', 'ASC') 
     ->execute(); 
    } else { 
    $results = db_select('contacts') 
     ->fields('contacts', array('title','link')) 
     ->condition('parent_id',$contact['id'],'=') 
     ->orderBy('title', 'ASC') 
     ->execute(); 
    } 
    if($results->rowCount()>0){ 
    $array = array(); 
    foreach($results as $row){ 
     $array[] = array('title' => $row->title, 'link' => $row->link); 
    } 
    $form += contact_us_selector($array,null,$contact['id']); 
    } 

    return $form; 
}