Я работаю над созданием модуля 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;
}