Передача значения из класса Yii CController в конфигурационный массив CForm (Form Builder)
Я новичок в Yii, и я пытаюсь сделать свой первоначальный проект "правильным" способом. Я создал класс CFormModel, которому требуются три поля для запроса некоторых данных, конфигурацию CForm для создания формы и CController для ее связывания (все приведено ниже).
Для запроса данных требуется учетная запись, и она может поступать из нескольких разных мест. Я думаю, что восстановление должно быть в контроллере. Однако я не знаю, как передать его в скрытое поле "account" формы из контроллера, чтобы оно передавалось в аргументы, назначенные CFormModel после отправки. В целом, я знаю, как перейти от CController для просмотра скрипта, но не для CForm. Является ли реестр (Yii::app()->params[]
) моя лучшая ставка?
Я полагаю, что я могу просто оставить его вне формы (и обязательных полей) и подождать, пока он заполнится в действии отправки (actionSummaries
). Это нарушает намерение CForm? Есть ли лучшая практика? Даже если принять это решение, сможет ли кто-нибудь решить первую проблему, если она возникнет снова?
Любая другая, нежная критика приветствуется.
модели /SummariesForm.php
class SummariesForm extends CFormModel
{
public $account;
public $userToken;
public $year;
public function rules () {...}
public function fetchSummary () {...}
static public function getYearOptions () {...}
}
просмотров / счет /select.php
<?php
$this->pageTitle=Yii::app()->name;
?>
<div class="form">
<?php echo $form->render(); ?>
</div>
Контроллеры /AccountController.php
class AccountController extends CController
{
public $layout = 'extranet';
public function actionSelect ()
{
$model = new SummariesForm();
// retrieve account
require_once 'AccountCookie.php';
/*
*
* Here, I insert the account directly into the
* model used to build the form, but $model isn't
* available to selectForm.php. So, it doesn't
* become part of the form, and this $model doesn't
* persist to actionSummaries().
*
*/
$model->account = AccountCookie::decrypt();
if ($model->account === false) {
throw new Exception('Unable to retrieve account.');
}
$form = new CForm('application.views.account.selectForm', $model);
$this->render('select', array(
'form' => $form,
'account' => $model->account,
));
}
public function actionSummaries ()
{
$model = new SummariesForm();
if (isset($_POST['SummariesForm'])) {
$model->attributes = $_POST['SummariesForm'];
/*
*
* Should I just omit "account" from the form altogether
* and fetch it here? Does that break the "model"?
*
*/
if ($model->validate() === true) {
try {
$summaries = $model->fetchSummary();
} catch (Exception $e) {
...
CApplication::end();
}
if (count($summaries) === 0) {
$this->render('nodata');
CApplication::end();
}
$this->render('summaries', array('model' => $model, 'summaries' => $summaries));
} else {
throw new Exception('Invalid year.');
}
}
}
}
просмотров / счет /selectForm.php
<?php
return array(
'title' => 'Select year',
'action' => Yii::app()->createUrl('Account/Summaries'),
'method' => 'post',
'elements' => array(
'account' => array(
'type' => 'hidden',
'value' => $account,
),
'userToken' => array(
'type' => 'hidden',
'value' => /* get token */,
),
'year' => array(
'type' => 'dropdownlist',
'items' => SummariesForm::getYearOptions(),
),
),
'buttons' => array(
'view' => array(
'type' => 'submit',
'label' => 'View summaries',
),
),
);
1 ответ
Ответ НЕТ, чтобы делать то, что вы просили. Ты можешь видеть $form
переменная, которая действовала почти как массив, когда она была передана из контроллера для просмотра. Решение заключается в том, что вы добавляете больше недвижимости $account
в selectForm model
и относиться к нему как к другим элементам. Я не думаю, что оставить новое поле за пределами формы будет правильно, если вы также захотите указать его значение.
Отредактировано: