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}}')
Дерзайте, сэнсэи))