2011-03-14 57 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。