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.

Другие вопросы по тегам