Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

yyyaaazzz

Newbie
  
  • Posts

    20
  • Joined

  • Last visited

Everything posted by yyyaaazzz

  1. Дяди не придут. Есть соглашение с клубом. По футболке - доставка Новой Почтой по Украине (25-30 грн). Сейчас должны в наличии все размеры.
  2. Я могу сколько угодно дать подсказок, но не научу логически мыслить. Метод 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, как строится меню категорий. Там эта рекурсия реализована. Не могу сказать что мне по душе способ ее реализации, но для вас это - практически готовое решение.
  3. Кому что больше по душе... я всего лишь намекнул на расширение базовой модели ОС для большего удобства использования. Сегодня вам нужно вывести названия категорий, завтра - еще что-то. А отдельныйметод в модели на такие случаи не бывает лишним. Это так, к слову. Что до решения вашей задачи. Если нужен просто список категорий, в которых есть товар - уберите из запроса 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); результат:
  4. 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'"); }
  5. http://shop.wbc.kiev.ua Магазин эксклюзивной атрибутики Ультрас Динамо Киев Opencart 1.5.1.3 шаблон свой Quickcheckout от rb2 По большому счету - ничего. Лишь кое-где, частично переделаны стандартные модули. Фишка магазина в сохранении линии дизайна сайта-родителя wbc.kiev.ua. Еще до запуска магазина, на основном сайте был раздел витрины товаров, без корзины, регистрации и онлайн-заказа. Каждая страница товара была статической и рисовалась в Photoshop (что согласитесь - не слишком удобно). По сути, единственной задачей было - максимально сохранить визуальную часть, будто ничего не поменялось. Дизайн - Алексей Марчук. Верстка и установка на ОС - ваш покорный слуга. PS: Мой первый проект на Opencart. Создавался в ОЧЕНЬ сжатые сроки (пару бессонных ночей), на что-либо "из ряда вон" попросту не было времени.
  6. Поверьте, это еще не предел клиентского маразма. Текущая версия сайта соответствует лишь 2 этапу комплексной доработки из запланированных 4. Так что лиха беда начало :-D
  7. 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 и заголовок категории для каждого товара.
  8. С чем-то соглашусь. И будь сайт лично моим, а не клиентским - там бы было многое по-другому. Ну а так, как говорил Яо Минь...
  9. Если фишка дизайна в стиле ч/б фотографии - я бы добавил красного. Серый фон - в печь! И не стройтесь под разметку дефолтного шаблона. Не ленитесь переверстать под себя.
  10. По этому ключу я переопределял вывод. Само-собой, это не единственное возможное (и не самое рациональное)))) решение, но т.к. задача по реализации ЧПУ не стояла... вобщем сделал так)
  11. 1) http://pizza-celentano.kiev.ua 2) Онлайн-магазин сети пиццерий 3) Opencart 1.5.1.3 4) Шаблон свой, полностью создавался с нуля 5) Сторонние расширения не использовались. Только базовый функционал + несколько самописных модулей: - Пицца "сделай сам". Конструктор товара по ингридиентам. - Новостная лента. Простая до безобразия. - Модуль "магазины". Динамическая карта с добавлением меток через админку и фильтрацией по свойствам. - Контроллер checkout без ничего лишнего. 6) Помимо указанного выше: реализована индивидуализация макетов страницы товара, зависимо от категории; просмотр товара, форма обратной связи и оформление заказа в iframe 7) Ваш покорный слуга
  12. Если не получается вывести позицию в 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 } ?> Не забудьте проверить, выведен ли модуль на каждой схеме. Смотрим и наслаждаемся:
  13. Не все так просто. Для начала нужно отключить валидацию в контроллерах. 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 и скрываем поля. Насчет формы заказа - там все намного сложнее и прежде чем браться - обязательно сделайте дамп))) Есть для нее готовое решение, платное но не дорогое.
  14. Добавил процессинг изображений средствами GD2. Теперь изображения товаров, которых нет в наличии будут визуально выделяться черно-белым, или каким-либо другим эффектом. Как только чуть освобожусь - ждите готовый vqmod
  15. Решено! Причем довольно-таки просто, без всяких там 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' нужно дописать. Смотрим результат:
  16. Допустим. Но с точки зрения юзабилити, не лучше бы сделать так чтобы на странице категории отображалось наличие товара? Кликабельность картинки при этом можно сохранить, добавив в код водяного знака значение href="<?php echo '$this['href'];' ?>" и сменив точку вывода водяного знака. Не подскажете как в данном случае вывести водяной знак?
  17. Я решил этот вопрос таким путем: <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 с готовым решением
  18. Писал. Но ответа не получил. На странице загрузки дополнения можете найти мои комменты. Пока пытаюсь разобраться сам, а также спрашиваю совета у более опытных пользователей ОС
  19. Наткнулся недавно на одно интересное дополнение. Задача его - прятать кнопку "купить" и подгружать водяной знак для товаров. которых нет в наличии. На странице товара все заработало "на ура", но на странице категории не работает. Открыв код, я обнаружил кое-что интересное: <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
×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.