2016-04-04 9 views
0

私はDrupal 7のカスタムテーマを開発していますが、私はちょっと立ち往生しています。私はこの問題がDrupalに関係しているとは思わないので、Drupalスタックエクスチェンジにこれを投稿していません。これはPHP言語の問題だと思います。php変数/含まれていない/利用可能なインクルードファイルのスコープからですか?

Drupalは、基本的には、page.tpl.php、page - front.tpl.phpなどの名前付きファイルを探します。

私のhtml.tpl.phpファイルでは、私のページの全体的な構造を定義するのが便利だとわかりました。異なるページが(例えばページフロント、フロントページのように)アクセスされたときに、次のコードが実行される:

<?php 
$subtemplate = "front/content"; 
include("page.tpl.php"); 
?> 

ニースとシンプル。

今度は、page.tpl.phpで全体的なHTMLの構造を見てみましょう:

<?php 
if(!isset($subtemplate)) { 
    $subtemplate = "test"; 
}?> 
<html> (etc) 
... 
<?php print "from main template file:" . $content_column_class; ?> 
<?php $x="hello"; ?> 
<?php include "pages/$subtemplate.tpl.php"; ?> 

も非常に簡単。 $ content_column_classはテーマによって提供され、$ xは単なるテスト文字列です。

from main template file: class="col-sm-12" 
from sub template file: class="col-sm-12" 
hello 

は、実際には、出力はこれです:あなたは出力はこのことを期待する

<?php echo $x; ?> 
<?php print "from sub template file:" . $content_column_class; ?> 

:私たちのサブテンプレートファイル、ページ/ test.tpl.phpで今

from main template file: class="col-sm-12" 
Notice: Undefined variable: x in include() (line 1 of /buildkit/build/CiviCRM/sites/all/themes/common/templates/pages/test.tpl.php). 
Notice: Undefined variable: content_column_class in include() (line 1 of /buildkit/build/CiviCRM/sites/all/themes/common/templates/pages/test.tpl.php). 

これはわかりません。実際、私はPHP開発者として何年もの間何も見たことがありません。 include()ステートメントまたはそのファミリがrequire、on_onceなどを使用するたびに、スクリプトの実行はインクルードされたファイルの中で中断された場所で継続され、変数はインクルードされたスクリプトで/ always/availableになります。実際、このようなinclude()の振る舞いを変更することはできませんでした。

今、私はこの問題を解決することができます。

<?php global $x; ?> 
<?php global $content_column_class; ?> 
<?php echo $x; ?> 
<?php print "from subtemplate:" . $content_column_class; ?> 

予想通り今、出力は次のとおりです。グローバルキーワードを使用して

from main template file: class="col-sm-12" 
from sub template file: class="col-sm-12" 
hello 

は、洗練と一般的には推奨できません。これを行う簡単で簡単な方法はありますか?私はこのルートを取るならば、グローバル化することを忘れてしまった変数が必然的に存在するのではないかと心配しています。

releventかもしれない、私は見つけることができる唯一のことは、Wordpressのから、このフォーラムの投稿です:https://wordpress.org/support/topic/passing-php-variable-between-template-files

WordPressはあなたが非WPに行う可能性があります同じように変数を含めることはできませんサイト。これにアプローチする1つの方法は、ページ上のカスタムフィールドを使用し、そのフィールドの値を使用してロードするスタイルシートを決定する方法です。

しかし、実際には/ how/itはこれを行うことはできません。

デバッグバックトレースは特に便利ではありません。

#0 include() called at [/buildkit/build/CiviCRM/sites/all/themes/common/templates/page.tpl.php:100] 
#1 include(/buildkit/build/CiviCRM/sites/all/themes/common/templates /page.tpl.php) called at [/buildkit/build/CiviCRM/includes/theme.inc:1525] 
#2 theme_render_template(sites/all/themes/common/templates/page.tpl.php, Array ([page] => Array ([#show_messages] => 1,[#theme] => page,[#theme_wrappers] => Array ([0] => html),[#type] => page,[#icon] => ,[#icon_position] => before,[#process] => Array ([0] => bootstrap_form_process),[#pre_render] => Array ([0] => bootstrap_pre_render),[content] => Array ([workbench_block] => Array ([#markup] => ... 

ことは可能ですか?誰が私がここで何が起こっているのか、それがどのように克服されるのかを理解するのを助けることができますか?

テーマはDrupal Bootstrapの子供のテーマですが、私はそれが重要であるとは思っていません。

+0

デバッグ出力がコードと一致しません。テストを再実行し、一貫してコピーアンドペーストします。また、 'include'呼び出しを' require'呼び出しに変更してください。 – miken32

+1

サブテンプレートファイルの 'debug_print_backtrace()'への呼び出しを追加してください。 '<?php print" from subtemplate: " $ content_column_class; ?>

'および[add](http://stackoverflow.com/posts/36414304/edit)あなたの質問への出力(マイナス実際の絶対パス) – VolkerK

答えて

0

既にコーディングされたものを使用している場合、いくつかのものを統合するのは難しいかもしれません。あなたは標準のDrupalテーマモジュールの中を見て、彼らがどのように進行するのを見たことがありますか?

バージョン6に切り替えるとDrupalの使用が中止されましたので、現在どのように動作しているのかわかりません。

は、Drupalの7テーマについて、公式ドキュメントから:

私は、彼らは、特に第3のリンクに提案として、あなたの変数を登録すべきだと思います。

関連する問題