Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
2 / 2 / 2
Регистрация: 26.10.2015
Сообщений: 83

Вывод данных из обработчика в шаблон

03.12.2018, 12:53. Показов 1940. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. На своем учебном сайте зашел в тупик при попытке вывести данные из обработчика в шаблон.
Суть проблемы в следующем. Роутер вызывает обработчик. В обработчике в конструкторе подключаю шаблон html страницы.

файл html_tpl.php
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<html>
 <head>
    <title></title>
 </head>
 <body>
        <div id="header">
         Шапка
         </div>
 
        <div id='content'>
        $class::Display();
        </div>
 
        <footer id="footer">
         Подвал сайта
    </footer>
 </body>
</html>
файл класса обработчика Page.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Page
{ 
 public $layout = 'html_tpl';
 
 public function __construct()
 {
     $this->getLayout();
 }
 
  public function getLayout() {
     $class = get_class($this);
     $layout = 'tpl/'.$this->layout.'.php';
     require $layout;
 }
 
 public static function Display()
 {
     echo "Текст главной страницы";
 }
 
 public function ThisClass() {
     $class = get_class($this);
     return $class;
 }
Соответственно проблема в том, что при вызове обработчика Page/Display в данном примере он отображается как и в теле шаблона так и после него. Как мне сделать так, чтобы был только в теле. Догадываюсь, что делаю все в корне неправильно. Если так, то направьте на путь истинный. Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.12.2018, 12:53
Ответы с готовыми решениями:

Вывод данных с обработчика
function DownLoadDate() { $.ajax({ type: &quot;POST&quot;, url:...

Вывод данных из БД в шаблон
Дико туплю. Во вьюхе считаю сумму цен товаров: summa = Good.objects.all().aggregate(Sum('price')) return render(request,...

Вывод в шаблон данных из БД
Добрый вечер! Я понимаю, что вопрос нубский, однако ковыряюсь уже второй день, и все бесполезно. Я хочу вывести данные из БД в шаблон, при...

10
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
03.12.2018, 13:01
Покажите, как вы запускаете этот обработчик.
0
2 / 2 / 2
Регистрация: 26.10.2015
Сообщений: 83
03.12.2018, 13:05  [ТС]
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
require 'vendor/autoload.php';
 
spl_autoload_register( function($classname){
    require_once( "classes/" .  $classname . ".php");   
} );
 
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
    $r->addRoute('GET', '/', 'Page/Display');
});
 
// Fetch method and URI from somewhere
$httpMethod = $_SERVER['REQUEST_METHOD'];
$uri = $_SERVER['REQUEST_URI'];
 
// Strip query string (?foo=bar) and decode URI
if (false !== $pos = strpos($uri, '?')) {
    $uri = substr($uri, 0, $pos);
}
$uri = rawurldecode($uri);
 
$routeInfo = $dispatcher->dispatch($httpMethod, $uri);
switch ($routeInfo[0]) {
    case FastRoute\Dispatcher::NOT_FOUND:
        // ... 404 Not Found
        break;
    case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
        $allowedMethods = $routeInfo[1];
        // ... 405 Method Not Allowed
        break;
    case FastRoute\Dispatcher::FOUND:
        $handler = $routeInfo[1];
        $vars = $routeInfo[2];
        list($class, $method) = explode("/", $handler, 2);
        call_user_func_array(array(new $class, $method), $vars);
        break;
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
03.12.2018, 14:02
Цитата Сообщение от svisch Посмотреть сообщение
PHP
1
call_user_func_array(array(new $class, $method), $vars);
Здесь вы создаёте объект. В этот момент запускается __construct, который выводит шаблон на экран. Затем функция call_user_func_array вызывает метод Display, который дополнительно выводит текст.

Чтобы исправить, переместите вывод шаблона в метод Display, в конструкторе ему нечего делать.

Цитата Сообщение от svisch Посмотреть сообщение
PHP
1
spl_autoload_register( function($classname){
Композер может сам сгенерировать автозагрузчик для пользовательских файлов, делается парой строк кода в конфиге:
https://klisl.com/composer_autoload.html
0
2 / 2 / 2
Регистрация: 26.10.2015
Сообщений: 83
03.12.2018, 14:46  [ТС]
Цитата Сообщение от Jodah Посмотреть сообщение
Чтобы исправить, переместите вывод шаблона в метод Display, в конструкторе ему нечего делать.
Все равно не понимаю. Допустим я делаю метод Dysplay следующим образом:
PHP
1
2
3
4
5
public function Display()
 {
     $this->getLayout();
     echo 'текст главной страницы';
 }
Когда обработчик вызовет метод Display, то он выведет сначала шаблон, потом текст, который будет после него.

В шаблоне:
PHP
1
2
3
<div id='content'>
        $class::Display();
        </div>
Это получается что обработчик сперва вызовет метод Display, а потом когда загрузится шаблон, то он еще раз в нем запустится. Не понятно мне взаимодействие шаблона и метода класса.(
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
03.12.2018, 15:46
svisch, а, точно. А зачем вы вызываете Display в шаблоне?
0
2 / 2 / 2
Регистрация: 26.10.2015
Сообщений: 83
03.12.2018, 17:24  [ТС]
Jodah, просто по другому я не понимаю как можно в нужном месте в шаблоне отрендерить необходимые данные! Соответственно за этим и создал тему, полагая, что концепция у меня полностью не правильная
Был бы благодарен за подсказки в какую сторону двигаться!
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
03.12.2018, 17:55
svisch, для этого обычно используется шаблонизатор. Пример самописки:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
 
class View
{
    private $path;
 
    public function __construct($path)
    {
        $this->path = $path;
    }
 
    public function render($file_path, array $data = [])
    {
        extract($data);
        ob_start();
        require "{$this->path}$file_path.php";
        return ob_get_clean();
    }
}
При создании объекта указываете путь к папке с шаблонами, затем в метод render передаёте путь к шаблону и переменные, которые нужно подставить.

Например, у вас есть файл common/template.php с таким содержимым:
PHP/HTML
1
2
3
4
<html>
<head><title><?= $title ?></title></head>
<body><?= $content ?></body>
</html>
Соответственно в методе Display можно будет сделать так:

PHP
1
2
3
4
5
6
7
8
9
<?php
$view = new View('тут_путь_к_папке_с_шаблонами');
 
$data = [
    'title' => 'Заголовок',
    'content' => 'Содержимое страницы'
];
 
echo $view->render('common/template', $data);
Разумеется, создание $view лучше вынести в родителя, от которого Page и другие подобные классы будут наследоваться. Чтобы обращаться к шаблонизатору можно было через $this->view.

Можно использовать готовые шаблонизаторы вроде Twig. Принцип примерно тот же, только больше плюшек вроде наследования шаблонов.
1
2 / 2 / 2
Регистрация: 26.10.2015
Сообщений: 83
03.12.2018, 19:22  [ТС]
Jodah, да так работает. Спасибо. Только вот не пойму зачем в двух местах указывать пути к шаблону: в конструкторе одну часть, в рендере название файла шаблона.
И еще вопрос меня интересует. Например если на какой то другой странице сайта в месте
HTML5
1
<body><?= $content ?></body>
мне понадобится вывести отличное по структуре и в другой html обертке содержимое(допустим список пользователей), то соответственно я создаю другой шаблон, отличный от первоначального? то есть на разные типы страниц делать разные шаблоны. Верно? Или же это отличие можно как то задавать в методе обработчика, а шаблон оставлять неизменным для всего сайта?
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
03.12.2018, 22:09
Цитата Сообщение от svisch Посмотреть сообщение
зачем в двух местах указывать пути к шаблону
Чтобы не прописывать каждый раз полный путь.

Цитата Сообщение от svisch Посмотреть сообщение
то есть на разные типы страниц делать разные шаблоны. Верно?
Для типовых сайтов обычно хватает двух базовых шаблонов - для публичной части и для админки. Помимо этого, для каждого типа страниц создаём свой шаблон, который меняет только динамическую часть. Например:

Базовый шаблон common/template.php
PHP/HTML
1
2
3
4
5
6
7
8
9
10
<html>
    <head>
        <title><?= $title ?></title>
    </head>
    <body>
        <div class="header">...</div>
        <div class="content"><?= $content ?></div>
        <div class="footer">...</div>
    </body>
</html>
Шаблон страницы товара product.php
PHP/HTML
1
2
3
4
<div class="product">
    <h1><?= $product['name'] ?></h1>
    <div class="price"><?= $product['price']?></div>
</div>
И далее собираем страницу в контроллере:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$product = ...; // Получаем товар из БД
 
// Генерируем html из шаблона карточки товара
$product_html = $this->view->render('product', [
    'product' => $product,
]);
 
// Генерируем базовый шаблон
echo $this->view->render('common/template', [
    'title' => 'Заголовок',
    'content' => $product_html
]);
1
2 / 2 / 2
Регистрация: 26.10.2015
Сообщений: 83
04.12.2018, 12:25  [ТС]
Jodah, спасибо большое за разъяснения! Более менее прояснился принцип работы шаблонизатора. Поэкспериментирую с самописным шаблонизатором, а потом возможно попробую twig, о котором вы писали выше. Тем более в планах есть вернуться к друпал 8, который тоже его использует.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.12.2018, 12:25
Помогаю со студенческими работами здесь

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

Вывод данных в шаблон Word
Здравствуйте! Помогите разобраться. Документ Word формируется с помощью закладок. Есть главная форма и на ней подчиненная. Подчиненная...

Вывод данных из Edit в HTML шаблон
Добрый день. Как выводить данные из нескольких EDIT ов на HTML шаблон. (Типа как отчет на HTML)

Шаблон проектирования MVC и вывод данных
Создавал проект по видео урокам. Использовал модель MVC.https://ru.wikipedia.org/wiki/Model-View-Controller Не могу сделать так что бы...

Django. Вывод данных ForeignKey в шаблон
Есть 2 модели: class shops_cafe(models.Model): cafe_name = models.CharField(max_length=255, unique=True,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru