[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Библитоеки. View.
twin
Оглавление.

Эта тема "два в одном". Разобраться, что и как с библиотеками на примере одной из них.

Как я уже говорил в самом начале, каждая библиотека должна располагаться в отдельной директории. Но этого мало. В каждой такой директории должен находится класс адаптера. Мне это слово не нравится, потому что не совсем отражает суть. Адатер, это система с разными входом и выходом. Посредник.

По моей схеме он нужен не всегда, чаще это просто интерфейс либы, или вообще сам скрипт, если он в одном файле. Так что я назвал такой класс Master. Вот в данном конкретном случае покажу, что имеется ввиду.

И так вьюшка. Это некий слой между бизнесс-логикой и шаблонами. Не буду использовать шаблонизатор, потому что мейнстримные не люблю я, а мой может не понравиться вам. Выберу компромиссный путь - нативные шаблоны.

Для начала нужно сделать парочку. И разместить их где-нибудь. Находиться они могут, так же как и конфига, в двух местах. Непосредственно в приложении, либо в публичной папке. Это удобнее, если есть разделение обязанностей между программистами и верстальщиками. Чтобы задницами не толкались. :)

Я так и сделаю.

Главный шаблон, он же макет (layout):
www/theme/tpl/layout.php
<!DOCTYPE html>
<html>
<head>
<meta
http-equiv="Content-type" content="text/html; charset=utf-8">
<link
rel="stylesheet" href="/theme/css/style.css" type="text/css" />
<title><?=
$title ?></title>
</head>
<body>
<div
class="wrapper">
<h1><?=
$header ?></h1>
<div
class="content">
<?=
$content ?>
</div>
</div>
</body>
</html>


И 404 для наглядности (с пятисотой позже разберемся, там сложнее):
www/theme/tpl/404.php

<h2>Ничего нету ((</h2>


Здесь даже говорить не нужно, что где и как организовать ассеты - дело сугубо индивидуальное. Я в своей практике использую скины, по старинке. Сейчас моднее называть это theme. Ну кто во что горазд, вольному воля.

А для того, чтобы как то упорядочить это, пропишем в конфиге путь до шаблонов:
App/config.php
<?php

return [
'debug' => true,
'template_path' => dirname(__DIR__) .'/www/theme/tpl'

];


Вот теперь и сама библиотека:
Core/Libs/View/Master.php
<?php

namespace Core\Libs\View;

/**
* Класс View\Master
*
* NOTE: Requires PHP version 5.5 or later
*
@author phpforum.su
*
@copyright © 2016
*
@license WTFPL (http://www.wtfpl.net)
*/
class Master
{
protected $tplPath;
protected $template;
protected $data = [];

public function __construct($tplPath)
{
$this->tplPath = $tplPath;
$this->tplPath = str_replace('\\', DIRECTORY_SEPARATOR, $this->tplPath );
}

/**
* Передает переменные в шаблон
*
*
@param string|array $data
*
@param mix $value
*
*
@return $this
*/

public function assign($data, $value = null)
{
if (is_array($data)) {
$this->data = array_merge($this->data, $data);
} else {
$this->data[$data] = $value;
}

return $this;
}

/**
* Передает переменные в шаблон, обработав для HTML
*
*
@param string|array $data
*
@param mix $value
*
*
@return $this
*/

public function assignHtml($data, $value = null)
{
if (is_array($data)) {
$this->data = array_merge($this->data, $this->htmlChars($data));
} else {
$this->data[$data] = $this->htmlChars($value);
}

return $this;
}

/**
* Псевдонаследование макета
*
*
@param string $content
*
*
@return $this
*/

public function extendsTpl($content, $layout = 'layout')
{
$this->assign('content', $content);
$this->html = $this->execute($this->tplPath . '/'. $layout .'.php');
return $this;
}

/**
* Возвращает заполненный шаблон
*
*
@return string
*/

public function parseTpl()
{
return $this->execute($this->template);
}

/**
* Возвращает результат
*
*
@return void
*/

public function render($tplName)
{
$tplName = str_replace('\\', DIRECTORY_SEPARATOR, $tplName);
$this->template = $this->tplPath .'/'. $tplName .'.php';

if (!file_exists($this->template)) {
trigger_error('Template '. $this->template .' not found');
}

$content = $this->execute($this->template);
$this->extendsTpl($content);
echo $this->html;
}

/**
* Разбор шаблона
*
*
@param string $tpl
*
*
@return string
*/

protected function execute($tpl)
{
ob_start();
extract($this->data);
include_once $tpl;
return ob_get_clean();
}

/**
* Обработка переменных для вывода в поток
*
*
@param array|string $data
*
*
@return mix
*/

protected function htmlChars($data)
{
if (is_array($data)) {
$data = array_map([$this, 'htmlChars'], $data);
} else {
$data = htmlspecialchars($data);
}
return $data;
}
}


Как получить к ней доступ описано в предыдущем разделе. Нужно только подправить её секцию (метод вызова):
Core/Libs/Assembly.php
    /**
* Отображение
*
*
@return object
*/

public static function getView()
{
return new \Core\Libs\View\Master(self::$config['template_path']);
}


Прикол тут вот в чем. Если потребуется допустим TWIG, то можно переделать мастер в адаптер. И тогда приложение трогать не нужно.

Ну и контроллер, там теперь доступна эта вьюшка:
App/Controllers/ErrorController.php
<?php

namespace App\Controllers;


class ErrorController extends \Core\Libs\Assembly
{
public static function action404()
{
header("HTTP/1.1 404 Not Found");
$view = parent::getView();
$view->assign('title', '404');
$view->assign('header', '404');
$view->render('404');
}

public static function action500()
{
header("HTTP/1.1 500 Internal Server Error");
print('500');
}
}


Если библиотека из нескольких файлов, то они тут рядом, в этой же директории, в том же немспейсе. Теперь адаптер сделать легко и просто, нужно только лишь подменить файл Master.php. Если понадобится. Заранее делать адаптер нет смысла, опять же YAGNI.

Так и со всеми остальными библиотеками. Адаптеру пофиг, откуда её тянуть. Из этой папки или из vendor/, если захочется опенсорсную. Или любую другую, хоть с другой планеты.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.