我自愿创建了一些数据库应用程序,我告诉那些人这很容易,因为我想使用CakePHP。可悲的是,经过一段时间后,他们告诉我他们想要在他们已经存在的网络中,这是古老的高度定制的PHPNuke。
所以我想要的是在CakePHP已经存在的页面内生成一个<div>
的内容。我抬头看着互联网,但我找不到我想要的东西。我更喜欢框架的用户,而不是开发人员,所以我对后端以及MVC框架如何在内部工作知之甚少(这是我第一次尝试使用CakePHP,因为我是Rails的人)。
到目前为止,我所做的是为Cake禁用mod_rewrite
。在PHPNuke模块中,我包含了Cake的index.php和使用空布局的渲染视图。这在某种程度上有效,但问题是如何形成URL。我现在用
http://localhost/modules.php/posts?op=modload&name=xxxxx&file=index&do=xxxxx
但是这一切都与PHPNuke网站上的CSS和图像的所有链接都破了。
有没有办法使用像
这样的东西http://localhost/modules.php?op=modload&name=xxxxx&file=index&do=xxxxx&CakePHP=/posts/bla/bla
或任何其他可以完成这项工作的方式?我真的不想改变现有PHPNuke应用程序中的任何内容。
非常感谢
答案 0 :(得分:1)
好吧,如果你不理解CakePHP如何工作,你将无法做你想做的事情,因为这意味着将黑客入侵CakePHP核心文件以绕过默认路由。这基本上意味着你将以CakePHP的工作方式重新工作,所以你可以忘记更新到更新的CakePHP版本,并且维护将是地狱。
如果你想修改系统,但保留PHP-Nuke,我建议不要在那里干扰CakePHP,因为这会打开太多问题,无法事先预测。
我认为你的选择如下:
与您想要的相比,其中任何一个都比数量级更容易。
答案 1 :(得分:1)
所以总结解决方案我发现,如果有人会寻找类似的东西。使用两个自定义路由类(http://manual.cakephp.neoboots.com/2.0/en/development/routing.html#custom-route-classes)
解决了问题class CustomParserRoute extends CakeRoute {
function parse($url) {
if (parent::parse($url) != false) //if default parser has the match continue
{
// call to Router class to do the routing for new url string again,
// if &cakePHP= is in query string, use this, or use default
if ($_GET['cakePHP']) {
$params = Router::parse($_GET['cakePHP']);
} else {
$params = Router::parse("/my_controller");
}
return $params;
}
return false;
}
}
class CustomMatcherRoute extends CakeRoute {
// cusotm mathc function, that generates url string.
// If this route matches the url array, url string is generated
// with usual way and in the end added to url query used by PHPNuke
function match($url) {
$result_url = parent::match($url);
if($result_url!= false) {
$newurl = function_to_generate_custom_query()."&cakePHP=".$result_url;
return $newurl;
} else {
return $result_url;
}
}
}
然后在路线php
中进行简单配置App::import('Lib', 'CustomParserRoute');
App::import('Lib', 'CustomMatcherRoute');
// entry point to custom routing, if route starts with modules.php it matches
// the url and CustomParserRoute::parse class is called
// and route from query string is processed
Router::connect('/modules.php', array('controller' => 'my_controller'), array('routeClass' => 'CustomParserRoute'));
// actual routes used by cakephp app, usual routes that need to use
// CustomMatcherRoute classe, so when new url is generated, it is modified
// to be handled later by route defined above.
Router::connect('/my_controller/:action/*', array('controller' => 'my_controller'), array('routeClass' => 'CustomMatcherRoute'));