web-dev-qa-db-ja.com

カスタムモジュールブロック:HTMLコードを配置する場所?

Hook_block_viewを実装するカスタムモジュールがあります。ブロックコンテンツの広範なHTMLコードをどこに配置すればよいか知りたいのですが。

例えば:

$block['title'] = t('TEST');
$block['content'] = '<div id="user-custom-block">';
$block['content'] .= ... 50 LINES OF HTML.
$block['content'] .= '</div>';

私がこれまでに行ったことは、。tpl.phpファイルを作成し、そこにこのすべてのコードを配置して、次に呼び出すだけです:

$block['title'] = t('TEST');
$block['content'] = theme('user_custom_block');

それが正しいか?

はいの場合、これまでのところ、とても良い。しかし、このブロックコンテンツ内に「複雑な」ロジックがある場合はどうなりますか?

例えば:

$block['title'] = t('TEST');
for...
  $block['content'] = '<div id="user-custom-block">';
  if:
    $block['content'] .= ... 50 LINES OF HTML.
  endif;
  $block['content'] .= '</div>';
endfor;
etc
etc

。tpl.phpファイルで使用しても問題ありませんか?そうでない場合、どのアプローチを使用する必要がありますか?

このようなものを使用する必要がありますか?

/**
 * Implementation of hook_block_view().
 */
function custom_block_view($delta='') {
  $block = array();
  switch ($delta) {
    case 'my-block-id':
      $block['subject'] = t('Block Name');
      $block['content'] = custom_contents();
      break;
  }
  return $block;
}

/**
 * custom html block
 * @return string
 */
function custom_contents() {
  return '
      </p><div class="body">
        Hello World, this is a example custom Block
      </div><p>
    ';
}
2
Fabio

あなたの目標は、すべての処理をテンプレートファイルに入れないようにすることです。テンプレートをテンプレートとして扱います。一部のHTMLと場所によっては、変数を出力します。

しかし、あなたが説明していることから、「50行のHTML」のテンプレートを使用することが最も有用です。 PHP=関数で数行のHTMLを維持することは1つのことですが、50は悪夢のように聞こえます。

<!-- my-template.tpl.php -->
<div class="50-lines-of-html">
  <?php echo $this; ?>
  <?php echo $that; ?>
</div>

次に、for ...ループを実行し、そのテンプレートを使用してコンテンツを構築する関数を作成します。

function process_my_things($things) {
  $output = '';
  foreach ($things as $thing) {
    if ($it_is == TRUE) {
      // do some stuff with $thing
      $output .= theme('my-template', array('this' => $this, 'that', => $that));
    }
  }
  return $output
}

これもテーマ関数になる可能性がありますが、オーバーライドを許可する場合を除き、テーマ関数である必要はありません。

最後に、別のテーマ関数またはテンプレートをラッパーとして使用して、取得したものを配置します。上記のように、ここで$ block ['content']を使用することもできます。

$block['content'] = '<div id="my-wrapper">';
$block['content'] .= process_my_things($things);
$block['content'] .= '</div>';
1
calebtr

あなたは2つの異なるオプションでそれを改善することができます:1)テーマ関数の作成2)テンプレートファイルの作成(tpl)

Tplはよりクリーンなオプションかもしれませんが、どちらも似ています。どちらの場合も、ロジックをテーマ関数/ tplファイル内に配置する代わりに、前処理された変数を渡す必要があります。

また、リテラル文字列はt()関数を通過する必要があることに注意してください。

1
Pere