2011-03-14 24 views
1

我在我的页面上使用PHP代码时遇到了麻烦,在我的正文内容区域内。我在这个网站,Drupal的网站和其他网站上不知疲倦地搜索,所以我很抱歉如果答案是在某个地方,但我无法找到它,我需要帮助。在正文内容区域内使用PHP变量

我们有很多信息可以在我们的网站中重复使用,我想将它们作为变量存储在PHP文件中。我们现在在我们的网站上执行此操作,但我正在使用Drupal重写整个网站。因此,例如,我们销售软件,并且我希望为我们的每个产品网址提供一个变量,以用于网站上的各种“添加到购物车”按钮。我不想将产品网址硬编码到每个链接中,而是希望能够在任何drupal页面上调用PHP变量。

我无法获得任何工作;我已阅读了几条建议,但都没有成功。我尝试将变量设置为自己的块,然后在创建新页面时从页面内调用它们。我可以在页面上回显变量,但只能在其内部的块中显示,我不能调用它们并让它们从其他块或内容区域回显。我尝试过使用全局关键字(按照一个建议),但这并不适合我。

我希望这是有道理的。其他信息?我使用的是Drupal 6.x,我在创建页面时已经启用了PHP代码,我已经启用了PHP过滤器模块,我可以获取PHP代码来渲染,因此我知道它正在工作,但它不工作在我需要的地方是。我是Drupal的新手,所以如果任何人都可以帮助并尽可能地解释他们对我的建议,我会非常感激!

在此先感谢。

编辑11年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> 

对于这个例子,我已经在我试过的一切。你会看到我对全局变量的调用,这从来没有奏效。我在我创建的自定义块中定义了全局变量,并放置在我的“content top”区域中。我明白,该地区显然没有任何东西能够访问我的页面的内容,因为这些调用从未奏效。

我有一个自定义的令牌,我昨天用令牌模块;它从来没有工作,但后来我读了一个不同的帖子,默认情况下,令牌在主体内容区域可用,我需要一个特殊的过滤器。我还没有找到一个过滤器,所以我不知道这个解决方案将工作。

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

所以也许这个代码会帮助别人来帮助我。我现在要详细看看CCK,因为这是我还没有尝试过的唯一的其他建议。如果有人能提供帮助,请提前致谢。

+1

你需要发布你的代码,或至少一些它的样本。 – 2011-03-14 14:44:03

+2

也许现在是时候重新思考你的应用程序是如何放在一起的,这就是所谓的重构,它在我看来你非常需要这样做。在php中的全局变量被认为是一个坏习惯http://blog.case.edu/gps10/2006/07/22/why_global_variables_in_php_is_bad_programming_practice。在某些情况下,你可以使用常量,也许静态类变量会是更好的选择?不是真的很舒服,但它看起来像你非常需要记录你自己如何Drupal处理这样的事情,只是“顺其自然”,以保持标准。 – 2011-03-14 14:52:11

+0

除了Poelinca的回答:将PHP放入你的身体(即数据库)也被认为是一个不好的习惯。这是Drupal中一个非常不幸的“特性”,它会导致更多的麻烦,然后解决。 – berkes 2011-03-14 19:22:05

回答

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()默认/ 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

注意sourcevariable_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['test1_variable'] = 'test 1 variable'; 

,然后在TEMPL:底部,使用$ GLOBALS全局变量,像这样设置你的PHP变量吃(与PHP输入格式选择):

<?php 

echo "<p>This is my {$GLOBALS['test1_variable']}.</p>"; 

?> 

或...

<p>This is my short tag <?=$GLOBALS['test1_variable'];?>.</p> 

而且你应该看到你的变量从模板代码中打印出来。请注意$ GLOBALS变量周围的花括号。

+0

我很想获得关于当你说'使用数据库'时你的意思的更多信息。可以这么说,我很乐意以更符合Drupal的方式建立我们的新网站。目前,我们的网站只是一个基本的PHP网站,这就是为什么我使用PHP包含文件来存储需要在整个网站页面全局使用的变量。如果有一种方法可以将其保存在数据库中,并且这是Drupal的方式,那么您能为我提供一个链接或更多信息吗? – Julie 2011-03-14 18:09:11

+0

您正在寻找的概念是内容类型。在Drupal中,这些与创建具有列/行的表格有点相似,尽管它不完全类似。有关更多详细信息,请参阅DrColossos的答案。 http://drupal.org/node/306792 – 2011-03-14 18:22:33

+0

此外,您可以在任何作用域(全局,函数,方法)中设置一个$ GLOBALS变量,并且它将在任何这些作用域中可用。 – 2011-03-14 18:27:00

0

如果你想提供更多的信息应该与一些节点,你应该使用CCK来创建一个内容类型,它具有所有额外的信息。借助模板内的样式,您几乎可以归档任何内容。

如果CCK不可调(在大多数情况下,它正是你想要的),你需要实现一个_preprocess_函数。这看起来像

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

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

一定要让自己熟悉Drupal的template system(如果你还没有的话)。

+0

感谢您的回复。我确实尝试了preprocess_page函数,但是这只会使我的变量在page.tpl.php中可用。我需要的是在网站本身的主体内容区域中使我的变量可用。如同当​​我点击创建一个新页面,并且身体区域设置为接受PHP代码时,我想在那里调用我的变量。在preprocess_page函数中设置它们之后,有没有办法访问它们?也许我做错了。同时,我会研究CCK,看看它是否能为我解决这个问题;到目前为止,我已经得到了其他建议以使用它。 – Julie 2011-03-14 18:01:47

0

这听起来像你正在寻找token_filter模块。 我的问题是它尚未准备好(在令牌模块中)D7。