Проверка формы zf2 (связанные с zfcAdmin и BjyAuthorize)

Я столкнулся с проблемами проверки, интегрируя мой пользовательский модуль в zfcAdmin и BjyAuthorize.

Мой класс формы:

... $formOptions = $this->settings->getFormSettings(); foreach ($formOptions as $field){ if (isset($field['field'])) $this->add($field['field']); } ... 

Мой класс фильтра:

 $formOptions = $this->settings->getFormSettings(); foreach ($formOptions as $filter){ if (isset($filter['filter'])) $this->add($filter['filter']); } ... 

Поля, фильтры и другие параметры извлекаются из файла конфигурации.

В основном все работает нормально: данные формы могут быть добавлены, отредактированы или удалены из db. Также после установки модуля zfcAdmin проблем не возникло. Все работает отлично, используя маршрут «site / mymodule» и «site / admin / mymodule»: я могу добавлять, редактировать и удалять элементы из db.

Здесь проблема: мне нужны некоторые элементы формы (a Выберите в этом конкретном случае), редактируемые / доступные только администратору. (Я могу написать новый класс контроллера / сущности ad hoc для администратора, но я бы хотел использовать тот же код для всего сайта.)

Я установил и настроил модуль bjyoungblood / BjyAuthorize: он позволил мне отображать некоторые элементы / поля формы только для администратора, но когда я в режиме редактирования, отображается ошибка проверки формы: «Значение требуется и не может быть пустым»

Здесь код:

 //view/mymodule/mymodule/update.phtml <div id="page" style="margin-top: 50px;"> <?php if (isset($this->messages) && count($this->messages) > 0 ): ?> <?php foreach ($this->messages as $msg): ?> <div class="alert alert-<?php echo $this->escapeHtmlAttr($msg['type']); ?>"> <?php if (isset($msg['icon'])) echo '<i class="'.$this->escapeHtmlAttr($msg['icon']).'"></i>&nbsp;'; ?><?php echo $this->escapeHtml($msg['message']); ?> </div> <?php endforeach; ?> <?php endif; ?> <?php $title = 'Edit Item'; $this->headTitle($title); ?> <h1><?php echo $this->escapeHtml($title); ?></h1> <?php $form = $this->form; $form->setAttribute('action', $this->url($this->route . 'mymodule/update', array('action' => 'update', 'id' => $this->id ))); $form->prepare(); $form->setAttribute('method', 'post'); $input = $form->getInputFilter(); ?> <?php echo $this->form()->openTag($form) ?> <dl class="zend_form"> <?php foreach ($form as $element): ?> <?php //CHECK USER PRIVILEDGES $elName = $element->getName(); $elResource = isset($this->form_options[$elName]['auth']) ? $this->form_options[$elName]['auth']['resource'] : "userresource"; $elPrivilege = isset($this->form_options[$elName]['auth']) ? $this->form_options[$elName]['auth']['privilege'] : "view"; //SHOW THE ELEMENT IF ALLOWED if($this->isAllowed($elResource, $elPrivilege)): ?> <?php if ($element->getLabel() != null): ?> <dt><?php echo $this->formLabel($element) ?></dt> <?php endif ?> <?php if ($element instanceof Zend\Form\Element\Button): ?> <dd><?php echo $this->formButton($element) ?></dd> <?php elseif ($element instanceof Zend\Form\Element\Select): ?> <dd><?php echo $this->formSelect($element) . $this->formElementErrors($element) ?></dd> <?php else: ?> <dd><?php echo $this->formInput($element) . $this->formElementErrors($element) ?></dd> <?php endif ?> <?php else: ?> <?php ?> <?php endif ?> <?php endforeach ?> </dl> <?php echo $this->form()->closeTag() ?> </div> <div class="clear-both"></div> 

Мое действие контроллера

 //controller public function updateAction(){ $messages = array(); $id = (int)$this->getEvent()->getRouteMatch()->getParam('id'); $form = $this->getServiceLocator()->get('FormItemService'); $itemMapper = $this->getItemMapper(); $item = $itemMapper->findById($id); $form->bind($item); $request = $this->getRequest(); if($request->isPost()){ $form->setData($request->getPost()); if ($form->isValid()) { die('c');//never here $service = $this->getServiceLocator()->get('mymodule\Service\Item'); if ( $service->save($form->getData()) ) { $messages[] = array( 'type' => 'success', 'icon' => 'icon-ok-sign', 'message' => 'Your profile has been updated successfully!', ); } else { $messages[] = array( 'type' => 'error', 'icon' => 'icon-remove-sign', 'message' => 'Profile update failed! See error messages below for more details.', ); } }else{ var_dump($form->getMessages());//Value is required and can't be empty } } return array( 'messages' => $messages, 'form' => $form, 'id' => $id, 'form_options' => $this->getServiceLocator()->get('mymodule_module_options')->getFormSettings(), 'route' => $this->checkRoute($this->getEvent()->getRouteMatch()->getmatchedRouteName()) ); } 

Если пользователю не разрешено просматривать ресурс, элемент не будет эхом. Таким образом, $ request-> getPost () не имеет значения для этого элемента формы, и ошибка возвращается isValid ().

Кто-нибудь решил аналогичную проблему, или кто-нибудь может указать мне в правильном направлении? благодаря

Проблема в том, что вы не проводите проверку безопасности в своем классе FormFilter, где вы определяете свои обязательные поля.

Функция $ form-> isValid () проверяет опубликованные данные против этих фильтрующих элементов. Поэтому недостаточно для предотвращения «эхо-поля» в вашем представлении, вам все равно нужно применить проверку безопасности к элементу фильтра.

Еще один подход заключался бы в том, чтобы сделать две формы одной для передней и одной для администратора. Поскольку один для администратора будет иметь те же поля плюс одно дополнительное поле выбора, вы можете сделать админ-форму, расширяя переднюю часть. Например

 class myForm { public function __construct(...) { // add fields and set validators } } 

и форма администратора может быть:

 class MyAdminForm extends myForm { public function __construct(...) { parent::__construct(...); // add the extra field and extra validator } } 

Таким образом, даже если вы редактируете форму переднего конца (или валидаторы), задняя часть всегда будет актуальной.

Надеюсь это поможет :),

Стоян