Codeigniter - лучшая конфигурация маршрутов для CMS? - PullRequest
3 голосов
/ 16 сентября 2010

Я хотел бы создать собственную CMS в Codeigniter, и мне нужен механизм для маршрутизации общих страниц на контроллер по умолчанию, например:

mydomain.com/about
mydomain.com/services/maintenance

Они будут направлены через мой контроллер обработчика страниц. Поведение маршрутизации по умолчанию в Codeigniter, разумеется, заключается в маршрутизации на соответствующий контроллер и метод, поэтому в приведенных выше примерах потребуется контроллер About и контроллер Services. Это явно не практичный или даже разумный подход.

Я видел следующее решение для размещения в rout.php:

$route['^(?!admin|products).*'] = "pagehandler/$0";

Но я полагаю, это создает собственные проблемы. Например, он просто ищет «продукты» в запросе uri и, если найдены маршруты к контроллеру продуктов - но что, если у нас есть сервисы / продукты в виде страницы CMS? Не направляется ли это на контроллер продуктов?

Есть ли идеальный подход к этому? Я не хочу иметь маршрутизацию, где весь контент CMS имеет префикс с именем контроллера, но мне также нужно иметь возможность переопределить маршрутизацию для других контроллеров.

Ответы [ 2 ]

3 голосов
/ 18 октября 2010

Если вы используете CodeIgniter 2.0 (который был достаточно стабилен для использования в течение нескольких месяцев), тогда вы можете использовать:

$route['404_override'] = 'pages';

Это отправит на контроллер страниц все, что не является контроллером, методом или допустимым маршрутом. Затем вы можете использовать любой PHP, который вам нравится, чтобы показать страницу или показать более приятную страницу 404.

Прочтите руководство, объясняющее, как вы обновляетесь до CodeIgniter 2.0 . Также вас может заинтересовать использование существующей CMS, такой как PyroCMS , которая сейчас приближается к финальной версии 1.0 и имеет огромное количество поклонников.

3 голосов
/ 15 октября 2010

Вам повезло. Я сам разрабатываю CMS, и мне понадобились годы, чтобы найти жизнеспособное решение для этого. Позвольте мне объяснить, чтобы убедиться, что мы находимся на той же странице здесь, но я вполне уверен, что мы области.

Ваши URL могут быть отформатированы следующими способами:

http://www.mydomain.com/about - страница верхнего уровня без категории
http://www.mydomain.com/services/maintenance - страница с родительской категорией
http://www.mydomain.com/services/maintenace/server-maintenance - страница с категорией и подкатегорией.

В моем контроллере страниц я использую функцию _remap, которая в основном захватывает все запросы к вашим контроллерам и позволяет вам делать с ними все, что вы хотите.

Вот мой код, прокомментированный для вашего удобства:

<?php

class Pages extends Controller {

    // Captures all calls to this controller
    public function _remap() 
    {
        // Get out URL segments
        $segments = $this->uri->uri_string();
        $segments = explode("/", $segments);

        // Remove blank segments from array
            foreach($segments as $key => $value) {
               if($value == "" || $value == "NULL") {
                   unset($segments[$key]);
               }
            }

            // Store our newly filtered array segments
            $segments = array_values($segments); 

            // Works out what segments we have
            switch (count($segments))
            {
                // We have a category/subcategory/page-name
                case 3:
                    list($cat, $subcat, $page_name) = $segments;
                break;

                // We have a category/page-name
                case 2:
                    list($cat, $page_name) = $segments;
                    $subcat = NULL;
                break;

                // We just have a page name, no categories. So /page-name
                default:
                    list($page_name) = $segments;
                    $cat = $subcat = NULL;
                break;
            }

        if ($cat == '' && $subcat == '') {

            $page  = $this->mpages->fetch_page('', '', $page_name);

        } else if ($cat != '' && $subcat == '') {

            $page  = $this->mpages->fetch_page($cat, '', $page_name);

        } else if ($category != "" && $sub_category != "") {

            $page = $this->mpages->fetch_page($cat, $subcat, $page_name);
        }

                // $page contains your page data, do with it what you wish.

}
?>

Вам, конечно, потребуется изменить функцию модели выборки страниц, принять 3 параметра и затем передать информацию в зависимости от того, какой тип страницы вы просматриваете.

В вашем файле application / config / rout.php просто укажите, какие конкретные URL-адреса вы хотите направить, и в самом низу укажите:

/* Admin routes, login routes etc here first */

$route['(:any)'] = "pages"; // Redirect all requests except for ones defined above to the pages controller.

Дайте мне знать, если вам нужно больше разъяснений или загружаемый пример кода.

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