Указан неверный тип. Ожидаемая строка - Zend Framework 2

Я работаю над Zend Framework 2, особенно с Zend Forms. Я объявил раскрывающийся список "Выбрать" в

Форма:

$selectElement = new Element\Select('selectElement');
    $selectElement->setAttribute('title', 'Select a Value')
            ->setAttribute('id', 'id');

    $data = array(
        array(
           //Fetching the values from database
            ),
    );

   $selectElement->setAttribute('multiple', 'multiple')      
        ->setValueOptions($data);

   $this->add($selectElement);

InputFilter:

$inputFilter->add($factory->createInput(array(
                'name'     => 'selectElement',
                'required' => false,
                'filters'  => array(
                    array(
                        'name' => 'Int'
                        ),
                    ),
           )));

Я использовал Zend Debug, чтобы получить значения, которые находятся в выпадающем списке selectElement, следующим образом:

$dataSelectElements = $this->getRequest()->getPost('selectElement');
 \Zend\Debug\Debug::dump($dataSelectElements);

Результат отладки:

array(4) {
  [0] => string(2) "20"
  [1] => string(2) "22"
  [2] => string(2) "23"
  [3] => string(2) "75"
}

В основном я получаю идентификатор из формы selectElement, чтобы сохранить его в базе данных. Прямо сейчас я получаю уведомление и ошибку формы zend:

Уведомление об ошибке:

Notice: Array to string conversion in ..\zendframework\zendframework\library\Zend\Filter\Int.php on line 29

И ошибка неверной формы:

array(1) {
  [0] => array(1) {
    ["selectElement "] => array(1) {
      ["explodeInvalid"] => string(35) "Invalid type given. String expected"
    }
  }
}

Есть ли решение этой проблемы. Любая помощь будет оценена по достоинству.


person user1686230    schedule 29.10.2012    source источник


Ответы (3)


Фильтр Int попытается сделать из вашего массива данных целое число, что не сработает.

Раньше я использовал фильтр обратного вызова, который можно использовать для просмотра данных и проверки, является ли каждое значение типом Int.

Например:

'filters' => array(
    array(
        'name' => 'Callback',
        'options' => array(
            'callback' => function($values) {
                return array_filter($values, function($value) {
                    return ((int)$value == $value);
                });
            }
        )
    ),
),
person DrBeza    schedule 29.10.2012
comment
спасибо за ваш пост, это помогло в определенной степени, но сейчас я получаю ошибку [notInArray]. Это ошибка, которую я получаю для того же кода, что и упомянутый выше, с той лишь разницей, что в моем inputFilter я удалил фильтр Int и заменил его фильтром обратного вызова. Вот ошибка array(1) { [0] => array(1) { ["selectElement "] => array(1) { [0] => array(1) { ["notInArray"] => string(39) "The input was not found in the haystack" } } } }. Есть идеи, как это преодолеть - person user1686230; 29.10.2012
comment
Код работает без примененного фильтра? Если это так, возможно, стоит просто отфильтровать значения после проверки формы. В противном случае кажется, что это элементы Checkbox / Radio, которые применяют валидатор InArray для проверки истинности или ложности на входах. Это сообщение об ошибке предполагает, что валидатор InArray не получает правильные данные. Извините, я не могу больше помочь с этим. - person DrBeza; 29.10.2012

Я немного по-другому поступил, что-то вроде этого

форма

class Companyform extends Form

    {
        public function __construct()
        {
            // we want to ignore the name passed
            parent::__construct('company');

            $this->setAttribute ('method', 'post');
            $this->setAttribute ('class', 'form-horizontal');
    $this->add ( array (
                'name' => 'parentID',
                'type' => 'Zend\Form\Element\Select',        
                'attributes' => array(
                    'id' => 'parentID',
                    'type' => 'select',
                    'placeholder' => "Parent Company",
                ),
                'options' => array(
                    'label' => 'Parent Company'
                )
            ));

            $this->add(array(
                'name' => 'btnsubmit',
                'attributes' => array(
                    'id' => 'btnsubmit',
                    'type' => 'submit',
                    'value' => 'Add',   
                    'class' => 'btn btn-primary'
                ),
            ));

        }

    }

контролер

public function addAction() 
{        
    $request = $this->getRequest();

    $companyList = $this->_getCompanyList();         

    $form = new Companyform();                  

    $form->get('parentID')->setAttribute('options',$companyList);


    if ($request->isPost()) 
    {
        $company = new Company();   
            $form->setInputFilter($company->getInputFilter());            

            $form->setData($request->getPost());

            if ($form->isvalid()) 
            {                 
            }

    }
}

public function _getCompanyList()
{
     $companies = $this->Em()->getEntityManager()->getRepository('XXXX\Entity\Company')->findBy(array('isDeleted'=>'0'));
     $companyIDList = array();
     $companyIDList[0] = "No Parent";
     foreach ($companies as $company) 
     {        
       $companyIDList[$company->id] = $company->companyName;
     }         
     return $companyIDList;        
}

Класс сущности

 protected $inputFilter;

    public function setInputFilter(InputFilterInterface $inputFilter)
    {
        throw new \Exception("Not used");
    }

    public function getInputFilter()
    {
        if (!$this->inputFilter) {
            $inputFilter = new InputFilter();

            $factory = new InputFactory();

            $inputFilter->add($factory->createInput(array(
                'name' => 'companyName',
                'required' => true,
                'filters' => array(
                    array('name' => 'StripTags'),
                    array('name' => 'StringTrim'),
                ),
                'validators' => array(
                    array(
                        'name' => 'StringLength',
                        'options' => array(
                            'encoding' => 'UTF-8',
                            'min' => 2,
                            'max' => 255,
                        ),
                    ),
                ),
            )));

            $this->inputFilter = $inputFilter;
        }

        return $this->inputFilter;
    }

Возможно, вам потребуется добавить следующую библиотеку в объект

use Zend\InputFilter\InputFilter;
use Zend\InputFilter\Factory as InputFactory;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;
person Developer    schedule 29.10.2012

В ZendFramework 2 при создании (добавления) элемента из файла формы проверьте атрибут: inarrayvalidator истинно.

        $this->add(array(
           'name' => 'select_name',
           'type' => 'select',
           'id' => 'select_name',
           'options' => array(
                 'label' => 'Select Name',
            ),
            'attributes' => array(
                 'id' => 'select_id',
                  'inarrayvalidator' => true,
             ),
        )); 

Надеюсь, это сработает ...

person KumarA    schedule 05.12.2013