-
Posts
20 -
Joined
-
Last visited
Content Type
Profiles
Forums
Marketplace
Articles
FAQ
Our New
Store
Blogs
module__dplus_manager
Everything posted by yyyaaazzz
-
Дяди не придут. Есть соглашение с клубом. По футболке - доставка Новой Почтой по Украине (25-30 грн). Сейчас должны в наличии все размеры.
-
Я могу сколько угодно дать подсказок, но не научу логически мыслить. Метод getCategories() принимает единственный параметр - parent_id (ID родителя). Если у вас в каталоге товары размещены только в одной категории - все просто. В первом примере мы получили cid - ID категории. По cid мы можем взять полную запись из БД методом getCategory(), передав в него параметром cid. Получите массив данных одой категории. Если parent_id в нем больше нуля - снова вызывайте getCategory(), только уже с передачей parent_id и так до бесконечности. Я бы советовал вынести это в отдельный метод, который будет рекурсивно вызывать сам себя если parent_id больше 0. Там и строку сформируете, и контроллер останется чистеньким. Просто в контроллере потом добавите: $temp['href'] = $this->url->link('product/product', 'path='.$temp['cid'].'&product_id=' . $product_info['product_id']); Это для примера. У вас все должно выглядеть несколько иначе. А насчет getCategories() - посмотрите в контроллере common/header, как строится меню категорий. Там эта рекурсия реализована. Не могу сказать что мне по душе способ ее реализации, но для вас это - практически готовое решение.
-
Кому что больше по душе... я всего лишь намекнул на расширение базовой модели ОС для большего удобства использования. Сегодня вам нужно вывести названия категорий, завтра - еще что-то. А отдельныйметод в модели на такие случаи не бывает лишним. Это так, к слову. Что до решения вашей задачи. Если нужен просто список категорий, в которых есть товар - уберите из запроса LIMIT, получайте массив и делайте implode() через разделитель. Если собираетесь строить рекурсивный путь от родительской категории - до дочерней, это уже отдельная тема. Советую обратить внимание на метод getCategories() в catalog/model/catalog/category.php Вот вариант с простым имплодом всех категорий. Модель: public function getRowItems($table, $selectcols = '*', $where = '', $order = 'category_id', $limit = '') { $sql = 'SELECT t.'.$selectcols.' FROM '.DB_PREFIX.$table.' t WHERE t.'.$where.' ORDER by t.'.$order; if(!empty($limit)) { $sql .= ' LIMIT '.$limit; } $query = $this->db->query($sql); return $query->rows; } контроллер: $temp = array( 'product_id' => $product_info['product_id'], 'cid' => $this->model_catalog_product->getRowValue('product_to_category', 'category_id', 'product_id='.$product_info['product_id']), 'categories' => $this->model_catalog_product->getRowItems('product_to_category', '*', 'product_id='.$product_info['product_id']), 'ctitle' => '', 'thumb' => $image, 'name' => $product_info['name'], 'price' => $price, 'special' => $special, 'rating' => $rating, 'reviews' => sprintf($this->language->get('text_reviews'), (int)$product_info['reviews']), 'href' => $this->url->link('product/product', 'product_id=' . $product_info['product_id']) ); if(!empty($temp['categories'])) { $temp2 = array(); foreach ($temp['categories'] as $row) { $temp2[] = $this->model_catalog_product->getRowValue('category_description', 'name', 'category_id='.$row['category_id']); } $temp['ctitle'] = implode(', ', $temp2); unset($temp2); } $this->data['products'][] = $temp; unset($temp); результат:
-
[Решено] Проблема с шаблоном.
yyyaaazzz replied to Regeet's topic in Шаблони, дизайн та оформлення магазину
1) Проверьте, еть ли у вас файл catalog/language/russian/module/sellegance.php. Если нет - скопируйте файл из папки english по указанному выше пути. Потом откройте в редакторе и переводите. 2) Откройте 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'] . "', date_added = NOW(), status = '1'"); } -
В нужном месте вставьте: <?php echo $description;?>
-
http://shop.wbc.kiev.ua Магазин эксклюзивной атрибутики Ультрас Динамо Киев Opencart 1.5.1.3 шаблон свой Quickcheckout от rb2 По большому счету - ничего. Лишь кое-где, частично переделаны стандартные модули. Фишка магазина в сохранении линии дизайна сайта-родителя wbc.kiev.ua. Еще до запуска магазина, на основном сайте был раздел витрины товаров, без корзины, регистрации и онлайн-заказа. Каждая страница товара была статической и рисовалась в Photoshop (что согласитесь - не слишком удобно). По сути, единственной задачей было - максимально сохранить визуальную часть, будто ничего не поменялось. Дизайн - Алексей Марчук. Верстка и установка на ОС - ваш покорный слуга. PS: Мой первый проект на Opencart. Создавался в ОЧЕНЬ сжатые сроки (пару бессонных ночей), на что-либо "из ряда вон" попросту не было времени.
-
Pizza-celentano.kiev.ua
yyyaaazzz replied to yyyaaazzz's topic in Примеры сайтов на OpenCart (ocStore)
Поверьте, это еще не предел клиентского маразма. Текущая версия сайта соответствует лишь 2 этапу комплексной доработки из запланированных 4. Так что лиха беда начало :-D -
1) Для начала расширяем модель: открываем system/engine/model.php и добавляем новый метод public function getRowValue($table, $colname, $where) { $sql = 'SELECT t.'.$colname.' FROM '.DB_PREFIX.$table.' t '; $sql .= ' WHERE t.'.$where.' LIMIT 1'; $query = $this->db->query($sql); return !empty($query->row)? $query->row[$colname]: ''; } этот метод будет доступен из любого контроллера и позволит получать одно необходимое нам значение. 2) Теперь открываем catalog/controller/module/featured.php и ищем: $this->data['products'][] = array( 'product_id' => $product_info['product_id'], 'cid' => $this->model_catalog_product->getRowValue('product_to_category', 'category_id', 'product_id='.$product_info['product_id']), 'ctitle' => '', 'thumb' => $image, 'name' => $product_info['name'], 'price' => $price, 'special' => $special, 'rating' => $rating, 'reviews' => sprintf($this->language->get('text_reviews'), (int)$product_info['reviews']), 'href' => $this->url->link('product/product', 'product_id=' . $product_info['product_id']) ); заменяем на следующее: $temp = array( 'product_id' => $product_info['product_id'], 'cid' => $this->model_catalog_product->getRowValue('product_to_category', 'category_id', 'product_id='.$product_info['product_id']), 'ctitle' => '', 'thumb' => $image, 'name' => $product_info['name'], 'price' => $price, 'special' => $special, 'rating' => $rating, 'reviews' => sprintf($this->language->get('text_reviews'), (int)$product_info['reviews']), 'href' => $this->url->link('product/product', 'product_id=' . $product_info['product_id']) ); if(!empty($temp['cid'])) { $temp['ctitle'] = $this->model_catalog_product->getRowValue('category_description', 'name', 'category_id='.$temp['cid']); } $this->data['products'][] = $temp; unset($temp); Таким образом мы получили ID и заголовок категории для каждого товара.
-
Pizza-celentano.kiev.ua
yyyaaazzz replied to yyyaaazzz's topic in Примеры сайтов на OpenCart (ocStore)
С чем-то соглашусь. И будь сайт лично моим, а не клиентским - там бы было многое по-другому. Ну а так, как говорил Яо Минь... -
Decorius - Магазин Стильных Подарков
yyyaaazzz replied to decorius's topic in Примеры сайтов на OpenCart (ocStore)
Если фишка дизайна в стиле ч/б фотографии - я бы добавил красного. Серый фон - в печь! И не стройтесь под разметку дефолтного шаблона. Не ленитесь переверстать под себя. -
Pizza-celentano.kiev.ua
yyyaaazzz replied to yyyaaazzz's topic in Примеры сайтов на OpenCart (ocStore)
По этому ключу я переопределял вывод. Само-собой, это не единственное возможное (и не самое рациональное)))) решение, но т.к. задача по реализации ЧПУ не стояла... вобщем сделал так) -
1) http://pizza-celentano.kiev.ua 2) Онлайн-магазин сети пиццерий 3) Opencart 1.5.1.3 4) Шаблон свой, полностью создавался с нуля 5) Сторонние расширения не использовались. Только базовый функционал + несколько самописных модулей: - Пицца "сделай сам". Конструктор товара по ингридиентам. - Новостная лента. Простая до безобразия. - Модуль "магазины". Динамическая карта с добавлением меток через админку и фильтрацией по свойствам. - Контроллер checkout без ничего лишнего. 6) Помимо указанного выше: реализована индивидуализация макетов страницы товара, зависимо от категории; просмотр товара, форма обратной связи и оформление заказа в iframe 7) Ваш покорный слуга
-
[РЕШЕНО] Слайдер в шапке
yyyaaazzz replied to Giant's topic in Шаблони, дизайн та оформлення магазину
Если не получается вывести позицию в header.tpl, попробуйте следующий способ: 1. Делаем все по мануалу ravilr`a с пункта 1 по 3 (изменяем только административную часть). 2. Пользовательская часть. В контроллере header.php добавляем следующий код: $this->load->model('design/layout'); if (isset($this->request->get['route'])) { $route = $this->request->get['route']; } else { $route = 'common/home'; } $layout_id = 0; if (substr($route, 0, 16) == 'product/category' && isset($this->request->get['path'])) { $path = explode('_', (string)$this->request->get['path']); $layout_id = $this->model_catalog_category->getCategoryLayoutId(end($path)); } if (substr($route, 0, 15) == 'product/product' && isset($this->request->get['product_id'])) { $layout_id = $this->model_catalog_product->getProductLayoutId($this->request->get['product_id']); } if (substr($route, 0, 23) == 'information/information' && isset($this->request->get['information_id'])) { $layout_id = $this->model_catalog_information->getInformationLayoutId($this->request->get['information_id']); } if (!$layout_id) { $layout_id = $this->model_design_layout->getLayout($route); } if (!$layout_id) { $layout_id = $this->config->get('config_layout_id'); } $module_data = array(); $this->load->model('setting/extension'); $extensions = $this->model_setting_extension->getExtensions('module'); foreach ($extensions as $extension) { $modules = $this->config->get($extension['code'] . '_module'); if ($modules) { foreach ($modules as $module) { if ($module['layout_id'] == $layout_id && $module['position'] == 'имя_вашей_позиции_модуля' && $module['status']) { $module_data[] = array( 'code' => $extension['code'], 'setting' => $module, 'sort_order' => $module['sort_order'] ); } } } } $sort_order = array(); foreach ($module_data as $key => $value) { $sort_order[$key] = $value['sort_order']; } array_multisort($sort_order, SORT_ASC, $module_data); $this->data['modules'] = array(); foreach ($module_data as $module) { $module = $this->getChild('module/' . $module['code'], $module['setting']); if ($module) { $this->data['modules'][] = $module; } } после чего в файле шаблона header.tpl в необходимом месте добавляем: <?php if ($modules) { ?> <?php foreach ($modules as $module) { ?> <?php echo $module; ?> <?php } ?> <?php } ?> Не забудьте проверить, выведен ли модуль на каждой схеме. Смотрим и наслаждаемся: -
Не все так просто. Для начала нужно отключить валидацию в контроллерах. 1) в файле controller/account/register.php ищем строку private function validate() { и снимаем проверку с обязательных полей, напр: if ((utf8_strlen($this->request->post['city']) < 2) || (utf8_strlen($this->request->post['city']) > 128)) { $this->error['city'] = $this->language->get('error_city'); } заменяем на if ((utf8_strlen($this->request->post['city']) < 0) || (utf8_strlen($this->request->post['city']) > 128)) { $this->error['city'] = $this->language->get('error_city'); } и т.д... 2) То же самое проделываем в файлах controller/account/edit.php и controller/account/address.php, что позволит клиентам редактировать данные учетной записи. 3) Скрываем поля в файле view/theme/*/template/account/register.tpl 4) Переходим в папку admin/controller/sale, открываем файл customer_form.php и выше описаным способом снимаем валидацию с полей. Это позволит вам изменять данные учетных записей клиентов. 5) Открываем файл admin/view/template/sale/customer_form.tpl и скрываем поля. Насчет формы заказа - там все намного сложнее и прежде чем браться - обязательно сделайте дамп))) Есть для нее готовое решение, платное но не дорогое.
-
Добавил процессинг изображений средствами GD2. Теперь изображения товаров, которых нет в наличии будут визуально выделяться черно-белым, или каким-либо другим эффектом. Как только чуть освобожусь - ждите готовый vqmod
-
Решено! Причем довольно-таки просто, без всяких там vqmod'ов. В контроллер category.php дописал: 'quantity' => $result['quantity'],В шаблоне category.tpl вывел картинку с водяным знаком: <?php if($product['quantity'] <= 0) { echo '<img src="image/sold-out.png" width="200" style="position:absolute" />'; } ?>То же самое работает в модулях latest, featured, special итд. Только в контроллер 'quantity' нужно дописать. Смотрим результат:
-
Допустим. Но с точки зрения юзабилити, не лучше бы сделать так чтобы на странице категории отображалось наличие товара? Кликабельность картинки при этом можно сохранить, добавив в код водяного знака значение href="<?php echo '$this['href'];' ?>" и сменив точку вывода водяного знака. Не подскажете как в данном случае вывести водяной знак?
-
Я решил этот вопрос таким путем: <div class="multicolumn"> // wrapper страницы категории (в вашем случае product-list) <?php $iCol = 1; // новая колонка $cellCount = 2; // количество колонок $cellwidth = intval(100 / $cellCount); // ширина колонки, равная 100 / кол-во колонок ?> <?php foreach ($products as $product) { ?> <div class="column" style="width:<?php echo $cellwidth; ?>%; float:left;" > // каждая колонка = div с относительной шириной, зависимой от кол-ва колонок. <?php if ($product['thumb']) { ?> <a class="image" href="<?php echo $product['href']; ?>"><img align="middle" src="<?php echo $product['thumb']; ?>" alt="<?php echo $product['name']; ?>" /></a> <?php } ?> </div> <?php } ?> <?php if ($iCol == $cellCount) { echo "<br style="clear:both;" />n"; // закрываем ряд в случае если в нем необходимое нам кол-во колонок $iCol = 1; } else { $iCol++; // добавляем колонки до определенного количества } ?> </div>Если что-то не понятно, вышлю .tpl с готовым решением
-
Писал. Но ответа не получил. На странице загрузки дополнения можете найти мои комменты. Пока пытаюсь разобраться сам, а также спрашиваю совета у более опытных пользователей ОС
-
Наткнулся недавно на одно интересное дополнение. Задача его - прятать кнопку "купить" и подгружать водяной знак для товаров. которых нет в наличии. На странице товара все заработало "на ура", но на странице категории не работает. Открыв код, я обнаружил кое-что интересное: <file name="catalog/controller/product/category.php"> <operation> <search position="after" index="1"><![CDATA[ $this->data['products'][] = array( ]]></search> <add><![CDATA[ 'quantity' => $result['quantity'], ]]></add> </operation> </file>Эта функция записывает в массив контроллера category.php новую переменную, содержащую количество товара. Вроде бы с первого взгляда все правильно, но если внимательнее разобрать цикл, образующий массив, оказывается что данная переменная пуста. Вот цикл: $results = $this->model_catalog_product->getProducts($data); 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 = false; } 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' => mb_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, 100) . '..', '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']) ); } Этот цикл вытягивает данные из массива в model/catalog/product.php, функция getProducts (26 строка). Но в данной функции нет захвата данных о наличии. Следовательно, новая переменная 'quantity' => $result['quantity'], пуста и определить наличие товара таким образом невозможно. Понятно что это ошибка разработчика, но может у кого-нибудь есть идеи как ее исправить? PS: версия ОС 1.5.1.3. Файл дополнения в аттаче. Hide AddToCart 2.0.0.zip