Zend Framework 2:为布局创建搜索小部件
Zend Framework 2: Create Search Widget for Layout
我有一个小的私人项目来学习 ZF2。我已将 Zend Lucene
集成为 Search Function
。这很好用,但我现在想在我的布局中集成一个搜索字段,以便它在所有页面上都可用。我真的不确定如何实现这一目标。首先,我认为这是用 View Helper
完成的是否正确?正如您在下面看到的,我不知道我必须在我的助手 __invoke()
中输入什么才能显示我的 Search Form
。我的方法总体上是正确的还是有更好的方法?我想要一个好的 ZF2
解决方案,有人可以给我一些建议吗?非常感谢您。
好的,到目前为止我做了什么:
1。我创建了一个表格:
namespace Advert\Form;
use Zend\Form\Form;
class SearchForm extends Form
{
public function __construct()
{
parent::__construct('search');
$this->setAttribute('method', 'post');
$this->add(array(
'name' => 'query',
'attributes' => array(
'type' => 'text',
'id' => 'queryText',
'required' => 'required'
),
'options' => array(
'label' => 'Search String',
),
));
$this->add(array(
'name' => 'submit',
'attributes' => array(
'type' => 'submit',
'value' => 'Search'
),
));
}
}
2。创建了一个视图助手 DisplaySearchForm.php !!! 2.更新!!!
非常感谢 AlexP 的帮助!!!
namespace Advert\View\Helper;
use Zend\View\Helper\AbstractHelper;
use Zend\Form\ElementInterface;
class DisplaySearchForm extends AbstractHelper
{
protected $form;
public function __construct($form)
{
$this->form = $form;
}
public function __invoke($form = null)
{
if ($form) {
$this->form = $form;
}
return $this->render($this->form);
}
public function render($form)
{
// return $this->getView()->form($form);
// To use my own Style, I have added a Partial
return $this->getView()->render('partial/search', array('form' => $form));
}
}
我在某处读到,在 Helper 中使用 ServiceLocator 并不好,所以我考虑在 Factory 中这样做,然后我将在其中获取 Form。所以我创建了一个工厂(不确定工厂是否正确)
3。创建工厂
namespace Advert\View\Helper;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class DisplaySearchFormFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator) {
$realServiceLocator = $serviceLocator->getServiceLocator();
$form = $realServiceLocator->get('FormElementManager')->get('\Advert\Form\SearchForm');
$helper = new DisplaySearchForm($form);
return $helper;
}
}
4.我在 module.php
中注册了工厂
public function getViewHelperConfig()
{
return array(
'factories' => array(
'displaySearchForm' => 'Advert\View\Helper\DisplaySearchForm',
)
)
}
5.在我的布局中 layout.phtml
<?php echo $this->displaySearchForm(); ?>
AbstractHelper
有一个 getView()
其中 returns 'renderer'。这意味着您可以使用所有需要的视图助手,就像在视图脚本中一样。
新助手可能是这样的。
use Zend\Form\ElementInterface;
class DisplaySearchForm extends AbstractHelper
{
protected $element; // Form element to render
public function __construct(ElementInterface $element)
{
$this->element = $element;
}
public function __invoke($element = null)
{
if ($element) {
$this->element = $element;
}
return $this->render($this->element);
}
public function render(ElementInterface $element)
{
return $this->getView()->form($element);
}
}
我有一个小的私人项目来学习 ZF2。我已将 Zend Lucene
集成为 Search Function
。这很好用,但我现在想在我的布局中集成一个搜索字段,以便它在所有页面上都可用。我真的不确定如何实现这一目标。首先,我认为这是用 View Helper
完成的是否正确?正如您在下面看到的,我不知道我必须在我的助手 __invoke()
中输入什么才能显示我的 Search Form
。我的方法总体上是正确的还是有更好的方法?我想要一个好的 ZF2
解决方案,有人可以给我一些建议吗?非常感谢您。
好的,到目前为止我做了什么:
1。我创建了一个表格:
namespace Advert\Form;
use Zend\Form\Form;
class SearchForm extends Form
{
public function __construct()
{
parent::__construct('search');
$this->setAttribute('method', 'post');
$this->add(array(
'name' => 'query',
'attributes' => array(
'type' => 'text',
'id' => 'queryText',
'required' => 'required'
),
'options' => array(
'label' => 'Search String',
),
));
$this->add(array(
'name' => 'submit',
'attributes' => array(
'type' => 'submit',
'value' => 'Search'
),
));
}
}
2。创建了一个视图助手 DisplaySearchForm.php !!! 2.更新!!!
非常感谢 AlexP 的帮助!!!
namespace Advert\View\Helper;
use Zend\View\Helper\AbstractHelper;
use Zend\Form\ElementInterface;
class DisplaySearchForm extends AbstractHelper
{
protected $form;
public function __construct($form)
{
$this->form = $form;
}
public function __invoke($form = null)
{
if ($form) {
$this->form = $form;
}
return $this->render($this->form);
}
public function render($form)
{
// return $this->getView()->form($form);
// To use my own Style, I have added a Partial
return $this->getView()->render('partial/search', array('form' => $form));
}
}
我在某处读到,在 Helper 中使用 ServiceLocator 并不好,所以我考虑在 Factory 中这样做,然后我将在其中获取 Form。所以我创建了一个工厂(不确定工厂是否正确)
3。创建工厂
namespace Advert\View\Helper;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class DisplaySearchFormFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator) {
$realServiceLocator = $serviceLocator->getServiceLocator();
$form = $realServiceLocator->get('FormElementManager')->get('\Advert\Form\SearchForm');
$helper = new DisplaySearchForm($form);
return $helper;
}
}
4.我在 module.php
中注册了工厂public function getViewHelperConfig()
{
return array(
'factories' => array(
'displaySearchForm' => 'Advert\View\Helper\DisplaySearchForm',
)
)
}
5.在我的布局中 layout.phtml
<?php echo $this->displaySearchForm(); ?>
AbstractHelper
有一个 getView()
其中 returns 'renderer'。这意味着您可以使用所有需要的视图助手,就像在视图脚本中一样。
新助手可能是这样的。
use Zend\Form\ElementInterface;
class DisplaySearchForm extends AbstractHelper
{
protected $element; // Form element to render
public function __construct(ElementInterface $element)
{
$this->element = $element;
}
public function __invoke($element = null)
{
if ($element) {
$this->element = $element;
}
return $this->render($this->element);
}
public function render(ElementInterface $element)
{
return $this->getView()->form($element);
}
}