Как отобразить форму в виде таблицы - PullRequest
2 голосов
/ 27 августа 2010

Я создал форму, которая имеет следующую структуру

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 отображал форму в виде таблицы?

PS Col 1 = select, Col 2 = checkbox, Col 3 = texfield, а самый первый столбец - этоrow # Row1, Row2, Row3.

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

Ответы [ 5 ]

2 голосов
/ 27 августа 2010

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


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;

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

2 голосов
/ 27 августа 2010

Это должно работать. Я не уверен, что находится в ваших реальных массивах (часть, которая закомментирована), но это должно отобразить все это в виде таблицы. Я использую 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>';
1 голос
/ 27 августа 2010

Вы можете по отдельности переопределить функцию темы каждого элемента формы, установив свойство #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.

1 голос
/ 27 августа 2010

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

1 голос
/ 27 августа 2010

предполагается, что row1, row2 - это fieldset.

Если вы хотите создать форму темы и поместить поля в таблицу:

Определите идентификатор формы (вы можете посмотреть его в html-источнике формы: type = "hidden" name = "form_id" value = "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 Код места, например:

<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.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...