Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: документация к шаблонизатору

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: а как у вас оно устроено
DlTA
Отправлено: 19 Марта, 2014 - 09:20:08
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




как вы организовываете подсказки по шаблонам?

к примеру у меня есть некий шаблонизатор заказа
CODE (htmlphp):
скопировать код в буфер обмена
  1. COrder::template($orderId, $textTexplate)

ему на вход
CODE (htmlphp):
скопировать код в буфер обмена
  1. $textTempl = "Ваш заказ №{oderNum}, дата создания {dateCreate}, адрес: {adres}";


ну а ан выходе "Ваш заказ №123, дата создания 1.01.01, адрес: Крыжопль"

вроде все правильно, относительно работоспособно НО
вот таких вот:
{oderNum}
{dateCreate}
...
{adres}

уже на данный момент десятки (как не удивительно)

на данный момент
в документации к методу template() написано
CODE (htmlphp):
скопировать код в буфер обмена
  1. /**
  2. * ...
  3. * $textTexplate ....
  4. * {adres} - адрес доставки
  5. * {dateCreate} - дата создания
  6. * ...
  7. */


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

так вот это не удобно, напрягает, есть идеи по оптимизации??

(Отредактировано автором: 19 Марта, 2014 - 09:28:06)

 
 Top
LIME
Отправлено: 19 Марта, 2014 - 09:31:05
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




есть одна шикарная мысль
более говорящие названия
самодокументация лучшая документация
 
 Top
DlTA
Отправлено: 19 Марта, 2014 - 09:32:25
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




LIME пишет:
самодокументация лучшая документация
а пример?
 
 Top
LIME
Отправлено: 19 Марта, 2014 - 09:34:25
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




$textTempl = "Ваш заказ №{oderNum}" . /* номер заказа */ .
", дата создания {dateCreate}, адрес: {adres}";
(Добавление)
это не пример
тоесть это отдельно
(Добавление)
{deliveryAdres} - адрес доставки
 
 Top
DlTA
Отправлено: 19 Марта, 2014 - 09:39:19
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




LIME, первый пост полностью прочитали??

я не понимаю как мне поможет добавление коментариев в текст шаблона с тем чтоб я в будущем мог узнавать название шаблонов и их назначение?

шаблоны то у меня хранятся не только в 1 файле, они берутся из базы, при выводе инфы о заказе, а иногда использование данного шаблонизатора это единственный метод для получение неких специфических значений для заказа, например закодированной ссылки для возможности просмотра статуса заказа
(Добавление)
LIME пишет:
$textTempl = "Ваш заказ №{oderNum}" . /* номер заказа */ .
", дата создания {dateCreate}, адрес: {adres}";
(Добавление)
это не пример
тоесть это отдельно
(Добавление)
{deliveryAdres} - адрес доставки

тоесть суть идеи в том чтоб обзывать шаблон так чтоб не надо было вспоминать его название

но вот проблема в том что этот метод работает наоборот, сначало мы видим название элемента а уже потом понимает что вместо нее будет подставленно

а нужно наоборот, зная что нужно подставить вписать элемент, а тут как бы достаточно большой разброс
 
 Top
armancho7777777 Супермодератор
Отправлено: 19 Марта, 2014 - 10:58:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




PHP:
скопировать код в буфер обмена
  1. class DataTexplate {
  2.  
  3.     /**
  4.      * Номер заказа.
  5.      */
  6.     public $oderNum = '';
  7.  
  8.     /**
  9.      * Дата созданияю.
  10.      */
  11.     public $dateCreate = '';
  12.  
  13.     /**
  14.      * Адрес доставки.
  15.      */
  16.     public $adres = '';
  17.  
  18. }
  19.  
  20. class MyCOrder extends COrder {
  21.  
  22.     public function template($orderId, DataTexplate $dataTexplate)
  23.     {
  24.         return 'Ваш заказ №'    . $dataTexplate->oderNum . ', ' .
  25.         'дата создания ' . $dataTexplate->dateCreate . ', ' .
  26.         'адрес: '        . $dataTexplate->adres;
  27.     }
  28. }
 
 Top
DelphinPRO
Отправлено: 19 Марта, 2014 - 12:42:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




ориентируюсь на шаблон.
т.е. сначала пишу шаблон, потом открываю его в блокноте на втором мониторе, и пишу код, который формирует нужные шаблону данные.
Т.к. В шаблоне могу писать любые переменные, то остается только закинуть данные в массив с соответствующими ключами.
В качестве шаблонизатора выбрал Mustache - простой как три копейки, имеет реализации для php и js -> использую один и теже шаблоны на клиенте и сервере. Красота.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
DlTA
Отправлено: 19 Марта, 2014 - 16:54:33
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




armancho7777777,DelphinPRO
ребята не тупите, у меня нет возможности брать шаблон из пыха файла в который я буду подставлять переменные в текст, использование какого либо еще шаблонизатора так же не обосновано


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


еще раз, вопрос изначально в том, как документировать простыню элементов для подставки в шаблоны?
 
 Top
DelphinPRO
Отправлено: 19 Марта, 2014 - 17:02:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




мы не тупим Улыбка вопрос был:
DlTA пишет:
как вы организовываете подсказки по шаблонам?

на него и был дан ответ Улыбка
(Добавление)
запишите в текстовый файлик и держите перед глазами Улыбка делов-то..


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
DlTA
Отправлено: 19 Марта, 2014 - 17:55:15
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




DelphinPRO пишет:
запишите в текстовый файлик и держите перед глазами делов-то..
мдамс, современный век, спутники летают, роботы бродят и играют в хокей, а подсказку по прежнему держим в соседнем файлике для переодического обращения, печалька.(
 
 Top
armancho7777777 Супермодератор
Отправлено: 19 Марта, 2014 - 18:05:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




DlTA, нечего говнокодить, тогда идиотские вопросы отпадут сами собой.
 
 Top
DlTA
Отправлено: 19 Марта, 2014 - 18:17:45
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




armancho7777777 пишет:
нечего говнокодить, тогда идиотские вопросы отпадут сами собой.

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

прикинем на примере:
Спойлер (Отобразить)


как примерно это должно использгваться при условии что например для 1 заказа у меня как минимум 40 шаблонов вывода

тоесть на примере вашего кода, мне нужно в классе MyCOrder создать еще 39 методов для получения конечного текста
еще правда непонятно накой делать эти методы динамеческими (не статическими) если внутырь подается только заполненный объект с полями/значениями

и выглядеть это будет примерно так:
PHP:
скопировать код в буфер обмена
  1. $oDT =  new DataTexplate();
  2. $oDT->dateCreate  = '11.11.2011';
  3. ...
  4.  
  5. $oMO = new MyCOrder();
  6. $text = $oMO->template($oDT);
  7. $text2 = $oMO->template2($oDT);


теперь то как это реализовано у меня:
PHP:
скопировать код в буфер обмена
  1. $oOrder = new COrders($orderId);
  2. list($text1, $text2) = $oOrder->template('text {templ1} text', 'text {templ2} text2');


по вашему мой код говнишнее?? сможете объяснить
 
 Top
DelphinPRO
Отправлено: 19 Марта, 2014 - 23:24:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




DlTA пишет:
а подсказку по прежнему держим в соседнем файлике для переодического обращения
ну я иногда распечатываю и на стену вешаю какую-то инфу, списки и т.п., которая нужна в данный момент. Если это ускоряет работу, почему бы и нет?


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
armancho7777777 Супермодератор
Отправлено: 20 Марта, 2014 - 04:58:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




DlTA пишет:
накой делать эти методы динамеческими

Начнём с того, что нет такого понятия "динамические методы" ))
Ключевое слово "static" я упустил в силу спешки, так как акцент был не на этой части кода.

DlTA пишет:
тоесть на примере вашего кода, мне нужно в классе MyCOrder создать еще 39 методов для получения конечного текста

Я показал, как реализовать передачу аргументов, решив проблему читабельности и подсказок в редакторе.
А реализация класса - шаблонизатора за Вами.
Мой вариант ниже (писАл на коленке):

PHP:
скопировать код в буфер обмена
  1. define('ROOT', '/home/public_html/site.ru/');
  2.  
  3. class DataException extends Exception {
  4.     const NOT_EXISTS_KEY = 1;
  5. }
  6.  
  7. abstract class Data {
  8.  
  9.     /**
  10.      * @param array $data
  11.      * @throws DataException
  12.      */
  13.     public function __construct(array $data = array())
  14.     {
  15.         foreach($data as $key => $val)
  16.         {
  17.             if(!isset($this->{$key})) {
  18.                 $this->notKeyException($key);
  19.             }
  20.  
  21.             $this->{$key} = $val;
  22.         }
  23.     }
  24.  
  25.     /**
  26.      * @param string $key
  27.      * @throws DataException
  28.      */
  29.     public function notKeyException($key)
  30.     {
  31.         $refl = new ReflectionObject($this);
  32.  
  33.         $keys = array_map(function($oProp){
  34.             return $oProp->getName();
  35.         }, $refl->getProperties(ReflectionProperty::IS_PUBLIC));
  36.  
  37.         throw new DataException(
  38.             'Неверный ключ: ' . $key . '!<br>
  39.              Возможные варианты:<br>' . join('<br>', $keys),
  40.              DataException::NOT_EXISTS_KEY
  41.         );
  42.     }
  43. }
  44.  
  45.  
  46. abstract class View {
  47.  
  48.     const DIR_TPL = 'templates/default/';
  49.     protected $_tpl = '';
  50.     protected $_content = '';
  51.  
  52.     /**
  53.      * @param string $tpl
  54.      * @return $this
  55.      */
  56.     public function setTpl($tpl)
  57.     {
  58.         $this->_tpl = $tpl;
  59.         return $this;
  60.     }
  61.  
  62.     /**
  63.      * @return string
  64.      */
  65.     public function getContent() {
  66.         return $this->_content;
  67.     }
  68.  
  69.     /**
  70.      * @param Data $data
  71.      * @return $this
  72.      */
  73.     public function render(Data $data)
  74.     {
  75.         ob_start();
  76.         include(ROOT . self::DIR_TPL . $this->_tpl);
  77.         $this->_content = ob_get_clean();
  78.         return $this;
  79.     }
  80.  
  81.     public function display() {
  82.         echo $this->getContent();
  83.     }
  84. }
  85.  
  86.  
  87. class OrderView extends View {
  88.     protected $_tpl = 'order.tpl';
  89. }
  90.  
  91.  
  92. class DataTexplate extends Data {
  93.  
  94.     /**
  95.      * Номер заказа.
  96.      */
  97.     public $orderNum = '';
  98.  
  99.     /**
  100.      * Дата создания.
  101.      */
  102.     public $dateCreate = '';
  103.  
  104.     /**
  105.      * Адрес доставки.
  106.      */
  107.     public $address = '';
  108.  
  109. }
  110.  
  111.  
  112. $data = new DataTexplate();
  113. $data->address = 'Адрес ...';
  114. $data->dateCreate = '12/05/2014';
  115. $data->orderNum = 1;
  116.  
  117. $orderView = new OrderView();
  118. $orderView->render($data)->display();
  119.  


Шаблон 'order.tpl':
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. /**
  3.  * @var DataTexplate $data
  4.  */
  5. ?>
  6.  
  7. <p>№ заказа: <?=$data->orderNum?></p>
  8. <p>Дата: <?=$data->dateCreate?></p>
  9. <p>Адрес: <?=$data->address?></p>


Шаблон из базы?
Нет проблем, достаточно переопределить метод render и
реализовать конструктор, принимающий один аргумент - контент, который надо отрендерить и вывести:
PHP:
скопировать код в буфер обмена
  1. class OrderView extends View {
  2.  
  3.     /**
  4.      * @param string $content
  5.      */
  6.     public function __construct($content)
  7.     {
  8.         $this->_content = $content;
  9.     }
  10.  
  11.     /**
  12.      * @param DataTexplate $data
  13.      * @throws DataException
  14.      * @return $this
  15.      */
  16.     public function render(DataTexplate $data)
  17.     {
  18.         $this->_content = preg_replace_callback(
  19.  
  20.             '/\{(?P<key>[^\}]+)\}/',
  21.  
  22.             function($match) use ($data)
  23.             {
  24.                 if(!isset($data->{$match['key']})) {
  25.                     $data->notKeyException($match['key']);
  26.                 }
  27.  
  28.                 return $data->{$match['key']};
  29.             },
  30.  
  31.             $this->_content
  32.         );
  33.  
  34.         return $this;
  35.     }
  36. }
  37.  
  38. $orderView = new OrderView('
  39.  
  40.      Ваш заказ №{orderNum},
  41.      дата создания {dateCreate},
  42.      адрес: {address}
  43.  
  44. ');
  45.  
  46. /*
  47. Можно передать просто ассоциативный массив в конструктор DataTexplate.
  48. В случае отсутствия свойства/ключа будет брошено исключение со списком возможных ключей.
  49. Такое же исключение будет иметь место при использовании некорректных ключей в шаблонах из БД.
  50. */
  51. $orderView->render(new DataTexplate(array(
  52.  
  53.     'address'    => 'Адрес ...',
  54.     'dateCreate' => '12/05/2014',
  55.     'orderNum'   => 1
  56.  
  57. )));
  58.  
  59. $orderView->display();


Код не тестировал, показал всего лишь принцип.

(Отредактировано автором: 22 Апреля, 2014 - 11:06:03)

 
 Top
DlTA
Отправлено: 20 Марта, 2014 - 09:43:10
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




armancho7777777,
суть ясна
НО это шаблонизатор, просто шаблонизатор, самый простой, всеголиш с той разницей, что он находит элементы шаблона и подменяет из значения массива, а если не находит, то кидает исключение, интересное решение)

НО причем тут заказ?!? ведь на самом деле весь этот код спокойнейшим образом живет отдельно от понятия заказ!

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

и как я говорил прежде это но просто значение из базы, чаще всего это подготавливаемая величина.
(Добавление)


armancho7777777, яб еще поспорил бы по поводу немеряной усложненности кода непонятно ради чего, если есть желание, но в другой теме
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB