当php变量/不/可从包含文件的范围中获取时?

时间:2016-04-04 22:53:33

标签: php function variables scope global-variables

我正在为Drupal 7开发一个自定义主题,我有点卡住了。我没有把它发布到Drupal stackexchange,因为我不相信这个问题与Drupal有关 - 我认为这是一个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只是一个测试字符串。

现在在我们的子模板文件中,pages / test.tpl.php:

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

您希望输出为:

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

实际上,输出是这样的:

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()语句或其family require,require_once等时,脚本执行都会继续,它会在包含的文件中停止,并且变量对于包含的脚本是/始终/可用的。事实上,我认为没有/可能/改变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

使用global关键字是不优雅的,通常不推荐使用。有更简单,更简单的方法吗?我担心如果走这条路,我不可避免地会忘记全球化的变数。

我能找到的唯一可能相关的东西是来自Wordpress的论坛帖子:https://wordpress.org/support/topic/passing-php-variable-between-template-files

  

WordPress不允许您以与在非WP网站上相同的方式包含变量。解决此问题的一种方法可能是在页面上使用自定义字段,并使用该字段中的值来确定要加载的样式表。

然而,他们实际上并没有说/如何/可以这样做。

调试回溯不是特别有用:

 #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的儿童主题,而不是我希望那会很重要。

1 个答案:

答案 0 :(得分:0)

当您处理已编码的内容时,可能很难集成某些内容。你看看标准的Drupal主题模块,看看它们是如何进行的吗?

当我切换到版本6时,我已停止使用Drupal,所以我现在不知道它是如何工作的。

来自Drupal 7,关于主题的官方文档:

我认为你应该按照他们的建议注册变量,特别是在第三个链接中。