Yii CActiveRecord с именем столбца "атрибуты"
Я использовал генератор CRUD из устаревшей базы данных. При поиске значения столбца я получаю следующую ошибку:
htmlspecialchars () ожидает, что параметр 1 будет строкой, задан массив (/usr/local/share/yii/framework/web/helpers/CHtml.php:103)
Проблема в том, что модель имеет существующий столбец с именем "атрибуты", который создает конфликт. Я удалил запись из _search.php и прокомментировал все экземпляры в модели, надеясь, по крайней мере, заставить ее работать, но не повезло. Мы ценим любые предложения.
Благодарю.
1 ответ
Каждый CActiveRecord
экземпляр (или CModel
экземпляр в этом отношении) имеет геттер / сеттер с именем attributes
с помощью которого можно установить все атрибуты. Это приводит к конфликту, потому что сгенерированный код crud использует attributes
Атрибут ожидает, что он работает, как описано ранее.
Контроллер делает что-то вроде:
$model->attributes=$_POST['ModelClassName'];
// or
$model->attributes=$_GET['ModelClassName'];
Это предназначено для одновременной установки всех (безопасных) атрибутов модели. Вместо этого это перезаписывает атрибут базы данных attributes
вашей устаревшей модели БД.
Это в свою очередь приводит к ошибке, которую вы описываете, потому что $_GET['ModelClassName']
а также $_POST['ModelClassName']
обычно содержат массивы данных.
Я думаю, что самым простым решением было бы напрямую вызвать функцию установки для "нормального" attributes
поведение, которое привело бы к замене упомянутых выше строк чем-то вроде следующего:
// in the controller
$model->setAttributes($_POST['ModelClassName']);
// and
$model->setAttributes($_GET['ModelClassName']);
Я думаю, что остальная часть сгенерированного кода CRUD (представления) может и должна быть оставлена нетронутой, чтобы заставить его работать.
Если вы хотите знать, как и почему это работает, лучше всего изучить __get
а также __set
магические функции и как они используются в рамках yii.