Перейти к содержимому



Паттерн MVC. В браузере не отображается содержимое одного из файлов.

#1 Pavl
Pavl
  • Пользователь
  • 12 сообщений
  • Репутация: 0
0

Обновлено 25 июля 2020 - 09:59  Отправлено 23 июля 2020 - 15:53

Добрый день!
Есть файл index.php:

<?php
    require_once 'start.php';
    Route::start();

который ссылается на файл start.php:

<?php
    set_include_path(get_include_path().PATH_SEPARATOR.'core'.PATH_SEPARATOR.'controllers');
    spl_autoload_extensions('_class.php');
    spl_autoload_register();
    define('DIR_TMPL', 'C:/OSPanel/domains/test/www/rusakov/tmpl/');
    define('MAIN_LAYOUT', 'main');

При заходе на index.php отображается содержимое двух файлов.
main.tpl:

<!DOCTYPE_html>
<html lang="ru">
<head>
    <title><?=$title?></title>
    <meta http-equiv="Content-Type" content="<?=$meta_desc?>">
    <meta name="description" content="<?=$meta_desc?>">
    <meta name="keywords" content="<?=$meta_keyword?>">
</head>
<body>
    <header>
        <h1>Добро пожаловать!</h1>
    </header>
    <hr />
    <div id="content"><?=$content?></div>
    <hr />
    <footer>С уваженем, команда нашего сайта.</footer>
</body>
</html>

и 404.tpl:

<h1>Страница не найдена</h1>
<p>Запрошенной страницы не существует!</p>
<p><a href="index">Главная страница</a></p>

Вопрос - почему браузер не находит и не выводит на экран содержимое файла index.tpl? Ведь этот файл лежит в одной папке с main.tpl и 404.tpl.
То есть, по идее, когда открываешь index.php, вместо содержимого 404.tpl, должно выводиться содержимое index.tpl, но так почему-то не происходит.
Файл index.tpl:

<h1>Главная страница</h1>
<p>Наш сайт только разрабатывается</p>
<p><a href="/page">Внутренняя страница</a></p>

Если необходимо, выложу содержимое других файлов: maincontroller_class.php, view_class.php, page.tpl и другие.
Содержимое папки tmpl:

Содержимое папки tmpl.JPG


 

 

Сообщение отредактировал Pavl: 23 июля 2020 - 15:55

  • 0

#2 miketomlin
miketomlin
  • Пользователь
  • 573 сообщений
  • Репутация: 119

Отправлено 24 июля 2020 - 13:55

То есть, по идее, когда открываешь index.php, вместо содержимого 404.tpl, должно выводиться содержимое index.tpl, но так почему-то не происходит.

Нет. Файл index.php – это фронт-контроллер. Если специально не определен /index.php, как валидный адрес, то будет отрабатывать шаблон 404.
 
Почитайте про роутинг. Вы должны определить конкретные адреса или адресные маски и привязать к ним обработчики, иначе по всем адресам будет выдаваться 404-ая. Например, в G-Drive и т.п. для определения страницы /page нужно создать в основной таблице запись с id="page" (и module="handler", если хотите, чтобы использовался шаблон handler.php, а не page.php).


P.S. Даже для главной (/) нужно определять спец. обработчик, иначе будет выдаваться 404-ая. Например, см. первую запись первой таблицы здесь ;)


Сообщение отредактировал BLIK: 25 июля 2020 - 14:57
удалил один url

  • 1


#3 Pavl
Pavl
    Topic Starter
  • Пользователь
  • 12 сообщений
  • Репутация: 0

Отправлено 24 июля 2020 - 15:51

@miketomlin, дело в том, что я писал этот код с видеоурока, который нашёл в интернете. Делал всё точь-в-точь, как в видеоуроке. С одним отличием - возможно я слишком глубоко в файловой системе разместил эти страницы. У автора урока код нормально работает, все страницы отображаются, а у меня нет. Возможно, я что-то напутал с путями к файлам, но, как это определить, ведь в браузере не появляется ошибка, что не найден, какой-то файл или папка? Появляется, только сообщение ""Страница не найдена", но опять же - это созданная страница 404.tmpl, а не ответ браузера.


  • 0

#4 miketomlin
miketomlin
  • Пользователь
  • 573 сообщений
  • Репутация: 119

Отправлено 24 июля 2020 - 22:33

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

// Определили каталог для шаблонов и т.п. относительно фронта (тек. файла)
define('PATH',__DIR__.'/mods/');
...
// Подключили файл из определенного каталога
require PATH.$r0['module'].'.php';

$r0['module'] содержит значение поля module основной таблицы (или поля id, если в таблице поле module отсутствует или содержит пустое значение).


У вас имя каталога шаблонов, судя по названию, задается константой DIR_TMPL. Хардкодить абсолютные пути – близко к идиотизму. Используйте абсолютные, но определяйте через какую-то базу, как я показал.


  • 0


#5 Pavl
Pavl
    Topic Starter
  • Пользователь
  • 12 сообщений
  • Репутация: 0

Отправлено 24 июля 2020 - 23:51

$r0['module'] содержит значение поля module основной таблицы (или поля id, если в таблице поле module отсутствует или содержит пустое значение).

В видеоуроке даже речи не идёт о создании таблиц и подключении к базе данных, несмотря на значительное количество созданных папок и файлов! У автора и без базы данных всё хорошо работает. Или Вы это прекрасно понимаете, но настаиваете, что нужно создать таблицу для выполнения текущего задания, так как по Вашему мнению так будет гораздо лучше и правильнее?


  • 0

#6 miketomlin
miketomlin
  • Пользователь
  • 573 сообщений
  • Репутация: 119

Отправлено 25 июля 2020 - 09:59

Это был всего лишь наглядный пример того, как работает роутинг. Если у вас нет таблицы в БД, то должна быть «таблица» в файлах (список роутов) или последовательный многократный вызов функции, которой в одном из параметров передается адрес (или маска), обращение по которому нужно обрабатывать.
 

по Вашему мнению так будет гораздо лучше и правильнее?

Попытайтесь «добить» до конца свой вариант. Потом переходите к изучению чего-то другого. Основные виды роутинга я перечислил. У каждого есть свои преимущества. Кроме того, их можно совмещать, например в этом комменте (см. фрагмент кода) показано, как можно к упомянутому мной фронту прикрутить элемент совсем другого вида роутинга, чем упомянутый мной табличный на основе данных из БД (который используется там же внутри второго блока ветвления, т.е. elseif).


P.S. Конечно, может быть и примитив вроде определения имени файла непосредственно из адреса, например из /page получается имя page.php или page.tpl, потом проверяется существование этого файла и т.д. Но такие вещи даже рассматривать не надо.


  • 0



Пользователь месяца
BLIK BLIK 1-й за Июль
Очков активности: 81 0 тем, 27 сообщений, 2 балла репутации
ТОП самых активных за этот месяц
  • Фотография Megoydagi
    #1

    Megoydagi (24ho.ru)
    Очков активности: 10.5 1 тема, 4 сообщения, 1 балл репутации

  • Фотография heisenberg
    #2

    heisenberg
    Очков активности: 7.5 1 тема, 2 сообщения, 1 балл репутации

  • Фотография sws
    #3

    sws
    Очков активности: 6 0 тем, 4 сообщения, 1 балл репутации

  • Фотография kartuzzz
    #4

    kartuzzz
    Очков активности: 6 1 тема, 1 сообщение, 1 балл репутации

  • Фотография Totti
    #5

    Totti
    Очков активности: 6 0 тем, 4 сообщения, 1 балл репутации

  • Фотография kuprum
    #6

    kuprum
    Очков активности: 4.5 1 тема, 0 сообщений, 1 балл репутации

  • Фотография Chaser
    #7

    Chaser (majento.ru)
    Очков активности: 4.5 1 тема, 0 сообщений, 1 балл репутации

  • Фотография 2kwkw
    #8

    2kwkw
    Очков активности: 4.5 1 тема, 0 сообщений, 1 балл репутации

  • Фотография Cpatoday
    #9

    Cpatoday
    Очков активности: 4.5 1 тема, 0 сообщений, 1 балл репутации

  • Фотография zyzy
    #10

    zyzy
    Очков активности: 3 0 тем, 2 сообщения, 1 балл репутации

  • Показать весь ТОП 10

Поддержите форум! =)
Топ 5 участников по репутации

Оформление форума – IPBSkins.ru