2010-08-26 2 views
2

Я создал форму, которая имеет следующую структуруКак визуализировать форму в виде таблицы

function myfunction(){ 

     $form['myform']['row1']['field1'] = array(
     //type, title, etc. 
    ); 
     $form['myform']['row1']['field2'] = array(
     //type, title, etc. 
    ); 
     $form['myform']['row1']['field3'] = array(
     //type, title, etc. 
    ); 


     $form['myform']['row2']['field1'] = array(
     //type, title, etc. 
    ); 
     $form['myform']['row2']['field2'] = array(
     //type, title, etc. 
    ); 
     $form['myform']['row2']['field3'] = array(
     //type, title, etc. 
    ); 
} 

, но я хотел бы сделать его в виде таблицы в формате с головой строки, если это возможно ,

     Col 1    Col 2    Col 3 
----------------------------------------------------------------------   
Row 1     Field 1   Field 2    Field 3 
Row 2     Field 1   Field 2    Field 3 
Row 3     Field 1   Field 2    Field 3 

Какой формат следует использовать, чтобы заставить Drupal отображать форму в виде таблицы?

P.S. Col 1 = select, Col 2 = checkbox, Col 3 = texfield и первая колонка row #Row1, Row2, Row3.

Редактировать: не имеет ли drupal что-то, что вы могли бы дать ему форму, и оно автоматически произведет этот цветный ряд, белый ряд выглядит?

+0

Каково фактическое содержание одного из массивов? – hookedonwinter

ответ

2

Нечто подобное может помочь.


function yourmodule_yourform($form){ 

    $header = array(
     'field1', 'field2', 'field3', 
    ); 

    $rows = array(); 

    $rows[] = array('data' => array(drupal_render($form['row1']['field1'], drupal_render($form['row1']['field2'], drupal_render($form['row1']['field3']))))); 

    $rows[] = array('data' => array(drupal_render($form['row2']['field1'], drupal_render($form['row2']['field2'], drupal_render($form['row2']['field3']))))); 

    $rows[] = array('data' => array(drupal_render($form['row3']['field1'], drupal_render($form['row3']['field2'], drupal_render($form['row3']['field3']))))); 

    $output = theme('table', $header, $rows, array('id' => 'yourid')); 
    $output .= drupal_render($form); 

    return $output; 

} 

UPD.

Также вы можете играть с атрибутом класса, как это:



$header = array(
     'Title', array('data' => t('Checkbox one'), 'class' => 'checkbox'), array('data' => t('Checkbox two'), 'class' => 'checkbox'), 
    ); 

$row[] = drupal_render($form['name']); 

$row[] = array('data' => drupal_render($form['checkbox_one']), 'class' => 'checkbox'); 

$row[] = array('data' => drupal_render($form['checkbox_two'], 'class'=> 'checkbox'); 

$rows[] = $row; 

$output = theme('table', $header, $rows, array('id' => 'yourid')); 
$output .= drupal_render($form); 

return $output; 

Я не уверен, можно ли использовать некоторые другие классы, кроме флажка. Довольно уверен, что вы можете каким-то образом использовать вес, но не уверены в других.

+0

Возможно, вы должны сделать это в виде темы или функции препроцесса, правильно? –

+0

Вы делаете это в функции темы формы, а не в препроцессе. – angryobject

+0

Я пытался заставить этот код работать в течение часа. У вас есть код примера? – AgA

2

Это должно сработать. Я не уверен, что в ваших реальных массивах (часть, которая закомментирована), но это должно отображать все это как таблицу. Я использую implode, потому что я не знаю, что находится в этих массивах, но это отобразит его с пробелом между каждым элементом массива ячеек.

echo '<table>'; 

echo '<tr><th></th><th>Cell 1</th><th>Cell 2</th><th>Cell 3</th></tr>'; 

foreach($form['myform'] as $row) 
{ 
    echo '<tr>'; 
    foreach($row as $cell) 
    { 
     echo '<td>' . implode(' ',$cell) . '</td>'; 
    } 
    echo '</tr> 
} 

echo '</table>'; 
+0

Также я понимаю, что это не совсем красиво. Если какой-либо из них не имеет смысла, дайте мне знать, и я буду размышлять. – hookedonwinter

+0

Также обратите внимание, что я ничего не знаю о drupal. Поэтому некоторые другие ответы могут быть лучше подходят для вашей ситуации. – hookedonwinter

1

предположим ряд1, ряд2 - fieldset.

Если вы хотите тему формы и места полей в таблице:

Определите идентификатор формы (вы можете посмотреть его в HTML-код вашей формы: тип = «скрытый» Name = «form_id» значение =» YOURFORMID ", это должно быть как" YOURMODULENAME_myform ").

Добавить эту функцию в template.php (или добавить массив, если уже функционируют там)

function YOURTHEME_theme($existing, $type, $theme, $path) { 
    $items[] = array(
    'YOURMODULENAME_myform' => array(
     'arguments' => array('form' => NULL), 
     'template' => 'YOURMODULENAME_myform' 
     // This is file name of your themer of form 
    ), 
    ... 
    return $items; 


Добавить файл в вашу тему: YOURMODULENAME_myform.tpl.php Place кода, как это:

<table><tbody> 
    <tr> 
    <td> 
    <?php print drupal_render($form['row1']['field1']); ?> 
    </td> 
    <td> 
    <?php print drupal_render($form['row1']['field2']); ?> 
    </td> 
    ... 
    </tr> 

</tbody></table> 

<?php print drupal_render($form); // Required! ?> 


Обновить кеш в Perfomance странице.

Если вы хотите тематическом результат формы, то просто тема страницы вывода (например, узел-TYPE.tpl.php)

1

я хотел бы построить массивы drupal_render() -ED выхода из формы element_children-х, который может быть тематическим, используя theme('table', $header, $rows, $attributes = array(), $caption = NULL).

1

Вы можете индивидуально переопределить функцию темы каждой формы, установив свойство #theme.

$form = array(); 
... 
$form['#theme'] = 'my_custom_form_theme_function'; 
... 
$form['item'] = array(
    ... 
    '#theme' => 'my_custom_item_theme_function', 
); 

Вы должны определить theme_my_custom_form_theme_function и theme_my_custom_item_theme_function и зарегистрировать их hook_theme.

Смежные вопросы