Есть много (у каждого такого) чем можно поделиться: К примеру (дописываем, изменяем, дополняем, ... ...) дефолтовые модули и возможности движка ОПК. К примеру, меня один заказчик попросил отображать (показывать товар (определенный товар)) в зависимости от зарегистрирован/не зарегистрирован и в зависимости от групп пользователей. Получилось неплохое дополнение.
И так для начала (все это для сборки maxystore_v1.5.4.1:думаю подойдет и для других) я добавил одно поле (visibility int(11)) в таблице product - добавил я его в конец списка (не принципиально). Админ часть - дополнительный пункт появиться в закладке "Данные" (Группа покупателей) Далее: admin\language\russian\catalog\ -> product.php -> //Entru вставляем $_['entry_customer_group'] = 'Группа покупателей:';, а в //Info $_['info_visibility'] = '<span class="help">Видимость товара в зависимости от группы пользователей.<span>'; 1. admin\view\template\catalog\ -> product_form.tpl Код: <tr> <td><?php echo $entry_customer_group; ?></td> <td><select name="visibility"> <?php foreach ($customer_groups as $customer_group) { ?> <?php if ($customer_group['customer_group_id'] == $visibility) { ?> <option value="<?php echo $customer_group['customer_group_id']; ?>" selected="selected"><?php echo $customer_group['name']; ?></option> <?php } else { ?> <option value="<?php echo $customer_group['customer_group_id']; ?>"><?php echo $customer_group['name']; ?></option> <?php } ?> <?php } ?> </select></td><td><?php echo $info_visibility; ?></td> </td> </tr> 2. admin\controller\catalog\ -> product.php в private function getForm() { добавляем $this->data['entry_customer_group'] = $this->language->get('entry_customer_group'); и $this->data['info_visibility'] = $this->language->get('info_visibility'); соответственно. Примерно начиная со строки 860 вставляем следующий код: Код: if (isset($this->request->post['visibility'])) { $this->data['visibility'] = $this->request->post['visibility']; } elseif (!empty($product_info)) { $this->data['visibility'] = $product_info['sku']; } else { $this->data['visibility'] = ''; } 3. admin\model\catalog\ -> product.php function addProduct -> visibility = '". (int)$data['visibility'] ."', - после weight_class_id = (не существенно); function editProduct -> visibility = '". (int)$data['visibility'] ."', - так же; function copyProduct -> $data['visibility'] = ''; - думаю понятно где; и добавляем (можно в самом конце): Код: public function getTotalProductsByVisibilityClassId($visibility) { $query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB_PREFIX . "product WHERE visibility = '" . (int)$visibility . "'"); return $query->row['total']; } Вроди все учел, с клиентской частью проще.
Предлагаю Вашему вниманию доработку для OPENCART которая позволит в админке настроить и выводить КОНТАКТЫ в шапке сайта. Как это выглядит. см. скриншоты или здесь http://krazdo.com/ Итак приступим. Скачайте архив contacts.zip и залейте в корень сайта. Откройте файл /admin/view/template/setting/setting.tpl и после строк Код: <tr> <td><span class="required">*</span> <?php echo $entry_address; ?></td> <td><textarea name="config_address" cols="40" rows="5"><?php echo $config_address; ?></textarea> <?php if ($error_address) { ?> <span class="error"><?php echo $error_address; ?></span> <?php } ?></td> </tr> вставляем Код: <tr> <td><?php echo $entry_marg_left; ?></td> <td><input type="text" name="config_marg_left" value="<?php echo $config_marg_left; ?>" /></td> </tr> <tr> <td><?php echo $entry_marg_top; ?></td> <td><input type="text" name="config_marg_top" value="<?php echo $config_marg_top; ?>" /></td> </tr> <tr> <td><?php echo $entry_con; ?>-1</td> <td><input type="text" name="config_con1" value="<?php echo $config_con1; ?>" /><?php echo $entry_headico; ?><input type="text" name="config_headico1" value="<?php echo $config_headico1; ?>" /></td> </tr> <tr> <td><?php echo $entry_con; ?>-2</td> <td><input type="text" name="config_con2" value="<?php echo $config_con2; ?>" /><?php echo $entry_headico; ?><input type="text" name="config_headico2" value="<?php echo $config_headico2; ?>" /></td> </tr> <tr> <td><?php echo $entry_con; ?>-3</td> <td><input type="text" name="config_con3" value="<?php echo $config_con3; ?>" /><?php echo $entry_headico; ?><input type="text" name="config_headico3" value="<?php echo $config_headico3; ?>" /></td> </tr> далее открываем /admin/language/russian/setting/setting.php находим Код: $_['entry_address'] = 'Адрес магазина:'; после нее вставляем Код: $_['entry_marg_left'] = 'Отступ слева в PX:'; $_['entry_marg_top'] = 'Отступ сверху в PX:'; $_['entry_con'] = 'Контакт'; $_['entry_headico'] = 'Иконка'; открываем /admin/controller/setting/setting.php находим Код: $this->data['entry_address'] = $this->language->get('entry_address'); после нее вставляем Код: $this->data['entry_marg_left'] = $this->language->get('entry_marg_left'); $this->data['entry_marg_top'] = $this->language->get('entry_marg_top'); $this->data['entry_con'] = $this->language->get('entry_con'); $this->data['entry_headico'] = $this->language->get('entry_headico'); находим Код: if (isset($this->request->post['config_address'])) { $this->data['config_address'] = $this->request->post['config_address']; } else { $this->data['config_address'] = $this->config->get('config_address'); } после вставляем Код: if (isset($this->request->post['config_marg_left'])) { $this->data['config_marg_left'] = $this->request->post['config_marg_left']; } else { $this->data['config_marg_left'] = $this->config->get('config_marg_left'); } if (isset($this->request->post['config_marg_top'])) { $this->data['config_marg_top'] = $this->request->post['config_marg_top']; } else { $this->data['config_marg_top'] = $this->config->get('config_marg_top'); } if (isset($this->request->post['config_con1'])) { $this->data['config_con1'] = $this->request->post['config_con1']; } else { $this->data['config_con1'] = $this->config->get('config_con1'); } if (isset($this->request->post['config_con2'])) { $this->data['config_con2'] = $this->request->post['config_con2']; } else { $this->data['config_con2'] = $this->config->get('config_con2'); } if (isset($this->request->post['config_con3'])) { $this->data['config_con3'] = $this->request->post['config_con3']; } else { $this->data['config_con3'] = $this->config->get('config_con3'); } if (isset($this->request->post['config_headico1'])) { $this->data['config_headico1'] = $this->request->post['config_headico1']; } else { $this->data['config_headico1'] = $this->config->get('config_headico1'); } if (isset($this->request->post['config_headico2'])) { $this->data['config_headico2'] = $this->request->post['config_headico2']; } else { $this->data['config_headico2'] = $this->config->get('config_headico2'); } if (isset($this->request->post['config_headico3'])) { $this->data['config_headico3'] = $this->request->post['config_headico3']; } else { $this->data['config_headico3'] = $this->config->get('config_headico3'); } Идем по пути /catalog/controller/common/header.php после строки Код: $this->data['text_home'] = $this->language->get('text_home'); вставляем Код: $this->data['marg_left'] = $this->config->get('config_marg_left'); $this->data['marg_top'] = $this->config->get('config_marg_top'); $this->data['con1'] = $this->config->get('config_con1'); $this->data['con2'] = $this->config->get('config_con2'); $this->data['con3'] = $this->config->get('config_con3'); $this->data['headico1'] = $this->config->get('config_headico1'); $this->data['headico2'] = $this->config->get('config_headico2'); $this->data['headico3'] = $this->config->get('config_headico3'); Открываем файл /catalog/view/theme/greentea/template/header.tpl после Код: <div id="header"> вставляем Код: div id="headcontacts" style="position: absolute;top:<?php echo $marg_top; ?>px;left: <?php echo $marg_left; ?>px;"> <div class="con" style="background: url('/image/contacts/<?php echo $headico1; ?>') no-repeat;"><?php echo $con1; ?></div> <div class="con" style="background: url('/image/contacts/<?php echo $headico2; ?>') no-repeat;"><?php echo $con2; ?></div> <div class="con" style="background: url('/image/contacts/<?php echo $headico3; ?>') no-repeat;"><?php echo $con3; ?></div> </div> Редактируем стили: добавляем в /catalog/view/theme/default/stylesheet/stylesheet.css Код: #headcontacts { font-size: 12px; color: #fff;text-decoration: none; } .con { padding-left:25px; height: 18px; } Все!!! Модификация готова!! Теперь переходим в адмику система > настройка > название вашего магазина > изменить и вписываем в строки Контакт-1,Контакт-2,Контакт-3 нужные данные. Справа от контакта в поле иконка вбиваем название иконки которая лежит в папке image/contacts/ - по умолчанию уже доступны 2 иконки icq.png и phone.png. из архива contacts.zip Можете добавить свои иконки в формате 16x16 px gif,png,jpg и т.д. Надеюсь кому-то поможет. В следующий раз опишу модификацию мини-корзины, и как сделать красивые русские урлы без задвоений.
Автопубликация отзывов: По умолчанию, в движке Opencart включено модерирование отзывов, которые оставляют покупатели продуктам. Т.е., нужно зайти в панель администрирования, далее в "Каталог-Статьи", где будет список еще не проверенных отзывов. Затем заходим в каждый отзыв, и либо одобряем (включаем) его, либо не одобряем (не включаем). В некоторых случаях это поведение нужно изменить, включив автопубликацию отзывов. Открываем файл: catalog\model\catalog\review.php Заменяем: Код: public function addReview($product_id, $data) { $this->db->query("INSERT INTO " . DB_PREFIX . "review SET author = '" . $this->db->escape($data['name']) . "', customer_id = '" . (int)$this->customer->getId() . "', product_id = '" . (int)$product_id . "', text = '" . $this->db->escape($data['text']) . "', rating = '" . (int)$data['rating'] . "', date_added = NOW()"); } НА: Код: public function addReview($product_id, $data) { $this->db->query("INSERT INTO " . DB_PREFIX . "review SET author = '" . $this->db->escape($data['name']) . "', customer_id = '" . (int)$this->customer->getId() . "', product_id = '" . (int)$product_id . "', text = '" . $this->db->escape($data['text']) . "', rating = '" . (int)$data['rating'] . "', status = 1, date_added = NOW()"); } Готово!
Как оказалось-работает, но сильно глючит. И к тому же там ничего особенного нету, пара картинок 16*16 под телефон и icq, как на сайте. Путь - image-contacts.
чтобы прикрутить символ рубля (ну этот Р с черточкой) попробовал прикрепить произвольный шрифт в котором редактором шрифтов к буквам Р р добавил эту черточку в CSS добавил @font-face { font-family: 'arial'; src: url('arial-webfont.ttf') format('truetype'); font-weight: normal; font-style: normal; } в tpl <style type="text/css"> body{font-family: 'arial';}</style> но только вот какая бяка получается все буквы Р р в теге ,body ( менял на тег a) пишутся с черточкой кто что может посоветовать по этому поводу
Прокрутка карусели Opencart по кругу .../catalog/view/theme/yourtheme/template/module/carousel.tpl В нём после: Код: vertical: false, вставляем: Код: auto: 3, wrap: 'circular', P.S. Цифра "3" обозначает через сколько секунд будет производиться автоматическая прокрутка.
Делаем красивую и плавную миникорзину вверху, которая срабатывает при наведении мыши. Делалось для OPENCART 1.5.5.1 Демо http://krazdo.com/ идем по пути /catalog/view/javascript/common.js Находим Код: $('#cart > .heading a').live('click', function() { $('#cart').addClass('active'); $('#cart').load('index.php?route=module/cart #cart > *'); $('#cart').live('mouseleave', function() { $(this).removeClass('active'); }); }); Заменяем на Код: $("#cart").hover( function () { $('#cart .content').add("#cart .content").load('index.php?route=module/cart .content > *').stop(true, true).show('slow');$('#cart').addClass('active'); }, function () { $('#cart .content').stop(true, true).hide('fast');$(this).removeClass('active'); } ); Кода столько-же - радости больше!! Все!!!
в хедер <style type="text/css"> span.rubl {font-family: 'arial';}</style> в структуре таблицы oc_currency увеличиваешь тип symbol_right с varchar(12) до varchar(64) в настройках валюты правый символ ставишь <span class="rubl">Р</span> (кстати есть в инете специальный шрифт с рублем, ввроде ALSRublRegular) далее /system/library/currency.php строка 20 'symbol_right' => $result['symbol_right'], переделываешь её в 'symbol_right' => html_entity_decode($result['symbol_right']), готово
Исправляем баг в IE с кнопкой "Купить" на странице товара для версий 1.5.2-1.5.4 Баг зафиксирован в IE8, возможно и в других версиях он имеет место быть, кнопка "Купить" не работает. До версии 1.5.2 скрипт fancybox размещался в подвале, начиная с 1.5.2 colorbox размещён в product.tpl и похоже вызывает конфликт с другими скриптами. Решение: В файле catalog/view/theme/ТЕМА/template/product/product.tpl удалить: Код: <script type="text/javascript"><!-- $('.colorbox').colorbox({ overlayClose: true, opacity: 0.5 }); //--></script> в файле catalog/view/theme/ТЕМА/template/common/footer.tpl перед: Код: </body></html> добавить: Код: <script type="text/javascript"><!-- $('.colorbox').colorbox({ overlayClose: true, opacity: 0.5 }); //--></script>
Автоматическое заполнение meta keywords для улучшения SEO В результате у нас будет что-то вроде: <head> <title>122-02 Модерн</title> <base href="http://ocstore:8888/" /> <meta name="keywords" content="122-02,Модерн,122-02 Модерн" /> Не идеал, но вроде бы лучше, чем ничего. В то же время вручную описать эти поля никто не мешает, и в случае их заполненности автоматика не вмешивается. Делать автозаполнение для "meta description" не рекомендуется, потому что одинаковое название и описание не приветствуется. Но кому хочется - могут дописать if( empty($this->data['description']) ) $this->data['description'] = $this->data['title']; Для версий Opencart 1.5.x, включая 1.5.1.3; ocStore 1.0.1. Добавляем в /catalog/controller/common/header.php: ... $this->data['description'] = $this->document->getDescription(); $this->data['keywords'] = $this->document->getKeywords(); $this->data['links'] = $this->document->getLinks(); $this->data['styles'] = $this->document->getStyles(); $this->data['scripts'] = $this->document->getScripts(); $this->data['lang'] = $this->language->get('code'); $this->data['direction'] = $this->language->get('direction'); $this->data['google_analytics'] = html_entity_decode($this->config->get('config_google_analytics'), ENT_QUOTES, 'UTF-8'); /* SEO автоматическое заполнение meta-keywords */ // If keywords and description not set - use title here too if( empty($this->data['keywords']) ) { $words = explode(' ', $this->data['title']); $this->data['keywords'] = implode(',', $words) . ',' . $this->data['title']; } /* SEO автоматическое заполнение meta-keywords */ ...
Убираем блок Метки на странице товара, если они не заполнены для версии 1.5.4 catalog/controller/product/product.php заменить: Код: foreach ($tags as $tag) { $this->data['tags'][] = array( 'tag' => trim($tag), 'href' => $this->url->link('product/search', 'filter_tag=' . trim($tag)) ); } на: Код: foreach ($tags as $tag) { if ($tag) { $this->data['tags'][] = array( 'tag' => trim($tag), 'href' => $this->url->link('product/search', 'filter_tag=' . trim($tag)) ); } }
доработанные категории на базе модуля 1000 категорий (особенно в малом количестве запросов к базе). добавлены [+] и [-] для индикации раскрываемых и раскрытых категорий, они отвечают за раскрытие, а переход на категорию по клику на название , легко изменяются на спрайты подходящие для дизайна. весь css в файле tpl демо (пока рабочее) http://virtual-collection.net/index.php?route=product/category&path=18_46поскольку всё это на jquery думаю не сложно будет прикрутить туда slideUp/slideDown
Цена в title на странице товара открываем файл: ...\catalog\controller\product\product.php ищем Код: $this->document->setTitle($product_info['name']); копируем! и удаляем с этого места затем ищем Код: if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) { $this->data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax'))); } else { $this->data['price'] = false; } после этого кода добавляем то что вырезали выше и немного модифицируем: Код: $this->document->setTitle($product_info['name']." - ".$this->data['price']);
И еще может кому интересно. В админке поле Модель делаем необязательным для заполнения. Редактировать файл /admin/controller/catalog/product.php найти строку вида: php code: private function validateForm() { if (!$this->user->hasPermission(‘modify’, ’catalog/product’)) { $this->error['warning'] = $this->language->get(‘error_permission’); } foreach ($this->request->post['product_description'] as $language_id => $value) { if ((utf8_strlen($value['name']) < 1) || (utf8_strlen($value['name']) > 255)) { $this->error['name'][$language_id] = $this->language->get(‘error_name’); } } if ((utf8_strlen($this->request->post['model']) < 1) || (utf8_strlen($this->request->post['model']) > 64)) { $this->error['model'] = $this->language->get(‘error_model’); } if ($this->error && !isset($this->error['warning'])) { $this->error['warning'] = $this->language->get(‘error_warning’); } и заменить на: php code: private function validateForm() { if (!$this->user->hasPermission(‘modify’, ’catalog/product’)) { $this->error['warning'] = $this->language->get(‘error_permission’); } foreach ($this->request->post['product_description'] as $language_id => $value) { if ((utf8_strlen($value['name']) < 1) || (utf8_strlen($value['name']) > 255)) { $this->error['name'][$language_id] = $this->language->get(‘error_name’); } } /*if ((utf8_strlen($this->request->post['model']) < 1) || (utf8_strlen($this->request->post['model']) > 64)) { $this->error['model'] = $this->language->get(‘error_model’); }*/ if ($this->error && !isset($this->error['warning'])) { $this->error['warning'] = $this->language->get(‘error_warning’); }
Добавил дополнительное описание к категориям (в основе доп поле к товару) 1.5.4.1 VQmod HTML: <modification> <id>category_short_description</id> <version>1.0</version> <vqmver>1.1.1</vqmver> <author>starlin</author> <!-- back --> <file name="admin/controller/catalog/category.php"> <operation> <search position="after" offset="7"><![CDATA[ public function index() { ]]></search> <add><![CDATA[ $query = $this->db->query("DESC " . DB_PREFIX . "category_description short_desc"); if (!$query->num_rows) { $this->db->query("ALTER TABLE `" . DB_PREFIX . "category_description` ADD `short_desc` text COLLATE utf8_bin NOT NULL"); } ]]></add> </operation> </file> <file name="admin/model/catalog/category.php"> <operation> <search position="replace" offset="2"><![CDATA[ foreach ($data['category_description'] as $language_id => $value) { ]]> </search> <add><![CDATA[ foreach ($data['category_description'] as $language_id => $value) { $this->db->query("INSERT INTO " . DB_PREFIX . "category_description SET category_id = '" . (int)$category_id . "', language_id = '" . (int)$language_id . "', name = '" . $this->db->escape($value['name']) . "', meta_keyword = '" . $this->db->escape($value['meta_keyword']) . "', meta_description = '" . $this->db->escape($value['meta_description']) . "', description = '" . $this->db->escape($value['description']) . "', short_desc = '" . $this->db->escape($value['short_desc']) . "'"); } ]]></add> </operation> </file> <file name="admin/model/catalog/category.php"> <operation> <search position="after"><![CDATA[ 'description' => $result['description'] ]]> </search> <add><![CDATA[ , 'short_desc' => $result['short_desc'] ]]></add> </operation> </file> <file name="admin/controller/catalog/category.php"> <operation> <search position="after" offset="1"><![CDATA[ $this->data['category_description'] = array(); ]]> </search> <add><![CDATA[ if (isset($this->error['short_desc'])) { $this->data['short_desc'] = $this->error['short_desc']; } else { $this->data['short_desc'] = array(); } ]]></add> </operation> </file> <file name="admin/controller/catalog/category.php"> <operation> <search position="after"><![CDATA[ $this->data['entry_description'] = $this->language->get('entry_description'); ]]> </search> <add><![CDATA[ $this->data['entry_short_desc'] = $this->language->get('entry_short_desc'); ]]></add> </operation> </file> <file name="admin/language/english/catalog/category.php"> <operation> <search position="after"><![CDATA[ $_['entry_description'] = 'Description:'; ]]> </search> <add><![CDATA[ $_['entry_short_desc'] = 'Additional description:'; ]]></add> </operation> </file> <file name="admin/language/russian/catalog/category.php"> <operation> <search position="after"><![CDATA[ $_['entry_description'] = 'Описание:'; ]]> </search> <add><![CDATA[ $_['entry_short_desc'] = 'Additional description:'; ]]></add> </operation> </file> <file name="admin/view/template/catalog/category_form.tpl"> <operation> <search position="after" offset="2"><![CDATA[ <td><?php echo $entry_description; ?></td>]]> </search> <add><![CDATA[ <tr> <td><?php echo $entry_short_desc; ?></td> <td><textarea name="category_description[<?php echo $language['language_id']; ?>][short_desc]" id="short_desc<?php echo $language['language_id']; ?>"><?php echo isset($category_description[$language['language_id']]) ? $category_description[$language['language_id']]['short_desc'] : ''; ?></textarea></td> </tr> ]]></add> </operation> </file> <file name="admin/view/template/catalog/category_form.tpl"> <operation> <search position="after" offset="3"><![CDATA[ filebrowserFlashUploadUrl: 'index.php?route=common/filemanager&token=<?php echo $token; ?>' ]]></search> <add><![CDATA[ <script type="text/javascript" src="view/javascript/ckeditor/ckeditor.js"></script> <script type="text/javascript"><!-- <?php foreach ($languages as $language) { ?> CKEDITOR.replace('short_desc<?php echo $language['language_id']; ?>', { filebrowserBrowseUrl: 'index.php?route=common/filemanager&token=<?php echo $token; ?>', filebrowserImageBrowseUrl: 'index.php?route=common/filemanager&token=<?php echo $token; ?>', filebrowserFlashBrowseUrl: 'index.php?route=common/filemanager&token=<?php echo $token; ?>', filebrowserUploadUrl: 'index.php?route=common/filemanager&token=<?php echo $token; ?>', filebrowserImageUploadUrl: 'index.php?route=common/filemanager&token=<?php echo $token; ?>', filebrowserFlashUploadUrl: 'index.php?route=common/filemanager&token=<?php echo $token; ?>' }); <?php } ?> //--></script> ]]></add> </operation> </file> <file name="catalog/model/catalog/category.php"> <operation> <search position="before"><![CDATA[ public function getCategory($category_id) { ]]></search> <add><![CDATA[ public function getShortDesc($category_id) { $query = $this->db->query("SELECT DISTINCT * FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "short_desc cd ON (c.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE c.category_id = '" . (int)$category_id . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND c.status = '1'"); if ($query->num_rows) { return array( 'short_desc' => $query->row['short_desc'] ); } else { return false; } } ]]></add> </operation> </file> <file name="catalog/controller/product/category.php"> <operation> <search position="after"><![CDATA[ $this->data['heading_title'] = $category_info['name']; ]]></search> <add><![CDATA[ $this->data['short_desc'] = $category_info['short_desc']; ]]></add> </operation> </file> <file name="catalog/controller/product/category.php"> <operation> <search position="after"><![CDATA[ $this->data['description'] = html_entity_decode($category_info['description'], ENT_QUOTES, 'UTF-8'); ]]></search> <add><![CDATA[ $this->data['short_desc'] = html_entity_decode($category_info['short_desc'], ENT_QUOTES, 'UTF-8'); ]]></add> </operation> </file> <!-- front --> <file name="catalog/controller/product/category.php"> <operation> <search position="after"><![CDATA[ $this->data['text_limit'] = $this->language->get('text_limit'); ]]></search> <add><![CDATA[ $this->data['text_short_desc'] = $this->language->get('text_short_desc'); ]]></add> </operation> </file> <file name="catalog/language/english/product/category.php"> <operation> <search position="after"><![CDATA[ $_['text_error'] = 'Product not found!'; ]]></search> <add><![CDATA[ $_['text_short_desc'] = 'Additional description'; ]]></add> </operation> </file> <file name="catalog/language/russian/product/category.php"> <operation> <search position="after"><![CDATA[ $_['text_error'] = 'Категория РЅРµ найдена!'; ]]></search> <add><![CDATA[ $_['text_short_desc'] = 'Additional description'; ]]></add> </operation> </file> <file name="catalog/view/theme/default/template/product/category.tpl"> <operation> <search position="before"><![CDATA[ <?php echo $content_bottom; ?> ]]></search> <add><![CDATA[ <?php if ($short_desc) { ?> <span><?php echo $text_short_desc; ?></span> <?php echo $short_desc; ?></a><br /> <?php } ?> ]]></add> </operation> </file> </modification>
Как легко вводить атрибуты товара при редактировании или добавлении продукта при вводе в поле атрибута точки “.” появится список всех атрибутов 1. Открыть файл admin/controller/catalog/attribute.php Найти в сконце ± 435 строке следующий код: Код: $sort_order = array(); foreach ($json as $key => $value) { $sort_order[$key] = $value['name']; } array_multisort($sort_order, SORT_ASC, $json); Если у вас присутствует данный код, то переходим к пункту 2: Если код отсутствует, тогда его нужно добавить выше этой строки: Код: $this->load->library(‘json’); 2. Открыть файл admin/model/catalog/attribute.php В ±37 строке примерный код: Код: if (isset($data['filter_name']) && !is_null($data['filter_name'])) { $sql .= ” AND LCASE(ad.name) LIKE ‘” . $this->db->escape(mb_strtolower($data['filter_name'], ‘UTF-8′)) . “%’”; } или может такой (ocStore 1.5.4.1): Код: if (!empty($data['filter_name'])) { $sql .= " AND LCASE(ad.name) LIKE '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "%'"; } заменить на: Код: if (isset($data['filter_name']) && !is_null($data['filter_name'])) { if( $data['filter_name'] == ‘.’ ) $sql .= ” AND LCASE(ad.name) LIKE ‘%’”; else $sql .= ” AND LCASE(ad.name) LIKE ‘%” . $this->db->escape(mb_strtolower($data['filter_name'], ‘UTF-8′)) . “%’”; } Bcе!
Нередко на форуме можно найти вопросы по стикерам для товаров. Как правило требуются стикеры на товары которые продаются со скидкой по акции, сам перепробовал множество модулей - но ничего подходящего конкретно мне так и не нашел, поэтому поковырявшись в одном из шаблонов для магазина обнаружил довольно простое и симпатичное решение проблемы стикеров для товаров по акции. Выкладываю на всеобщее обозрение: 1. Как правило стикеры необходимо отображать в трех видах: в категориях, в витрине на главной и в рекомендуемых на странице товара. 2. Ищем и открываем файл stylesheet.css (как правило расположен в папке stylesheet шаблона) 3. Добавляем следующий код: Код: #content .box-product .special_promo { position: absolute; top: -4px; right: -4px; width: 60px; height: 60px; background: url('../image/promo.png') left top no-repeat; z-index:1000; 4. В папку Image шаблона закидываем файл: 5. В папке /template/product ищем файлы: category.tpl, product.tpl и прочих где необходимо отображение стикера ищем приблизительно такой код: Код: <a href="<?php echo $product['href']; ?>" class="image-link"> <div class="image"> <?php if ($product['thumb']) { ?> <img src="<?php echo $product['thumb']; ?>" title="<?php echo $product['name']; ?>" alt="<?php echo $product['name']; ?>" /> <?php } else { ?> <div class="no-image"></div> <?php } ?> </div> </a> И между: Код: <div class="image"> <?php if ($product['thumb']) { ?> вставляем: Код: <?php if ($product['special']) { ?> <?php echo '<div class="special_promo"></div>'; ?> <?php } ?> У каждого шаблоны магазинов свои, а следовательно предложенный мною вариант это лишь направление в сторону которого можно двигаться. Из плюсов данного решения - магазин не загружается лишними модулями Из минусов - выделить можно лишь одним стикером. Вот как это смотрится у меня в магазине: Вид главной страницы: Вид категорий: Вид на вкладке с самим товаром:
Зачем ети танцы с бубнами если можно просто без каких либо изменений вместо точки ввести знак % (процента) И все