Это популярное сообщение. BuslikDrev Опубликовано: апреля 14, 2018 Это популярное сообщение. Жалоба Поделиться Опубликовано: апреля 14, 2018 1/ Чтобы быстро узнать id категории, товара, информации и т.д. не заходя в админку, то к ссылке дописывайте: &manufacturer_id= Примеры: Скрытый текст 1. http://demo23.opencart.pro/&manufacturer_id=/ipod-classic.html 2. http://demo23.opencart.pro/laptop-notebook/macs/&manufacturer_id= 3. http://demo23.opencart.pro/delivery.html&manufacturer_id= 2/ Вас достал стандартный фильтр тем, что при очистке остаётся на конце /?filter= Тогда пройдите в шаблон фильтра: catalog/view/theme/default/template/module/filter.tpl Скрытый текст Найти это: location = '<?php echo $action; ?>&filter=' + filter.join(',',$('input[type=checkbox]:checked').length); Заменить на: if (filter != 0) { location = '<?php echo $action; ?>&filter=' + filter.join(',',$('input[type=checkbox]:checked').length); } else if (filter = []) { location = '<?php echo $action; ?>'; } 3/ Иногда после переезда сайта или ещё по каким-то причинам, нужно массово изменить тип или кодировку таблиц, вот моё решение. По правилам создания модулей ocmod.zip, создать install.php с содержимым: Скрытый текст <?php $results = $this->db->query("SELECT TABLE_NAME, ENGINE, TABLE_COLLATION FROM information_schema.tables WHERE TABLE_SCHEMA = 'oc23' AND ENGINE = 'InnoDB'"); foreach ($results->rows AS $result) { if (!empty($result['TABLE_NAME'])) { $this->db->query("ALTER TABLE `" . $result['TABLE_NAME'] . "` ENGINE = MyISAM"); } } ?> Смена тип таблицы.ocmod.zip - где oc23 - название БД InnoDB - старый тип таблицы MyISAM - новый тип таблицы <?php $results = $this->db->query("SELECT TABLE_NAME, ENGINE, TABLE_COLLATION FROM information_schema.tables WHERE TABLE_SCHEMA = 'oc23' AND TABLE_COLLATION = 'greek_general_ci'"); foreach ($results->rows AS $result) { if (!empty($result['TABLE_NAME'])) { $this->db->query("ALTER TABLE `" . $result['TABLE_NAME'] . "` CHARSET = utf8 COLLATE = utf8_general_ci"); } } ?> Смена кодировки таблицы.ocmod.zip - где oc23 - название БД greek_general_ci - старая кодировка таблицы utf8/utf8_general_ci - новая кодировка таблицы nikifalex, Nameless, Виктори и 2 других 1 4 Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
Это популярное сообщение. BuslikDrev Опубликовано: сентября 7, 2018 Автор Это популярное сообщение. Жалоба Поделиться Опубликовано: сентября 7, 2018 4/ Мне надоело много раз переписывать инструкцию по модулям, переименовывать название модуля в путях (искать их среди путей), в итоге привёл её к максимальному универсалу сократив инструкцию в 2 раза, если существуют ещё действия, можно дописывать в конце. А так можно смело копировать этот шаблон заменив 2-4 строчки, а не 10-20. Скрытый текст УСЛОВНЫЕ ОБОЗНАЧЕНИЯ [==] - пропустить этот пункт * - дополнительно выполнить это действие по желанию; | - дополнительно выполнить это действие, если обновляете модуль (модификатор); /2 - выполнить это действие только в OpenCart 2.X /3 - выполнить это действие только в OpenCart 3.0.X [Название модификатора] - Линейка продукции для производителей - "SubManufacturers" [Название модуля] - [Название установочника] - SubManufacturers v1.2 Beta OpenCart [Название архива] - [Название установочника] 2.X-3.0.X.zip для OpenCart 2.0.X-2.1.X [Путь до модулей] - Админ панель/Модули (расширения или дополнения)/Модули [Путь установочника модуля] - [Название архива]/[Название установочника] 2.0.X-2.1.X.ocmod.zip для OpenCart 2.2.X-2.3.X [Путь до модулей] - Админ панель/Модули (расширения или дополнения)/Модули/Выпадающий список "Модули" [Путь установочника модуля] - [Название архива]/[Название установочника] 2.2.X-3.0.X.ocmod.zip для OpenCart 3.0.X-3.0.X [Путь до модулей] - Админ панель/Модули (расширения или дополнения)/Модули/Выпадающий список "Модули" [Путь установочника модуля] - [Название архива]/[Название установочника] 2.2.X-3.0.X.ocmod.zip [список файлов]: catalog/view/theme/default/stylesheet/submanufacturers.css [Путь установочника таблиц] - [Название архива]/Установка таблиц в БД.ocmod.zip [Путь деустановочника таблиц] - [Название архива]/Удаление таблиц из БД.ocmod.zip [Путь до установки модулей] - Админ панель/Модули (расширения или дополнения)/Установка модулей (расширений или дополнений) [Путь до модификаторов] - Админ панель/Модули (расширения или дополнения)/Модификаторы (Менеджер дополнений) [Путь редак. магазина] - Админ панель/Система/Настройки/Редактирование магазина УСТАНОВКА (ОБНОВЛЕНИЕ) И НАСТРОЙКА для OpenCart 2.X-3.0.X * ВНИМАНИЕ! Чтобы отбросить лишние сомнения и споры, установите и протестируйте модуль на голом движке! *|/2 Установите: https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=18892 *|/3 Установите: https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=31227 0-1|. Удалите модификатор через "[Путь до модификаторов]/Красная кнопка 'Удалить' (установив галочку на модификатор [название модификатора])"; 0-2*. Удалите таблицы модификатора через "[Путь до установки модулей]/Синяя кнопка 'Загрузить'/[Путь деустановочника таблиц]"; [==]0-3*|. Деактивируйте модуль через "[Путь до модулей]/[Название модуля]/Красная кнопка 'Деактивировать'"; 0-4*|. Прошерстите через ФТП данные пути и удалите следующие файлы модуля: [список файлов]; 0-5*|/3 Удалите все файлы от модуля на странице "[Путь до установки модулей]/*/Красная кнопка 'Деактивировать'"; 1-1. Установите таблицы модификатора через "[Путь до установки модулей]/Синяя кнопка 'Загрузить'/[Путь установочника таблиц]"; 1-2. Установите модификатор через "[Путь до установки модулей]/Синяя кнопка 'Загрузить'/[Путь деустановочника модуля]"; 2-1. Очистите модификаторы через "[Путь до модификаторов]/Оранжевая кнопка 'Очистить'"; 2-2. Удалите лог модификаторов через "[Путь до модификаторов]/Вкладка лог/Красная кнопка 'Очистить'"; 2-3. Обновите модификаторы через "[Путь до модификаторов]/Синяя кнопка 'Обновить'"; 2-4*. Проверьте лог модификаторов на отсутствие ошибок (совместимость с вашим сайтом) через "[Путь до модификаторов]/Вкладка - лог" В конце инструкции вы найдёте как ориентироваться в install.xml; 2-5. Очистите системный кэш сайта, шаблона, хостинга, если есть и браузера за последний час; [==]3-1. Активируйте модуль через "[Путь до модулей]/[Название модуля]/Зелёная кнопка 'Активировать'"; [==]3-2. Сохраните настройки магазина через "[Путь редак. магазина]/Синяя кнопка 'Сохранить'"; *|/2 Удалите: https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=18892 *|/3 Удалите: https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=31227 *|/3 Удалите "Установка таблиц в БД.ocmod.zip" на странице "[Путь до установки модулей]/*/Красная кнопка 'Деактивировать'"; Готово! УДАЛЕНИЕ для OpenCart 2.X-3.0.X * ВНИМАНИЕ! Перед удалением таблиц, режим редактирования подкатегорий должен быть отключён. 0-1. Удалите модификатор через "[Путь до модификаторов]/Красная кнопка 'Удалить' (установив галочку на модификатор [название модификатора])"; 0-2*. Удалите таблицы модификатора через "[Путь до установки модулей]/Синяя кнопка Загрузить/[Путь деустановочника таблиц]"; [==]0-3. Деактивируйте модуль через "[Путь до модулей]/[Название модуля]/Красная кнопка 'Деактивировать'"; 0-4*. Прошерстите через ФТП данные пути и удалите следующие файлы модуля: [список файлов]; 0-5*/3 Удалите все файлы от модуля на странице "[Путь до установки модулей]/*/Красная кнопка 'Деактивировать'"; *|/2 Удалите: https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=18892 *|/3 Удалите: https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=31227 *|/3 Удалите "Удаление таблиц из БД.ocmod.zip" на странице "[Путь до установки модулей]/*/Красная кнопка 'Деактивировать'"; 2-1. Очистите модификаторы через "[Путь до модификаторов]/Оранжевая кнопка 'Очистить'"; 2-2. Удалите лог модификаторов через "[Путь до модификаторов]/Вкладка лог/Красная кнопка 'Очистить'"; 2-3. Обновите модификаторы через "[Путь до модификаторов]/Синяя кнопка 'Обновить'"; 2-5. Очистите системный кэш сайта, шаблона, хостинга, если есть и браузера за последний час; 3-2. Сохраните настройки магазина через "[Путь редак. магазина]/Синяя кнопка 'Сохранить'"; Готово! Просьба оценить, какова она на восприятие и понимание. satyr и pasha_st 2 Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
Это популярное сообщение. BuslikDrev Опубликовано: октября 4, 2018 Автор Это популярное сообщение. Жалоба Поделиться Опубликовано: октября 4, 2018 5/ Появилась необходимость быстро сменить запись данных модуля в таблицу oc_setting (вместо многочисленных строк - в одну) и неохота писать много повторных слов такие как "filter_" как в примере, без которого модуль бы не работал. Предлагаю свой вариант написания: Скрытый текст Возьмём за основу модуль стандартного фильтра. в контроллере: admin\controller\module\filter.php Перед этим: public function index() { Вставляем: // подмена $this->config->get() private function configGet($data = '') { if (isset($this->config->get('filter')[$data])) { return $this->config->get('filter')[$data]; } else { if (!$data) { return $this->config->get('filter'); } elseif ($data == 'status') { return '1'; } else { return null; } } } Поменяем массово: $this->config->get('filter_ На: $this->configGet('filter_ В контроллере: admin\controller\module\filter.php В шаблоне: admin\view\template\module\filter.tpl Массово удаляем: filter_ Поменяем: $this->model_setting_setting->editSetting('filter', $this->request->post); На: $this->model_setting_setting->editSetting('filter', array('filter' => $this->request->post, 'filter_status' => $this->request->post['status'])); Если создаём модуль только для работы в админке, то меняем на: $this->model_setting_setting->editSetting('filter', array('filter' => $this->request->post)); Готово! Свои варианты и советы, можете предлагать в этой теме Nameless 1 Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: октября 5, 2018 Автор Жалоба Поделиться Опубликовано: октября 5, 2018 6/ Появилась необходимость авторизоваться в своём аккаунте через php для парсинга нужных мне данных из сайта opencarforum Код работает у меня на open server 5.2.2, может кому-то пригодиться для написания своего модуля и т.д.: Скрытый текст В корне каталога домена создать файл index.php с кодом и ввести логин и пароль в неём: <?php // Log in to Google account and go to account page $site_login = 'https://opencartforum.com/login/'; $user_agent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0'; //$csrfKey = '21bd4226b66a3bd1abba64f4c5a87d51'; $USERNAME = 'user@opencart.pro'; // логин $PASSWORD = '123456'; // пароль $remember_me = 1; $anonymous = 0; $processLogin = 'usernamepassword'; $COOKIEFILE = 'cookies.txt'; // initialize curl handle used for all requests $ch = curl_init($site_login); // set some options on the handle curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); curl_setopt($ch, CURLOPT_MAXREDIRS, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_COOKIEJAR, $COOKIEFILE); curl_setopt($ch, CURLOPT_COOKIEFILE, $COOKIEFILE); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_URL, $site_login); $data = curl_exec($ch); //$data = file_get_contents($site_login); //$data = curl_exec_follow($ch); // extract form fields from account login page $formFields = getFormFields($data); // inject email and password into form $formFields['csrfKey'] = $formFields['csrfKey']; $formFields['auth'] = $USERNAME; $formFields['password'] = $PASSWORD; $formFields['remember_me'] = $remember_me; $formFields['anonymous'] = $anonymous; $formFields['_processLogin'] = $processLogin; $post_string = http_build_query($formFields, null, '&', PHP_QUERY_RFC3986); // build urlencoded POST string for login $post_string = str_replace('%40', '@', $post_string); curl_setopt($ch, CURLOPT_URL, $site_login); curl_setopt($ch, CURLOPT_POST, 1); //curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); // execute login request $result = curl_exec($ch); if (!$result) { die("Логин или парль введён неверно."); } // check for "Redirecting" message in title to indicate success // based on your language - you may need to change this to match some other string if (strpos(curl_exec($ch), 'ipsBox_alt') === false) { die("Авторизация больше не доступна, скорее всего был изменён стиль страницы, либо метод авторизации."); } if (strpos(curl_exec($ch), 'ipsMessage_error') == true) { die("Отображаемое имя или email адрес, введённый вами, не принадлежит ни к одному аккаунту. Убедитесь в правильности введённой информации.<br>Ваш логин: " . $USERNAME . "<br>Ваш пароль:" . $PASSWORD); } // вывод на экран echo $result; function getFormFields($data) { if (preg_match('/(<form.*?class=.*?ipsBox_alt.*?<\/form>)/is', $data, $matches)) { //var_dump($matches[0]); $inputs = getInputs($matches[0]); //var_dump($inputs); return $inputs; } else { die('Авторизация больше не доступна, скорее всего был изменён метод авторизации.'); } } // extract all <input fields from a form function getInputs($form) { $inputs = array(); $elements = preg_match_all('/(<input[^>]+>)/is', $form, $matches); if ($elements > 0) { for($i = 0; $i < $elements; $i++) { $el = preg_replace('/\s{2,}/', ' ', $matches[1][$i]); if (preg_match('/name=(?:["\'])?([^"\'\s]*)/i', $el, $name)) { $name = $name[1]; $value = ''; if (preg_match('/value=(?:["\'])?([^"\'\s]*)/i', $el, $value)) { $value = $value[1]; } $inputs[$name] = $value; } } } return $inputs; } // чтобы не применять curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); и не отключать open_basedir function curl_exec_follow(/*resource*/ $ch, /*int*/ &$maxredirect = null) { $mr = $maxredirect === null ? 5 : intval($maxredirect); if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) { curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0); curl_setopt($ch, CURLOPT_MAXREDIRS, $mr); } else { curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); if ($mr > 0) { $newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); $rch = curl_copy_handle($ch); curl_setopt($rch, CURLOPT_HEADER, true); curl_setopt($rch, CURLOPT_NOBODY, true); curl_setopt($rch, CURLOPT_FORBID_REUSE, false); curl_setopt($rch, CURLOPT_RETURNTRANSFER, true); do { curl_setopt($rch, CURLOPT_URL, $newurl); $header = curl_exec($rch); if (curl_errno($rch)) { $code = 0; } else { $code = curl_getinfo($rch, CURLINFO_HTTP_CODE); if ($code == 301 || $code == 302 || $code == 403) { preg_match('/Location:(.*?)\n/', $header, $matches); $newurl = trim(array_pop($matches)); } else { $code = 0; } } } while ($code && --$mr); curl_close($rch); if (!$mr) { if ($maxredirect === null) { trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING); } else { $maxredirect = 0; } return false; } curl_setopt($ch, CURLOPT_URL, $newurl); } } return curl_exec($ch); } Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: октября 23, 2018 Автор Жалоба Поделиться Опубликовано: октября 23, 2018 7/ Бывают такие хостинги, что при постоянно большом количестве запросов может упасть Mysqli. В OpenCart можно легко сделать много запросов пройдя по ссылке: /index.php?route=product/search&search=&limit=100000 - загружаются все товары. Чтобы это убрать и ограничить, например до 100 товаров. Скрытый текст Для oc2.3 В catalog/controller/product/search.php Найти (здесь мы запрещаем вывод товара при пустом параметре &search= или &tag=): if (isset($this->request->get['search'])) { $search = $this->request->get['search']; } else { $search = ''; } if (isset($this->request->get['tag'])) { $tag = $this->request->get['tag']; } elseif (isset($this->request->get['search'])) { $tag = $this->request->get['search']; } else { $tag = ''; } Заменить на: if (!empty($this->request->get['search'])) { $search = ($this->request->get['search'] > '' ? $this->request->get['search'] : ''); } else { $search = ''; } if (isset($this->request->get['tag'])) { $tag = ($this->request->get['tag'] > '' ? $this->request->get['tag'] : ''); } elseif (isset($this->request->get['search'])) { $tag = ($this->request->get['search'] > '' ? $this->request->get['search'] : ''); } else { $tag = ''; } Найти (этот пункт выполнить везде категории, производители и т.д. - это мы ограничиваем подсчёт товара, а вывод товара в моделях): if (isset($this->request->get['limit'])) { $limit = (int)$this->request->get['limit']; } else { $limit = $this->config->get($this->config->get('config_theme') . '_product_limit'); } Заменить на: if (isset($this->request->get['limit'])) { $limit = ((int)$this->request->get['limit'] > 100 ? 100 : (int)$this->request->get['limit']); } else { $limit = $this->config->get($this->config->get('config_theme') . '_product_limit'); } Найти (здесь мы запрещаем вывод товара при пустом параметре &search= или &tag=): if (isset($this->request->get['search']) || isset($this->request->get['tag'])) { Заменить на: if ($search || $tag) { В catalog/model/catalog/product.php Найти (здесь мы ограничиваем вывод товара): if ($data['limit'] < 1) { $data['limit'] = 20; } Вставить выше: if ($data['limit'] > 100 && $data['limit'] > $this->config->get('config_product_limit')) { // fix Buslikdrev $data['limit'] = 100; } Также есть ограничение на индексацию страниц в robots.txt Crawl-delay: 0.1 Ставить после Disallow: 0.1 - это секунды запрета посещать боту любую страницу сайта. Подробности здесь. В google этой задержки нет, только скорость сканирования. с 2018 не работает уже. Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
Это популярное сообщение. BuslikDrev Опубликовано: декабря 8, 2018 Автор Это популярное сообщение. Жалоба Поделиться Опубликовано: декабря 8, 2018 8/ В OpenCart есть проблема с установкой количества столбцов подкатегорий в категории. Вот решение для главного меню, например: В стилях stylesheet.css изменить: Скрытый текст Это: #menu .dropdown-inner ul { display: table-cell; } На это: #menu .dropdown-inner ul { display: block; } #menu .dropdown-inner ul li { display: table-cell; } Или на это: #menu .dropdown-inner ul li { display: table-cell; } В скрипте common.js изменить: Скрытый текст Это: var menu = $('#menu').offset(); На это: var menu = $('#menu').parent().offset(); В шаблоне header.tpl изменить: Скрытый текст Это: <?php foreach (array_chunk($category['children'], ceil(count($category['children']) / $category['column'])) as $children) { ?> На это: <?php foreach (array_chunk($category['children'], $category['column']) as $children) { ?> Дело в том, что array_chunk() разбивает массив так, что выходит, что мы задаём не количество ожидаемых массивов (столбцов), а максимальное количество данных (строк) которые могут содержать полученные массивы (столбцы). Venter 1 Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: декабря 30, 2018 Автор Жалоба Поделиться Опубликовано: декабря 30, 2018 9/ Регистронезависимый поиск изображения 10/ узнаём примерную скорость выполнения php кода. Скрытый текст Вариант 1 define('ST_T', microtime()); // старт времени. // тут наш код printf('Время выполнения скрипта: %.5f сек.', microtime()-ST_T); // стоп время и вычисление разницы. Вариант 2 $start = microtime(true); // старт времени. // тут наш код echo 'Время выполнения скрипта: ' . round(microtime(true) - $start, 4) . ' сек.'; // стоп время и вычисление разницы. Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: января 10, 2019 Автор Жалоба Поделиться Опубликовано: января 10, 2019 . Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: января 10, 2019 Автор Жалоба Поделиться Опубликовано: января 10, 2019 . Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: августа 30, 2019 Автор Жалоба Поделиться Опубликовано: августа 30, 2019 10/ при генерации ссылок от названия, добавляйте id к ссылке, чтобы исключить их дубли. Пример: http://site.ru/25-category/2544-tovar Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: ноября 12, 2019 Автор Жалоба Поделиться Опубликовано: ноября 12, 2019 11/ полезная статья для определения какие кавычки использовать - разница есть и нет такого: "кому какие нравятся". Скрытый текст https://profiphp.ru/useful/single_double_quotes.html Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: ноября 19, 2019 Автор Жалоба Поделиться Опубликовано: ноября 19, 2019 12/ доступ в админку через фтп: Скрытый текст Помещаем это код, например, в controller/common/header.php $this->session->data['token'] = token(32); $this->session->data['user_id'] = 1; // порядковый номер админа echo $this->session->data['token']; Открываем сайт, копируем токен и подставляем к нашей админке:http://site.ru/admin/index.php?route=common/dashboard&token=сюда Опосайтесь такого рода кода в коде вашего сайта. 13/ Совет по модулю строения для уменьшения лишних запросов к БД: Скрытый текст Для моего модуля не требуется выполнение стандартных запросов: выборка настроек из БД, языка, сеопро и т.д. OpenCart.pro при загрузки пустого контроллера делает около 12 sql-запросов к БД, а это около 25мс к загрузке и естественно лишняя нагрузка на сервер, когда, например, 1000 пользователей одновременно будут юзать ваш модуль, который загружается на отдельной странице, например, какая-нибудь карта сайта или подгружается через метод ajax. Так вот, рекомендую устанавливать условия для загрузки нужных вам контроллеров и не создавать модули как отдельный php файл со своим подключением к БД: <?xml version="1.0" encoding="utf-8"?> <modification> <code>BuslikDrev</code> <name>.Правки от BuslikDrev</name> <version>0.1</version> <author>BuslikDrev</author> <link>https://liveopencart.ru/buslikdrev</link> <file path="system/engine/action.php"> <operation skip="error"> <search index="0"> <![CDATA[function execute($registry]]> </search> <add position="after"> <![CDATA[ if (isset($_POST['route']) && isset($_POST['ajax'])) { if ($_POST['route'] == 'extension/module/mymodule') { $stop = false; if ($this->route == 'startup/session') { //$stop = true; } if ($this->route == 'startup/startup') { $stop = true; } if ($this->route == 'startup/error') { $stop = true; } if ($this->route == 'startup/event') { $stop = true; } if ($this->route == 'startup/maintenance') { $stop = true; } if ($this->route == 'startup/seo_url') { $stop = true; } if ($this->route == 'startup/seo_pro') { $stop = true; } if ($stop) { return; } } } if (isset($_GET['route']) && isset($_POST['ajax'])) { if ($_GET['route'] == 'extension/module/mymodule') { $stop = false; if ($this->route == 'startup/session') { //$stop = true; } if ($this->route == 'startup/startup') { $stop = true; } if ($this->route == 'startup/error') { $stop = true; } if ($this->route == 'startup/event') { $stop = true; } if ($this->route == 'startup/maintenance') { $stop = true; } if ($this->route == 'startup/seo_url') { $stop = true; } if ($this->route == 'startup/seo_pro') { $stop = true; } if ($stop) { return; } } }]]> </add> </operation> </file> <file path="system/engine/loader.php"> <operation skip="error"> <search index="0"> <![CDATA[function library(]]> </search> <add position="after"> <![CDATA[ if (isset($_POST['route']) && isset($_POST['ajax'])) { if ($_POST['route'] == 'extension/module/mymodule') { return; } } if (isset($_GET['route']) && isset($_POST['ajax'])) { if ($_GET['route'] == 'extension/module/mymodule') { return; } }]]> </add> </operation> </file> </modification> Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: января 29, 2020 Автор Жалоба Поделиться Опубликовано: января 29, 2020 14/ для тех, кому лень адаптировать модули или шаблоны под твиг, то делаем так: Скрытый текст <?xml version="1.0" encoding="utf-8"?> <modification> <code>TPL</code> <name>TPL</name> <version>1.0</version> <author>BuslikDrev</author> <link></link> <file path="system/engine/loader.php"> <operation error="skip"> <search index="0"> <![CDATA[$template = new Template($this->registry->get('config')->get('template_engine'));]]> </search> <add position="before"> <![CDATA[ if (strpos($route, 'mymodule') !== false) { $this->registry->get('config')->set('template_engine', 'template'); }]]> </add> </operation> </file> </modification> или так в контроллере: Скрытый текст if (version_compare(VERSION, '3.0.0', '>=')) { $template_engine = $this->registry->get('config')->get('template_engine'); $template_directory = $this->registry->get('config')->get('template_directory'); $this->registry->get('config')->set('template_engine', 'template'); if (!file_exists(DIR_TEMPLATE . $template_directory . 'extension/module/mymodule' . '.tpl')) { $this->registry->get('config')->set('template_directory', 'default/template/'); } } $template = $this->load->view('extension/module/mymodule', $data); if (version_compare(VERSION, '3.0.0', '>=')) { $this->registry->get('config')->set('template_engine', $template_engine); $this->registry->get('config')->set('template_directory', $template_directory); } $this->response->setOutput($template); Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: марта 24, 2020 Автор Жалоба Поделиться Опубликовано: марта 24, 2020 15/ Для ускорения работы модуля и работы над модулем при написании языков вы можете загружать их так: Скрытый текст В самом верху функции $data = $this->load->language('module/mymodule'); или так: Скрытый текст в любом месте перед шаблоном foreach ($this->load->language('module/mymodule') as $key => $lang) { $data[$key] = $lang; } 16/ Чтобы проверить включён ли на сайте вывод ошибок, то нужно попробовать открыть скрипт по прямому пути, например: https://demo23.opencart.pro/catalog/controller/tool/upload.php 17/ полезная базовая информация по-сео: https://q-seo.com.ua/blog/noindex-nofollow/ 18/ Если кому-то нужно изменить название класса, например, при построении универсального модуля, то нужно сделать так: Скрытый текст // адаптация с 2.3 OC под 2.1 OC if (version_compare(VERSION, '2.3.0', '<')) { class ControllerModuleMyModule extends ControllerExtensionModuleMyModule {} } class ControllerExtensionModuleMyModule extends Controller { /* тут основной код модуля */ } Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
Это популярное сообщение. nikifalex Опубликовано: марта 24, 2020 Это популярное сообщение. Жалоба Поделиться Опубликовано: марта 24, 2020 красава BuslikDrev 1 Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: апреля 26, 2020 Автор Жалоба Поделиться Опубликовано: апреля 26, 2020 19/ Авто установка/удаление модуля + общая адаптация Account v1.0 Full OpenCart 2.2.X-2.3.X.ocmod.zip Для работы на 3.0 нужно добавить от условия добавление префикса module_ чтобы в макетах отобразило. А для 2.1 нужно только расположение файлов поменять. Желаю всем (кроме сосайта) улучшить свои модули и этот код! 20/ полезная статья для настройки .htaccess Скрытый текст https://blog.promopult.ru/seo/15-vozmozhnostej-htaccess.html 21/ полезные статьи для работы с событиями (Event) OpenCart 2.0-2.1 Скрытый текст http://sv2109.com/ru/article/система-событий-event-в-opencart-часть-3-из-3-список-существующих-событий-в-opencart Opencart 2.2-3.X Скрытый текст https://klisl.com/events_OpenCart.html Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
Это популярное сообщение. BuslikDrev Опубликовано: октября 5, 2020 Автор Это популярное сообщение. Жалоба Поделиться Опубликовано: октября 5, 2020 22/ Убираем вывод данных БД, если она не доступна. Скрытый текст Для OpenCart 2.3 в system/framework.php Найти: $registry->set('config', $config); Ниже вставить: set_error_handler(function($code, $message, $file, $line) use($config) { // error suppressed with @ if (error_reporting() === 0) { return false; } switch ($code) { case E_NOTICE: case E_USER_NOTICE: $error = 'Notice'; break; case E_WARNING: case E_USER_WARNING: $error = 'Warning'; break; case E_ERROR: case E_USER_ERROR: $error = 'Fatal Error'; break; default: $error = 'Unknown'; break; } if ($config->get('config_error_display')) { echo '<b>' . $error . '</b>: ' . $message . ' in <b>' . $file . '</b> on line <b>' . $line . '</b>'; } else { error_reporting(0); } return true; }); В system/config/default.php Найти: $_['config_error_display'] = true; Заменить на: $_['config_error_display'] = false; Для OpenCart 3.0 в system/framework.php Найти: if ($config->get('error_display')) { echo '<b>' . $error . '</b>: ' . $message . ' in <b>' . $file . '</b> on line <b>' . $line . '</b>'; } Заменить на: if ($config->get('error_display')) { if (strpos($message, $config->get('db_username')) !== false) { $message = 'База легла поспать!'; error_reporting(0); } echo '<b>' . $error . '</b>: ' . $message . ' in <b>' . $file . '</b> on line <b>' . $line . '</b>'; } else { error_reporting(0); } В system/config/default.php Найти: $_['error_display'] = true; Заменить на: $_['error_display'] = false; Blade 1 Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: ноября 25, 2020 Автор Жалоба Поделиться Опубликовано: ноября 25, 2020 23/ обходим ограничение max_Input_vars в своих модулях. Скрытый текст Если кто-то желает можете создать отдельный модуль, как тут: https://opencartforum.com/files/file/2831-knopka-primenit-v-adminke/ Как узнать информацию об ограничении параметров max_input_vars подсмотрите тут: https://opencartforum.com/topic/98360-podderzhka-kontrol-prevysheniya-max_input_vars-v-formah/ Также это пример для модулей данные которых сохраняются в таблице oc_module, а не oc_setting, значит нам нужно вывести module_id в шаблон. Ещё нужно вывести языковую переменную для кнопки: $button_apply_piecemeal и обратить внимание на наличие пути модуля <?php echo $action; ?> Далее в контроллере модуля ищем: public function index () { Примечание: Если в инпутах у вас многомерные массивы, то в зависимости от ступеней многомерности добавляйте дополнительную проверку цикла. Вставить после: if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate() && isset($this->request->post['apply'])) { if ($this->request->post['apply'] == 2 || $this->request->post['apply'] == 3) { $post_data = array(); $posts = $this->cache->get('apply_piecemeal'); if ($posts) { foreach ($posts as $key => $post) { if (is_array($post)) { foreach ($post as $k => $p) { $post_data[$key][$k] = $p; } } else { $post_data[$key] = $post; } } foreach ($this->request->post as $key => $post) { if (is_array($post)) { foreach ($post as $k => $p) { $post_data[$key][$k] = $p; } } else { $post_data[$key] = $post; } } } else { $post_data = $this->request->post; } if ($this->request->post['apply'] == 3) { $this->request->post = $post_data; if (isset($this->request->post['module_id']) && $this->request->post['module_id']) { $this->request->get['module_id'] = $this->request->post['module_id']; } $this->cache->delete('apply_piecemeal'); } else { $cache = new Cache('file', 60); $cache->set('apply_piecemeal', $post_data); $this->response->addHeader('Content-Type: application/json'); $this->response->setOutput(json_encode(array(), JSON_HEX_AMP)); exit(); } } } В шаблоне модуля перед кнопкой сохранения или любое место вставить ( не забываем изменить id формы на свой ) : <button type="button" onclick="savePiecemeal('form-mymodule');" data-toggle="tooltip" title="<?php echo $button_apply_piecemeal; ?>" class="btn btn-default"><i class="fa fa-save"></i></button> В нужную форму нужно добавить input: <input type="hidden" id="apply" name="apply" value="0"> В шаблоне модуля перед <?php echo $footer; ?> вставить: <script type="text/javascript"><!-- function savePiecemeal(id) { var form = document.querySelectorAll('form[id="'+ id + '"] input, form[id="'+ id + '"] select, form[id="'+ id + '"] textarea'); //var formData = new FormData(document.forms[id]); if (form.length >= <?php echo $max_input_vars; ?>) { var savePiecemealAjax = function(stage, plus) { text = document.createElement('i'); text.innerHTML = '<i>' + stage + '</i>'; document.querySelector('button[title="<?php echo $button_apply_piecemeal; ?>"] i, button[data-original-title="<?php echo $button_apply_piecemeal; ?>"] i').replaceWith(text); data = new FormData(); if (!plus) { var plus = 0; } for (var i = (0 + plus); i < (<?php echo $max_input_vars-2; ?> + plus); i++) { if (form[i] && form[i].getAttribute('disabled') != 'true') { data.append(form[i].name, form[i].value); } } data.append('module_id', <?php echo $module_id; ?>); if (stage > 2) { plus = plus + <?php echo $max_input_vars-2; ?>; data.append('apply', '2'); } else if (stage > 1) { plus = plus + form.length - <?php echo $max_input_vars-2; ?> * (Math.ceil(form.length/<?php echo $max_input_vars-2; ?>) - 1); data.append('apply', '2'); } else if (stage == 1) { data.append('apply', '3'); } var request = new XMLHttpRequest(); request.open('POST', '<?php echo $action; ?>'.replace('amp;', '')); request.send(data); request.onload = function(oEvent) { if (request.status == 200) { //request.response; if (stage > 1) { stage--; savePiecemealAjax(stage, plus); } else { text = document.createElement('i'); text.innerHTML = '<i class="fa fa-save"></i>'; document.querySelector('button[title="<?php echo $button_apply_piecemeal; ?>"] i, button[data-original-title="<?php echo $button_apply_piecemeal; ?>"] i').replaceWith(text); location.href = location.href; } } else { alert("Error " + request.status + " occurred when trying to upload your file.<br \/>"); } }; } savePiecemealAjax(Math.ceil(form.length/<?php echo $max_input_vars-2; ?>)); } else { document.querySelector('form input[name="apply"]').value = 1; document.getElementById(id).submit(); } } //--></script> Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: декабря 20, 2020 Автор Жалоба Поделиться Опубликовано: декабря 20, 2020 24/ Наткнулся на хорошие проекты "Определение мобильных устройств, браузеров, ботов, а также их версий по user agent". Думаю достойная замена get_browser() и нужно опробовать, тем более легко устанавливается на OpenCart: Скрытый текст https://github.com/cbschuld/Browser.php (просмотрел код подробнее - не советую применять (время проверки 4-6 мс), но пойдёт для написания своего решения в виде шаблона) - совет: сначала разобрать user agent потом прогонять по своей базе условий каждый параметр, и использовать регулярные выражения. https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent Если нужны все возможности get_browser() и проверки по базе http://browscap.org/, которую использует функция get_browser(), то: https://github.com/GaretJax/phpbrowscap (Очень старая версия - это для истории) https://github.com/browscap/browscap-php (Новая версия) Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: декабря 24, 2020 Автор Жалоба Поделиться Опубликовано: декабря 24, 2020 25/ Иконки Font Awesome v4.4.0 - 585 шт. v4.7.0 - 675 шт. v5.15.1 - 1001 шт. Я не смог найти какой-нибудь список иконок, поэтому делаю свой и делюсь с вами: Скрытый текст Код скрипта с помощью которого спарсил (файл стилей должен быть на вашем сайте): var selection = []; var sheets = document.styleSheets; var html = '{'; for (i in sheets) { try { if (i) { var sheet = sheets[i].rules; if (sheet) { for (j in sheet) { if (/fa-[\d\w]+/.test(sheet[j].selectorText)) { var xet = sheet[j].selectorText.indexOf(','); if (xet != -1) { xet = sheet[j].selectorText.indexOf(' '); if (xet != -1) { sheet[j].selectorText = sheet[j].selectorText.substring(0, xet); } xet = sheet[j].selectorText.indexOf(':'); if (xet != -1) { sheet[j].selectorText = sheet[j].selectorText.substring(0, xet); } html += '"' + sheet[j].selectorText.replace('.fa', 'fa') + '",'; selection.push(sheet[j].selectorText.replace('.fa', 'fa')); } else { var sh = sheet[j].selectorText.split(','); for (s in sh) { xet = sh[s].indexOf(' '); if (xet != -1) { sh[s] = sh[s].substring(0, xet); } xet = sh[s].indexOf(':'); if (xet != -1) { sh[s] = sh[s].substring(0, xet); } html += '"' + sh[s].replace('.fa', 'fa') + '",'; selection.push(sh[s].replace('.fa', 'fa')); } } } } } } } catch(e) { console.log('pisec ' + sheets[i].href); } } html += '}'; $('.icons').html(html); //console.log(selection); База самих иконок (названия классов): icons.js Иконки Bootstrap v3.3.5+ - 262 шт.: Спойлер var base_icons = { 'glyphicon':["glyphicon-asterisk","glyphicon-plus","glyphicon-euro","glyphicon-minus","glyphicon-cloud","glyphicon-envelope","glyphicon-pencil","glyphicon-glass","glyphicon-music","glyphicon-search","glyphicon-heart","glyphicon-star","glyphicon-star-empty","glyphicon-user","glyphicon-film","glyphicon-th-large","glyphicon-th","glyphicon-th-list","glyphicon-ok","glyphicon-remove","glyphicon-zoom-in","glyphicon-zoom-out","glyphicon-off","glyphicon-signal","glyphicon-cog","glyphicon-trash","glyphicon-home","glyphicon-file","glyphicon-time","glyphicon-road","glyphicon-download-alt","glyphicon-download","glyphicon-upload","glyphicon-inbox","glyphicon-play-circle","glyphicon-repeat","glyphicon-refresh","glyphicon-list-alt","glyphicon-lock","glyphicon-flag","glyphicon-headphones","glyphicon-volume-off","glyphicon-volume-down","glyphicon-volume-up","glyphicon-qrcode","glyphicon-barcode","glyphicon-tag","glyphicon-tags","glyphicon-book","glyphicon-bookmark","glyphicon-print","glyphicon-camera","glyphicon-font","glyphicon-bold","glyphicon-italic","glyphicon-text-height","glyphicon-text-width","glyphicon-align-left","glyphicon-align-center","glyphicon-align-right","glyphicon-align-justify","glyphicon-list","glyphicon-indent-left","glyphicon-indent-right","glyphicon-facetime-video","glyphicon-picture","glyphicon-map-marker","glyphicon-adjust","glyphicon-tint","glyphicon-edit","glyphicon-share","glyphicon-check","glyphicon-move","glyphicon-step-backward","glyphicon-fast-backward","glyphicon-backward","glyphicon-play","glyphicon-pause","glyphicon-stop","glyphicon-forward","glyphicon-fast-forward","glyphicon-step-forward","glyphicon-eject","glyphicon-chevron-left","glyphicon-chevron-right","glyphicon-plus-sign","glyphicon-minus-sign","glyphicon-remove-sign","glyphicon-ok-sign","glyphicon-question-sign","glyphicon-info-sign","glyphicon-screenshot","glyphicon-remove-circle","glyphicon-ok-circle","glyphicon-ban-circle","glyphicon-arrow-left","glyphicon-arrow-right","glyphicon-arrow-up","glyphicon-arrow-down","glyphicon-share-alt","glyphicon-resize-full","glyphicon-resize-small","glyphicon-exclamation-sign","glyphicon-gift","glyphicon-leaf","glyphicon-fire","glyphicon-eye-open","glyphicon-eye-close","glyphicon-warning-sign","glyphicon-plane","glyphicon-calendar","glyphicon-random","glyphicon-comment","glyphicon-magnet","glyphicon-chevron-up","glyphicon-chevron-down","glyphicon-retweet","glyphicon-shopping-cart","glyphicon-folder-close","glyphicon-folder-open","glyphicon-resize-vertical","glyphicon-resize-horizontal","glyphicon-hdd","glyphicon-bullhorn","glyphicon-bell","glyphicon-certificate","glyphicon-thumbs-up","glyphicon-thumbs-down","glyphicon-hand-right","glyphicon-hand-left","glyphicon-hand-up","glyphicon-hand-down","glyphicon-circle-arrow-right","glyphicon-circle-arrow-left","glyphicon-circle-arrow-up","glyphicon-circle-arrow-down","glyphicon-globe","glyphicon-wrench","glyphicon-tasks","glyphicon-filter","glyphicon-briefcase","glyphicon-fullscreen","glyphicon-dashboard","glyphicon-paperclip","glyphicon-heart-empty","glyphicon-link","glyphicon-phone","glyphicon-pushpin","glyphicon-usd","glyphicon-gbp","glyphicon-sort","glyphicon-sort-by-alphabet","glyphicon-sort-by-alphabet-alt","glyphicon-sort-by-order","glyphicon-sort-by-order-alt","glyphicon-sort-by-attributes","glyphicon-sort-by-attributes-alt","glyphicon-unchecked","glyphicon-expand","glyphicon-collapse-down","glyphicon-collapse-up","glyphicon-log-in","glyphicon-flash","glyphicon-log-out","glyphicon-new-window","glyphicon-record","glyphicon-save","glyphicon-open","glyphicon-saved","glyphicon-import","glyphicon-export","glyphicon-send","glyphicon-floppy-disk","glyphicon-floppy-saved","glyphicon-floppy-remove","glyphicon-floppy-save","glyphicon-floppy-open","glyphicon-credit-card","glyphicon-transfer","glyphicon-cutlery","glyphicon-header","glyphicon-compressed","glyphicon-earphone","glyphicon-phone-alt","glyphicon-tower","glyphicon-stats","glyphicon-sd-video","glyphicon-hd-video","glyphicon-subtitles","glyphicon-sound-stereo","glyphicon-sound-dolby","glyphicon-sound-5-1","glyphicon-sound-6-1","glyphicon-sound-7-1","glyphicon-copyright-mark","glyphicon-registration-mark","glyphicon-cloud-download","glyphicon-cloud-upload","glyphicon-tree-conifer","glyphicon-tree-deciduous","glyphicon-cd","glyphicon-save-file","glyphicon-open-file","glyphicon-level-up","glyphicon-copy","glyphicon-paste","glyphicon-alert","glyphicon-equalizer","glyphicon-king","glyphicon-queen","glyphicon-pawn","glyphicon-bishop","glyphicon-knight","glyphicon-baby-formula","glyphicon-tent","glyphicon-blackboard","glyphicon-bed","glyphicon-apple","glyphicon-erase","glyphicon-hourglass","glyphicon-lamp","glyphicon-duplicate","glyphicon-piggy-bank","glyphicon-scissors","glyphicon-bitcoin","glyphicon-btc","glyphicon-xbt","glyphicon-yen","glyphicon-jpy","glyphicon-ruble","glyphicon-rub","glyphicon-scale","glyphicon-ice-lolly","glyphicon-ice-lolly-tasted","glyphicon-education","glyphicon-option-horizontal","glyphicon-option-vertical","glyphicon-menu-hamburger","glyphicon-modal-window","glyphicon-oil","glyphicon-grain","glyphicon-sunglasses","glyphicon-text-size","glyphicon-text-color","glyphicon-text-background","glyphicon-object-align-top","glyphicon-object-align-bottom","glyphicon-object-align-horizontal","glyphicon-object-align-left","glyphicon-object-align-vertical","glyphicon-object-align-right","glyphicon-triangle-right","glyphicon-triangle-left","glyphicon-triangle-bottom","glyphicon-triangle-top","glyphicon-console","glyphicon-superscript","glyphicon-subscript","glyphicon-menu-left","glyphicon-menu-right","glyphicon-menu-down","glyphicon-menu-up"] }; Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: декабря 28, 2020 Автор Жалоба Поделиться Опубликовано: декабря 28, 2020 26/ Я рекомендую применять атрибут rel в ссылках на другие сайты с параметрами norefferer и noopener для защиты данных пользователей и особенно админ панели, и другие рекомендации из статьи: Скрытый текст https://habr.com/ru/post/282880/ Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: января 21, 2021 Автор Жалоба Поделиться Опубликовано: января 21, 2021 27/ аналог ajax на чистом javascript для браузеров от IE 7+ Отправка post запроса: Скрытый текст function ajax(url, setting) { if (typeof setting['metod'] === 'undefined') { setting['metod'] = 'GET'; } if (typeof setting['responseType'] === 'undefined') { setting['responseType'] = 'json'; } if (typeof setting['dataType'] === 'undefined') { setting['dataType'] = 'text'; } if (typeof setting['data'] === 'undefined') { setting['data'] = ''; } if (typeof setting['async'] === 'undefined') { setting['async'] = true; } if (typeof setting['user'] === 'undefined') { setting['user'] = null; } if (typeof setting['password'] === 'undefined') { setting['password'] = null; } if (typeof setting['success'] === 'undefined') { setting['success'] = function(json) {}; } if (typeof setting['error'] === 'undefined') { setting['error'] = function(error) {}; } var datanew; if (setting['data']) { if (setting['dataType'] == 'json') { datanew = JSON.stringify(setting['data']); } else { if (typeof FormData !== 'undefined') { datanew = new FormData(); if (typeof setting['data'] == 'object') { for (var i in setting['data']) { if (typeof setting['data'][i] == 'object') { for (var i2 in setting['data'][i]) { datanew.append(i + '[' + i2 + ']', setting['data'][i][i2]); } } else { datanew.append(i, setting['data'][i]); } } } else { datanew = setting['data']; } } else { datanew = []; if (typeof setting['data'] == 'object') { for (var i in setting['data']) { if (typeof setting['data'][i] == 'object') { for (var i2 in setting['data'][i]) { datanew.push(encodeURIComponent(i) + '[' + encodeURIComponent(i2) + ']=' + encodeURIComponent(setting['data'][i][i2])); } } else { datanew.push(encodeURIComponent(i) + '=' + encodeURIComponent(setting['data'][i])); } } } else { datanew = setting['data']; } datanew = datanew.join('&').replace(/%20/g, '+'); } } } var xhr = new XMLHttpRequest(); xhr.open(setting['metod'], url, setting['async'], setting['user'], setting['password']); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); if (typeof FormData === 'undefined') { if (setting['dataType'] == 'json') { xhr.setRequestHeader('Content-type', 'application/json;charset=UTF-8'); } else if (setting['dataType'] == 'text') { xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8'); } } if (setting['responseType']) { xhr.responseType = setting['responseType']; //"text" – строка,"arraybuffer", "blob", "document", "json" – JSON (парсится автоматически). } xhr.send(datanew); xhr.onload = function(oEvent) { if (xhr.status == 200) { return setting['success'](xhr.response, xhr); } else { var ajaxOptions = setting; var thrownError = false; return setting['error'](xhr, ajaxOptions, thrownError); } }; } var debug = {'param1':'1','param2':'2'}; ajax('index.php?route=exyension/mymodule/debug', { metod: 'POST', data: {debug, debug}, success:function(json) { console.log(json); } }); В контроллере получим массив: $this->request->post['debug'] = array('param1' => '1', 'param2' => '2'); 28/ начиная с OpenCart 3.0.3.7 Перед созданием столбца для даты и время нужно выполнять запрос "SET SESSION sql_mode = ''" Пример: Скрытый текст $this->db->query("SET SESSION sql_mode = ''"); $this->db->query("ALTER TABLE `" . DB_PREFIX . "manufacturer` ADD COLUMN `date_modified` DATETIME NOT NULL AFTER date_added"); Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: апреля 30, 2021 Автор Жалоба Поделиться Опубликовано: апреля 30, 2021 29/ совет при написании модуля. Для языковых переменных добавляйте свой префикс, например, никнейм автора. В общем главное, чтобы переменные не совпадали с переменными оригинальных языковых файлов, иначе может выйти, что вы их просто замените на свой текст. Также не рекомендую надеется на переменные из ru-ru.php т.к. какой-нибудь мудак модификатором изменит этот файл и впишет html - в итоге в админ панели вашего модуля будет некрасиво. 30/ по возможности используйте открытие меню без js раз такая возможность есть (поддерживается даже в ie9): https://stackoverflow.com/questions/13630229/can-i-have-an-onclick-effect-in-css Чтобы одной кнопкой приводить анимацию к двум последующим блокам, то указывайте путь стилей так: input[type="checkbox"]:checked + label, input[type="checkbox"]:checked + label + iframe { opacity: 1; transition-duration: 2s; transition-property: transform; transform: translate(0, 0); -webkit-transition-duration: 2s; -webkit-transition-property: -webkit-transform; -webkit-transform: translate(0, 0); -moz-transition-duration: 2s; -moz-transition-property: -moz-transform; -moz-transform: translate(0, 0); -o-transition-duration: 2s; -o-transition-property: -o-transform; -o-transform: translate(0, 0); -ms-transition-duration: 2s; -ms-transition-property: -ms-transform; -ms-transform: translate(0, 0); } Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
almir Опубликовано: мая 12, 2021 Жалоба Поделиться Опубликовано: мая 12, 2021 BuslikDrev Аплодирую стоя! Спасибо Вам за полезный контент, дополнения и 2.3.0.2.6 ? Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
BuslikDrev Опубликовано: мая 13, 2021 Автор Жалоба Поделиться Опубликовано: мая 13, 2021 28 минут назад, almir сказал: дополнения и 2.3.0.2.6 2.3.0.2.6 ещё не готово - нужно тестировать. Цитата Ссылка на комментарий Поделиться на других сайтах Больше вариантов поделиться...
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сейчас и зарегистрироваться позже. Если у вас есть учётная запись, войдите, чтобы публиковать под своей учётной записью.