Макет формы в друпале из модуля

Я создал свой собственный модуль под названием "cssswitch". Я пытаюсь создать свой собственный HTML-макет для отображения части формы модуля администратора. Я понимаю, как использовать hook_form_alter() для изменения элементов формы, но мне нужно создать весь макет формы, чтобы некоторые поля появлялись рядом друг с другом. Кажется, мне нужно что-то вроде того, как у меня отображается внешний вид узла, отображаемого с помощью theme_cssswitch_display(), но для административной части узла.

function cssswitch_form_alter(&$form, $form_state, $form_id) {

    switch($form_id) {  

        case 'cssswitch_node_form':
            $form['hour_start']['#prefix'] = '<div class="start-box">';
            $form['ampm_start']['#suffix'] = '</div>';
            $form['ampm_start']['#attributes'] = array("style" => "border-width:2px;");
            break;
    }

}

function cssswitch_theme() {

    return array(
      'cssswitch_display' => array(
        'arguments' => array('node'),
      ),

    );

}

// to display the view of the node
function theme_cssswitch_display($node) {

  $output = '<div class="cssswitch-cssfilename">Filename: '.
    check_plain($node->cssfilename). '</div>';
  $output .= '<div class="cssswitch-time_start">Start: '.
    check_plain($node->hour_start). ':'.check_plain($node->minute_start).' '.check_plain($node->ampm_start).'</div>';

  $output .= '<div class="cssswitch-time_end">End: '.
    check_plain($node->hour_end). ':'.check_plain($node->minute_end).' '.check_plain($node->ampm_end).'</div>';    

  return $output;
}

спасибо за любую помощь

3 ответа

Решение

Я все разобрался сейчас. Моя hook_theme это:

function cssswitch_theme() {

    return array(
      'cssswitch_display' => array(
        'arguments' => array('node'),
      ),

      'cssswitch_node_form' => array(
        'arguments' => array('form' => NULL),
        'template' => 'cssswitch-node-form.tpl.php',
      ),

      );

}

Я создал файл themes/garland/cssswitch-node-form.tpl.php. Затем я могу контролировать, куда помещать любые элементы формы, например:

<style>
#edit-hour-start-wrapper, #edit-minute-start-wrapper, #edit-ampm-start-wrapper, #edit-hour-end-wrapper, #edit-minute-end-wrapper, #edit-ampm-end-wrapper {
    float:left;
    margin-right:25px;
}
</style>
<div id="regform1">

<?php print drupal_render($form['title']); ?>
<?php print drupal_render($form['cssfilename']); ?>

    <fieldset class="group-account-basics collapsible">
        <legend>Time Start</legend>
        <?php print drupal_render($form['hour_start']); ?>
        <?php print drupal_render($form['minute_start']); ?>
        <?php print drupal_render($form['ampm_start']); ?>
    </fieldset>

    <fieldset class="group-account-basics collapsible"><legend>Time end</legend>
        <?php print drupal_render($form['hour_end']); ?>
        <?php print drupal_render($form['minute_end']); ?>
        <?php print drupal_render($form['ampm_end']); ?>    
    </fieldset>
</div>

<?php print drupal_render($form['options']); ?>
<?php print drupal_render($form['author']); ?>
<?php print drupal_render($form['revision_information']); ?>
<?php print drupal_render($form['path']); ?>
<?php print drupal_render($form['attachments']); ?>
<?php print drupal_render($form['comment_settings']); ?>
<?php print drupal_render($form); ?>

hook_form_alter нужен только, если вы хотите изменить форму, определенную другим модулем. Поскольку вы определяете форму, вам не нужно ее изменять, вместо этого вы можете просто определить ее так, как хотите.

Чтобы изменить разметку формы, вам нужно #theme атрибут самой формы и / или ее элементов. С его помощью вы можете использовать свои собственные функции темы для визуализации формы и ее элементов.

Ищите помощь в справочнике Drupal по FAPI.

Я нашел большую часть того, что мне нужно сейчас. Мне пришлось использовать "предложенный" идентификатор формы, который мне дала Themer Info, который был "cssswitch_node_form". Я использовал это в своей функции построения форм с именем "cssswitch_form(), например: $ form ['# theme'] = 'cssswitch_node_form';

Мне также нужно использовать это имя в этой функции:

function cssswitch_theme() {

    return array(
      'cssswitch_display' => array(
        'arguments' => array('node'),
      ),

      'cssswitch_node_form' => array(
        'arguments' => array('form' => NULL),
      ),      


    );

А вот функция с тем же именем, но с добавлением к ней "theme_":

function theme_cssswitch_node_form($form) {

    $output='';
    $output.='<span>testing 123</span>';
    $output.=drupal_render($form['hour_start']['name']);
    $output.=drupal_render($form['minute_start']);
        $output .= drupal_render($form);

  return $output;

}

У меня все еще есть проблема HTML-кода, окружающего элементы формы с помощью divs автоматически, а это не то, что я хотел. В этом случае я хочу разместить некоторые элементы формы рядом. Я предполагаю, что это то, что делает функция drupal_render(). Есть ли вызов функции, который просто даст мне элемент формы без всей разметки HTML?

Спасибо

Другие вопросы по тегам