Машрутизация вида /blog/test_page/
Добрый день! Для начала хотел бы поблагодарить за фреймворк. Работа проделана отличная. Разбираюсь в тонкостях и запутался в простой казалось бы теме... Через стандартную модель pages в панели администратор создал страницу /blog/. Она доступна по обозначенному URL. После создаю /test_page/, корневой ставлю /blog/. Через маршрутизацию настроил "blog/*/" => "view-blog.php". Однако /blog/test_page/ не выводит запись блога. В свою очередь страница доступна по корневому URL /test_page/. Если я верно понял - нужно в шаблоне сделать разбор getUrlPart(), но как именно не очень ясно. Буду благодарен за объяснение.
И ещё момент. Допустим я хочу организовать слайдер на главной. Каким образом мне лучше организовать его администрирование на базе фреймворка? Пример вывода слайдера даю ниже:
<img src="/userfiles/images/main_slider/1.jpg"> <img src="/userfiles/images/main_slider/2.jpg"> <img src="/userfiles/images/main_slider/3.jpg"> <img src="/userfiles/images/main_slider/4.jpg">
Артём, добрый день, спасибо за комплимент.
Вот как лучше поступить с блогом, нужно сделать отдельную модель, в которой будет список статей и 2 вьюхи. На одной будут все статьи, а на другой отдельная статья.
В модели pages у вас останется только ссылка /blog/ для перехода в общий список статей, если вы ее отобразите в меню.
//Модель class Blog extends Model { protected $name = "Блог"; protected $model_elements = array( array("Активация", "bool", "active", array("on_create" => true)), array("Название", "char", "name", array("required" => true)), array("Ссылка", "url", "url", array("unique" => true, "translit_from" => "name")), array("Дата", "date", "date"), array("Изображение", "image", "image"), array("Текст статьи", "text", "content", array("rich_text" => true)) ); } //Маршруты "blog/" => "view-blog.php", "blog/*/" => "view-blog-article.php" //Разбор url в модели public function defineBlogPage(Router $router) { $url_parts = $router -> getUrlParts(); $record = false; if(count($url_parts) == 2) if(is_numeric($url_parts[1])) $record = $this -> findRecord(array("id" => $url_parts[1], "active" => 1)); else $record = $this -> findRecord(array("url" => $url_parts[1], "active" => 1)); return $record; } //Страница блога view-blog-article.php $mv -> pages -> defineCurrentPage($mv -> router); //Если нужно подсветить пункт меню $article = $mv -> blog -> defineBlogPage($mv -> router); $mv -> display404($article); $mv -> seo -> mergeParams($article, "name"); include $mv -> views_path."main-header.php"; <div id="content"> ... </div> include $mv -> views_path."main-footer.php";
Теперь при создании в модели блога страницы с url "test_page" она будет доступна по ссылке /blog/test_page/
самый простой пример вывода галереи есть тут
http://mv-framework.ru/sozdanie-novogo-shablona/
или еще можно делать отдельную модель как с блогом, только вместо статей будут изображения в поле с типом image
Спасибо за разъяснение. А если речь не идёт о блоге? Допустим есть страница /main_page/ и в нее нужно две-три подстраницы сделать /main_page/page_1/, /main_page/page_2/. Городить функционал ленты новостей, блога уже нет смысла, так как это всего пара подстраниц. Как быть в этом случае? Как понимаю в модели pages для page_1 и page_2 указываем корневым main_page. Но как эти страницы вывести теперь? Надеюсь понятно сформулировал вопрос.
Артём, тут дело в том, что модель pages, которая сразу идет в комплекте, работает с url вида /page/25/ и /name/, т.е. page + число либо читабельный url в 1 ступень.
Все перечисленные url в системе идут на view-default.php, там проходят через defineCurrentPage() если в БД страница не была найдена, то покажется 404.
А далее, можно развивать с помощью маршрутизации, подробные примеры тут
http://mv-framework.ru/obshie-principy-shablonov/
Т.к. URL вида /main_page/page_1/ не будет соответствовать ни одному шаблону в маршрутизации,
то придет на view-default.php, сразу 404 MV не показывает, а переводит на дефолтный шаблон. Если немного дополнить defineCurrentPage() в pages, то можно обработать и /main_page/page_1/
else if(count($url_parts) == 2 && $url_parts[0] == "main_page" && !is_numeric($url_parts[1])) $params = array("url" => $url_parts[1], "active" => 1);
Потихоньку начинаю понимать. Действительно после редактирования модели - заработало. Однако страница остаётся активной и по адресу /page_1/, что не очень хорошо для SEO.
Да, подобная ситуация вообще актуальна для любого вида читабельных URL, когда в ссылку ставится не id, а текстовая часть URL, и страница становится доступна по обоим параметрам...
Это никак не побороть? Если обе страницы каким-то образом попадут в индекс поисковиков - это будут дубли страниц, что в результате может не очень хорошо отразиться в индексе поисковых систем.
Если на сайте не будет прямой ссылки на страницу, то в индекс она попасть не должна, а для подстраховки можно попробовать не показывать страницу если она запрошена по одноступенчатому url. Но это еще надо проверить на практике, чтобы не перекрыло другие модули...
Т.е. если страница лежит не в корне (parent не -1) и запрошена по последнему фрагменту url, то мы ее как бы не нашли.
В defineCurrentPage()
if($record && $record -> parent != -1 && count($url_parts) == 1) return false;