Сниппеты или Шоткоды (делаем сами)

Тема в разделе "Инструкции и FAQ", создана пользователем Ravilr, 10 окт 2017.

  1. Ravilr

    Ravilr Специалист

    Сообщения:
    3.877
    Симпатии:
    1.064
    Кто уже глубже начал изучать код, возможно задумывается "а как сделать шоткод" или как произвести замену определенного текста в статье на какой то функционал.

    Давайте рассмотрим например такой пример.

    Например мы хотим в статью вставить изображение, но не просто 1000 на 1000 пикселей, а миниатюру. Можно конечно подготовить миниатюру предварительно если их мало. Но когда много... то затруднительно и не удобно.

    Что делаем. Придумываем шоткод, вот такой
    Код:
    [{'func' : 'image_resize' , 'data' : 'catalog/demo/hp_1.jpg'}]
    Вставим прямо в текст статьи в нужное место.

    в исходник редактора вставил так
    Код:
    <img src="[{'func' : 'image_resize' , 'data' : 'catalog/demo/hp_1.jpg'}]">

    Делаем на статьях, а значим идем к контроллер

    \catalog\controller\information\information.php

    Далее перед
    PHP:
    $this->response->setOutput($this->load->view('information/information'$data));
    Вставим
    PHP:
                $matches = array();
                
    preg_match_all('/\[(.*?)\\]/s'$data['description'], $matches);

                foreach (
    $matches[1] as $match) {
                    
    $snippet_txt '['$match ']';
                    
    $snippen_json json_decode(str_replace("'"'"'$match));

                    
    $snippen_output $this->{$snippen_json->func}($snippen_json->data);
                    
    $data['description'] = str_replace($snippet_txt$snippen_output $data['description']);
                }

    И например перед
    PHP:
    public function agree() {
    вставим
    PHP:
    protected function image_resize($arg) {
        
    $this->load->model('tool/image');
        
    $image $this->model_tool_image->resize($arg100100);
        return 
    $image;
    }
    Вот и все. Если все вставили правильно, то мы увидим миниатюру изображения.

    Решение не идеальное и можно сократить, возможно дорабатывать и перерабатывать для своего правильного видения.
     
    Последнее редактирование: 10 окт 2017
    pomansur, Ален, Chukcha и 2 другим нравится это.
  2. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    685
    А баба яга против :)

    потому что нужно
    это нужно вынести в отдельную библиотеку, а не плодить по контроллерам, впрочем так и сделано в бесплатном модуле
    https://github.com/echothemes/opencart-shortcodes

    Рекомендую, всем желающим ознакомиться с кодом.. с оформлением кода
    И.. для очень продвинутых

    Код:
        // WARNING! Do not change this regex!
        return
            '\\['                    // Opening bracket
          . '(\\[?)'                  // 1: Optional second opening bracket for escaping shortcodes: [[tag]]
          . "($tagregexp)"              // 2: Shortcode name
          . '(?![\\w-])'                // Not followed by word character or hyphen
          . '('                      // 3: Unroll the loop: Inside the opening shortcode tag
          .    '[^\\]\\/]*'             // Not a closing bracket or forward slash
          .    '(?:'
          .      '\\/(?!\\])'          // A forward slash not followed by a closing bracket
          .      '[^\\]\\/]*'          // Not a closing bracket or forward slash
          .    ')*?'
          . ')'
          . '(?:'
          .    '(\\/)'                // 4: Self closing tag ...
          .    '\\]'                  // ... and closing bracket
          . '|'
          .    '\\]'                  // Closing bracket
          .    '(?:'
          .      '('                // 5: Unroll the loop: Optionally, anything between the opening and closing shortcode tags
          .         '[^\\[]*+'         // Not an opening bracket
          .         '(?:'
          .            '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag
          .            '[^\\[]*+'      // Not an opening bracket
          .         ')*+'
          .      ')'
          .      '\\[\\/\\2\\]'         // Closing shortcode tag
          .    ')?'
          . ')'
          . '(\\]?)';                  // 6: Optional second closing brocket for escaping shortcodes: [[tag]]
      }
    
    Зацените!!!
     
  3. Ravilr

    Ravilr Специалист

    Сообщения:
    3.877
    Симпатии:
    1.064
    Да, конечно вы правы. Но это пример, а не указание к действию, что делать именно так, а ни как по другому.
    Возможно кому то пригодится моя инструкция, а тем кому нужно больше и "не плодить" то скачают с гитхаба.
     
  4. fanatic

    fanatic Продвинутый пользователь

    Сообщения:
    1.415
    Симпатии:
    239
    насколько я понял, обрабатывается только description. в шаблоне шорткоды не будут работать.
    или я ошибаюсь?
     
  5. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    685
    в 2.3 , он кажется вешался на output - надо смотреть (не помню)
     
  6. fanatic

    fanatic Продвинутый пользователь

    Сообщения:
    1.415
    Симпатии:
    239
    копнул глубже
    не, только description
    на output, нужно допиливать
     
  7. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    685
    значит для 2.1 было на output
     
  8. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    685
    тут есть два вопроса, когда применть и что

    вы должны иметь щорткоды двух типов - локальные и глобальные

    Или иметь два обработки - локальную и глобальную

    Что такое локальная

    шортколы в описании товара

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

    И глобальное когда шорт коды могут выплыть откуда угодно

    И.. в >=2.3 не обязательно трогать response->output
    А надо вешать событие на view/after - глобальное
     
  9. fanatic

    fanatic Продвинутый пользователь

    Сообщения:
    1.415
    Симпатии:
    239
    именно так я и сделал
     
  10. fanatic

    fanatic Продвинутый пользователь

    Сообщения:
    1.415
    Симпатии:
    239
    там еще возникает проблема с стилями и скриптами модуля. который добавляется вместо шорткода, если вешать на view/after
    вывод то уже сформирован. и то что модуль добавляет в $this->document до лампочки
    я решил пока так
    перед заменой, доставать все из document(стили и скрипты)
    потом замена шорткода
    потом опять достать скрипты и стили из document
    далее сравниваем, и добавляем в вывод те, которых не было.
     
  11. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    685
    ну... <body есть вставляй туда

    как вариант..
    Да, события хорошо.. но "дорого"
     
  12. orion555

    orion555 Новичок

    Сообщения:
    12
    Симпатии:
    1
    А если шорткод нужно вставить в описание модуля , то есть не в $data['description'], а в описание из массива ( к примеру модуль доп вкладок в товаре)
    'description' => html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8'),
    Есть варианты что добавить или переписать?
     
  13. Ravilr

    Ravilr Специалист

    Сообщения:
    3.877
    Симпатии:
    1.064
    В принципе так же, только сначала перед массивом обрабатываем $result['description'] и уже потом вставляем как переменную типа $my_description
     
    Tesloz нравится это.
  14. orion555

    orion555 Новичок

    Сообщения:
    12
    Симпатии:
    1
    я так понимаю реализацию кодом не стоит спрашивать?

    оставлю тут... а вдруг)))

    $data['customtabs'] = array();
    $results = $this->model_catalog_product->getProducttabs($this->request->get['product_id']);
    foreach ($results as $result) {
    $data['customtabs'][] = array(
    'title' => $result['title'],
    'description' => html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8'),
    );
    }
     
    Последнее редактирование: 15 янв 2024