Передача значения из класса 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 и относиться к нему как к другим элементам. Я не думаю, что оставить новое поле за пределами формы будет правильно, если вы также захотите указать его значение.

Отредактировано:введите описание изображения здесь

Другие вопросы по тегам