Хочу приделать к модулю приложения полезную штуку - добавление в БД таблиц модуля при первом запуске, если они отсутствуют там. Столкнулся с проблемой, при создании action install и соответствующей функции в модели, мне выдается ошибка, то что таблица данного модуля отсутствует в бд. При том, что я ее нигде не запрашиваю. в чем может быть дело?
это как-то связано с работой модели, но не знаю как это обойти. т.е. это не ошибка в коде, а просто то, что модель видимо вызывает таблицу, определенную в function tableName();, а если ее там снести, то таблицу одноименную с названием модели…
$this->updateDbTable(); - вот этот вызов, это соответственно нужен такой метод в самой модели, который и будет возвращать массив данных? или эта функция уже занимается конвертацией массива, а массив в другой находится?
нет ли какого-то готового решения на просторах инета по конвертации массива в mysql? Немного погуглил, пока не нашел. Может придется и написать…
все, с этим понял. и все-таки? я что-то подобное видел, но не могу вспомнить где, может в друпале? Когда из массива конвертировалось в mysql. не знаете? есть какие-то решения?
Правда в yii есть нечто похожее в тех же данных, что возвращает getMetaData(). Исследуй классы CDbSchema, CMysqlSchema, CMysqlTableSchema, CMysqlColumnSchema
а я должен где-то вызывать данный или какой-то другой метод в контроллере? Просто я все сделал, пока без массивов, просто дамп sql, но при запуске данного модуля у меня ошибка:
The table "advertisements_categories" for active record class "Advertisements_mdl_categories" cannot be found in the database.
UPD
от этого недуга избавился, ошибок нет, но и добавления данных в базу не происходит. что=то наверное не так сделал. причем код добавления данных в базу исправный, работал раньше в другом месте.
это в файле модели, причем хочу обратить внимание что у меня в 1 модуле их несколько. как быть тогда? Просто логично разделить было - 1 модель отвечает за категории, другая за сами объявления (в данном случае) ну ит.д.
public function getSchema()
{
return array(
'sql' => './protected/modules/advertisements/config/schema_advertisements.sql',
'sep' => ';',
)
}
а вот код новоиспеченной прослойки:
Abstract Class TempoActiveRecord extends CActiveRecord
{
public function getMetaData()
{
$status = self::getTableStatus($this->tableName());
if (($status === null)&&(Yii::app()->params["autoInstallModules"]))
{
$this->updateDbTable();
}
return parent::getMetaData();
}
public function updateDbTable();
{
$data = $this->getSchema();
$sql = file_get_contents($data['dump']);
foreach (explode($data['sep'],$data['sql']) as $query)
{
$query = trim($query);
if (!empty($query))
{
$command = $connection->createCommand($query)->execute();
return true;
}
else
{
return false;
}
}
}