我在我的身体内容区域内的网页上使用PHP代码时遇到了麻烦。我在这个网站,Drupal的网站和其他网站上不知疲倦地搜索,所以如果答案是在这个网站的某个地方,我很抱歉,但我找不到它,我需要帮助。
我们在整个网站中重用了很多信息,我希望将它们存储在PHP文件中作为变量。我们现在在我们的网站上这样做,但我正在重写整个网站以使用Drupal。因此,例如,我们销售软件,我想为网站上的各种“添加到购物车”按钮的每个产品网址添加一个变量。我不想将产品URL硬编码到每个链接中,而是要在任何drupal页面上调用PHP变量。
我无法得到任何工作;我已经阅读了几条建议但没有任何建议。我已经尝试将变量设置为自己的块,然后在创建新页面时从页面内调用它们。我可以回显页面上的变量,但只能在它们所在的块内,我不能调用它们并让它们从其他块或内容区域回显。我已经尝试使用global关键字(根据一个建议),但这对我不起作用。
我希望这是有道理的。其他信息?我正在使用Drupal 6.x,我在创建页面时启用了PHP代码,我确实启用了PHP过滤器模块,我可以使用PHP代码进行渲染,所以我知道它正在工作,它只是在我需要它的地方工作是
我应该说(如果只是通过阅读这个来说并不明显!)我是一个Drupal新手,所以如果有人能帮助我并尽可能明白地解释他们的建议,我真的很感激!
提前致谢。
编辑3/15/11
为了进一步解释,我将发布一些示例代码。我还没有这样做,因为还没有太多展示,我认为这可能会使问题更加混乱。
所以,我做了一个Drupal'页面',这是我们的软件试用版下载。我想要设置的PHP变量用于我们的下载链接;我想将它们放在一个地方,这样如果将来下载链接需要改变,我只需要在一个地方这样做。您看,我们在各种网站页面上都有下载链接。我们的“立即购买”链接也是如此。这是页面代码:
<p>Try [product] free for 30 days.</p>
<!--<p>[token_custom_ewintry]</p>-->
<p><?php global $ewintry; ?><a href="<?php print $ewintry; ?>">Download for Windows PC</a></p>
<p><?php global $emactry; ?><a href="<?php print $emactry; ?>">Download for Mac OS X</a></p>
<p><?php global $ebbtry; ?><a href="<?php print $ebbtry; ?>">Download for BlackBerry</a></p>
<?php
$ebbtryprint = variable_get("ebbtry", "default");
print $ebbtryprint;
?>
<p><a href="<?php print $ewmtry; ?>">Download for Windows Mobile</a></p>
<p><?php global $ipewlstorelink; ?>iPhone, iPad, iPod touch owners: <a href="<?php print $ipewlstorelink; ?>">Download [product] on the iTunes App Store</a>. You'll be able to create 10 cards for free to try [product] before you buy!</p>
对于这个样本,我已经离开了我尝试过的所有内容。你会看到我对全局变量的调用,这些变量从未奏效。我在我创建的自定义块中定义了全局变量,并将其放置在“内容顶部”区域中。我了解到,显然该地区的任何内容都无法访问我的网页内容,因为这些调用从未奏效。
我昨天使用令牌模块制作了一个自定义令牌;它从来没有工作,但后来我读了一个不同的帖子,默认情况下,令牌在身体内容区域可用,我需要一个特殊的过滤器。我还没有找到过滤器,所以我不确定这个解决方案是否会起作用。
我打电话给variable_get。现在,这确实有效。我在template.php页面中定义了variable_set。我的值在我的代码示例中使用上面的打印调用打印。但是,我今天早上看了这个页面,我认为这不是我需要的答案。因为现在我必须在我的所有页面上调用variable_get才能打印任何内容,对吧?这并没有解决我只想在一个地方设置所有内容以便随处调用的问题。我尝试将variable_get调用放入我的自定义块中,但我再次无法从我的正文内容区域访问“内容顶部”中的任何内容。 variable_get调用打印'content top'中的值,但不会在内容区域下面重新打印。
所以也许这段代码会帮助别人帮助我。我现在要详细查看CCK,因为这是我没有尝过的唯一其他建议。如果有人可以提供帮助,请提前致谢。
答案 0 :(得分:1)
如果您尝试设置global variable,然后在函数/方法块中使用它,则需要在导入时使用global关键字:
<?php
// For some reason, this sometimes gives me problems
$foo = 'test';
// So I do this instead, they are equivalent
$GLOBALS['bar'] = 'test';
echo "<p>Global <br/> foo: $foo <br/> bar: $bar</p>";
function globalTest() {
global $foo;
echo "<p>globalTest() <br/> foo: $foo <br/> bar: $bar</p>";
}
globalTest();
function globalBarTest() {
global $foo, $bar;
echo "<p>globalBarTest() <br/> foo: $foo <br/> bar: $bar</p>";
}
globalBarTest();
?>
行动中:http://jfcoder.com/test/globals.php
打印:
Global
foo: test
bar: test
globalTest()
foo: test
bar:
globalBarTest()
foo: test
bar: test
我一直养成使用$ GLOBALS设置全局变量的习惯,我从来没有遇到任何问题。
但是,我要提醒一下,设置全局范围的变量被认为是有害的(或至少是不必要的),因为它们很容易意外地覆盖代码中的其他地方(由您和/或其他人)。您在说明中陈述的方法听起来很混乱;您应该使用数据库并让Drupal抽象如何组织,设置和获取数据存储区中的数据,而不是编辑文件并将一些链接和数据硬编码到PHP文件中。这就是我在想你的描述,这可能不公平,但我想我需要提一下。
修改强>
在Drupal中,您可以使用variable_set()
在default / settings.php页面中设置全局变量,然后使用variable_get()
按名称获取变量。
http://api.drupal.org/api/drupal/sites--default--default.settings.php/6
variable_set('foo','bar');
http://api.drupal.org/api/drupal/includes--theme.inc/function/template_preprocess/6
function yourtemplate_preprocess (&$variables) {
$vars['foo'] = variable_get('foo');
}
编辑2
请注意variable_set()
功能的source:
<?php
function variable_set($name, $value) {
global $conf;
$serialized_value = serialize($value);
db_query("UPDATE {variable} SET value = '%s' WHERE name = '%s'", $serialized_value, $name);
if (!db_affected_rows()) {
@db_query("INSERT INTO {variable} (name, value) VALUES ('%s', '%s')", $name, $serialized_value);
}
cache_clear_all('variables', 'cache');
$conf[$name] = $value;
}
?>
修改强>
好的,这是你可以做的:
/drupal-root/htdocs/sites/settings.php
打开settings.php文件,在底部,使用$ GLOBALS全局变量设置PHP变量,如下所示:
$GLOBALS['test1_variable'] = 'test 1 variable';
然后在您的模板中(选择了PHP输入格式):
<?php
echo "<p>This is my {$GLOBALS['test1_variable']}.</p>";
?>
或者...
<p>This is my short tag <?=$GLOBALS['test1_variable'];?>.</p>
您应该从模板代码中看到您的变量在页面上打印出来。请注意$ GLOBALS变量周围的花括号。
答案 1 :(得分:0)
如果您想提供应该与某些节点一起使用的其他信息,您应该使用CCK创建一个包含所有其他信息的内容类型。通过在模板中设置样式,您几乎可以存档任何内容。
如果CCK不是可换行的(在大多数情况下,它正是你想要的),你需要实现_preprocess_
函数。这看起来像
function yourtemplate_preprocess_page(&$variables) {
$vars['my_custom_var'] = "hello"; //anything can go here
}
现在,您的页面模板文件中有$my_custom_var
。
一定要熟悉Drupal的template system(如果你还没有)。
答案 2 :(得分:0)
听起来您正在寻找token_filter模块。 我的问题是它尚未准备好(在令牌模块中)D7。