2012-08-26 16 views
1

我試圖通過模板變量顯示一個HTML文本塊,它似乎沒有處理PHP。我現在在我看來,用這個(這是笨)在HTML字符串中迴應PHP代碼

<?php dump($_SESSION); echo (isset($html) && !empty($html)) ? $html : show_404(); ?> 

的HTML包括用PHP標籤幾個位置,我想,當頁面被回顯那些得到加載。有沒有辦法做到這一點?

我需要它從我通過的HTML變量工作的主要原因是因爲這是頁面創建者的一部分,我需要能夠在那裏沒有在每個頁面中的php條件。

+0

所以'$ html'變量是一個包含'<?php ...'代碼的字符串,並且您希望執行該代碼? –

+1

聽起來像你想['eval()'](http://php.net/manual/en/function.eval.php)的東西,這意味着你可能有一些更根本的錯誤,你的設計。 'eval()===√evil' - **不這樣做!** – DaveRandom

+0

'isset($ var)&&!empty($ var)'→'!empty($ var)' - 你不需要那裏多餘的'isset'。 – deceze

回答

0

還有就是要做到這一點的一種方式,但它的壞:eval()

echo (isset($html) && !empty($html)) ? eval($html) : show_404(); 
+0

如果'$ html'的內容像模板一樣(即有'<?php'),則eval將* not *工作 –

+0

有人在編程時認爲是「邪惡」,而不應該用於這個問題?嗯... – Sammaye

0

我能想到的(儘管一個更好的解決方案可能會發現,如果我知道$html是如何創建的)最快的方法將內容放入tmp文件然後包含它。這的確是一個警示標誌,也有與程序體系結構問題,但是,(例如,爲什麼不能在PHP插值來創建HTML $時做了什麼?)

$tmpFile = tempnam('/tmp', 'my_app_namespace'); 
file_put_contents($tmpFile, $html); 
include $tmpFile; 
unlink($tmpFile); // cleanup 

編輯,從Drupal的7

當您在評論暗示,Drupal的7確實包含我所說的一招:在前面加上一個PHP 關閉標籤傳遞給eval的代碼,然後將處理它像一個普通的PHP包括:

從Drupal 7的./modules/php/php.module,在第79行左右,改編了一個位:

ob_start(); 
print eval('?>' . $html); 
$output = ob_get_clean(); 
+0

這可以工作,但我很好奇Drupal如何做到這一點。他們在文章發佈中使用類似的東西。 –

+0

我在Drupal 7中發現了一些有趣的東西,不確定它是否是他們在你提到的功能中使用的東西,但它可能更符合你的期望... –

+0

注意,不管怎樣,Drupal的./includes/文件夾包含許多熱心的評論敦促人們*不*使用評估... –

1

我會親自ob這從一個文件,緩衝,然後使用get_ob_clean得到的結果,就像這樣:

ob_start(); 
     include 'temp_file_with_html_in'; 
     $view = ob_get_contents(); 
    ob_end_clean(); 

注:

  • 你的英語不清楚,所以我不確定你想要什麼
  • 這可能不會像你想要的那樣工作

也許更好地解釋什麼是$html以及它是如何來源的將有助於?