我目前正在开发一个现有的插件,大多数都是成功的 根据我的意愿扩展它。但我遇到了一个主要问题: 当第一次激活插件(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) {
}
}
非常感谢您的支持!
答案 0 :(得分:1)
似乎cake缓存了哪些表存在,并且在创建新表后,缓存不会更新。
有一种方法可以在不使用缓存的情况下创建模型实例,或者只是在创建实例之前清除缓存。
查看api文档以获取有关此
的更多信息