yii Forms возвращает ошибку, параметр не определен

У меня есть контроллер настроек, например

public function actionIndex()
{
    $model = new SettingsForm;

    if(isset($_POST['SettingsForm'])) {
        if($model->validate()) {
            //
        }
    }

    $this->render('index', array('model' => $model));
}

и в настройках:

<?php
$form = $this->beginWidget(
    'CActiveForm', array(
       'id' => 'settings-form',
       'enableClientValidation' => true,
       'clientOptions' => array(
           'validateOnSubmit' => true,
       ),
));
?>
<div class="form-group">
<?php echo $form->labelEx($model, 'meta_keywords'); ?>
<?php echo $form->textField($model, 'meta_keywords', array('class' => 'form-control', 'value' => Yii::app()->config->get('meta_keywords'), 'placeholder' => 'Ключевые слова и фразы через запятую')); ?>
<?php echo $form->error($model, 'meta_keywords', array('class' => 'text-danger')); ?>
</div>
<div class="form-group">
<?php echo $form->labelEx($model, 'main_page'); ?>
<?php echo $form->dropDownList($model, 'main_page', $model->getPages()); ?>
<?php echo $form->error($model, 'main_page', array('class' => 'text-danger')); ?>
</div>

функция getPages в модели SettingsForm:

public function getPages() {
        return array(
            0 => 'Nothing'
        );
    }

Этот код возвращает ошибку:

Свойство "SettingsForm.main_page" не определено.

Но все предыдущие элементы Yii созданы успешно и не возвращают никаких ошибок =\


person heeeej    schedule 26.11.2014    source источник


Ответы (4)


В вашей модели SettingsForm определено ли main_page в методе rules? то есть

public function rules()
{
    // NOTE: you should only define rules for those attributes that
    // will receive user inputs.
    return array(
        array( ... 'main_page', ...),
        ...
    );
}
person Stu    schedule 26.11.2014
comment
хм... и var_dump($model->main_page) что-нибудь возвращает, или это тоже возвращает ошибку? Вы также можете попробовать array('main_page', 'safe') в массиве правил, просто чтобы узнать, не связана ли проблема с логическим валидатором? - person Stu; 26.11.2014
comment
@heeeej, все же, пожалуйста, опубликуйте (как обновление) все правила проверки модели. - person Igor Savinkin; 26.11.2014

Обновлено

класс SettingsForm расширяет CFormModel

Все еще делай это. Посмотрите здесь и здесь.

public function rules()
{        
    return array(
        array('site_name, charset, meta_description, meta_keywords', 'required'),
        array('main_page', 'boolean'),
        array('site_name, charset, meta_description, meta_keywords, main_page', 'safe'),
    );
}
person Igor Savinkin    schedule 26.11.2014
comment
я сделал эхо $form->dropDownList($model, 'main_page', array(0 => 'ничего')); и.... НИЧЕГО +) - person heeeej; 26.11.2014
comment
@heeeej, как насчет того, чтобы в раскрывающемся списке вы только что поставили $form->dropDownList($model, 'main_page', array(0=>'smth')), это сработает? - person Igor Savinkin; 26.11.2014
comment
@heeeej, а вам нужно, чтобы ClientValidation был включен? Попробуйте отключить его: 'enableClientValidation' => false, так как вы проверяете на сервере и в раскрывающемся списке ничего не вводится извне. - person Igor Savinkin; 26.11.2014
comment
@heeeej, не могли бы вы опубликовать в своем вопросе (как обновление) все правила проверки модели, например: public function rules() { return array( array('userId, email', 'required'),... - person Igor Savinkin; 26.11.2014
comment
Я написал.. Я назвал все поля =( - person heeeej; 26.11.2014

Пффффф.... Я просто забыл переменную вызова в модели $main_page...

class SettingsForm extends CFormModel
{
    public $site_name;
    public $charset;
    public $meta_description;
    public $meta_keywords;
    public $main_page;

..
}
person heeeej    schedule 26.11.2014

person    schedule
comment
конечно, вы не определили array('site_name, charset, meta_description, meta_keywords, main_page', 'safe', 'on'=>'search'), как последнюю строку в этом массиве. Поэтому они НЕ БЕЗОПАСНЫ для хранения в AR и БД. Сделай это. - person Igor Savinkin; 26.11.2014