0

特に Zend Forms を使用して、Zend Framework 2 に取り組んでいます。Selectドロップダウンボックスを宣言しました

形:

$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->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フォームからIDを取得してデータベースに保存します。現在、通知と 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"
    }
  }
}

この問題を克服する解決策はありますか。どんな助けでも大歓迎です。

4

3 に答える 3

1

フィルタは、Intデータの配列から整数を作成しようとしますが、これは機能しません。

以前は、コールバックフィルターを使用しました。これを使用して、データをループし、各値がIntであるかどうかを確認できます。

例えば:

'filters' => array(
    array(
        'name' => 'Callback',
        'options' => array(
            'callback' => function($values) {
                return array_filter($values, function($value) {
                    return ((int)$value == $value);
                });
            }
        )
    ),
),
于 2012-10-29T12:50:15.090 に答える
0

私は少し違うことをしました、このようなもの

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;
于 2012-10-29T16:31:07.427 に答える