Croogo / CakePHP: Плагин: проблема OnActivation - невозможно создать таблицы из схемы и записи в таблице (через экземпляр модели) одновременно - PullRequest
2 голосов
/ 06 июня 2011

В настоящее время я работаю над существующим плагином, в основном успешно расширяя его в соответствии с моими пожеланиями.Но я столкнулся с одной большой проблемой: при первой активации плагина (onActivation-method) необходимо создать необходимые таблицы, если они не существуют.На самом деле, они созданы, это работает правильно.Но сразу после этого я создаю Экземпляр модели плагина, чтобы сохранить первую запись Модели в одной из недавно созданных таблиц.Однако это не работает.Таблицы созданы, но я получаю сообщение об ошибке SQL: Croogo / CakePHP утверждает, что эти таблицы не существуют.Но они на самом деле делают.Если я нажму несколько раз обновить, плагин снова деактивируется.Таблицы уже существуют, и следующая активация прошла успешно: вводятся данные образца.

Похоже, что это проблемы с кэшированием, потому что я уже играл с этим.Я также попытался использовать loadModel вместо ClassRegistry.Но это ничего не меняет вообще.

Вот мой код:

class SitesActivation {
public function beforeActivation(&$controller) {
    return true;
}

public function onActivation(&$controller) {
    App::import('Model', 'CakeSchema');
    App::import('Model', 'ConnectionManager');
    App::import('Libs', 'Sites.sites');
    include_once(APP.'plugins'.DS.'sites'.DS.'config'.DS.'schema'.DS.'schema.php');
    $db = ConnectionManager::getDataSource('default');

    //Get all available tables
    $tables = $db->listSources();

    $CakeSchema = new CakeSchema();
    $SiteSchema = new SitesSchema();

    if (!in_array('sites', $tables)) {
        $db->execute($db->createSchema($SiteSchema, 'sites'));
    }
    if (!in_array('site_domains', $tables)) {
        $db->execute($db->createSchema($SiteSchema, 'site_domains'));
    }
    if (!in_array('sites_nodes', $tables)) {
        $db->execute($db->createSchema($SiteSchema, 'sites_nodes'));
    }

    //Insert "ALL SITES"

    $Site = ClassRegistry::init('Sites.Site');
    $Site->create();
    $data = array(
        'Site' => array(
            'id' => Sites::ALL_SITES,
            'title' => 'All Sites',
            'tagline' => Configure::read('Site.tagline'),
            'email' => Configure::read('Site.email'),
            'locale' => Configure::read('Site.locale'),
            'status' => Configure::read('Site.status'),
            'timezone' => Configure::read('Site.timezone'),
            'theme' => Configure::read('Site.theme'),
            'default' => 1,
        ),
        'SiteDomain' => array(
            'site_id' => Sites::ALL_SITES,
            'domain' => env('HTTP_HOST'),
        ),
    );
    $Site->saveAll($data);

    /*$db->execute($db->rawQuery(
        'INSERT INTO sites ( id, title, tagline, email, locale, status, timezone, theme, default ) VALUES( 
        "1",
        "All Sites",
        "' . Configure::read('Site.tagline') . '",
        "' . Configure::read('Site.email') . '",
        "' . Configure::read('Site.locale') . '",
        "' . Configure::read('Site.status') . '",
        "' . Configure::read('Site.timezone') . '",
        "' . Configure::read('Site.theme') . '",
        "1"
        )'
    ));*/
}

public function beforeDeactivation(&$controller) {
    return true;
}

public function onDeactivation(&$controller) {
}

}

Большое спасибо за вашу поддержку!

1 Ответ

1 голос
/ 07 июня 2011

Похоже, что торт кешировал, какие таблицы существуют, и после создания новых кеш не обновляется.

Существует способ создать экземпляр модели без использования кэша или просто очистить кэш перед созданием экземпляра.

Проверьте API документы для получения дополнительной информации об этом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...