Добавление дополнительных полей для продукта
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. Вопрос к разработчикам. Как мне в шаблоне сделать такую проверку:
Если заходит пользователь группы А то делаем что то, а если заходит пользователь из группы Б то делаем чёто другое.