2011-08-10 45 views
1

我以下有關此頁面「全定製使用ViewScript裝飾」的部分 - >http://devzone.zend.com/article/3450ViewScript裝飾無法設置

在我的表單類的init方法我已經加入這個

$this->setDecorators(
      array(
       array(
        'ViewScript', 
         array(
          'script' => 'display.phtml' 
         ) 
       ) 
      ) 
     ); 

現在在我的形式出現的地方,我有這樣的:

出錯
應用程序錯誤

我在做什麼錯在這裏?我真的需要自定義表單的外觀,而我只想更改表單而不是整個頁面的外觀。

我已經試過這樣:

$this->setElementDecorators(array(array('ViewScript', array('viewScript'=>'display.phtml')))) 

哪些工作,但會影響整個頁面(我使用Zend佈局)的顯示。我只需要將表單的呈現傳遞給display.phtml頁面。

注意:有沒有特別的地方需要放置display.phtml?我把它放在view \ scripts文件夾中。

回答

1

使用視圖腳本時,我發現最好在視圖級別進行任何這樣的更改。

忽略表單中的「ViewScript」裝飾細節,並從視圖中設置它們,例如

<?php echo $this->form->setDecorators(array(
    'PrepareElements', 
    array('ViewScript', array('viewScript' => '_forms/display.phtml')) 
)) ?> 

display.phtml文件的位置是相對於模塊的視圖腳本文件夾中。如果這只是默認模塊(在application文件夾下),我的示例中的腳本將位於application/views/scripts/_forms/display.phtml

+0

我在表單的init()這樣做,它改變了頁面。我真的只想改變表單的渲染輸出,而不是完整的頁面。有沒有辦法做到這一點? – AntonioCS

+0

@AntonioCS您是否從我的答案中概述的視圖中嘗試過?你的'display.phtml'文件是什麼樣的? – Phil

2

我認爲它是如此簡單。

由於一個簡單的原因,ViewScript不能用於表單的init()方法。如果你看看這個例子(可能是你的display.phtml),那麼就有這樣的回聲陳述$this->form->firstname;。在init()中的這一點上,表單元素尚未加載!

筆者因此正確地顯示驗證碼

$form->setDecorators(array(
    array('ViewScript', array('script' => 'demogForm.phtml')) 
)); 

注意,他用$form爲對象。無論是在控制器還是視圖腳本中,您都可以將表單作爲對象加載,然後添加ViewScript。因此,在你的控制器之一,你會這樣做

$form = new My_Form(); 
$scriptPath = '/path/to/script/display.pthml' 
// or without a path if you have a script folder loaded 
$form->setDecorators(array(
    array('ViewScript', array('script' => $scriptPath)) 
)); 

這應該做的伎倆。

更新看着你pthml命名我認爲(和希望)這是您的形式和你的整個佈局文件一個特殊的模板。如果您使用整個佈局文件,那麼當然如果將渲染整個頁面!

+0

修飾器只在渲染時被調用。您可以在添加元素之前,之後或期間添加它們。 – Phil

+0

我希望這個細微差別在文檔中的某處變得更加明顯。我花了太久想知道,如果我在init()中設置ViewScript裝飾器的嘗試失敗了,因爲我做錯了什麼。 – David

0

如果你想刪除HTML標籤,如<dt><dd>(標籤和viewscript),可以使用方法removeDecorator('HtmlTag')removeDecorator('Label')