особенности FormAPI

Главные вкладки

Аватар пользователя Vendict Vendict 6 июня 2009 в 21:59

Назрело два вопроса по формам.
1) как сделать в форме ввод данных как в /admin/build/modules, т.е. в виде таблицы. но при этом чтобы присутствовали остальные контролы как обычно.
2) как сделать расположение описания поля слева от поля, а не сверху от поля.

Комментарии

Аватар пользователя penexe penexe 6 июня 2009 в 22:54

1) любую форму(даже системную) можно темизировать через свои theme функции

сначала идет сама форма

<?php
$form 
= array();
// form
$form['content_ranking'] = array(
  
'#type' => 'fieldset',
  
'#title' => t('Content ranking'),
);
$form['content_ranking']['#theme'] = 'node_search_admin'// говорим какую тему использовать
$form['content_ranking']['info'] = array(
  
'#value' => '<em>'t('The following numbers control which properties the content search should favor when ordering the results. Higher numbers mean more influence, zero means the property is ignored. Changing these numbers does not require the search index to be rebuilt. Changes take effect immediately.') .'</em>'
);

$ranking = array('node_rank_relevance' => t('Keyword relevance'),
                 
'node_rank_recent' => t('Recently posted'));
if (
module_exists('comment')) {
  
$ranking['node_rank_comments'] = t('Number of comments');
}
if (
module_exists('statistics') && variable_get('statistics_count_content_views'0)) {
  
$ranking['node_rank_views'] = t('Number of views');
}

// Note: reversed to reflect that higher number = higher ranking.
$options drupal_map_assoc(range(010));
foreach (
$ranking as $var => $title) { // $var - ключ
  
$form['content_ranking']['factors'][$var] = array(
    
'#title' => $title,
    
'#type' => 'select',
    
'#options' => $options,
    
'#default_value' => variable_get($var5),
  );
}
return 
$form;
?>
<?php
затем надо определить 
<a href="http://api.drupal.org/api/function/hook_theme/6">hook_theme</a>
function 
node_theme() {
  return array(
    
'node_search_admin' => array( // название нашей темы
      
'arguments' => array('form' => NULL),
    ),
  );
}
?>

затем сама функция

<?php
function theme_node_search_admin($form) {
  
$output drupal_render($form['info']); // рендер поля

  

$header = array(t('Factor'), t('Weight'));
  foreach (
element_children($form['factors']) as $key) { // ключ, который раньше был $var
    
$row = array();
    
$row[] = $form['factors'][$key]['#title']; // выводим лейбл элемента
    
unset($form['factors'][$key]['#title']); // удаляем его
    
$row[] = drupal_render($form['factors'][$key]); рендер элемента(селектауже без лейбла
    $rows
[] = $row;
  }
  
$output .= theme('table'$header$rows); // оборачиваем в таблицу

  

$output .= drupal_render($form); // другие полей которые не были отрендерены до этого
  
return $output;
}
?>

2) переопределение theme_form_element