3

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

助けてくれてありがとう

4

3 に答える 3

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',
      ),

      );

}

ファイル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); ?>
于 2010-05-17T18:27:42.870 に答える
1

hook_form_alter別のモジュールが定義したフォームを変更したい場合にのみ必要です。フォームを定義しているので、フォームを変更する必要はありません。代わりに、必要に応じて定義することができます。

フォームのマークアップを変更するために使用する必要があるの#themeは、フォーム自体および/またはその要素の属性です。これを使用すると、独自のテーマ関数を使用してフォームとその要素をレンダリングできます。

Drupal の FAPI リファレンスでヘルプを探してください。

于 2010-05-10T20:24:57.240 に答える
0

今必要なもののほとんどを見つけました。Themer Info が提供してくれた「提案された」フォーム ID を使用する必要がありましたが、これは「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;

}

フォーム要素を div で自動的に囲む html コードの問題がまだありますが、これは私が望んでいたものではありません。この例では、いくつかのフォーム要素を並べて配置したいと考えています。それが関数 drupal_render() の機能だと思います。すべての HTML マークアップなしでフォーム要素を提供する関数呼び出しはありますか?

ありがとう

于 2010-05-11T18:03:17.043 に答える