Zend - 在Mapper中丢失帖子值

时间:2012-10-12 13:00:26

标签: mysql post zend-framework insert

当我从我的Controller传递到我的Mapper以插入我的数据库时,我似乎丢失了我的帖子数据。我是新手,并使用留言板模板,但修改它以添加“交易”。这就是我所拥有的:

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

      $form    = new Application_Form_Deal();

      if ($this->getRequest()->isPost()) {

            if ($form->isValid($request->getPost())) {

                $posts = $form->getValues();
                //print_r($posts);
                $newdeal = new Application_Model_Deal($posts);
                $mapper  = new Application_Model_DealMapper();
                $mapper->save($newdeal);
                return $this->_helper->redirector('index');
            }
        }

        $this->view->form = $form;
    }

这是我的Mapper

public function save(Application_Model_Deal $deal)
        {

            $data = array(
                'dealname'      => $deal->getDealName(),
                'dealclient'    => $deal->getDealClient(),        
                'dealtelephone' => $deal->getDealTelephone(),
                'dealvalue'     => $deal->getDealValue(),
                'dealdescription' => $deal->getDealDescription(),
                'dealcreated'   => date('Y-m-d H:i:s'),
                'dealmodified'  => date('Y-m-d H:i:s'),
            );

            /*echo "<pre>";
            print_r($data);
            echo "</pre>";
            exit();*/

             if (null === ($dealid = $deal->getDealId())) {
                unset($data['dealid']);
                $this->getDbTable()->insert($data);
            } else {
                $this->getDbTable()->update($data, array('dealid = ?' => $dealid));
            }
        }

protected $_dealmodified;
    protected $_dealcreated;
    protected $_dealdescription;
    protected $_dealvalue;
    protected $_dealtelephone;
    protected $_dealclient;
    protected $_dealname;
    protected $_dealid;

    public function __construct(array $options = null)
    {
        if (is_array($options)) {
            $this->setOptions($options);
        }
    }

    public function __set($name, $value)
    {
        $method = 'set' . $name;
        if (('mapper' == $name) || !method_exists($this, $method)) {
            throw new Exception('Invalid deal property');
        }
        $this->$method($value);
    }

    public function __get($name)
    {
        $method = 'get' . $name;
        if (('mapper' == $name) || !method_exists($this, $method)) {
            throw new Exception('Invalid deal property');
        }
        return $this->$method($value);
    }

    public function setOptions(array $options)
    {
        $methods = get_class_methods($this);
        foreach ($options as $key => $value) {
            $method = 'set' . ucfirst($key);
            if (in_array($method, $methods)) {
                $this->$method($value);
            }
        }
        return $this;
    }

     public function setDealModified($ts)
    {
        $this->_dealmodified = $ts;
        return $this;
    }

    public function getDealModified()
    {
        return $this->_dealmodified;
    }

    public function setDealCreated($ts)
    {
        $this->_dealcreated = $ts;
        return $this;
    }

    public function getDealCreated()
    {
        return $this->_dealcreated;
    }

    public function setDealDescription($text)
    {
        $this->_dealdescription = (string) $text;
        return $this;
    }

    public function getDealDescription()
    {
        return $this->_dealdescription;
    }

    public function setDealValue( $text)
    {
        $this->_dealvalue =  $text;
        return $this;
    }

    public function getDealValue()
    {
        return $this->_dealvalue;
    }

    public function setDealTelephone($text)
    {
        $this->_dealtelephone = $text;
        return $this;
    }

    public function getDealTelephone()
    {
        return $this->_dealtelephone;
    }

    public function setDealClient($text)
    {
        $this->_dealclient = $text;
        return $this;
    }

    public function getDealClient()
    {
        return $this->_dealclient;
    }

    public function setDealName($text)
    {
        $this->_dealname = $text;
        return $this;
    }

    public function getDealName()
    {
        return $this->_dealname;
    }

    public function setDealId($dealid)
    {
        $this->_dealid = (int) $dealid;
        return $this;
    }

    public function getDealId()
    {
        // $this->_dealid = (int) $value;
        return $this->_dealid;
    }

我完全失去了为什么,当我在Mapper中print_r我的$ data var时,一切都消失了。

请帮忙!

2 个答案:

答案 0 :(得分:0)

映射器中的save()方法没有您用作$post参数的第二个参数。

<强>重构:

public function save(Application_Model_Deal $deal, array $post)...

答案 1 :(得分:0)

这看起来很奇怪$mapper->save($newdeal, $posts);

你的api是save(Application_Model_Deal $deal)

因此应该阅读$mapper->save($newdeal);

如果你真的想要掌握地图和模型,这三个链接帮助我很多:

http://survivethedeepend.com/

http://phpmaster.com/building-a-domain-model/

http://phpmaster.com/integrating-the-data-mappers/

您正在完成特定的工作流程:

  • 现在的表格
  • 从数据中收集($ post)
  • 验证$ post数据(if(isValid())
  • 获取有效且已过滤的表单值($ form-&gt; getValues())
  • 实例化您的交易对象($ newdeal = new Application_Model_Deal($ posts);)
  • 使用您的映射器保存/更新您的交易
  • 成功重定向

创建交易对象后,$ post数据没有其他价值,交易对象是重要的考虑因素。希望这有点帮助。

好的我觉得我找到了它:

你的问题围绕着这个$method = 'set' . ucfirst($key);,这一行将尝试调用$this->setProperty();你的getter和setter设置了camel case,这样它们就无法工作了。解决此问题的最简单方法是将getter和setter重命名为:

 public function setDealmodified($ts)//not camel cased only first letter is capped.
    {
        $this->_dealmodified = $ts;
        return $this;
    }

或者您必须使用数组密钥来填充。