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?
В лучшем случае производи конвертацию: в представлении из массива в строку, а в контроллере из строки в массив. Но, честно говоря, что из этого получится и будут ли сохраняться значения я не знаю.
я понимаю, что это не правильно, так вот я и привел пример с блогом, и спросил, что ускользнуло от моего внимания. как по правилам обозначить атрибут и инпута?
понимаешь отношение HAS_MANY это один ко многим. Следовательно результатом его - будет куча обьектов данных полученный джоином. А ты пробуешь этот самый результат запихнуть в textarea поле без предворительной обработки. Отсюда собственно и ошибка.
Тебе надо данные перед тем как кинуть их в текстовое поле - обработать и привести к склаинной строке, а не как обьект. А при сохранении - разбивать это поле обратно в массив и сохранять по отдельности.
да не надо мне объяснять, что я неправильно сделал - мне надо узнать, как это сделать правильно. почему в демоблоге подобная конструкция работает, а в моем примере нет?
ну если то что тебе объясняют тебе не подходит, а хочется всё на блюдечке в золотой каёмачке - тогда жди помощи от кого то другого. если хватит ума вникнуть в то что тебе написали - может сам и разберешься.
п.с. это называется хочешь и рыбку съесть и на х*й не сесть.
Это не херня, уважаемый 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. Про херню, признаюсь, погорячился, но как можно воспринимать советы про "городить города", если в примере все так прозрачно и замечательно?
Онлайнсертифайдспешалист, ведь называл же инпуты именем отношения в предыдущем проекте, и все было айс. Магия? Или просто другой тип инпутов? Тогда вопрос: почему одни можно, а другие нельзя?
Остальные фреймворки мне не надо. Были проекты и на кейке, и на игнитере, и на симфони (к зенду предвзятое отношение). Может это и мешает? Пытаюсь найти более изящные решения именно из-за того, что там все это было гораздо проще.
Любитель фразеологизмов, подучите пунктуацию (да и грамматику тоже не помешает), а то попытки сарказма утопают в некрасивых предложениях.
На заметку: приведенная глагольная группа имеет смысловую ошибку.