2011-07-20 38 views
0

我在application/forms/elements目錄下創建了一個Phone.php文件。類簽名如下: class Form_Element_Phone extends Zend_Form_Element_Xhtml如何訪問自定義的Zend表單元素?

在我引導我有以下幾點:

$autoLoader = new Zend_Application_Module_Autoloader(array(
              'namespace' => '', 
              'basePath' => APPLICATION_PATH)); 

      return $autoLoader; 

我認爲這將自動加載,當我在申請我的表單對象類型$phone = new Form_Element_Phone('phone');自定義表單元素/ forms目錄。 爲什麼這不起作用?應用程序目錄下的所有東西都不應該以這種方式訪問​​,因爲Bootstrap文件中的代碼?我得到Fatal error: Class 'Form_Element_Phone' not found錯誤。

我也在我的表單類的init函數中試過$this->addElementPrefixPath('Form_Element', APPLICATION_PATH . '/forms/elements');。但它沒有改變任何東西。我究竟做錯了什麼?我事先感謝您的幫助。

回答

0

試試這個男人

public function _initAutoload() 
    {  

     $resourceLoader = new Zend_Loader_Autoloader_Resource(array(
       'basePath' =>APPLICATION_PATH, 
       'namespace' => '', 
       'resourceTypes' => array(
         'form' => array(
          'path'  => 'forms/', 
          'namespace' => 'Form_', 
         ), 
         'model' => array(
           'path' => 'models/', 
           'namespace' => 'Model_' 
         ), 

         'validator' =>array(
          'path'  => 'validators/', 
          'namespace' => 'Validator_' 
         ), 
         'plugin' => array(
           'path' => 'plugins/', 
           'namespace' => 'Plugin_' 
         ), 
         'helper' => array(
           'path' => 'helpers/', 
           'namespace' => 'Helper_' 
         ), 
        ), 
       )); 

     $modelLoader = new Zend_Application_Module_Autoloader(array(
        'namespace' => '', 
        'basePath' => APPLICATION_PATH.'/modules/default')); 
     return $modelLoader; 
     return $resourceLoader; 
     } 
+0

我仍然得到同樣的錯誤。什麼是「資源類型」?什麼是聲明他們的規則? – ryy705

0

嘗試查看你在內部形成。也許你在打電話時弄錯了。 像:

類Form_SomeForm擴展Zend_Form的

檢查它 並檢查控制器的時候,你問的形式

+0

表單工作正常,沒有自定義元素 – ryy705

0

如果您設置自動加載在全局配置文件中只有一個命名空間,你應該能夠避免任何複雜的自定義代碼來設置它。在我application.ini,我有以下幾點:

appnamespace = "Application" 

ZF的資源加載器具有用於APPLICATION_PATH/forms形式的默認位置。所以在上面,我的表單類名以Application_開頭。要使用自定義表單元素,您可以創建APPLICATION_PATH/forms/Element/Phone.php,並使用類名稱Application_Form_Element_Phone。我剛纔嘗試過,效果很好。如果您的課程名稱中的Application前綴太長,則可以將其替換爲較短的內容,如AppMy

+0

感謝您的輸入。你能向我解釋我做錯了什麼嗎?我已經按照您的建議定義了應用空間。但我的理解是,由於Bootstrap文件中的代碼,我不需要將「Application」放在類名的前面。我錯了嗎?我構建了我的所有控制器和表單,而不用將「應用程序」放在他們的類名中。此外,Zend命名約定不要求我將目錄命名爲「元素」而不是「元素」?搜索課程時,它應該將'元素'變成'元素'。我錯了嗎? – ryy705

+0

我不確定您的原始設置出了什麼問題。我從來沒有做過,沒有某種appnamespace前綴。我只是傾向於在可行的情況下選擇使用ZF的默認配置和約定,因爲這意味着編寫和調試代碼更少。但是,是的,這可能意味着一些重構現在切換到此。至於Element目錄,我認爲只有在您的資源加載器配置中列出它時才需要使用較小的目錄。在我的解決方案中,它是不直接列出的子文件夾。 APPLICATION_PATH/forms/Element在我自己的測試中工作。我沒有嘗試APPLICATION_PATH/forms/elements。 – curtisdf

0

如前所述,您必須使用Autoloader註冊空名稱空間。要做到這一點,你將不得不使用Zend_Loader_Autoloader_Resource。您應該將其添加到應用程序Bootstrap。注意:@ user854029已經提到了其中的大部分內容,但忘記了Form_Element_命名空間。

protected _initAutoload() 
{ 
    // the __construct of this class registers this resource with Zend_Loader_Autoloader 
    new Zend_Loader_Autoloader_Resource(array(
     // This base path prepends paths defined in the resourceTypes below 
     'basePath' => APPLICATION_PATH, 
     'namespace' => '', 
     'resourceTypes' => array(
      'form' => array(
       'path' => 'forms/', 
       'namespace' => 'Form_' 
      ), 
      // the key 'element' is an arbitrary name I used, it's not special 
      'element' => array(
       // Now we set the path we need to append to basePath set above     
       'path' => 'forms/elements', 
       // And now we have to declare the namespace 
       'namespace' => 'Form_Element_' 
      ), 
      'model' => array(
       'path' => 'models/', 
       'namespace' => 'Model_' 
      ) 
      /** You can add the rest here as need **/ 
     ) 
    )); 
    // Note: you don't have to return anything 

} 

有關進一步的說明,請考慮將自定義類移動到您的應用程序的library目錄。

編輯

protected _initAutoload() 
{ 
    //Removed Autoloader_Resoure and Replaced with Module_Autoloader 
    new Zend_Application_Module_Autoloader(array(
     'basePath' => APPLICATION_PATH, 
     'namespace' => '', 
     'resourceTypes' => array(
      'element' => array( 
       'path'  => 'forms/elements', // This is custom 
       'namespace' => 'Form_Element' 
      ) 
     ) 
    )); 

} 
+0

我現在可以訪問自定義表單元素。但現在我得到以下錯誤: – ryy705

+0

警告:在註冊表中找不到名稱爲'PhoneElement'的表單插入的異常:使用路徑: Stack Trace: #0/home/ryy/Sites/public_html/tmpsolution。Zend_View_Helper_:Zend/View/Helper /:/ home/ryy/Sites/public_html/tmpsolution.com/application/views/helpers/ COM /庫/ Zend的/視圖/ Abstract.php(1182):Zend_Loader_PluginLoader->負載( 'PhoneElement') #1 /home/ryy/Sites/public_html/tmpsolution.com/library/Zend/View/Abstract.php( 618):Zend_View_Abstract - > _ getPlugin('helper','phoneElement') #2 /home/ryy/Sites/public_html/tmpsolution.com/library/Zend/Form/Decorator/ViewHelper.php(241): – ryy705

+0

Zend_View_Abstract- > getHelper('phoneElement') #3 /home/ryy/Sites/public_html/tmpsolution.com/library/Zend/Form/Element.php(2023):Zend_Form_Decorator_ViewHelper-> render('') #4/home/RYY /網站/的public_html/tmpsolution.com /庫/的Zend /表格/迪科拉符/ FormElements.php(101):Zend_Form_Element->渲染() #5 /home/ryy/Sites/public_html/tmpsolution.com/library/Zend/Form.php(2908):Zend_Form_Decorator_FormElements->渲染( '') #6 /家庭/ RYY /硅在/home/ryy/Sites/public_html/tmpsolution.com/library/Zend/Form.php線2929 – ryy705

相關問題