Можно ли использовать Zend Form 2 с Zend Framework 1?

Я попытался заменить папку Form нового фреймворка папкой Zend Framework 1, но это не сработало.

Я также пытался указать ZF1 в библиотеке новую папку Form 2.0, но я тоже не могу заставить это работать.

Кто-нибудь знает, как это сделать?


person Samuele    schedule 18.10.2012    source источник
comment
Я не думаю, что это невозможно, так как все компоненты ZF слабо связаны. Таким образом, все компоненты можно использовать по отдельности. Однако вы не можете использовать код ZF1 для доступа к компоненту формы ZF2, потому что он полностью переписан. См. также: framework.zend.com/manual/2.0/en/ref /обзор.html   -  person Dirk McQuickly    schedule 18.10.2012


Ответы (1)


Компоненты ZF2 можно использовать с ZF1, и по большей части это относительно просто.

Прежде всего вам нужно будет клонировать zf2 в путь к вашей библиотеке, поэтому перейдите к library и введите: -

git clone https://github.com/zendframework/zf2.git Zf2

Это создаст папку Zf2 в библиотеке.

Теперь нам нужно сообщить автозагрузчику, как найти файлы zf2. в вашем бутстрапе добавьте следующее: -

protected function _initZf2()
{
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->pushAutoloader(new App_Loader_Autoloader_Zf2(), 'Zend');
}

Затем создаем автозагрузчик. У меня есть пространство имен App_, которое включено в application.ini с помощью этой строки:

autoloadernamespaces[] = "App_"

и я создал автозагрузчик в App/Loader/Autoloader/Zf2.php: -

class App_Loader_Autoloader_Zf2 implements Zend_Loader_Autoloader_Interface
{
    public function autoload($class)
    {
        if(strstr($class, '\\')){
            $zf2Class = explode('\\', $class);
            $path = 'Zf2/library/' . implode('/', $zf2Class) . '.php';
            include_once $path;
        }
    }
}

Теперь zf1 знает, где найти классы zf2, когда представлено правильное пространство имен. Мы можем создать форму, например Application/Forms/Zf2.php:

use Zend\Form\Form;
use Zend\Form\Element;
use Zend\Form\Element\Text;

class Application_Form_Zf2 extends Form

{
    public function prepareElements()
    {
        $this->add(array(
            'name' => 'name',
            'options' => array(
                'label' => 'Your name',
            ),
            'attributes' => array(
                'type'  => 'text',
            ),
        ));
    }
}

Теперь в вашем контроллере вы можете создать экземпляр формы zf2:

$this->view->form = new Application_Form_Zf2();
$this->view->form->prepareElements();

Поскольку мы используем представление ZF1, у нас нет автоматического доступа к помощники представлений, которые используются для рендеринга форм ZF2, поэтому мы должны явно создавать их экземпляры в представлении по мере необходимости:-

$form = $this->form;
$formHelper = new \Zend\Form\View\Helper\Form();
$formText = new \Zend\Form\View\Helper\FormText();
$formLabel = new \Zend\Form\View\Helper\FormLabel();
echo $formHelper->openTag($form);
echo $formLabel($form->get('name'));
echo $formText($form->get('name'));
echo $formHelper->closeTag($form);

Это выведет следующий HTML: -

<form action="" method="POST">
    <label for="name">Your name</label>
    <input name="name" type="text" value="">
</form>

Этот метод дает вам большой контроль над выводом ваших форм, и я бы рекомендовал скрыть часть кода, который я поместил в файл phtml выше, в помощнике представления ZF1.

person vascowhite    schedule 19.10.2012
comment
Я полагаю, вы хотели сказать «в ZF1», а не «в ZF2»? - person markus; 19.10.2012
comment
Большое спасибо за ответ... В понедельник попробую... :) - person Samuele; 19.10.2012