我目前正在开发一个现有的插件,在根据我的意愿延长。但我遇到了一个主要问题:当第一次激活插件(onActivation方法)时,必须创建所需的表,以防它们不存在。在里面事实上,它们是被创造出来的,它正常工作。但紧接着,我我正在创建插件模型的实例,以便保存第一个最近创建的一个表中的模型条目。然而,这确实不起作用。表已创建,但我收到一个SQL错误:Croogo/CakePHP声称,这些表并不存在。但是他们实际上是这样。如果我多次点击刷新,插件就会得到再次退出。然后这些表已经存在,下一个激活成功:输入样本数据。
这个doe鼻涕似乎是一个缓存问题,因为我已经玩了带着这个。我还尝试使用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) {
}
}
非常感谢您的支持!
看起来cake已经缓存了存在的表,并且在创建新表后,缓存不会更新。
有一种方法可以在不使用缓存的情况下创建模型实例,或者在创建实例之前只清除缓存。
查看api文档,了解有关此的更多信息