2011-05-30 115 views
1

在啓用php解析的表達式引擎中,Expressionengine裏面的php標籤

如果我做了以下操作,它的工作原理和我得到的用戶名顯示。登錄用戶是admin。所以它迴應了管理員。

<?php 
    $x = '{username}'; 
    echo $x; 
?> 

但是,如果我做以下和使用{用戶名}標籤insde mkdir()功能,那麼它不工作。創建的目錄將具有名稱{username}而不是admin。這是爲什麼發生。

<?php 
    $x = '{username}'; 
    mkdir($x); 
?> 
+0

@erisco。 EE是開源的。這不是問題的關鍵。 – Pinkie 2011-05-30 05:04:36

+0

那麼,我在哪裏可以免費下載EE的源代碼?如果可以的話,我將能夠回答你的問題。 – erisco 2011-05-30 05:06:40

+0

EE是開源的,但不是免費的。你需要讓EE知道我在說什麼。 – Pinkie 2011-05-30 05:10:36

回答

2

我建議寫一個快速的plugin接受登錄的用戶名作爲參數,然後你的mkdir()在插件內工作。

class Make_directory 
{ 
    var return_data = ''; 

    function __construct() 
    { 
     $this->EE =& get_instance(); 
     $username = $this->EE->TMPL->fetch_param('username', FALSE); 

     if($username != FALSE) 
     { 
      $dir = mkdir(escapeshellarg($username)); 
     } 

     $this->return_data = $dir; 
} 

還有更多的插件,但這是它的膽量。然後把它叫做{exp:make_directory username="{logged_in_username}"}

+0

謝謝@ D-rock,我真的不需要插件。我解析模板內的PHP,我想在我的PHP代碼中使用用戶名。 – Pinkie 2011-05-31 19:52:12

+1

我的建議是,如果你把它移動到一個插件而不是在你的模板中使用PHP,你可能會有更好的運氣。更容易調試,因爲它都是純粹的PHP,我的猜測是它會起作用。 – 2011-05-31 21:50:56

0

是否有可能設置了它,以便在EE標籤之前解析您的PHP?您不僅需要設置爲允許php解析,還需要以什麼順序進行。

http://expressionengine.com/user_guide/templates/php_templates.html

+0

這不是問題。如果你看看我上面的2個例子,它適用於echo而不適用於mkdir()。我已經嘗試php解析這兩個選項(輸入和輸出),根據您的鏈接 – Pinkie 2011-05-30 03:00:47

1

表達式引擎是一個模板引擎。它幾乎可以肯定緩衝輸出然後取代它,這就是爲什麼這將與echo,但不是功能。

我不是EE的專家,但這樣的事情可能工作:

$name = get_instance()->TMPL->fetch_param('username', ''); 
mkdir(escapeshellarg($name)); 

的一點是,你需要獲得EE的回報解釋說,而不是僅僅路過的原始文本。

如果您無法輕鬆獲取EE的回報,您還可以使用ob_start()來捕獲輸出。例如:

function mkdir_obcb($dir) { 
    mkdir(escapeshellarg($dir)); 
    return ''; 
} 

ob_start('mkdir_obcb'); 
echo '{username}'; 
ob_end_clean(); 

還請注意我用的escapeshellarg()降低被攻擊的風險。

+0

謝謝。您的第一個解決方案不適用於expressionengine。在第二個解決方案中,我們如何創建一個目錄。我只看到回聲。你是如何將{username}傳遞給mkdir的,以及它在哪裏被調用。 – Pinkie 2011-05-30 04:45:59

+1

'ob_start()'接受一個回調函數作爲它的第一個參數。這個回調函數在輸出緩衝區被刷新時被調用 - 即被銷燬,清理,結束。反過來,該回調接收作爲其第一個參數的任何輸出到緩衝器。然而,我懷疑這將作爲一種解決方案,因爲即使EE使用輸出緩衝器,它的處理也只會在它自己的緩衝器結束時發生 - 這是在我們製作的緩衝器結束之後,因此直到發生後調用'mkdir_obcb()'。 – erisco 2011-05-30 04:55:40

+0

@erisco是正確的,ob不會工作。你的第一個例子中的 – mjec 2011-05-30 06:07:15

0

您可能需要在CP Template Manager的模板首選項中將'PHP Parsing Stage'設置爲'output',因爲PHP在表達式引擎呈現ee標籤後執行。