макет формы в друпале из модуля - PullRequest
3 голосов
/ 10 мая 2010

Я создал свой собственный модуль под названием "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 ]

2 голосов
/ 17 мая 2010

Я все разобрал сейчас. Моя ловушка-тема такая:

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); ?>
1 голос
/ 11 мая 2010

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

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

Обратитесь за помощью в Справочник Drupal по FAPI .

0 голосов
/ 11 мая 2010

Я нашел большую часть того, что мне сейчас нужно. Мне пришлось использовать «предложенный» идентификатор формы, который мне дала 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?

спасибо

...