カスタムモジュールからテンプレートファイルに変数を渡すにはどうすればよいですか?


8

カスタムモジュールからテンプレートファイルに変数を渡す最も簡単な方法を知る必要があります。custom.moduleを作成し、custom.tpl.phpをモジュールフォルダーに配置しました。

function custom_menu(){
  $items = array();

  $items['custom'] = array(
    'title' => t('custom!'),
    'page callback' => 'custom_page',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function custom_page() {

    $setVar = 'this is custom module';
    return theme('custom', $setVar);    
}

私はテーマ機能を追加しましたが、機能していません、誰でもこのコードの何が問題になっているのかを示唆できますか

function theme_custom($arg) {
  return $arg['output'];
}

function custom_theme() {
  return array(
    'Bluemarine' => array(
        'variables' => 'output',
        'template' => 'Bluemarine',
     ),
  );
}

回答:


6

モジュールを作成しているDrupalバージョンとは関係なく、コードには2つのエラーがあります。

  • 「Bluemarine」をテーマ関数として定義しますが、次にtheme('custom')「カスタム」テーマ関数を呼び出すを呼び出します
  • テンプレートファイルを使用するテーマ関数として「カスタム」を定義すると、theme_custom()は呼び出されません

Drupal 6のコードを記述している場合、コードは次のようになります。テーマ関数の名前はであると想定していcustomます。

function custom_menu(){
  $items = array();

  $items['custom'] = array(
    'title' => t('custom!'),
    'page callback' => 'custom_page',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function custom_theme() {
  return array(
    'custom' => array(
      'arguments' => array('output' => NULL),
      'template' => 'custom',
     ),
  );
}

function custom_page() {
    $output = 'This is a custom module';
    return theme('custom', $output);    
}

function theme_custom($output) {
}

モジュールがそれを実装している場合、テンプレートファイルは$output、およびで設定された変数にアクセスできtemplate_preprocess_custom()ます。

たとえば、次のようなコードを実装できます。

function template_preprocess_custom(&$variables) {
  if ($variables['output'] == 'This is a custom module') {
    $variables['append'] = ' and I wrote it myself.";
  }
}

このコードを使用する$outputと、テンプレートファイルはおよびにアクセスできます$append

テンプレートファイルを使用して、テーマ機能の例として、あなたが見ることができます(theme_node) 、で定義されているnode_theme() 、およびその用途はnode.tpl.phpテンプレートファイルとして、そのテーマ関数のNodeモジュールによって実装された前処理関数はtemplate_preprocess_node()です。


Kiamに感謝します。明らかにD6の使用に関するOPの最初のコメントを逃しました。+1
Laxman13


tplをテーマフォルダーに移動したいのですが、どうすればよいですか?
カムランアクター

@KamranAkhterそれは別の質問です。:-)
kiamlaluno

3

間違ったテーマ関数を呼び出しています。代わりにfunction theme_customそれがあるべきですfunction theme_Bluemarine。また、配列をhook_theme()の変数に渡す必要があります。こちらの簡単な例をご覧ください

あなたの例を使用する(テンプレートとテーマ関数をに変更した後custom):

function custom_menu(){
  $items = array();

  $items['custom'] = array(
    'title' => t('custom!'),
    'page callback' => 'custom_page',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function custom_page() {
  $setVar = 'this is custom module';
  return theme('custom', array('output' => $setVar));
}

function custom_theme() {
  $path = drupal_get_path('module', 'custom');
  return array(
    'custom' => array(
        'variables' => array('output' => null),
        'template' => 'custom',
     ),
  );
}

今custom.tpl.phpでちょうど必要です <?php print $output; ?>


返信ありがとう、あなたが与えた例はノードモジュールであり、私は非ノードモジュールです。私は変数をtplファイルに渡す方法が必要です、私はdrupal 6.plzヘルプを使用しています
Kamran Akhter

返信いただきありがとうございます。このようなファイルやディレクトリはありませんというエラーが表示されます。実際には、コードBluemarineにあるモジュールフォルダー内のファイルcustom.tpl.phpがカスタムによって置き換えられることを期待しています。Bluemarineは、私が使用しているdrupalテーマです。
カムランアクター

上記のコードを変更し、白い空白の画面を表示して、
plzの

コードを変更し、自分のサイトで機能させています。
Laxman13

上記のコードをコピーして貼り付けますが、機能しません
Kamran Akhter
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.