Croogo / CakePHP:插件:OnActivation问题 - 无法同时从Schema和table-entry(通过Model-instance)创建表

时间:2011-06-06 16:49:47

标签: cakephp plugins schema

我目前正在开发一个现有的插件,大多数都是成功的  根据我的意愿扩展它。但我遇到了一个主要问题:  当第一次激活插件(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 个答案:

答案 0 :(得分:1)

似乎cake缓存了哪些表存在,并且在创建新表后,缓存不会更新。

有一种方法可以在不使用缓存的情况下创建模型实例,或者只是在创建实例之前清除缓存。

查看api文档以获取有关此

的更多信息