-
Публікації
1 750 -
З нами
-
Відвідування
Тип публікації
Профілі
Форум
Маркетплейс
Статті
FAQ
Наші новини
Магазин
Блоги
module__dplus_manager
Повідомлення, опубліковані користувачем halfhope
-
-
Из ряда "Дело было вечером, делать было нечего ". Может быть этот генератор будет кому-нибудь полезен при переносе/создании модулей на OpenCart 2.0.
Скриншоты:
Умеет создавать формы с:
- select
- radio
- text
- textarea
- button
- checkboxlist (опенкартовский список чекбоксов)
- image(опенкартовский контрол для выбора изображений)
- fieldset (HTML5 группы контролов)
- tab(bootstrap tabs)
Дополнительные возможности:
- Превью
- Автодополнение названия языковых переменных
- Drag & Drop
- Заточен только под OpenCart
Описание файлов:
- language.php (Файл для автодополнения языковых переменных (в формате языкового файла opencart))(Туда нужно вставить содержимое языкового файла своего модуля/раздела)
- demo_data.php (Демо данные (необходим для генерации превью так же подходит для хранения языковых переменных))
- generated.php (Файл шаблона для генерации всей страницы, можете все оттуда удалить и оставить {generated})
- preview.php (Файл шаблона для генерации первью)
Особенности:- Вкладки и Fieldsets(группы контролов), как и html теги, нужно закрывать дополнительным элементом - "Закрытие открытой вкладки" и "Закрыть группу контролов".
Из соображений безопасности рекомендую запускать сей скрипт только на локальном сервере.Скачать- 3
-
А как мне от этого избавиться то, не подскажите?
Рекомендую сначала найти дыру. Посмотрите логи, если есть другие сайты на аккаунте, то проверьте их. Обновитесь, удалите варезные модули. Используйте скрипт - "айболит".
-
Т.е то что через поиск можно положить сайт мозгами школьника из 5-го класса это не дыра?
http://1564.halfhope.ru/ Чистый 1.5.6.4. Пробуйте.
-
Восстановил сайт с бекапа, но версия скриптов 1564. Слышал, что это уязвимая версия и под нее есть паблик эксплоиты. Как пропатчить магазин с данной версий, чтобы залатать дырку?
Для 1.5.6.4 нет эксплоитов и дыр там нет, разве что драйвер кривых рук.
-
При отключении модуля (использую vqmod_ manager) ошибка пропадает, при активации напротив сразу же появляется, сами можете убедиться, доступ к админке у вас есть.
Что бы как то повлияло на работоспособность пока не заметил, смущает то что горит это ошибка в любом разделе админки.
Про то что модуль не тестировался прекрасно понимаю, но не думаю что среди сборок большие отличия.
p.s. залез в ваш xml посмотреть из-за чего может быть.
Имеется строка:
<file name="admin/view/template/common/footer.tpl"> <operation error="skip"> <search position="replace" offset="4"><![CDATA[<script type="text/javascript"><!--]]></search> <add><![CDATA[]]></add> </operation> </file>
Удалил и ошибка пропала, честно говоря вообще не понял а зачем это? Сама подсветка работает как и прежде без нареканий.
P.S. а вы говорите ни как не связано :-) в любом случаи спасибо за хак, сам думал что надо как то выделить, а тут и делать самому ничего не пришлось :wink:
=) Забыл про этот скрипт. Это для совместимости с OcStore
-
у меня вот так http://www.alevistyle.com/index.php?route=information/news&news_id=7
Если сделать так information/news, то будет вставляться в список новостей, но не конкретного материала
information/news&news так тоже не помогло
Согласен с @afwollis. Это уже недоработка модуля. Автор должен был позаботиться о том, чтобы категория и запись имели разные схемы. Например blog/category и blog/record.
-
Решил опробовать, заработало, но на каждой странице админки, в самом внизу теперь строчка:
$('.image').hover(function(){ var link = $(this).find("a:contains('text_browse')"); if (link.length != 0) { $(this).css('cursor', 'pointer'); } }); //-->
Модуль не тестировался с maxystore.
-
Решил опробовать, заработало, но на каждой странице админки, в самом внизу теперь строчка:
$('.image').hover(function(){ var link = $(this).find("a:contains('text_browse')"); if (link.length != 0) { $(this).css('cursor', 'pointer'); } }); //-->
Это никак не связано с модулем. Там нет такого кода. Модуль работает только в разделе "Дополнения", в остальных разделах он не работает.
-
в файле
catalog/controller/product/category.php
catalog/controller/module/filterpro.php
добавлено 'model' => $result['model'],
у меня тема не стандартная, aqucart.
я и в default теме тоже ковырял, че то не то..
В category.tpl скрипт, который обрабатывает list/grid. null отображается именно после обработки javascript-ом.
-
Отключите на время SEO URL, посмотрите значение переменной route в адресной строке.
Например:
http://адрес сайта/index.php?route=blog/record&record_id=1
Путь - blog/record
-
Добрый день, требовалась возможность выставлять категориям разные шаблоны, нашёл и использовал даже костыль для этого, но добрый человек Tom рассказал о вашем модуле.
Ваш модуль судя по описанию устраивает всем и даже больше и я его сегодня честно приобрёл, поставил и... не работает. :(
Давайте разберёмся в чём может быть проблема.
Использую я сборку maxystore v1.5.5.1
vqmod стоит 2.5.0
Загрузил все файлы на ftp, в разделе модули активировал "Персонализованные шаблоны", захожу в них и тыкаю кнопку "добавить модуль" - 0 реакций.
В чём может быть проблема? что делать?
Добрый вечер. Вероятней всего возникла ошибка в JavaScript. Если используется нестандартная тема админки либо какие-нибудь JS модули для админки. Без доступа ничего сказать не могу. Пришлите данные для доступа в админку в ЛС.
-
Чтобы получить подитог корзины, есть переменная $this->cart->getSubTotal()
Она дает сумму товаров в корзине без учета купонов или сертификатов.
Как можно получить сумму корзины с купонами и сертификатами, если они были применены? Насколько я понимаю, подобное происходит при помощи model/total/coupon, но как именно, я понять не могу - к сожалению, не программист.
Возможно, кто-то уже решал задачу?
А сертификатами и бонусными баллами клиент разве не расплачивается? Если расплачивается, то этого в классе Cart нет. Т.к. нужная Вам сумма становится известна только после применения сертификата или бонусных баллов. А применение происходит при оформлении заказа.
-
На скорую руку сделал вывод товаров из подкатегорий в родительской категории.
ControllerCatalogCategory:
Добавлены строки с 199 по 258, изменены 261, 265.
<?php class ControllerProductCategory extends Controller { public function index() { $this->language->load('product/category'); $this->load->model('catalog/category'); $this->load->model('catalog/product'); $this->load->model('tool/image'); if (isset($this->request->get['filter'])) { $filter = $this->request->get['filter']; } else { $filter = ''; } if (isset($this->request->get['sort'])) { $sort = $this->request->get['sort']; } else { $sort = 'p.sort_order'; } if (isset($this->request->get['order'])) { $order = $this->request->get['order']; } else { $order = 'ASC'; } if (isset($this->request->get['page'])) { $page = $this->request->get['page']; } else { $page = 1; } if (isset($this->request->get['limit'])) { $limit = $this->request->get['limit']; } else { $limit = $this->config->get('config_catalog_limit'); } $this->data['breadcrumbs'] = array(); $this->data['breadcrumbs'][] = array( 'text' => $this->language->get('text_home'), 'href' => $this->url->link('common/home'), 'separator' => false ); if (isset($this->request->get['path'])) { $url = ''; if (isset($this->request->get['sort'])) { $url .= '&sort=' . $this->request->get['sort']; } if (isset($this->request->get['order'])) { $url .= '&order=' . $this->request->get['order']; } if (isset($this->request->get['limit'])) { $url .= '&limit=' . $this->request->get['limit']; } $path = ''; $parts = explode('_', (string)$this->request->get['path']); $category_id = (int)array_pop($parts); foreach ($parts as $path_id) { if (!$path) { $path = (int)$path_id; } else { $path .= '_' . (int)$path_id; } $category_info = $this->model_catalog_category->getCategory($path_id); if ($category_info) { $this->data['breadcrumbs'][] = array( 'text' => $category_info['name'], 'href' => $this->url->link('product/category', 'path=' . $path . $url), 'separator' => $this->language->get('text_separator') ); } } } else { $category_id = 0; } $this->data['category_id'] = $category_id; $category_info = $this->model_catalog_category->getCategory($category_id); if ($category_info) { if ($category_info['seo_title']) { $this->document->setTitle($category_info['seo_title']); } else { $this->document->setTitle($category_info['name']); } $this->document->setDescription($category_info['meta_description']); $this->document->setKeywords($category_info['meta_keyword']); $this->document->addScript('catalog/view/javascript/jquery/jquery.total-storage.min.js'); if ($category_info['seo_h1']) { $this->data['heading_title'] = $category_info['seo_h1']; } else { $this->data['heading_title'] = $category_info['name']; } $this->data['text_refine'] = $this->language->get('text_refine'); $this->data['text_empty'] = $this->language->get('text_empty'); $this->data['text_quantity'] = $this->language->get('text_quantity'); $this->data['text_manufacturer'] = $this->language->get('text_manufacturer'); $this->data['text_model'] = $this->language->get('text_model'); $this->data['text_price'] = $this->language->get('text_price'); $this->data['text_tax'] = $this->language->get('text_tax'); $this->data['text_points'] = $this->language->get('text_points'); $this->data['text_compare'] = sprintf($this->language->get('text_compare'), (isset($this->session->data['compare']) ? count($this->session->data['compare']) : 0)); $this->data['text_display'] = $this->language->get('text_display'); $this->data['text_list'] = $this->language->get('text_list'); $this->data['text_grid'] = $this->language->get('text_grid'); $this->data['text_sort'] = $this->language->get('text_sort'); $this->data['text_limit'] = $this->language->get('text_limit'); $this->data['button_cart'] = $this->language->get('button_cart'); $this->data['button_wishlist'] = $this->language->get('button_wishlist'); $this->data['button_compare'] = $this->language->get('button_compare'); $this->data['button_continue'] = $this->language->get('button_continue'); // Set the last category breadcrumb $url = ''; if (isset($this->request->get['sort'])) { $url .= '&sort=' . $this->request->get['sort']; } if (isset($this->request->get['order'])) { $url .= '&order=' . $this->request->get['order']; } if (isset($this->request->get['page'])) { $url .= '&page=' . $this->request->get['page']; } if (isset($this->request->get['limit'])) { $url .= '&limit=' . $this->request->get['limit']; } $this->data['breadcrumbs'][] = array( 'text' => $category_info['name'], 'href' => $this->url->link('product/category', 'path=' . $this->request->get['path']), 'separator' => $this->language->get('text_separator') ); if ($category_info['image']) { $this->data['thumb'] = $this->model_tool_image->resize($category_info['image'], $this->config->get('config_image_category_width'), $this->config->get('config_image_category_height')); $this->document->setOgImage($this->data['thumb']); } else { $this->data['thumb'] = ''; } $this->data['description'] = html_entity_decode($category_info['description'], ENT_QUOTES, 'UTF-8'); $this->data['compare'] = $this->url->link('product/compare'); $url = ''; if (isset($this->request->get['filter'])) { $url .= '&filter=' . $this->request->get['filter']; } if (isset($this->request->get['sort'])) { $url .= '&sort=' . $this->request->get['sort']; } if (isset($this->request->get['order'])) { $url .= '&order=' . $this->request->get['order']; } if (isset($this->request->get['limit'])) { $url .= '&limit=' . $this->request->get['limit']; } $this->data['categories'] = array(); $results = $this->model_catalog_category->getCategories($category_id); foreach ($results as $result) { ################################### Начало ###################################### $data = array( 'filter_category_id' => $result['category_id'], 'filter_sub_category' => true, 'filter_filter' => $filter, 'sort' => $sort, 'order' => $order, 'start' => ($page - 1) * $limit, 'limit' => $limit ); $prod_results = $this->model_catalog_product->getProducts($data); $product_total = $this->model_catalog_product->getFoundProducts(); $products = array(); foreach ($prod_results as $prod_result) { if ($prod_result['image']) { $image = $this->model_tool_image->resize($prod_result['image'], $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height')); } else { $image = $this->model_tool_image->resize('no_image.jpg', $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height')); } if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) { $price = $this->currency->format($this->tax->calculate($prod_result['price'], $prod_result['tax_class_id'], $this->config->get('config_tax'))); } else { $price = false; } if ((float)$prod_result['special']) { $special = $this->currency->format($this->tax->calculate($prod_result['special'], $prod_result['tax_class_id'], $this->config->get('config_tax'))); } else { $special = false; } if ($this->config->get('config_tax')) { $tax = $this->currency->format((float)$prod_result['special'] ? $prod_result['special'] : $prod_result['price']); } else { $tax = false; } if ($this->config->get('config_review_status')) { $rating = (int)$prod_result['rating']; } else { $rating = false; } $products[] = array( 'prod_product_id' => $prod_result['product_id'], 'prod_thumb' => $image, 'prod_name' => $prod_result['name'], 'prod_description' => html_entity_decode($prod_result['mini_description'], ENT_QUOTES, 'UTF-8'), 'prod_price' => $price, 'prod_special' => $special, 'prod_tax' => $tax, 'prod_rating' => $prod_result['rating'], 'prod_reviews' => sprintf($this->language->get('text_reviews'), (int)$prod_result['reviews']), 'prod_href' => $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $prod_result['product_id'] . $url) ); } ################################### Конец ###################################### $this->data['categories'][] = array( 'category_id' => $result['category_id'], //добавляем для создания уникального ID 'name' => $result['name'] . ($this->config->get('config_product_count') ? ' (' . $product_total . ')' : ''), 'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '_' . $result['category_id'] . $url), 'thumb' => $this->model_tool_image->resize(($result['image']=='' ? 'no_image.jpg' : $result['image']), $this->config->get('config_image_category_width'), $this->config->get('config_image_category_height')), 'products' => $products //Добавляем массив товаров из подкатегорий ); } $this->data['products'] = array(); $data = array( 'filter_category_id' => $category_id, 'filter_filter' => $filter, 'sort' => $sort, 'order' => $order, 'start' => ($page - 1) * $limit, 'limit' => $limit ); $results = $this->model_catalog_product->getProducts($data); //Вызов метода getFoundProducts должен проводится сразу же после getProducts //только тогда он выдает правильное значения количества товаров $product_total = $this->model_catalog_product->getFoundProducts(); foreach ($results as $result) { if ($result['image']) { $image = $this->model_tool_image->resize($result['image'], $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height')); } else { $image = $this->model_tool_image->resize('no_image.jpg', $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height')); } if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) { $price = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax'))); } else { $price = false; } if ((float)$result['special']) { $special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax'))); } else { $special = false; } if ($this->config->get('config_tax')) { $tax = $this->currency->format((float)$result['special'] ? $result['special'] : $result['price']); } else { $tax = false; } if ($this->config->get('config_review_status')) { $rating = (int)$result['rating']; } else { $rating = false; } $this->data['products'][] = array( 'product_id' => $result['product_id'], 'thumb' => $image, 'name' => $result['name'], 'description' => html_entity_decode($result['mini_description'], ENT_QUOTES, 'UTF-8'), 'price' => $price, 'special' => $special, 'tax' => $tax, 'rating' => $result['rating'], 'reviews' => sprintf($this->language->get('text_reviews'), (int)$result['reviews']), 'href' => $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'] . $url) ); } $url = ''; if (isset($this->request->get['filter'])) { $url .= '&filter=' . $this->request->get['filter']; } if (isset($this->request->get['limit'])) { $url .= '&limit=' . $this->request->get['limit']; } $this->data['sorts'] = array(); $this->data['sorts'][] = array( 'text' => $this->language->get('text_default'), 'value' => 'p.sort_order-ASC', 'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.sort_order&order=ASC' . $url) ); $this->data['sorts'][] = array( 'text' => $this->language->get('text_name_asc'), 'value' => 'pd.name-ASC', 'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=pd.name&order=ASC' . $url) ); $this->data['sorts'][] = array( 'text' => $this->language->get('text_name_desc'), 'value' => 'pd.name-DESC', 'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=pd.name&order=DESC' . $url) ); $this->data['sorts'][] = array( 'text' => $this->language->get('text_price_asc'), 'value' => 'p.price-ASC', 'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.price&order=ASC' . $url) ); $this->data['sorts'][] = array( 'text' => $this->language->get('text_price_desc'), 'value' => 'p.price-DESC', 'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.price&order=DESC' . $url) ); if ($this->config->get('config_review_status')) { $this->data['sorts'][] = array( 'text' => $this->language->get('text_rating_desc'), 'value' => 'rating-DESC', 'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=rating&order=DESC' . $url) ); $this->data['sorts'][] = array( 'text' => $this->language->get('text_rating_asc'), 'value' => 'rating-ASC', 'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=rating&order=ASC' . $url) ); } $this->data['sorts'][] = array( 'text' => $this->language->get('text_model_asc'), 'value' => 'p.model-ASC', 'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.model&order=ASC' . $url) ); $this->data['sorts'][] = array( 'text' => $this->language->get('text_model_desc'), 'value' => 'p.model-DESC', 'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.model&order=DESC' . $url) ); $url = ''; if (isset($this->request->get['filter'])) { $url .= '&filter=' . $this->request->get['filter']; } if (isset($this->request->get['sort'])) { $url .= '&sort=' . $this->request->get['sort']; } if (isset($this->request->get['order'])) { $url .= '&order=' . $this->request->get['order']; } $this->data['limits'] = array(); $limits = array_unique(array($this->config->get('config_catalog_limit'), 25, 50, 75, 100)); sort($limits); foreach($limits as $value){ $this->data['limits'][] = array( 'text' => $value, 'value' => $value, 'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&limit=' . $value) ); } $url = ''; if (isset($this->request->get['filter'])) { $url .= '&filter=' . $this->request->get['filter']; } if (isset($this->request->get['sort'])) { $url .= '&sort=' . $this->request->get['sort']; } if (isset($this->request->get['order'])) { $url .= '&order=' . $this->request->get['order']; } if (isset($this->request->get['limit'])) { $url .= '&limit=' . $this->request->get['limit']; } $pagination = new Pagination(); $pagination->total = $product_total; $pagination->page = $page; $pagination->limit = $limit; $pagination->text = $this->language->get('text_pagination'); $pagination->url = $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&page={page}'); $this->data['pagination'] = $pagination->render(); $this->data['sort'] = $sort; $this->data['order'] = $order; $this->data['limit'] = $limit; $this->data['continue'] = $this->url->link('common/home'); if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/product/category.tpl')) { $this->template = $this->config->get('config_template') . '/template/product/category.tpl'; } else { $this->template = 'default/template/product/category.tpl'; } $this->children = array( 'common/column_left', 'common/column_right', 'common/content_top', 'common/content_bottom', 'common/footer', 'common/header' ); $this->response->setOutput($this->render()); } else { $url = ''; if (isset($this->request->get['path'])) { $url .= '&path=' . $this->request->get['path']; } if (isset($this->request->get['filter'])) { $url .= '&filter=' . $this->request->get['filter']; } if (isset($this->request->get['sort'])) { $url .= '&sort=' . $this->request->get['sort']; } if (isset($this->request->get['order'])) { $url .= '&order=' . $this->request->get['order']; } if (isset($this->request->get['page'])) { $url .= '&page=' . $this->request->get['page']; } if (isset($this->request->get['limit'])) { $url .= '&limit=' . $this->request->get['limit']; } $this->data['breadcrumbs'][] = array( 'text' => $this->language->get('text_error'), 'href' => $this->url->link('product/category', $url), 'separator' => $this->language->get('text_separator') ); $this->document->setTitle($this->language->get('text_error')); $this->data['heading_title'] = $this->language->get('text_error'); $this->data['text_error'] = $this->language->get('text_error'); $this->data['button_continue'] = $this->language->get('button_continue'); $this->data['continue'] = $this->url->link('common/home'); if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/error/not_found.tpl')) { $this->template = $this->config->get('config_template') . '/template/error/not_found.tpl'; } else { $this->template = 'default/template/error/not_found.tpl'; } $this->children = array( 'common/column_left', 'common/column_right', 'common/content_top', 'common/content_bottom', 'common/footer', 'common/header' ); $this->response->setOutput($this->render()); } } } ?>
Шаблон category.tpl
Описание конструкции:
if($products){ //Выводим обычный список товаров }elseif($categories){ //Если нет товаров, но есть подкатегории, об обрабатываем подкатегории foreach($categories as $category){ //Обрабатываем товары каждой подкатегорий //Здесь вывод название каждой подкатегории <h2><?php echo $category['category_name'] ?></h2> foreach($products as $product){ //Выводим товары как обычно } } }else{ //Товаров вообще нет нет, выводим сообщение о том, что эта категория пуста }
Код измененного шаблона:
<?php if ($products) { ?> <div class="product-filter"> <div class="display"><b><?php echo $text_display; ?></b> <?php echo $text_list; ?> <b>/</b> <a onclick="display('grid');"><?php echo $text_grid; ?></a></div> <div class="limit"><b><?php echo $text_limit; ?></b> <select onchange="location = this.value;"> <?php foreach ($limits as $limits) { ?> <?php if ($limits['value'] == $limit) { ?> <option value="<?php echo $limits['href']; ?>" selected="selected"><?php echo $limits['text']; ?></option> <?php } else { ?> <option value="<?php echo $limits['href']; ?>"><?php echo $limits['text']; ?></option> <?php } ?> <?php } ?> </select> </div> <div class="sort"><b><?php echo $text_sort; ?></b> <select onchange="location = this.value;"> <?php foreach ($sorts as $sorts) { ?> <?php if ($sorts['value'] == $sort . '-' . $order) { ?> <option value="<?php echo $sorts['href']; ?>" selected="selected"><?php echo $sorts['text']; ?></option> <?php } else { ?> <option value="<?php echo $sorts['href']; ?>"><?php echo $sorts['text']; ?></option> <?php } ?> <?php } ?> </select> </div> </div> <div class="product-list" id="#product_list<?php echo $category_id; ?>"> <?php foreach ($products as $product) { ?> <div> <?php if ($product['rating']) { ?> <div class="rating"><img src="catalog/view/theme/ocstore-premium/image/stars-<?php echo $product['rating']; ?>.png" alt="<?php echo $product['reviews']; ?>" /></div> <?php } ?> <?php if ($product['thumb']) { ?> <div class="image"><a href="<?php echo $product['href']; ?>"><img src="<?php echo $product['thumb']; ?>" title="<?php echo $product['name']; ?>" alt="<?php echo $product['name']; ?>" /></a></div> <?php } ?> <div class="name"> <?php if (strlen($product['name']) > 40) { ?> <a href="<?php echo $product['href']; ?>" title="<?php echo $product['name']; ?>"><?php echo utf8_substr($product['name'], 0, 40) . '...'; ?></a> <?php } else { ?> <a href="<?php echo $product['href']; ?>"><?php echo $product['name']; ?></a> <?php } ?> </div> <div class="description"><?php echo $product['description']; ?></div> <?php if ($product['price']) { ?> <div class="pricebox"> <div class="price"> <?php if (!$product['special']) { ?> <?php echo $product['price']; ?> <?php } else { ?> <span class="price-old"><?php echo $product['price']; ?></span> <span class="price-new"><?php echo $product['special']; ?></span> <?php } ?> </div> </div> <?php } ?> <div class="cart"> <input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button-product" /> </div> </div> <?php } ?> </div> <div class="pagination"><?php echo $pagination; ?></div> <?php }elseif ($categories) { ?> <!-- Show subcategory products --> <div class="product-filter"> <div class="display"><b><?php echo $text_display; ?></b> <?php echo $text_list; ?> <b>/</b> <a onclick="display('grid');"><?php echo $text_grid; ?></a></div> <div class="limit"><b><?php echo $text_limit; ?></b> <select onchange="location = this.value;"> <?php foreach ($limits as $limits) { ?> <?php if ($limits['value'] == $limit) { ?> <option value="<?php echo $limits['href']; ?>" selected="selected"><?php echo $limits['text']; ?></option> <?php } else { ?> <option value="<?php echo $limits['href']; ?>"><?php echo $limits['text']; ?></option> <?php } ?> <?php } ?> </select> </div> <div class="sort"><b><?php echo $text_sort; ?></b> <select onchange="location = this.value;"> <?php foreach ($sorts as $sorts) { ?> <?php if ($sorts['value'] == $sort . '-' . $order) { ?> <option value="<?php echo $sorts['href']; ?>" selected="selected"><?php echo $sorts['text']; ?></option> <?php } else { ?> <option value="<?php echo $sorts['href']; ?>"><?php echo $sorts['text']; ?></option> <?php } ?> <?php } ?> </select> </div> </div> <?php foreach ($categories as $category) { ?> <a href="<?php echo $category['href']; ?>" class="category-header"><h2><?php echo $category['name']; ?></h2></a> <div class="product-list" id="#product_list<?php echo $category['category_id']; ?>"> <?php foreach ($category['products'] as $product) { ?> <div> <?php if ($product['prod_rating']) { ?> <div class="rating"><img src="catalog/view/theme/ocstore-premium/image/stars-<?php echo $product['prod_rating']; ?>.png" alt="<?php echo $product['prod_reviews']; ?>" /></div> <?php } ?> <?php if ($product['prod_thumb']) { ?> <div class="image"><a href="<?php echo $product['prod_href']; ?>"><img src="<?php echo $product['prod_thumb']; ?>" title="<?php echo $product['prod_name']; ?>" alt="<?php echo $product['prod_name']; ?>" /></a></div> <?php } ?> <div class="name"> <?php if (strlen($product['prod_name']) > 40) { ?> <a href="<?php echo $product['prod_href']; ?>" title="<?php echo $product['prod_name']; ?>"><?php echo utf8_substr($product['prod_name'], 0, 40) . '...'; ?></a> <?php } else { ?> <a href="<?php echo $product['prod_href']; ?>"><?php echo $product['prod_name']; ?></a> <?php } ?> </div> <div class="description"><?php echo $product['prod_description']; ?></div> <?php if ($product['prod_price']) { ?> <div class="pricebox"> <div class="price"> <?php if (!$product['prod_special']) { ?> <?php echo $product['prod_price']; ?> <?php } else { ?> <span class="price-old"><?php echo $product['prod_price']; ?></span> <span class="price-new"><?php echo $product['prod_special']; ?></span> <?php } ?> </div> </div> <?php } ?> <div class="cart"> <input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['prod_product_id']; ?>');" class="button-product" /> </div> </div> <?php } ?> </div> <?php } ?> <!-- Show subcategory products --> <?php }else{ ?> <h2>Этот раздел пуст, мы работаем над его наполнением</h2> <?php } ?>
JavaScript код менять не требуется. Работает фильтр и смена grid/list.
Работающий вариант можно посмотреть этом сайте, если сайт не доступен, то вот скриншот.
-
Еще предложения?
Напишите ему.
-
Здравствуйте. Перестал работать модуль связанные опции, скорей всего при обновлении модуля, кто починит?
Автор модуля
-
- Если есть другие сайты на аккаунте, то стоит в первую очередь посмотреть на них, OpenCart можно взломать только в редких случаях.
- Поменяйте пароли для доступа
- Проверьте сайт ai bolit или PHP-Shell-Detector
- Раз уж смогли отличить код от оригинала, то интуиция подскажет что дальше делать.
Как обезопаситься? Если даете доступ к сайту различным фрилансерам, то никак. Только своевременными бекапами.
-
потом добавить через импорт/экспорт?
Да, именно так.
-
Достаточно только JavaScript:
$('input[name=category_name]').on('change keyup paste', function(){ $('input[name=seo_url]').val(translit($(this).val())); // функция translit - Ваша. });
- 1
-
исходя из того, что я нашла в поисковиках, идентичные моему случаю проблемы возникают именно по совершении ошибок в бд и в файлах конфигурации. решила сразу предупредить, что там все в порядке)
Если в конфиге в качестве драйвера БД стоит mysqli, то смените на, mysql.
-
В следующей версии планирую добавлять элементы серверной оптимизации, такие как кэширование модулей и "Рекомендатор".
-
А проблему с объединением ява скриптов он так и не решил- как было 5 блокирующих судя по гугл page speed, так и осталось. (( :mellow:
Обновитесь. В новой версии вместо поля "Вставлять скрипты после body" появились два новых пункта:
- Вставлять все скрипты перед:
- Переместить inline скрипты вместе с остальными:
Для того, чтобы переместить все скрипты в конец страницы необходима в первом поле написать /<\/body>/ , а во втором поставить значение "Да". Затем сохраните настройки.
Это экспериментальная функция и не факт, что она будет работать у всех. Однако я буду стараться помочь каждому.
-
А как тогда избежать повторной генерации массива если данные в кэше уже есть?
$cached = $this->cache->get('cached'); if($cached){ $this->data['products'] = $cached; }else{ //Получение данных //Обработка массива foreach($results as $result){ $this->data['products'] = array( ... ); } $this->cache->set('cached'); }
-
Решено.
vqmod сам по себе создает конфликты, а vqmod c использованием офсетов вместе с регулярными выражениями это конфликты в геметрической прогрессии.. Даже вроде в официально документации где-то было написано что пользоваться таким крайне не желательно.
но я не понимаю зачем вам заменять все?
какая у вас задача? Если добавить свое поле то его можно дабавить после:
$this->data['products'][] = array(
Напишите конкретную задачуЗадача была такой: после
); }
добавить:
$this->cache->set('mcj.product.category.'.md5(json_encode(array($data, $this->config->get('config_store_id'), $this->config->get('config_language_id')))), $this->data['products']); }
В разных версиях OpenCart этот массив ($this->data['products']) выглядит по разному, но я все-таки нашел способ с применением offset:
<search position="after" offset="2"><![CDATA[$this->url->link('product/product', 'path=']]></search> <add><![CDATA[$this->cache->set('mcj.product.category.блаблабла');}]]></add>
Понимаю, что vqmod это костыль, но архитектура OpenCart не позволяет обходится без него при написании некоторых дополнений.
-
Нужно обновить движек с версии 1.5 на самую свежую версию. По поводу обновления пишите в аську 442200 или скайп jackes_dok
Рекомендую переезд на последний OcStore, т.к. 2.0 не стабильный и под него еще не заточены модули.
[Решение] Генератор форм админки для OpenCart 2.0
в Допомога програмістам та розробникам
Опубліковано:
Если языковые переменные не добавлены, то возможно исключение, которое я не предусмотрел.
В файл demo_data.php добавьте: