CakePHR маршрутизация для cushycms ссылка для предварительного просмотра - PullRequest
0 голосов
/ 19 января 2010

У меня есть набор довольно статичных страниц, которые я переместил в папку views / pages. Полученные файлы * .ctp редактируются моим клиентом через CushyCMS (упрощенная система управления контентом, идеально подходящая для редактирования фиктивных доказательств). Однако CushyCMS генерирует ссылки для предварительного просмотра, которые явно не учитывают CakePHP. Я хотел бы решить эту небольшую проблему с помощью пользовательской маршрутизации, но не могу разобраться в деталях ..

Как я могу динамически подключить URL http://localhost:8888/cake125/app/views/pages/test.ctp к http://localhost:8888/cake125/pages/test?

Я добавил следующее в мои маршруты.php:

Router::connect('/pages/test.ctp', array(
  'controller' => 'pages',
  'action' => 'display', 'test'));

Это работает нормально для подключения: http://localhost:8888/cake125/pages/test.ctp к http://localhost:8888/cake125/pages/test. Каким-то образом следующий сниббет не справляется с задачей:

Router::connect('/app/views/pages/test.ctp', array(
  'controller' => 'pages',
  'action' => 'display', 'test'));

В идеале я хотел бы иметь один оператор Router :: connect, который соединяет все /app/views/pages/*.ctp запросы в нужном месте.

Наконец, я также хотел бы правильно обработать результаты поиска Google для старой версии сайта. Вот так:

Router::connect('/test.html', array(
   'controller' => 'pages',
   'action' => 'display', 'test'));

Это работает нормально, но я бы предпочел, чтобы anypage.html подключался к / pages / anypage. Кто-нибудь может помочь с этим?

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 20 января 2010

Поскольку другие указали, как работает CakePHP Router, я оставлю это на этом.

Для второй части вашего вопроса (обработка старых ссылок) я бы предложил добавить это в конец вашего списка маршрутов:

Router::connect( '/:page', 
    array (
        'controller' => 'pages', 
        'action' => 'display',
    ), 
    array (
        'pass' => array ('page'),    // to pass the page as first arg to action
        'page' => '.+\.html$',       // to verify that it ends with .html
    )
);

Вам, к сожалению, придется разобраться с .html самостоятельно, хотя

1 голос
/ 19 января 2010

Во-первых, благодаря наличию Cake в подкаталоге (/ cake125), я думаю, вам может понадобиться подключить действие / cake125 /: controller /:, а не то, как оно у вас есть. Не 100%, хотя; Cake может быть достаточно надежным, чтобы справиться с этим вариантом использования. Если у вас странные ошибки, я бы это проверил.

На мой ответ: Я думаю, вы несколько не понимаете, как работает класс Router. Вы подключаете URL, а не относительные пути файловой системы, используя Router :: connect. По умолчанию (который вы, возможно, стерли, но исправить это довольно просто), Cake направит запросы к / pages / * в функцию PagesController :: display (), передав ей один аргумент (действие, указанное в запросе http).

Итак, чтобы контроллер страниц сопоставил / pages / one с элементом app / views / pages / one.ctp, просто убедитесь, что следующая строка (по умолчанию, т. Е. Cake обычно имеет эту настройку) находится в конфигурации маршрутов (и убедитесь, что строки над ним не соответствуют этому шаблону):

Router::connect( '/pages/:action', array( 'controller' => 'pages', 'action' => 'display', :action);

Это должно гарантировать, что PagesController :: display ($ action) вызывается во время запроса, что является (я думаю) тем, что вы ищете.

Если ваша CMS генерирует ссылки для предварительного просмотра, которые вы хотите правильно перенаправить, я бы предложил добавить новый маршрут. Например, если ваша CMS генерирует ссылки наподобие http://somesite.com/cms/preview/newly_edited_file,, вы можете направить ее так:

Router::connect( '/cms/preview/:action', array( 'controller' => 'pages', 'action' => 'display', :action );

По второму вопросу: имейте правило по умолчанию в ваших маршрутах (сделайте его последним правилом и сделайте так, чтобы оно совпадало *). Затем он будет настроен на маршрутизацию всех не найденных запросов к вашей паре контроллер / действие в соответствии с запросом. Попробуйте это:

Router::connect( '/:action', array( 'controller' => 'pages', 'action' => 'display', :action );

Большая оговорка это нарушит ваши существующие маршруты. Вам нужно будет вручную добавить запись для каждого из ваших существующих контроллеров (Router :: connect ('/ users /: action', ... и т. Д.). Если вы гуглите вокруг, вы можете найти некоторые умные решения, такие как сгенерировать этот список во время выполнения для вас. Но вам нужно будет обратиться к «нормальной» маршрутизации, как только вы добавите эту ловушку (и убедитесь, что ваша ловушка находится в конце файла маршрутизации).

Кроме того, если вы хотите проанализировать URL-адреса, такие как /test.html, просто добавьте вызов Router :: parseExtensions (...), чтобы Cake зарегистрировал .html в качестве расширения для его анализа. Обратитесь к руководству по этой функции для получения дополнительной информации.

0 голосов
/ 20 января 2010

Как я могу динамически подключить URL http://localhost:8888/cake125/app/views/pages/test.ctp к http://localhost:8888/cake125/pages/test?

Ну, дело в том, что нет. : -)

Я имею в виду, что вы не подключаете URL к другому URL. Что вы действительно делаете, так это то, что определенные URL запускают определенные функции контроллера (или действия для краткости), которые в свою очередь могут (или не могут) отображать определенные Просмотров . По умолчанию все прямо через соглашения об именах. URL /foo/bar запускает действие контроллера Foo bar и отображает представление /views/foo/bar.ctp.

PagesController - это уже особый случай. URL /pages/foo запускает действие контроллера Pages display, передает ему параметр foo, который отображает представление /views/pages/foo.ctp. Обратите внимание на разницу, в которой запускается действие.

Так как между ними много шагов, не обязательно, чтобы определенный URL соответствовал определенному файлу на жестком диске. URL /foo/bar может вызвать Controller Baz 'Action doh, который отображает представление /views/narf/glob.ctp.

Это переводит http://localhost:8888/cake125/app/views/pages/test.ctp, чтобы сделать файл /views/pages/test.ctp где-то между неопределенностью и болью в тылу.


Edit:

Сказав это, особая проблема в вашем случае заключается в том, что базовый URL-адрес http://localhost:8888/cake125/app/. Вы можете вызвать приложение Cake из http://localhost:8888/cake125/, http://localhost:8888/cake125/app/ или http://localhost:8888/cake125/app/webroot. Все три URL-адреса будут обрабатываться одним и тем же файлом cake125/app/webroot/index.php, если вы используете один из более коротких URL-адресов, запрос будет «переадресован» (переписан) с помощью .htaccess правил.

Итак, маршрут, который вы пытаетесь подключить, маршрут, который видит Cake, на самом деле /views/pages/test.ctp.

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


Кажется, в CMS это не имеет особого смысла, поскольку для каждой вновь создаваемой страницы требуется свое собственное правило. Поэтому я бы рекомендовал не пытаться делать это, а скорее взломать Cushy для правильного построения URL-адресов, используя Cake HtmlHelper или Router::url(). В противном случае подключите все URL-адреса с правилом всеохватывающего действия к какому-либо действию, проанализируйте URL-адрес и отобразите правильное представление "вручную".

В качестве альтернативы, используйте .htaccess файлы и правила перезаписи, чтобы фактически переписать URL-адрес в обычный URL-адрес Cake, поэтому Cake не нужно об этом беспокоиться. Как уже было сказано выше, это может быть очень хрупким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...