GM2mars
@GM2mars

Почему в Yii не все данные формы передаются в модель?

Возникла такая проблема, после отправки формы, не все данные формы присваиваются модели.

Отрывок кода Вида формы:
echo $form->textArea($model,'description', array('class'=>"input_text"));
echo $form->textField($model,'url', array('class'=>"input_text"));

Код контроллера:
public function actionCreateLink() {
  $model=new Links;
  if(isset($_POST['Links'])) {
    $model->attributes=$_POST['Links'];
    echo '<pre>';
    print_r($_POST['Links']);
    print_r($model->attributes);
    echo '</pre>';
  }
}

В итоге выводится:
Array (
    [url] => yandex.ru
    [name] => Яндекс
    [id_category] => 9
    [description] => Поисковая система
)

Array (
    [url] => yandex.ru
    [name] => Яндекс
    [description] =>
    [id_category] => 9
)

Как можно заметить, поле description не присвоилось модели. В чем может быть проблема?

Links rules: (добавил description в массив save)
public function rules() {
  return array(
    array('url, name', 'required', 'message'=>'Обязательно для заполнения'),
    array('id_category', 'required', 'message' => 'Выберите категорию'),

    array('id, url, name, id_category, description', 'safe', 'on'=>'search'),
  );
}
  • Вопрос задан
  • 4175 просмотров
Решения вопроса 1
fornit1917
@fornit1917
все атрибуты, для которых делаете массовое присваивание, должны быть указаны в rules
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 6
p4s8x
@p4s8x
Здесь в Links::rules() отсутствует поле description, поэтому это свойство помечается как unsafe attribute - просмотрите логи, увидете там соответствующую ошибку.
самый простой вариант добавить
array('description', 'safe'),
Ответ написан
GM2mars
@GM2mars Автор вопроса
Я думаю что валидация тут не причем, так как присвоение атрибутов формы к модели идет до проверки валидации.
Ответ написан
GM2mars
@GM2mars Автор вопроса
Добавил array('description', 'required', 'message' => 'напишите что нибудь'), все заработало.
Отсюда другой вопрос, как сделать чтоб поле не валидировалось? То есть чтоб оно могло быть пустым?
Ответ написан
@Nc_Soft
Присваивайте ручками, чем меньше магии тем лучше.
Ответ написан
Комментировать
@Cage
Вам же написали
array('description', 'safe'),
safe ничего не валидирует, а только сообщает что эти данные можно безопасно присваивать.

или же если не хотите писать это в rules() сделайте так:
public function actionCreateLink() {
  $model=new Links;
  if(isset($_POST['Links'])) {
    $model->setAttributes($_POST['Links'], false);
    echo '<pre>';
    print_r($_POST['Links']);
    print_r($model->attributes);
    echo '</pre>';
  }
}

но это небезопасно!
Ответ написан
Комментировать
@Cage
Links rules: (добавил description в массив save)

Все таки safe a не save
Вы его добавили для сценария "search", а для вновь созданного объекта используется по умолчанию сценарий "insert"
добавьте как было ранее указано отдельной строкой.
public function rules() {
  return array(
    array('url, name', 'required', 'message'=>'Обязательно для заполнения'),
    array('id_category', 'required', 'message' => 'Выберите категорию'),
    array('description', 'safe'),
    array('id, url, name, id_category', 'safe', 'on'=>'search'),
  );
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы