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

Leaderboard

Popular Content

Showing content with the highest reputation on 08/28/2011 in all areas

  1. Добавление дополнительных полей для продукта Q: Как добавить дополнительное поле для продукта? A: Вам нужно сделать ряд изменений: 0) Определится что хотим сделать :) К примеру, хотим добавить дополнительное поле "Цена за:" "шт.". 1) Приступим. Сначала придумаем алиас для нашего поля. К примеру price_for. а) Определяемся в каком формате будут храниться данные. В нашем случае это будет varchar(64) (символьный). б) Добавляем новый столбец в таблицу: ALTER TABLE `имя_таблицы` ADD `price_for` varchar(64) NOT NULL; 2) Далее говорим админ панеле OpenCart'а о существовании этого столбца. То есть, нам нужно: а) "обновить" в модели продукта запросы к нашей БД. Открываем /admin/model/catalog/product.php мы увидем такой вот запросик: в строке 5 (или 6):$this->db->query("INSERT INTO " . DB_PREFIX . "product SET model = '" . $this->db->escape($data['model']) . "', sku = '" . $this->db->escape($data['sku']) . "', location = '" . $this->db->escape($data['location']) . "', quantity = '" . (int)$data['quantity'] . "', stock_status_id = '" . (int)$data['stock_status_id'] . "', date_available = '" . $this->db->escape($data['date_available']) . "', manufacturer_id = '" . (int)$data['manufacturer_id'] . "', shipping = '" . (int)$data['shipping'] . "', price = '" . (float)$data['price'] . "', weight = '" . (float)$data['weight'] . "', weight_class_id = '" . (int)$data['weight_class_id'] . "', length = '" . (float)$data['length'] . "', width = '" . (float)$data['width'] . "', height = '" . (float)$data['height'] . "', measurement_class_id = '" . (int)$data['measurement_class_id'] . "', status = '" . (int)$data['status'] . "',tax_class_id = '" . (int)$data['tax_class_id'] . "', date_added = NOW()"); Это основной запрос из админки для добавления товара. Нам нужно добавить нашу переменную price_for. Так $this->db->query("INSERT INTO " . DB_PREFIX . "product SET model = '" . $this->db->escape($data['model']) . "', sku = '" . $this->db->escape($data['sku']) . "', location = '" . $this->db->escape($data['location']) . "', quantity = '" . (int)$data['quantity'] . "', stock_status_id = '" . (int)$data['stock_status_id'] . "', date_available = '" . $this->db->escape($data['date_available']) . "', manufacturer_id = '" . (int)$data['manufacturer_id'] . "', shipping = '" . (int)$data['shipping'] . "', price = '" . (float)$data['price'] . "', price_for = '" . (float)$data['price_for'] . "', weight = '" . (float)$data['weight'] . "', weight_class_id = '" . (int)$data['weight_class_id'] . "', length = '" . (float)$data['length'] . "', width = '" . (float)$data['width'] . "', height = '" . (float)$data['height'] . "', measurement_class_id = '" . (int)$data['measurement_class_id'] . "', status = '" . (int)$data['status'] . "',tax_class_id = '" . (int)$data['tax_class_id'] . "', date_added = NOW()"); А также правим запрос обновления продукта (когда жмём изменить продукт). тотже файл. строка 87(88, 89):$this->db->query("UPDATE " . DB_PREFIX . "product SET model = '" . $this->db->escape($data['model']) . "', sku = '" . $this->db->escape($data['sku']) . "', location = '" . $this->db->escape($data['location']) . "', quantity = '" . (int)$data['quantity'] . "', stock_status_id = '" . (int)$data['stock_status_id'] . "', date_available = '" . $this->db->escape($data['date_available']) . "',manufacturer_id = '" . (int)$data['manufacturer_id'] . "', shipping = '" . (int)$data['shipping'] . "', price = '" . (float)$data['price'] . "', price_for = '" . (float)$data['price_for'] . "', weight = '" . (float)$data['weight'] . "', weight_class_id = '" . (int)$data['weight_class_id'] . "', length = '" . (float)$data['length'] . "', width = '" . (float)$data['width'] . "', height = '" . (float)$data['height'] . "', measurement_class_id = '" . (int)$data['measurement_class_id'] . "', status = '" . (int)$data['status'] . "', tax_class_id = '" . (int)$data['tax_class_id'] . "', date_modified = NOW() WHERE product_id = '" . (int)$product_id . "'"); б) добавляем проверку заносимых данных в /admin/controller/catalog/product.php. Сначала укажем о существовании текстовой переменной: строка 440:$this->data['entry_price'] = $this->language->get('entry_price');Добавляем ниже своё $this->data['entry_price_for'] = $this->language->get('entry_price_for');И самое главное, добавляем проверку вносимых данных. Смотрим: строка 679 if (isset($this->request->post['price'])) { $this->data['price'] = $this->request->post['price']; } else if (isset($product_info)) { $this->data['price'] = $product_info['price']; } else { $this->data['price'] = ''; }Ниже добавляем своё if (isset($this->request->post['price_for'])) { $this->data['price_for'] = $this->request->post['price_for']; } else if (isset($product_info)) { $this->data['price_for'] = $product_info['price_for']; } else { $this->data['price_for'] = ''; }в) теперь нужно поправить шаблон в аминке. Что бы мы смогли увидеть поле куда забивать всё это дело. Открываем /admin/view/template/catalog/product_form.tpl строка 141 <tr> <td><?php echo $entry_price; ?></td> <td><input type="text" name="price" value="<?php echo $price; ?>" /></td> </tr>Вставляем наше поле: <tr> <td><?php echo $entry_price_for; ?></td> <td><input type="text" name="price_for" value="<?php echo $price_for; ?>" /></td> </tr>г) Ну и самое главное! в файле /admin/language/russian/catalog/product.phpОписываем какой текст мы будем видеть: $_['entry_price_for'] = 'Цена за:';Всё! С админкой покончено. Можно добавлять товар.2) Теперь делаем самое главное - показуем покупателям єто поле =) а) Говорим продуктам о существовании поля. Открываем файлик /catalog/controller/product/product.php строка 122$this->data['text_price'] = $this->language->get('text_price');Ниже добавляем наше: $this->data['text_price_for'] = $this->language->get('text_price_for');а также вносим переменную в масив: строка 430'price' => $price,добавляем 'price_for' => $price_for,Забыл.... нужно добавить $this->data['price_for'] = $product_info['price_for'];гдето в строке 320б) Добавляем в шаблон. Открываем /catalog/view/theme/ваша_тема/template/product/product.tpl строка 18 <tr> <td>[b]<?php echo $text_price; ?>[/b]</td> <td><?php if (!$special) { ?> <?php echo $price; ?> <?php } else { ?> <span style="text-decoration: line-through;"><?php echo $price; ?></span> [color= #F00;]<?php echo $special; ?>[/color] <?php } ?></td> </tr>ниже добавляем наше <tr> <td><b><?php echo $text_price_for; ?></b></td> <td><?php echo $price_for; ?></td> </tr>в) Ну и напоследок добавляем в файл языка /catalog/language/russian/product/product.php $_['text_price_for'] = 'Цена за:'; Вот и всё! Пользуйтесь. PS. Вопрос к разработчикам. Как мне в шаблоне сделать такую проверку: Если заходит пользователь группы А то делаем что то, а если заходит пользователь из группы Б то делаем чёто другое.
    1 point
  2. Предлагаю вашему вниманию перечень собственных наработки, которые пришлось внедрить при создании (пока что еще не интернет-магазина) каталога товаров с использованием OpenCart. - Выгрузка данных из 1С 8.1 УТ - импорт в OpenCart Пришлось добавить дополнительные таблицы для синхронизации номенклатуры и др. справочников по GUID в 1С. Все предлагаемые методы импорта/экспорта работают таким образом, что каждый раз нужно очищать таблицы и заново их загружать. Я пошел другим путем, создал таблицы с соответствием id в 1С и в OpenCart, теперь при выгрузке данных, я передаю изменения сделанные в 1С с момента последней выгрузки, соответственно в таблицах OpenCart нет надобности удалять все данные и переносить все по новой. - Модуль "Сниженные цены" Идея в следующем, в 1С создаются документы "Установка цен номенклатуры", которые изменяют цены на товары как в меньшую, так и в большую сторону, эти данные пишутся в регистр сведений "Цены номенклатуры", который в свою очередь используется для выгрузки цен в OpenCart. Т.е. цена в таблице products просто замещается новой текущей. Механизма, который бы хранил предыдущую цену в OpenCart нет. В новом модуле как раз и использован механизм хранения старых цен, причем не всех, а только тех которые были снижены в 1С, отображают цены которые были снижены за определенный период (например, месяц). - Модуль "Торговые точки" В OpenCart есть возможность создания нескольких магазинов используя одну базу данных, но для отображения на разных сайтах, идея хорошая, но скажите кто-нибудь пользуется этим? В моем случае, требуется одна база данных, но магазины должны находится на одном сайте. Если проводить параллели с 1С, то это просто разные склады, с данными о наличии одного и того же товара на имеющихся складах. Данный модуль хранит данные о наличии товара в каждой розничной точке, с отображением дополнительной информации (адрес, телефон, цена и т.д.). Информация доступна при открытии страницы о товаре, для этого добавлена еще одна закладка. Есть бокс (виджет), который отображает список всех торговых точек с данными (фото, адрес, телефон, время работы, google-карта). - Ссылка на завод-производитель (модификация) В OpenCart при выводе информации о товаре почему-то забыли о производителей, т.е. нигде нет данных при выводе перечня товаров, например при поиске или выбор по категориям. - Ссылка на категории из товара (модификация) Тоже самое касается и категорий, например я нахожу какой-нибудь товар в поиске, к каким категориям он относится, приходится только гадать. А ведь в OpenCart для этого все есть, создана даже функция getCategories($product_id). Ведь это нормально отобразить перечень категорий, к которым относится данный товар. - Поиск в найденном (модификация) Работает как в яндексе. Ищем что-либо, потом ставим галочку "Поиск в найденном" и меняем текст для поиска. Как это все работает можно посмотреть на готовом сайте http://biosfera.kz. В планах добавление других модулей (например, "Распродажа") и доработка опций товаров. Если есть интерес, просьба высказываться, какой из перечисленных модулей вызывает наибольший интерес, я постараюсь рассказать об этом подробней и подготовить его для использования. P.S. За основу взят движок версии 1.4.9.5. К сожалению, после выпуска версии 1.5.0 сайт уже был практически готов, и адаптировать все изменения под новую версию, пока что не представилось возможным.
    1 point
  3. Ну, на счет удаления неоплаченных или наоборот готовых заказов не согласен. Это портит отчётность. А вот то, что как при удалении, так и при выставлении возвратных и отмененных статусов товар не зачисляется обратно — факт. Надо будет допилить, да. И поиграться с "умолчальной" фильтрацией, чтобы не мозолить глаза уже обработанными заказами.
    1 point
  4. Всем спасибо, проблема решилась!
    1 point
  5. Смотрим на дату постов, удивляемся))
    1 point
  6. закомментировали не все. по приведенному коду не хватает ?> и я подозреваю, что именно это в 95 строке.
    1 point
  7. есть модуль advanced position - настраиваешь его и ставишь куда душе угодно.
    1 point
  8. Задача: иметь возможность фильтровать товар в каталоге по 2м измерениям, оба измерения - часть наименования (мл, г) Реализация: >catalog/model/catalog/product.php код до замены и после, вставки отмечены красным: public function getProductsByCategoryId($category_id, $sort = 'p.sort_order', $order = 'ASC', $start = 0, $limit = 20, $filter = '') { //filter in the end of next string $sql = "SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2c.category_id = '" . (int)$category_id . "'".$filter; >catalog/controller/product/category.php код до замены и после, вставки отмечены красным: $this->data['products'] = array(); //FILTER $filter =''; // $this->data['filter1'] = ( isset($this->request->get['filter1']) ? $this->request->get['filter1'] : ''); $this->data['filter2'] = ( isset($this->request->get['filter2']) ? $this->request->get['filter2'] : ''); $this->data['filter3'] = ( isset($this->request->get['filter3']) ? $this->request->get['filter3'] : ''); if ($this->data['filter1']){ $filter .= " AND pd.name LIKE '%".$this->data['filter1']."%'"; } if ($this->data['filter2']){ $filter .= " AND pd.name LIKE '%".$this->data['filter2']."%'"; } if ($this->data['filter3']){ $filter .= " AND pd.name LIKE '%".$this->data['filter3']."%'"; } // $product_total = sizeof($this->model_catalog_product->getProductsByCategoryId($category_id, $sort, $order, 0, 99999, $filter)); //END OF FILTER $results = $this->model_catalog_product->getProductsByCategoryId($category_id, $sort, $order, ($page - 1) * $this->config->get('config_catalog_limit'), $this->config->get('config_catalog_limit'),$filter); и чуть ниже //FILTER URL OPTIONS -------- $url .= '&filter1='.$this->data['filter1'].'&filter2='.$this->data['filter2'].'&filter3='.$this->data['filter3']; //--------------------------- $pagination = new Pagination(); $pagination->total = $product_total; $pagination->page = $page; $pagination->limit = $this->config->get('config_catalog_limit'); $pagination->text = $this->language->get('text_pagination'); $pagination->url = $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $this->request->get['path'] . $url . '&page={page}'); //FILTER URL OPTIONS -------------------- $this->data['filter_url'] = $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $this->request->get['path'] . $url); $this->data['category_id'] = $category_id; //--------------------------------------- $this->data['pagination'] = $pagination->render(); ну и наконец шаблон >catalog/view/theme/имя.темы/template/product/catalog.tpl вставляется в тело <div class="sort"> ... </div> перед списком сортировки <?php $filters = array(); // перечисление каталогов, для кого применяется фильтр и собственно структура фильтров // обратите внимание, что одинаковые каталоги не должны входить в разные наборы фильтров, // т.е. $filters[',1,2,'] вместе с $filters[',1,3,'] - для категории 1 выведет 2хКол-во определенных // фильтров, т.е. задублируются, что приведет к ошибке $filters[',1,39,40,41,42,43,'] = array ( 'filter1' => array ('Name' => 'Параметр 1 ', 'Options' => array ('', 'Значение 1','Значение 2') ), 'filter2' => array ('Name' => 'Параметр 2 ', 'Options' => array ('', 'Значение 1','Значение 2','Значение 3','Значение 4') ), 'filter3' => array ('Name' => '', 'Options' => array () ) ); foreach ($filters as $key => $value){ if (!(strpos($key,','.$category_id.',') === false) ) { ?> <?php if( $value['filter1']['Name'] ){ ?> <div class="filter_option"> <span><?php echo $value['filter1']['Name']; ?></span> <select name="filter1" onchange="location = this.value"> <?php foreach ( $value['filter1']['Options'] as $filter) { ?> <?php $option = preg_replace('/filter1=[^&]*&/','filter1='.$filter.'&',$filter_url); ?> <?php if ($filter1 == $filter) { ?> <option value="<?php echo $option; ?>" selected="selected"><?php echo $filter; ?></option> <?php } else { ?> <option value="<?php echo $option; ?>"><?php echo $filter; ?></option> <?php } ?> <?php } ?> </select> </div> <?php } ?> <?php if( $value['filter2']['Name'] ){ ?> <div class="filter_option"> <span><?php echo 'Содержание никотина '; ?></span> <select name="filter2" onchange="location = this.value"> <?php foreach ( $value['filter2']['Options'] as $filter) { ?> <?php $option = preg_replace('/filter2=[^&]*&/','filter2='.$filter.'&',$filter_url); ?> <?php if ($filter2 == $filter) { ?> <option value="<?php echo $option; ?>" selected="selected"><?php echo $filter; ?></option> <?php } else { ?> <option value="<?php echo $option; ?>"><?php echo $filter; ?></option> <?php } ?> <?php } ?> </select> </div> <?php } ?> <?php if( $value['filter3']['Name'] ){ ?> <div class="filter_option"> <span><?php echo 'Содержание никотина '; ?></span> <select name="filter3" onchange="location = this.value"> <?php foreach ( $value['filter3']['Options'] as $filter) { ?> <?php $option = preg_replace('/filter3=[^&]*&/','filter3='.$filter.'&',$filter_url); ?> <?php if ($filter3 == $filter) { ?> <option value="<?php echo $option; ?>" selected="selected"><?php echo $filter; ?></option> <?php } else { ?> <option value="<?php echo $option; ?>"><?php echo $filter; ?></option> <?php } ?> <?php } ?> </select> </div> <?php } ?> <?php break; } ?> <?php } ?> </div> и немного CSS: .filter_option { float: left; margin-top: 7px; margin-left: 20px; } Сильно не бейте, в php я почти ноль - мог что и пропустить. Все три фильтра используются для фильтрации по наименованию. В контроллере можно отредактировать на практически любые поля - просто немного изучить sql запрос под кодом фильтра В шаблоне можно создать структуру фильтров для любых категорий. Надеюсь кому нибудь пригодится :)) Кстати работает на 1.4.9 - на ней собственно и сижу. *Updated! Исправлен баг: при изменении параметра номер страницы оставался. *Updated! Исправлены ошибки данного поста.
    1 point
  9. Ну еще школьники мне советы не давали по русскому языку. А на вопрос ваш, я вам уже дал ответ выше. "Убить" значит "удалить". "Аглицкий" = "английский" со старорусского.
    1 point
  10. Это значит нужно учить аглицкий язык и желательно хоть немного знать php прежде чем что-то удалять\комментировать. У вас переменная firstname встречается еще в 432 строке в файле guest_step_1.php - закомментируйте ее.
    1 point
  11. str_replace('что_заменить', 'на_что заменить', в_какой_переменной)а что вам мешает удалить всю эту ненужную для вас шелуху и написать просто <a href='index.php?route=information/information&information_id=7'>тем более, если вы четко знаете id статьи..
    1 point
  12. ну раз вы сделали оформление заказа в ОДИН шаг, то странно, что у вас возникли ТАКИЕ вопросы =) 1. в catalog/view/theme/тема/template/common/header.tpl удалить <a id="tab_login" ...</a>2. catalog/language/russian/checkout/guest_step_1.php - пишете то, что вам нужно
    1 point
  13. в пхп я не очень, делал интуитивно, на основе этой темы. может не оптимально, но главное работает :) версия магазина ocstore_v0.1.4 дальше описаны изменения для отображения "ПРОДАНО" на картинке товара в Продукте, Категории, Производителях и Последних товарах, при количестве товара = 0.
    1 point
×
×
  • 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.