Встраивание CakePHP в существующую страницу

#php #cakephp #routing #embed

#php #cakephp #маршруты #Внедрить

Вопрос:

Я вызвался создать какое-то приложение для БД, и я сказал этим ребятам, что это будет очень просто, так как я хотел использовать CakePHP. К сожалению, через некоторое время они сказали мне, что хотят использовать его в своей уже существующей сети, которая является древним, сильно настроенным phpNuke.

Итак, я хочу сгенерировать только содержимое одного <div> внутри уже существующей страницы с помощью CakePHP. Я посмотрел в Интернете, но не нашел того, что искал. Я скорее пользователь фреймворка, а не разработчик, поэтому я мало что знаю о бэкэнде и о том, как внутри работают фреймворки MVC (и это моя первая попытка с CakePHP, поскольку я парень из Rails).

То, что я сделал до сих пор, отключено mod_rewrite для Cake. Внутри модуля phpNuke я включил Cake index.php и рендеринг представлений с пустым макетом. Это как-то работает, но дело в том, как формировать URL-адреса. Я уже заработал с

 http://localhost/modules.php/posts?op=modloadamp;name=xxxxxamp;file=indexamp;do=xxxxx
  

но при этом все ссылки на CSS и изображения на сайте phpNuke не работают.

Есть ли какой-нибудь способ использовать что-то вроде

 http://localhost/modules.php?op=modloadamp;name=xxxxxamp;file=indexamp;do=xxxxxamp;CakePHP=/posts/bla/bla
  

или любой другой способ, который мог бы выполнить эту работу? Я действительно не хочу ничего менять в существующем приложении phpNuke.

Большое вам спасибо

Ответ №1:

Ну, если вы не понимаете, как работает CakePHP, у вас возникнут проблемы с выполнением того, что вы хотите, поскольку это означало бы внесение взломов в файлы ядра CakePHP, чтобы обойти маршрутизацию по умолчанию. По сути, это означает, что вам придется переделывать способ работы CakePHP, поэтому вы можете забыть об обновлении до более новой версии CakePHP, а обслуживание будет адом.

Если вы хотите изменить систему, но сохранить PHP-Nuke, я бы не советовал использовать там CakePHP, поскольку это создаст слишком много проблем, которые невозможно предсказать заранее.

Я думаю, что ваши варианты следующие:

  1. Узнайте, как работает PHP-Nuke, чтобы вы могли его модифицировать
  2. Используйте обычный php для страниц

Любой из них на порядок проще по сравнению с тем, что вы хотели сделать.

Комментарии:

1. Спасибо, PHP nuke почти как обычный php, без MVC, ORM, CRUD, и это страшно 🙂 Это выглядит как два простых пользовательских класса маршрутизации CakePHP ([ссылка] manual.cakephp.neoboots.com/2.0/en/development /… ) сделал свое дело. Теоретически и в простых тестовых случаях это работает, поэтому, надеюсь, будет работать в любой другой ситуации.

2. Интересно, спасибо, что поделились своим решением 🙂 Надеюсь, это сработает и в других случаях.

Ответ №2:

Итак, подводя итог, я нашел решение, если кто-то будет искать что-то подобное. Проблема решена с помощью двух пользовательских классов маршрутов ( 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 amp;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()."amp;cakePHP=".$result_url;
           return $newurl;
        } else {
            return $result_url;
        }
    }    

}
  

А затем простая настройка в routes 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'));