Как получить доступ к пользовательскому элементу формы Zend? - PullRequest
0 голосов
/ 20 июля 2011

Я создал файл Phone.php в каталоге application / forms / elements. Подпись класса выглядит следующим образом: class Form_Element_Phone extends Zend_Form_Element_Xhtml

В моем Bootstrap у меня есть следующее:

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

            return $autoLoader;

Я думал, что это автоматически загрузит пользовательский элемент формы, когда я наберу $phone = new Form_Element_Phone( 'phone' ); в моем объекте формы в каталоге application / forms. Почему это не работает? Разве все в каталоге приложения не должно быть доступно таким образом из-за кода в файле Bootstrap ??? Я получаю Fatal error: Class 'Form_Element_Phone' not found ошибку.

Я также попытался $this->addElementPrefixPath('Form_Element', APPLICATION_PATH . '/forms/elements'); в функции init моего класса формы. Но это ничего не изменило. Что я делаю неправильно? Заранее благодарю за помощь.

Ответы [ 4 ]

0 голосов
/ 20 июля 2011

Как уже упоминалось, вам нужно зарегистрировать пустое пространство имен в автозагрузчике.Для этого вам нужно будет использовать 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 вашего приложения.

EDIT

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 голосов
/ 20 июля 2011

Попробуйте проверить свою форму внутри. Может быть, вы ошиблись, когда позвонили. Как:

класс Form_SomeForm расширяет Zend_Form

Проверьте это И проверить в контроллере, когда вы запрашиваете форму

0 голосов
/ 20 июля 2011

Если вы настроили свой автозагрузчик в глобальном конфигурационном файле только с пространством имен, вы сможете избежать сложного пользовательского кода для его настройки.В моем application.ini у меня есть следующее:

appnamespace = "Application"

Загрузчик ресурсов ZF имеет расположение по умолчанию для форм в APPLICATION_PATH/forms.Итак, с учетом вышеизложенного мои имена классов форм начинаются с Application_.Чтобы использовать пользовательский элемент формы, вы можете создать APPLICATION_PATH/forms/Element/Phone.php и использовать имя класса Application_Form_Element_Phone.Я попробовал это только сейчас, и это прекрасно работает.Если префикс Application в именах ваших классов слишком длинный, вы можете заменить его на что-то более короткое, например App или My.

0 голосов
/ 20 июля 2011

Попробуйте это Мужчины

 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;
       }
...