За последние 24 часа нас посетили 54795 программистов и 1781 робот. Сейчас ищут 1636 программистов ...

Как создать собственные шаблонные теги

Тема в разделе "PHP для новичков", создана пользователем Axios, 1 фев 2017.

  1. Axios

    Axios Активный пользователь

    С нами с:
    13 янв 2013
    Сообщения:
    52
    Симпатии:
    1
    Всем привет. Подскажите как создать собственные шаблонные теги, типа вот такого

    <element name="news" count="10" template="mainpage" sort="date">

    который говорит, что в данном месте необходимо вывести 10 новостей, отсортированных по дате по шаблону mainpage
     
  2. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Атрибуты придумывал, помню... хранил в них инфу нужною... но тэги.. А что так можно???
     
  3. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
  4. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Это вообще гониво какое то... нужент тебе строчный элемент - пиши span, нужен блочный - пиши div.
    Класс дал, css прописал вот тебе и свой тэг.
    Бред какой-то...
     
  5. Axios

    Axios Активный пользователь

    С нами с:
    13 янв 2013
    Сообщения:
    52
    Симпатии:
    1
    может не так задачу описал.

    Суть идет не про свой html-тег, а по то что при вставке такой конструкции в шаблоне, будут выводиться новости. Ну типа как в MODx [[*tvparam]], или {{BANNER}} в другом движке
     
  6. Axios

    Axios Активный пользователь

    С нами с:
    13 янв 2013
    Сообщения:
    52
    Симпатии:
    1
    про html-теги ни слова не было написано, вопрос совсем в другом
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я в своём PinPIE (всех уже от него тошнит, но) сделал теги нескольких типов. Совместными усилиями вместе с @[vs] мы родили вот такое чудо на регулярках: https://github.com/pinpie/pinpie/blob/stable/src/PP.php#L156

    PHP:
    1.     /**
    2.      * Parses any string and executes found tags. Returns resulting content as string.
    3.      * @param string $content
    4.      * @param null $parent (optional) Parent tag can be provided. Rarely used outside PP class.
    5.      * @return String
    6.      */
    7.     public function parseString($content, $parent = null) {
    8.         if (empty($parent)) {
    9.             $this->tagPath[] = '/';
    10.         } else {
    11.             $this->tagPath[] = $parent->type . $parent->name;
    12.         }
    13.         $content = preg_replace_callback(/** @lang RegExp */
    14.             '/
    15.        \[
    16.        ([^\[\]]*?)
    17.        \[
    18.        ([!\d]*)
    19.        ([@#$%=]?)
    20.        (?!\*)
    21.        ([^\[\]]+?)
    22.        \]
    23.        ([^\[\]]*?)
    24.        \]  
    25.        (\r\n|\n\r|\r|\n)*
    26.      /xsmuS',
    27.             function ($matches) use ($parent) {
    28.                 /* defaults =) to prevent warning on last (enter)* detector */
    29.                 $matches += ['', '', '', '', '', '', ''];
    30.                 /* creating tag from array of matches */
    31.                 $tag = $this->createTag($matches, $parent);
    32.                 $tag->index = count($this->tags);
    33.                 $this->tags[] = $tag;
    34.                 /* render output */
    35.                 $tag->output = $tag->getOutput();
    36.                 if (!empty($tag->output)) {
    37.                     /* if tag output is not empty - add line endings to make tags with line endings just after tag
    38.                     have its output have new line chars. And tags without new line chars after tags will be
    39.                     replaced only with its output. */
    40.                     $tag->output .= $matches[6];
    41.                 }
    42.                 /* set time for debug */
    43.                 $tag->time['end'] = microtime(true);
    44.                 $tag->time['total'] = $tag->time['end'] - $tag->time['start'];
    45.                 /* return tag output so it will replace tag in the text with its output */
    46.                 return $tag->output;
    47.             }
    48.             , $content);
    49.         array_pop($this->tagPath);
    50.         return $content;
    51.     }

    она дёргает вот это:

    PHP:
    1.     protected function createTag($matches, $parent) {
    2.         /* $matches
    3.          * Tag with new line after tag
    4.             array (size=8)
    5.                 0 => string '[header[!$snippet]template]
    6.             ' (length=28) <-- New line
    7.                 1 => string 'header' (length=6) <-- placeholder to put tag output in
    8.                 2 => string '!' (length=1) <-- cache forever
    9.                 3 => string '$' (length=1) <-- it is snippet
    10.                 4 => string 'snippet' (length=7) <-- snippet name
    11.                 5 => string 'template' (length=8) <-- template
    12.                 6 => string '
    13.             ' (length=1) <-- New line
    14.         */
    15.         $fulltag = $matches[0];
    16.         $type = $matches[3];
    17.         $placeholder = ($matches[1] == '' ? false : $matches[1]);
    18.         $template = ($matches[5] == '' ? false : $matches[5]);
    19.         if ($matches[2] === '!') {
    20.             $cachetime = $this->conf->pinpie['cache forever time'];
    21.         } else {
    22.             $cachetime = ($matches[2] == '' ? 0 : (int)$matches[2]);
    23.         }
    24.         $fullname = $matches[4];
    25.         $tagClass = '\pinpie\pinpie\Tags\Tag';
    26.         if (isset($this->conf->tags[$type])) {
    27.             $tagClass = $this->conf->tags[$type]['class'];
    28.         }
    29.         $tagSettings = [];
    30.         if (!empty($this->conf->tags[$type])) {
    31.             $tagSettings = $this->conf->tags[$type];
    32.         }
    33.         $priority = 10000;
    34.         $depth = 0;
    35.         if (!empty($parent)) {
    36.             $priority = $parent->priority;
    37.             $depth = $parent->depth + 1;
    38.         }
    39.         $tag = new $tagClass($this, $tagSettings, $fulltag, $type, $placeholder, $template, $cachetime, $fullname, $parent, $priority, $depth);
    40.         return $tag;
    41.     }
     
    denis01 нравится это.
  8. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    Это давно реализовано в стандарте XHTML и это перспективное будущее развития веб компонентов
    Возьмите готовый шаблонизатор Twig, Smarty, mustache
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    суть тут простая.

    есть регулярка
    Код (Text):
    1. /
    2.        \[
    3.        ([^\[\]]*?)
    4.        \[
    5.        ([!\d]*)
    6.        ([@#$%=]?)
    7.        (?!\*)
    8.        ([^\[\]]+?)
    9.        \]
    10.        ([^\[\]]*?)
    11.        \]
    12.        (\r\n|\n\r|\r|\n)*
    13.      /xsmuS
    она ищет квадратные скобочки и то что в них. У меня относительно сложный синтаксис, она может быть куда проще.
    Но короче она находит текст в квадратных скобочках. И всё. Потом этот текст кидается в функцию.


    Например https://regex101.com/r/4LOfQC/1

    Код (Text):
    1. /
    2. {{
    3. ([^}]+)
    4. }}
    5. /xsmu
    x флаг это чтобы регулярку можно было писать в несколько строк и с комментариями даже
    остальные флаги это юникод и многострочность.

    Т.е. даннаря регулярка находит текст в таких вот скобочках даже если он занимает несколько строк

    upload_2017-2-1_15-41-1.png
     
  10. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    Вспомнил и я баловался. (Кто не писал свой мега шаблонизатор)
    Так вот брал я стандартные HTML комментарии и их парсил
    PHP:
    1.  public function render($viewFile, array $params = [])
    2.     {
    3.         extract($params, EXTR_SKIP);
    4.         ob_start();
    5.         include($viewFile);
    6.         $this->content = preg_replace_callback('/(<!--{(.+?)}-->)/', [$this, 'fetch'], ob_get_clean());
    7.     }
     
  11. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    На сколько я понял, тут речь идёт вообще о патернах, типа как на DLE. То есть обработка файлов tpl. Или можно просто прогонять всю страницу через str_replace (), например, str_replace ("%TIME%", "time ()", $mypage); Или я не то понял? :)
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Кто-то изобретает заново шорткоды как в ВордПресс :)