Hitman, все эти функции правильный и работают. Просто у rosko модель по другому вызывается/инициализируется. Вот и все просто перепиши метод model или же выясни у rosko как он это делает
Hitman, все эти функции правильный и работают. Просто у rosko модель по другому вызывается/инициализируется. Вот и все просто перепиши метод model или же выясни у rosko как он это делает
вы уж меня извините за тупняк, но что в model надо переписать? в смысле что не так? не догоняю
Ну скорее всего там и надо вызывать проверку на наличие таблицы… я сам хз
ладно, ждем rosko, может он нас просветит?
надо переопределить model в своей прослойке? а что он будет возвращать тогда?
Действительно, у меня просто работа с моделью начинается чуть по-другому. Поэтому мой код на 100% примером быть не может.
Ты вот сделай так. Переопредели model() в прослойке:
public static function model($className=__CLASS__) { if (!self::tableExists()) { self::createTable(); self::insertInitData(); } return parent::model($className); }
И опиши в прослойке методы: tableExists() - для проверки реального существования таблицы; createTable() - для создания таблицы; insertInitData() - по желанию, для вставки исходных данных.
А вот как может выглядеть tableExists():
public function tableExists() { $command = Yii::app()->db->createCommand("show table status"); $reader = $command->query(); while (($row = $reader->read()) !== false) { if ($row["Name"] == self::tableName()) return true; } return false; }
Только оптимизируй как-то, а то проверка будет выполняться при каждом использовании метода mode().
ну черновой вариант примерно такой:
Прослойка:
<?php Abstract Class SActiveRecord extends CActiveRecord { public static function model($className=__CLASS__) { if (!self::tableExists()) { $this->createTable(); //self::insertInitData(); } return parent::model($className); } public function tableExists() { $command = Yii::app()->db->createCommand("show table status"); $reader = $command->query(); while (($row = $reader->read()) !== false) { if ($row["Name"] == self::tableName()) return true; } return false; } /*public function getMetaData() { $status = self::tableExists(); if ((1 == 1)&&(Yii::app()->params["autoInstallModules"])) { $this->createTable(); } return parent::getMetaData(); }*/ public function createTable(); { $data = self::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; } } }
в модели:
public function getSchema() { return array( 'sql' => './protected/modules/advertisements/config/schema_advertisements.sql', 'sep' => ';', ) }
вы не поверите, опять ничерта не работает. ни одного признака жизни.(
Зачем в цикле делаешь return true или return false? У тебя тогда функция будет заканчиваться после первого удачного запроса. Это первое.
И второе. explode($data[‘sep’],$data[‘sql’]) - что ты парсишь? файл или его название?
И даже третье. Мне кажется не разумно парсить файл только по одному символу. Что будет, если точка с запятой встретятся не самих данных? Правильно, глюк.
Например, покопайся в том же phpMyAdmin и узнай каким образом там парсится файл.
И даже четвертое. Сделай парсинг до цикла, а то у тебя файл будет заново парситься при каждой иттерации.
Все, собрался в кучу, когда приехал щас на дачу, остался наедине с кодом на полчасика, допилил все ошибки, а их оказалось немало и - ура, заработало! От меня огромное спасибо rosko, Digital God и персонально по плюсу в карму спасибо!
В следующей версии ожидается появление CFormModel::init() и CActiveRecord::init().
Наверно его будет удобнее использовать для инсталляции/обновления таблиц в БД.
Проверка на существование таблицы, учитывая префикс
Yii::app()->db->schema->getTable('{{users}}')
Дерзайте, сэнсэи))