#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, поскольку это создаст слишком много проблем, которые невозможно предсказать заранее.
Я думаю, что ваши варианты следующие:
- Узнайте, как работает PHP-Nuke, чтобы вы могли его модифицировать
- Используйте обычный 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'));