在现有页面中嵌入CakePHP

时间:2011-10-22 23:55:13

标签: php cakephp routing embed

我自愿创建了一些数据库应用程序,我告诉那些人这很容易,因为我想使用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应用程序中的任何内容。

非常感谢

2 个答案:

答案 0 :(得分:1)

好吧,如果你不理解CakePHP如何工作,你将无法做你想做的事情,因为这意味着将黑客入侵CakePHP核心文件以绕过默认路由。这基本上意味着你将以CakePHP的工作方式重新工作,所以你可以忘记更新到更新的CakePHP版本,并且维护将是地狱。

如果你想修改系统,但保留PHP-Nuke,我建议不要在那里干扰CakePHP,因为这会打开太多问题,无法事先预测。

我认为你的选择如下:

  1. 了解PHP-Nuke的工作原理,以便您进行修改
  2. 使用常规php作为页面
  3. 与您想要的相比,其中任何一个都比数量级更容易。

答案 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'));