我正在尝试学习有关Zend Framework的一些内容,并且我对“编辑”数据库条目这样简单的操作感到困惑。
我有MySQL数据库中的联系人列表,我的意图是用一行中的信息填写表单,编辑它并将其保存回db(更新语句)。我尝试了几乎在我脑海中浮现的东西,检查了谷歌并预订了ZF,但是一直存在一些问题。此时,当我想要进行更新时,zf和mysql将创建新的数据库条目,其中填入了新的id和编辑的信息,但这显然不是我想要做的事情,因为而不是DB中的一个更新条目我已经得到了两个旧的和新的一个,有更新的信息。
以下是我的代码的重要部分...请看一下,我无法弄清楚我在这里缺少什么。
indexcontroller的一部分:
public function createcontactAction()
{
$createContactForm = $this->_helper->_formLoader('addContact');
$this->view->addContactForm = $createContactForm;
}
public function editcontactAction()
{
$id = $this->getRequest()->getParam('id');
$contactModel = new Application_Model_Contacts();
$contactRow = $contactModel->find($id)->current();
$addContactForm = $this->_helper->formLoader('addContact');
if ($this->getRequest()->isPost() && $this->getRequest()->getPost('send', false) !== false) {
if ($addContactForm->isValid($this->getRequest()->getPost())) {
$contactRow->setFromArray($addContactForm->getValues());
$contactRow->save();
$this->_redirect('/index/editcontact/id/' . $contactRow->id);
}
} else {
$addContactForm->populate($contactRow->toArray());
}
$this->view->addContactForm = $addContactForm;
}
public function savecontactAction()
{
$form = $this->_helper->formLoader('addContact');
if ($this->getRequest()->isPost() && $this->getRequest()->getPost('send', false) !== false) {
if ($form->isValid($this->getRequest()->getPost())) {
$contactModel = new Application_Model_Contacts();
$contactRow = $contactModel->createRow($form->getValues());
$contactRow->save();
$this->_redirect('/index/editcontact/id/' . $contactRow->id);
}
}
$this->view->form = $form;
}
表格 - 重要的部分:
类Application_Form_AddContact扩展了Zend_Form {
public function init()
{
$this->setAction('/index/savecontact');
$this->setMethod(Zend_Form::METHOD_POST);
$this->setAttrib('id', 'index_savecontact');
$contactFirstName = new Zend_Form_Element_Text('first_name', array('size'=>32, 'maxlength'=>64, 'label'=>'Křestní', 'required'=>false));
$contactLastName = new Zend_Form_Element_Text('last_name', array('size'=>32, 'maxlength'=>64, 'label'=>'Přímění', 'required'=>true));
.
.
.
$contactNotes = new Zend_Form_Element_Textarea('notes', array('cols'=>32, 'rows'=>1, 'label'=>'Poznámky', 'required'=>false));
$contactSend = new Zend_Form_Element_Submit('send', array('label'=>'Odeslat'));
$this->addElements(array ($contactFirstName, $contactLastName, $contactStreet, $contactHouseNumber, $contactCity, $contactZipCode, $contactCountry,
$contactPhoneNumber, $contactMobileNumber, $contactEmail, $contactWebPage, $contactCrn, $contactVat, $contactNotes, $contactSend));
非常感谢!
(如果您需要更多的东西来帮我解决这个问题)
编辑:
heres联系模式:
class Application_Model_Contacts extends Zend_Db_Table_Abstract
{
protected $_name = 'contacts';
protected $_primary = 'id';
}
答案 0 :(得分:0)
您尝试在不提供要更新的行的ID的情况下获取更新。用于查询的数据是$form->getValues()
,但表单似乎不包含联系人的ID。将ID作为隐藏字段(ID为值)添加到表单中,或者使用$contactRow->id = $id
单独设置,并且应该更新而不是插入。
答案 1 :(得分:0)
关于Zend_Db_Table
和Zend_Db_Table_Row
(我假设这是你的模型使用的),我有点生疏,但我的赌注是你错过了主键(PK) )在你的$contactRow
- 我猜你可能不会通过表单提供它,因为我看到你通过GET
得到它。所以,只需在id
中将$id
设置为$contactRow
,就可以了。
答案 2 :(得分:0)
在editcontactAction()
之前,$contactRow->save();
之前,添加:$contactRow->id = $id
。
如果您的行没有指定ID,则save()
无法更新。