ошибка при создании инпута htmlspecialchars() expects parameter 1 to be string

Ситуация, как с тэгами в демоблоге, даже легче.

Attributes




public function relations() {

   return array(

      'values' => array(self::HAS_MANY, 'Values', 'attribute_id'),

   );

}

при создании инпута


CHtml::activeTextArea($model, 'values')

вылетает ошибка, что, мол, как бы


htmlspecialchars() expects parameter 1 to be string, array given

а при изменении имени ‘values’ на что-либо другое с занесением в safeAttributes и rules (где-то, помню, читал об этом, но не могу найти), пишет, что свойство не определено.

Посмотрел исходники блога - там отношение постов с тэгами задано одним именем, а в форме указано другое. "Tags" указан только в safeAttributes и rules. Что я пропустил?

Как же ты хочешь передавая строковое значение влиять на массив, которым по сути является свойство values?

В лучшем случае производи конвертацию: в представлении из массива в строку, а в контроллере из строки в массив. Но, честно говоря, что из этого получится и будут ли сохраняться значения я не знаю.

я понимаю, что это не правильно, так вот я и привел пример с блогом, и спросил, что ускользнуло от моего внимания. как по правилам обозначить атрибут и инпута?

какая конвертация? о чем Вы?

Как я понял rosko имел ввиду сериализацию

да ну? )) дело не в том, что он имел ввиду, а как правильно построить такую конструкцию. неужели никто не делал подобные вещи?

понимаешь отношение HAS_MANY это один ко многим. Следовательно результатом его - будет куча обьектов данных полученный джоином. А ты пробуешь этот самый результат запихнуть в textarea поле без предворительной обработки. Отсюда собственно и ошибка.

Тебе надо данные перед тем как кинуть их в текстовое поле - обработать и привести к склаинной строке, а не как обьект. А при сохранении - разбивать это поле обратно в массив и сохранять по отдельности.

да не надо мне объяснять, что я неправильно сделал - мне надо узнать, как это сделать правильно. почему в демоблоге подобная конструкция работает, а в моем примере нет?

ну а вот это полная, извините меня, херня

ну если то что тебе объясняют тебе не подходит, а хочется всё на блюдечке в золотой каёмачке - тогда жди помощи от кого то другого. если хватит ума вникнуть в то что тебе написали - может сам и разберешься.

п.с. это называется хочешь и рыбку съесть и на х*й не сесть.

to seme4kin

Это не херня, уважаемый Zolter все правильно объяснил.

Я в свою очередь постараюсь разжевать и предложить решение.

Причина ошибки:

‘values’ это связь в результате которой получается массив объектов Values. Таким образом метод CHtml::activeTextArea() получает вместо ожидаемого значения атрибута модели массив объектов, который передается в функцию htmlspecialchars(), что есть very big mistake.

Решение:

Реализуй в модели метод getValuesAsString() который будет склеивать значения нужного атрибута массива моделей ‘values’ в строку. После чего все будет работать, но вызывать нужно будет как




CHtml::activeTextArea($model,'valuesAsString');



P.S. Yii довольно сложный фреймворк, для полного и грамотного использования которого нужно знать не только документацию, но и желательно глубоко вникнуть в его реализацию. Для новичков больше подошел бы CakePHP или Codeigniter, но это просто совет.

Я бы сделал так:

в модель добавляем public $valusAsText = null; В afterFind() собираем values[] в $this->valuesAsText. В beforeSave разбиваем $this->valuesAsText в массив (регуляркой или explode()). И например,грохнув все подчиненные values, сохраняем $value = new Values(array(‘value’=>$values[$i]); $value->save();

В представлении CHtml::activeInputField($model, ‘valuesAsText’);

И теперь даже если валидация формы не пройдет - в поле ввода будет то что надо.

Итак, ответ на вопрос, который я и озвучил в первом посте: собственно, откуда в форме добавления постов демоблога взялся этот самый "tags", нигде не обозначенный ранее - посмотрел заново структуру БД - и вот он, родимый, как столбец таблицы Post, в котором через запятую и перечислены все тэги - решение очевидное, но некрасивое.

Открой мне кто из вас глаза на это в первом или втором ответе, и мои поиски продолжились бы в соответствующем направлении. Но нет, начались рассказы про сериализацию и отношения AR. Про херню, признаюсь, погорячился, но как можно воспринимать советы про "городить города", если в примере все так прозрачно и замечательно?

Онлайнсертифайдспешалист, ведь называл же инпуты именем отношения в предыдущем проекте, и все было айс. Магия? Или просто другой тип инпутов? Тогда вопрос: почему одни можно, а другие нельзя?

Остальные фреймворки мне не надо. Были проекты и на кейке, и на игнитере, и на симфони (к зенду предвзятое отношение). Может это и мешает? Пытаюсь найти более изящные решения именно из-за того, что там все это было гораздо проще.

Любитель фразеологизмов, подучите пунктуацию (да и грамматику тоже не помешает), а то попытки сарказма утопают в некрасивых предложениях.

На заметку: приведенная глагольная группа имеет смысловую ошибку.

puritania, спасибо.

Кто ж вам виноват что вам религия мешает в базу посмотреть. Обычно это делают в первую очередь чем флудят на форуме.

Вы спросили почему ошибка - вам все на это и ответили.