2010-05-10 5 views
3

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

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; 
} 

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

ответ

2

Я все это разобрал. Мой 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', 
    ), 

    ); 

} 

Я создал ТЕМЫ файл/гирлянда/cssswitch-узловой-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

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

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

Обратитесь за помощью в Drupal's FAPI reference.

+0

Спасибо, что указал мне в правильном направлении. Я чувствую, что у меня почти есть это сейчас, но моя форма не связана с функцией в моем модуле.Я добавил имя функции темы в функцию формы следующим образом: $ form ['# theme'] = 'cssswitch_form'; функция cssswitch_theme() { \t возврата массива ( \t 'cssswitch_display' => Array ( \t 'аргументы' => массив ('узел'), \t), \t 'cssswitch_form' => Array ( \t 'arguments' => array(), \t), \t \t); } function theme_cssswitch_form ($ form) { $ output = ' тестирование 123'; $ output. = Drupal_render ($ form); return $ output; } – EricP

+0

@EricP не забудьте очистить кеш, это самая обычная проблема с функциями темы. – googletorp

0

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

спасибо