Кто уже глубже начал изучать код, возможно задумывается "а как сделать шоткод" или как произвести замену определенного текста в статье на какой то функционал. Давайте рассмотрим например такой пример. Например мы хотим в статью вставить изображение, но не просто 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($arg, 100, 100); return $image;} Вот и все. Если все вставили правильно, то мы увидим миниатюру изображения. Решение не идеальное и можно сократить, возможно дорабатывать и перерабатывать для своего правильного видения.
А баба яга против потому что нужно это нужно вынести в отдельную библиотеку, а не плодить по контроллерам, впрочем так и сделано в бесплатном модуле 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]] } Зацените!!!
Да, конечно вы правы. Но это пример, а не указание к действию, что делать именно так, а ни как по другому. Возможно кому то пригодится моя инструкция, а тем кому нужно больше и "не плодить" то скачают с гитхаба.
насколько я понял, обрабатывается только description. в шаблоне шорткоды не будут работать. или я ошибаюсь?
тут есть два вопроса, когда применть и что вы должны иметь щорткоды двух типов - локальные и глобальные Или иметь два обработки - локальную и глобальную Что такое локальная шортколы в описании товара Кода вы выводите укороченное описание товара в списках, то оно должно быть прогнано через шорткодео, чтоб обрезок не попал в выдачу И глобальное когда шорт коды могут выплыть откуда угодно И.. в >=2.3 не обязательно трогать response->output А надо вешать событие на view/after - глобальное
там еще возникает проблема с стилями и скриптами модуля. который добавляется вместо шорткода, если вешать на view/after вывод то уже сформирован. и то что модуль добавляет в $this->document до лампочки я решил пока так перед заменой, доставать все из document(стили и скрипты) потом замена шорткода потом опять достать скрипты и стили из document далее сравниваем, и добавляем в вывод те, которых не было.
А если шорткод нужно вставить в описание модуля , то есть не в $data['description'], а в описание из массива ( к примеру модуль доп вкладок в товаре) 'description' => html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8'), Есть варианты что добавить или переписать?
В принципе так же, только сначала перед массивом обрабатываем $result['description'] и уже потом вставляем как переменную типа $my_description
я так понимаю реализацию кодом не стоит спрашивать? оставлю тут... а вдруг))) $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'), ); }