Я не могу понять, почему моя форма Zend не обновляется до новых значений. Я очень внимательно следил за примером альбома, но не могу понять, где я ошибся. В настоящее время форма не проходит утверждение IsValid IF. Если я помещу строку сохранения над этой проверкой, она, кажется, повторно вводит старую информацию независимо от того, какая новая информация находится в поле формы. Какие-нибудь мысли?
РЕДАКТИРОВАТЬ ДЕЙСТВИЕ НИЖЕ:
public function editLicenceAction()
{
$dbAdapter = $this->getServiceLocator()->get('Zend\Db\Adapter\Adapter');
$pro_id='22';
$licence_id = (int) $this->params()->fromRoute('licence_id', 0);
if (!$licence_id) {
return $this->redirect()->toRoute('proLicence', array(
'action' => 'index'
));
}
try {
$proLicence = $this->getProLicenceTable()->getProLicence($licence_id);
}
catch (\Exception $ex) {
return $this->redirect()->toRoute('proLicence', array(
'action' => 'index'
));
}
$form = new ProLicenceForm($dbAdapter);
$form->bind($proLicence);
$form->get('submit')->setAttribute('value', 'Edit');$request = $this->getRequest();
if ($request->isPost()) {
//$form->setInputFilter($proLicence->getInputFilter());
$form->setData($request->getPost());
echo 'I got Request';
if ($form->isValid()) {
echo 'I got Save';
$this->getProLicenceTable()->saveProLicence($proLicence);
return $this->redirect()->toRoute('proLicence');
}
}
return array(
'licence_id' => $licence_id,
'form' => $form,
);
}
ПОСМОТРЕТЬ НИЖЕ:
$title = 'Edit Licence';
$this->headTitle($title);
?>
<h1><?php echo $this->escapeHtml($title); ?></h1>
<?php
$form = $this->form;
$form->setAttribute('action', $this->url(
'proLicence',
array(
'action' => 'editLicence',
'licence_id' => $this->licence_id,
)
));
$form->prepare();
echo $this->form()->openTag($form);
echo $this->formHidden($form->get('licence_id'));
echo $this->formRow($form->get('licence_name_id'));
echo $this->formRow($form->get('licence_number'));
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag();
Класс лицензий Pro
<?php
namespace Pro\Model\ProLicence;
use Zend\Db\TableGateway\TableGateway;
use Zend\Db\Sql\Sql;
class ProLicenceTable
{
protected $tableGateway;
public function __construct(TableGateway $tableGateway)
{
$this->tableGateway = $tableGateway;
}
public function fetchAll()
{
$resultSet = $this->tableGateway->select();
return $resultSet;
}
public function getProLicence($licence_id)
{
$licence_id = (int) $licence_id;
$rowset = $this->tableGateway->select(array('licence_id' => $licence_id));
$row = $rowset->current();
if (!$row) {
throw new \Exception("Could not find row $licence_id");
}
return $row;
}
public function saveProLicence(ProLicence $proLicence)
{
$data = array(
'pro_id' =>$proLicence->pro_id,
//'licence_id' => $proLicence->licence_id,
'licence_name_id' => $proLicence->licence_name_id,
'licence_number' => $proLicence->licence_number,
'licence_approved' => $proLicence->licence_approved,
);
$licence_id = (int) $proLicence->licence_id;
if ($licence_id == 0) {
$this->tableGateway->insert($data);
} else {
if ($this->getProLicence($licence_id)) {
$this->tableGateway->update($data, array('licence_id' => $licence_id));
} else {
throw new \Exception('Licence id does not exist');
}
}
}
public function deleteProLicence($licence_id)
{
$this->tableGateway->delete(array('licence_id' => (int) $licence_id));
}
}
Класс лицензии Pro
<?php
namespace Pro\Model\ProLicence;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;
class ProLicence implements InputFilterAwareInterface
{
public $pro_id;
public $licence_id;
public $licence_name_id;
public $licence_number;
public $licence_approved;
protected $inputFilter;
public function exchangeArray($data)
{
$this->pro_id = (!empty($data['pro_id'])) ? $data['pro_id'] : null;
$this->licence_id = (!empty($data['licence_id'])) ? $data['licence_id'] : null;
$this->licence_name_id = (!empty($data['licence_name_id'])) ? $data['licence_name_id'] : null;
$this->licence_number = (!empty($data['licence_number'])) ? $data['licence_number'] : null;
$this->licence_approved = (!empty($data['licence_approved'])) ? $data['licence_approved'] : null;
}
// Add content to these methods:
public function getArrayCopy()
{
return get_object_vars($this);
}
public function setInputFilter(InputFilterInterface $inputFilter)
{
throw new \Exception("Not used");
}
public function getInputFilter()
{
if (!$this->inputFilter) {
$inputFilter = new InputFilter();
$inputFilter->add(array(
'name' => 'pro_id',
'required' => true,
'filters' => array(
array('name' => 'Int'),
),
));
$inputFilter->add(array(
'name' => 'licence_id',
'required' => true,
'filters' => array(
array('name' => 'Int'),
),
));
$inputFilter->add(array(
'name' => 'licence_name_id',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
),
));
$inputFilter->add(array(
'name' => 'licence_number',
'required' => false,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
),
));
$inputFilter->add(array(
'name' => 'licence_approved',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
),
));
$this->inputFilter = $inputFilter;
}
return $this->inputFilter;
}
}
ФОРМА Класс:
<?php
namespace Pro\Form;
use Zend\Form\Form;
use Zend\Db\Adapter\AdapterInterface;
class ProLicenceForm extends Form
{
public function __construct(AdapterInterface $dbAdapter)
{
$this->adapter =$dbAdapter;
// we want to ignore the name passed
parent::__construct();
$this->add(array(
'name' => 'pro_id',
'type' => 'Hidden',
));
$this->add(array(
'name' => 'licence_id',
'type' => 'Hidden',
'options' => array(
),
'attributes' => array(
//'required' => 'required'
)
));
$this->add(array(
'name' => 'licence_approved',
'type' => 'Hidden',
'options' => array(
),
'attributes' => array(
// 'required' => 'required'
)
));
$this->add(array(
'name' => 'licence_name_id',
'type' => 'Zend\Form\Element\Select',
'options' => array(
'label' => 'Licence',
'value_options' => $this->getLicenceOptions(),
'empty_option' => '--- please choose ---'
),
'attributes' => array(
'placeholder' => 'Choose all that apply'
)
));
$this->add(array(
'name' => 'licence_number',
'type' => 'Text',
'options' => array(
'label' => 'Licence Number'
)
));
$this->add(array(
'name' => 'submit',
'type' => 'Submit',
'options' => array(
'label'=> 'Primary Button',
),
'attributes' => array(
'value' => 'Go',
'id' => 'submitbutton',
),
));
}
/*
* SQL statements used to bring in optiosn
*/public function getLicenceOptions()
{
$dbAdapter = $this->adapter;
$sql = 'SELECT licence_name_id,licence_name FROM licence_name_table ORDER BY licence_name';
$statement = $dbAdapter->query($sql);
$result = $statement->execute();
$selectData = array();
foreach ($result as $res) {
$selectData[$res['licence_name_id']] = $res['licence_name'];
}
return $selectData;
}
}
Большое спасибо, М
Обновление: работает ниже (скопировано с примера альбома). Это то, что я использую, чтобы решить проблему.
public function editAction()
{
$id = (int) $this->params()->fromRoute('id', 0);
if (!$id) {
return $this->redirect()->toRoute('album', array(
'action' => 'add'
));
}
// Get the Album with the specified id. An exception is thrown
// if it cannot be found, in which case go to the index page.
try {
$album = $this->getAlbumTable()->getAlbum($id);
}
catch (\Exception $ex) {
return $this->redirect()->toRoute('album', array(
'action' => 'test'
));
}
$form = new AlbumForm();
$form->bind($album);
$form->get('submit')->setAttribute('value', 'Edit');
$request = $this->getRequest();
if ($request->isPost()) {
$form->setInputFilter($album->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid()) {
$this->getAlbumTable()->saveAlbum($album);
Debug::dump($form);
//var_dump($album);
// Redirect to list of albums
//return $this->redirect()->toRoute('album');
}
}
return array(
'id' => $id,
'form' => $form,
);
}
Обновление 2: при сравнении отладки кажется, что приведенная ниже часть не обновляется в примере лицензии, а в примере рабочего альбома:
["object":protected] => object(Pro\Model\ProLicence\ProLicence)#398 (6) {
["pro_id"] => string(2) "22"["licence_id"] => string(1) "1"["licence_name_id"] => string(1) "5"["licence_number"] => string(9) "345345345"["licence_approved"] => string(1) "T"
Вы установили метод для формы? Если я правильно помню, по умолчанию используется метод GET, но вы извлекаете отправленные значения с помощью POST. Попробуйте явно установить метод формы в POST.
Вы также можете попробовать использовать Zend\Debug\Debug::dump($form)
чтобы увидеть, что объект содержит в различных точках — но на самом деле похоже, что вы не получаете новые значения вообще из отправленной формы.
Метод, который вы используете для установки данных формы, не выглядит правильным — он должен выглядеть примерно так
$form->setData($this->params()->fromPost());
потому что вам нужны только сами элементы данных в ассоциативном массиве.
Глядя на ваш код еще раз, ошибка довольно очевидна — просто еще один взгляд! Вы делаете звонок:
$this->getAlbumTable()->saveAlbum($album);
но вы не установили данные в объекте $ album.
Я забыл добавить скрытые формы в поле редактирования. Как только они были добавлены, я смог редактировать без проблем.
echo $this->formHidden($form->get('membership_id'));
echo $this->formHidden($form->get('pro_id'));