1

我在正文内容区域内的页面上使用 PHP 代码时遇到问题。我在这个站点、Drupal 的站点和其他站点上进行了不知疲倦的搜索,所以如果答案在这个站点的某个地方,我很抱歉,但我找不到它,我需要帮助。

我们在整个网站中重复使用了很多信息,我想将它们作为变量存储在 PHP 文件中。我们现在在我们的网站上这样做,但我正在重写我们的整个网站以使用 Drupal。因此,例如,我们销售软件,我想为网站上的各种“添加到购物车”按钮的每个产品 URL 设置一个变量。我不想将产品 URL 硬编码到每个链接中,而是设置我可以在任何 drupal 页面上调用的 PHP 变量。

我什么都做不了;我已经阅读了一些建议,但没有一个有效。我尝试将变量设置为它们自己的块,然后在创建新页面时从页面内调用它们。我可以在页面上回显变量,但只能在它们所在的块内,我不能调用它们并让它们从其他块或内容区域回显。我试过使用 global 关键字(根据一个建议),但这对我不起作用。

我希望这是有道理的。其他信息?我正在使用 Drupal 6.x,我在创建页面时启用了 PHP 代码,我确实启用了 PHP 过滤器模块,我可以让 PHP 代码呈现,所以我知道它正在工作,它只是在我需要的地方无法工作是。

我应该说(如果仅仅从阅读本文中不明显!)我是 Drupal 新手,所以如果有人可以帮助并尝试尽可能清楚地解释他们的建议,我将非常感激!

提前致谢。

编辑 2011 年 3 月 15 日

为了进一步解释,我将发布一些示例代码。我还没有这样做,因为还没有太多可以展示的东西,而且我认为这可能会使问题更加混乱。

所以,我制作了一个 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>

对于这个示例,我已经尝试过所有内容。你会看到我对全局变量的调用,但从未奏效。我在我创建并放置在我的“内容顶部”区域的自定义块中定义了全局变量。我了解到,显然该区域的任何内容实际上都无法访问我页面的正文内容,因为这些调用从未奏效。

我有一个昨天用 Tokens 模块制作的自定义令牌;它从来没有用过,但后来我在另一篇文章中读到,默认情况下,令牌在正文内容区域中可用,我需要一个特殊的过滤器。我还没有找到过滤器,所以我不确定这个解决方案是否会奏效。

我打电话给 variable_get。现在,这确实奏效了。我在我的 template.php 页面中定义了 variable_set。我的值在我的代码示例中使用上面的打印调用打印。但是,我今天早上看了这个页面,我认为这不是我需要的答案。因为现在我必须在所有页面上调用 variable_get 才能打印任何内容,对吗?这并不能解决我只想把所有东西都放在一个地方就可以在任何地方调用的问题。我尝试将 variable_get 调用放在我的自定义块中,但我再次无法从我的正文内容区域访问“内容顶部”中的任何内容。variable_get 调用会打印“内容顶部”中的值,但不会在内容区域的下方重新打印。

所以也许该代码会帮助某人帮助我。我现在要详细研究 CCK,因为这是我没有尝试过的唯一其他建议。如果有人可以提供帮助,请提前致谢。

4

3 回答 3

1

如果您尝试设置全局变量,然后在函数/方法块中使用它,则需要在导入时使用 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 中,您可以在 default/settings.php 页面中使用 设置全局变量variable_set(),然后使用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()

<?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 变量周围的花括号。

于 2011-03-14T14:46:36.353 回答
0

听起来您正在寻找 token_filter 模块。我的问题是它还没有为 D7 准备好(在令牌模块中)。

于 2011-03-18T12:00:51.747 回答
0

如果您想提供应与某些节点一起使用的附加信息,则应使用CCK创建具有所有附加信息的内容类型。通过模板内的样式,您几乎可以归档任何内容。

如果 CCK 不合适(在大多数情况下,这正是您想要的),您需要实现一个_preprocess_功能。这看起来像

function yourtemplate_preprocess_page(&$variables) {
  $vars['my_custom_var'] = "hello"; //anything can go here
}

现在您$my_custom_var的页面模板文件中有一个可用的。

一定要让自己熟悉 Drupal 的模板系统(如果你还没有的话)。

于 2011-03-14T15:59:06.600 回答