Операции Entity CRUD - Проблемы с редактированием (обновлением) - PullRequest
1 голос
/ 20 января 2012

Я пытаюсь кое-что узнать о Zend Framework, и я застрял на такой простой операции, как запись «Редактировать» в БД.

У меня есть список контактов в базе данных MySQL, и я собираюсьзаполните форму информацией из одной строки, отредактируйте ее и сохраните обратно в db (оператор обновления).Я попробовал почти все, что мне пришло в голову, проверил Google и книгу о ZF, но постоянно возникает какая-то проблема.В этот момент, когда я хочу выполнить обновление, zf и mysql создадут новую запись в БД с заполненным новым идентификатором и отредактированной информацией, но это не то, что я хочу сделать, очевидно, потому что вместо одной обновленной записи в БД у меня естьдва старых и новый с обновленной информацией.

Вот важные части моего кода ... пожалуйста, посмотрите, я не могу понять, чего мне здесь не хватает.

часть 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;
}

form - важные части:

класс Application_Form_AddContact extends 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));

Большое спасибо!

(Если есть еще что-то, что вам может понадобиться, чтобы помочь мне с этим, просто попросите об этом)

РЕДАКТИРОВАТЬ:

вот модель для контактов:

class Application_Model_Contacts extends Zend_Db_Table_Abstract
{
    protected $_name    = 'contacts';
    protected $_primary = 'id';

}

Ответы [ 3 ]

0 голосов
/ 20 января 2012

Я немного заржавел в отношении Zend_Db_Table и Zend_Db_Table_Row (я предполагаю, что это то, что использует ваша модель), но я бы поспорил, что вы пропустите Первичный ключ (PK) в вашем $contactRow - Я предполагаю, что вы, вероятно, не предоставляете это через форму, поскольку я вижу, что вы получаете это через GET. Так что просто установите id на $id в вашем $contactRow, и все будет в порядке.

0 голосов
/ 20 января 2012

В editcontactAction(), перед $contactRow->save();, добавить: $contactRow->id = $id.Если в вашей строке не указан идентификатор, save() не может обновиться.

0 голосов
/ 20 января 2012

Вы пытаетесь получить обновление без указания идентификатора строки, которую хотите обновить. Данные, используемые для запроса, $form->getValues(), но форма не содержит идентификатор контакта. Добавьте идентификатор в виде скрытого поля (с идентификатором в качестве значения) к вашей форме или установите его отдельно с помощью $contactRow->id = $id, и он должен обновляться вместо вставки.

...