В настоящее время я работаю над приложением в Zend Framework 2. Я работаю над календарем, и у меня есть две кнопки отправки в форме, чтобы перейти к следующему или предыдущему месяцу. Итак, теперь я хочу передать два значения (месяц и год) в форме при отправке так что я могу знать, в каком месяце я нахожусь.
Как вы можете видеть в классах ниже Я пытался сделать это с помощью скрытых полей, но я не знаю, как добавить данные или извлечь их впоследствии. Может кто-нибудь сказать мне, как это сделать или дать мне другое решение? Возможно ли это отправить весь класс CalendarMonth с формой?
Моя установка теперь имеет следующие классы:
Форма: CalendarForm.php
class CalendarForm extends Form {
protected $_id = null;
public function __construct()
{
parent::__construct('calendar');
$this->setAttribute('method', 'post');
$this->add(array(
'name' => 'month',
'attributes' => array(
'type' => 'hidden',
),
));
$this->add(array(
'name' => 'year',
'attributes' => array(
'type' => 'hidden',
),
));
$this->add(array(
'name' => 'previous',
'attributes' => array(
'type' => 'submit',
'value' => 'Vorige',
),
));
$this->add(array(
'name' => 'next',
'attributes' => array(
'type' => 'submit',
'value' => 'Volgende',
),
));
}
public function setId($id) {
$this->_id = $id;
}
}
Контроллер: CalendarController.php
class CalendarController extends AbstractActionController
{
private $calendarEventTable;
public function indexAction()
{
$calendarMonth = null;
$form = new CalendarForm();
$request = $this->getRequest();
if ($request->isPost()) {
$form->setData($request->getPost());
if($this->getRequest()->getPost('next'))
{
//Extract the values from the submitted form and recall the getCalenderPage() to recreate the CalendarMonth
echo "test";
echo ((isset($_POST['month'])) ? $_POST['month'] : null);
} else if($this->getRequest()->getPost('previous'))
{
//$this->calendarMonth->minusMonth();
}
} else {
$calendarMonth = $this->getCalendarPage(8, 2014);
}
$calendarMonth = $this->getCalendarPage(8, 2014);
//Add the values to the form
$collection = $form->get('month');
$collection->setAttribute("month", "test12356t");
return new ViewModel(array(
'calendarMonth' => $calendarMonth,
'form' => $form,
));
}
public function detailAction()
{
return new ViewModel(array(
'event' => $this->getCalendarTable()->getCalendar($this->getEvent()->getRouteMatch()->getParam('id')),
));
}
private function getCalendarTable()
{
if (!$this->calendarEventTable) {
$sm = $this->getServiceLocator();
$this->calendarEventTable = $sm->get('Website\Model\Database\CalendarEventTable');
}
return $this->calendarEventTable;
}
public function getCalendarPage($month, $year)
{
$calendarMonth = new CalendarMonth($month, $year);
$events = $this->getCalendarTable()->fetchBetween('2014-08-01', '2014-08-31');
$calendarMonth->initPage($events);
return $calendarMonth;
}
}
И вид: index.phtml
<?php
$form = $this->form;
$form->setAttribute('action', $this->url('calendar', array('action' => 'index')));
$form->prepare();
echo $this->form()->openTag($form);
echo $this->formHidden($form->get('month'));
echo $this->formHidden($form->get('year'));
echo $this->formSubmit($form->get('previous'));
echo $this->formSubmit($form->get('next'));
echo $this->form()->closeTag();
?>
Проблема в indexAction
, вы не изменяете месяц и год, а вызываете getCalendarPage
после if if так всегда выполняется. Вы можете изменить indexAction
быть примерно таким:
public function indexAction()
{
$calendarMonth = null;
$form = new CalendarForm();
$request = $this->getRequest();
if ($request->isPost()) {
$form->setData($request->getPost());
$month = $form->get('month')->getValue();
$year = $form->get('year')->getValue();
if($this->getRequest()->getPost('next')) {
$month += 1;
if ($month > 12) {
$month = 1;
$year += 1;
}
} else if($this->getRequest()->getPost('previous')) {
$month -= 1;
if ($month < 1) {
$month = 12;
$year -= 1;
}
}
} else {
$month = 8;
$year = 2014;
}
$calendarMonth = $this->getCalendarPage($month, $year);
$form->get('month')->setValue($month);
$form->get('year')->setValue($year);
return new ViewModel(array(
'calendarMonth' => $calendarMonth,
'form' => $form,
));
}
Других решений пока нет …