无法使bind()工作

时间:2014-06-12 07:04:23

标签: zend-framework2

我希望表单字段在表单页面打开时包含数据库中包含的先前数据。我在这里经历了很多查询,并且开始知道使用populate()或bind()方法是这样做的。但是当我尝试使用它时,我得到一个未定义的方法错误。 还有其他办法吗? 我也无法使用bind()。我提交后,我将获得一个带有默认值的新表单。 对不起,如果这是一个愚蠢的问题。自从我开始学习Zend框架以来,仅用了4-5天。此外,我上网的大多数方法都是针对较旧的框架。我正在使用Zend Framework2。

这是控制器代码

<?php
class ChatController extends AbstractActionController 
{
    protected $chatTable;

    public function indexAction()
    {

        $form = new ChatForm();
        $model= new Chat();
        $form->bind($model);
        $form->get('submit')->setValue('Save');

        $request = $this->getRequest();
        if ($request->isPost()) {
            $gen_set = new Chat();
            $form->setInputFilter($gen_set->getInputFilter());
            $form->setData($request->getPost());

            if ($form->isValid()) {
                $gen_set->exchangeArray($form->getData());
                $this->getChatTable()->saveChat($gen_set);

                // Redirect to list of albums
                return $this->redirect()->toRoute('chat');
            }
        }
        return array('form' => $form);
    }

    public function getChatTable()
    {
        if (!$this->chatTable) {
            $sm = $this->getServiceLocator();
            $this->chatTable = $sm->get('Chat\Model\ChatTable');
        }
        return $this->chatTable;
    }

}

我的实体类,这里api_key和anon_prefix是列&#39;设置&#39;的行。并且还有一列有价值。

<?php
class Chat implements InputFilterAwareInterface
{

    protected $inputFilter;                         

    public function exchangeArray($data)
    {
        $this->api_key=(isset($data['api_key'])) ? $data['api_key'] : null;
        $this->anon_prefix  = (isset($data['anon_prefix']))  ? $data['anon_prefix']  : null;    
    }


    // Add content to these methods:

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

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

            $inputFilter->add(array(
                'name'     => 'iflychat_external_api_key',
                'required' => true,
                'filters'  => array(
                    array('name' => 'StripTags'),
                    array('name' => 'StringTrim'),
                ),
            ));

            $inputFilter->add(array(
                'name'     => 'iflychat_show_admin_list',
                'required' => true,
                'validators' => array(
                    array(
                        'name'    => 'InArray',
                        'options' => array(
                            'haystack' => array(1,2),
                        ),
                    ),
                ),
            ));


            $this->inputFilter = $inputFilter;
        }

        return $this->inputFilter;
    }

    public function getArrayCopy()
    {
        return get_object_vars($this);
    }
}

这用于在db

中输入值
<?php
class ChatTable
{
    protected $tableGateway;

    public function __construct(TableGateway $tableGateway)
    {
        $this->tableGateway = $tableGateway;
    }

    public function fetchAll()
    {
        $resultSet = $this->tableGateway->select();
        return $resultSet;
    }


    public function saveChat(Chat $gen_set)
    {

        $data = array(                                      
            'value' => $gen_set->api_key,
        );
        $id='iflychat_external_api_key';
        $this->tableGateway->update($data,array('settings' => $id));

        $data = array(
            'value'  => $gen_set->anon_prefix,
        );
        $id='anon_prefix';
        $this->tableGateway->update($data,array('settings' => $id));
    }
}

我收到此错误,&#39;无法使用Chat \ Model \ Chat类型的对象作为数组&#39;

2 个答案:

答案 0 :(得分:0)

您的操作没有多大意义,您将Chat实例实例化为$model,然后将另一个实例实例化为$gen_set。您应该做的是绑定第一个,并使用表单类getData方法稍后返回绑定到它的实例,以及您在setData方法中给出的值。不需要从对象到数组的任何转换再返回。

以下是它的外观......

public function indexAction()
{

    $form = new ChatForm();

    // bind the model
    $model= new Chat();
    $form->bind($model);

    $form->get('submit')->setValue('Save');

    $request = $this->getRequest();
    if ($request->isPost()) {
        $form->setInputFilter($gen_set->getInputFilter());

        // set data from POST as properties of the bound model ...
        $form->setData($request->getPost());

        if ($form->isValid()) {

            // get the bound model instance with the POSTed values
            // ($gen_set is now the original $model object instance bound above) 
            $gen_set = $form->getData(); 

            // and save it
            $this->getChatTable()->saveChat($gen_set);

            // Redirect to list of albums
            return $this->redirect()->toRoute('chat');
        }
    }

    return array('form' => $form);
}

答案 1 :(得分:0)

控制器代码 -

<?php

class ChatController extends AbstractActionController {

    protected $chatTable;

    public function indexAction() {

        $model = $this->getChatTable()->fetchLastChat();
        if($model === null || $model->count() == 0)
            $model = new Chat();

        //Now if no record exists in the database then $model will be empty
        //Else $model will contain data of last record.

        $form = new ChatForm();
        $form->bind($model);
        $form->get('submit')->setValue('Save');

        $request = $this->getRequest();
        if ($request->isPost()) {
            $gen_set = new Chat();
            $form->setInputFilter($gen_set->getInputFilter());
            $form->setData($request->getPost());

            if ($form->isValid()) {
                $gen_set->exchangeArray($form->getData());
                $this->getChatTable()->saveChat($gen_set);
            }
        }
        return array('form' => $form);
    }

    public function getChatTable() {
        if (!$this->chatTable) {
            $sm = $this->getServiceLocator();
            $this->chatTable = $sm->get('Chat\Model\ChatTable');
        }
        return $this->chatTable;
    }

}

ChatTable类代码 -

<?php

//Other use statements

use Zend\Db\Sql\Select;

class ChatTable {

    protected $tableGateway;

    public function __construct(TableGateway $tableGateway) {
        $this->tableGateway = $tableGateway;
    }

    public function fetchAll() {
        $resultSet = $this->tableGateway->select();
        return $resultSet;
    }

    public function fetchLastChat() {
        $select = new Select('TABLE_NAME'); //Change the tablename accordingly
        $select->order('PRIMARY_KEY DESC'); //Set the Primary Key of the table
        $select->limit(1);

        $resultSet = $this->tableGateway->selectWith($select);
        return $resultSet->current();
    }

    //Rest of the Code ....

请从上面的代码中了解。