Четверг, 04 Май 2017 07:13

OpenCart: Дополнительные поля товара (ч.1)

Один из отрицательных моментов при работе с Joomla – компоненты/плагины/модули написанные для прошлых версий не будут работать на новых и наоборот. Такая же беда не обошла стороной и OpenCart. К этому стоит добавить ещё и более ранние/поздние версии самих компонентов/плагинов. Теперь ещё к этому добавим что 90% годноты (а то и все 100%) имеют "платную подоплеку", в общем первые впечатления от движка всё радужнее и радужнее.

Однако вернёмся к «пальцы веером и сопли пузырьком», нытьё в сторону и продолжим работу. Один из вопросов, который у меня появилась необходимость решить – «добавление дополнительных полей к товару». Сейчас упущу из виду момент нытья на тему несовместимости версий и что все хотят бабла, а сразу перейду к пункту решения. Альтернативу нашёл здесь: custom product fields, но поскольку написано на английском языке, подумал что будет неплохо написать свой русский аналог.

Итак вопрос – OpenCart 2.3.0.2 нужно добавить Custom Product Fields (а* платный; б* для более ранних версий).

Вопрос этот будет раскрыт в 2 этапа, ЭТАП 1 – Добавление полей в админ-панель:

Первым делом открываем базу данных сайта и задаём следующий запрос.

ALTER TABLE `oc_product` ADD `custom_desc` VARCHAR(200) NULL ;

Где "oc_" – префикс таблицы Вашего магазина.


На этом с базой закончили, а потому переходим к файловой структуре, а именно к файлу admin/model/catalog/product.php. Здесь нужно добавить строку:

custom_desc = '" . $this->db->escape($data['custom_desc']) . "',

В функцию addProduct($data), после поля sort_order, в итоге код функции должен будет выглядеть так:

$this->db->query("INSERT INTO " . DB_PREFIX . "product SET model = '" . $this->db->escape($data['model']) . "', sku = '" . $this->db->escape($data['sku']) . "', upc = '" . $this->db->escape($data['upc']) . "', ean = '" . $this->db->escape($data['ean']) . "', jan = '" . $this->db->escape($data['jan']) . "', isbn = '" . $this->db->escape($data['isbn']) . "', mpn = '" . $this->db->escape($data['mpn']) . "', location = '" . $this->db->escape($data['location']) . "', quantity = '" . (int)$data['quantity'] . "', minimum = '" . (int)$data['minimum'] . "', subtract = '" . (int)$data['subtract'] . "', 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'] . "', points = '" . (int)$data['points'] . "', weight = '" . (float)$data['weight'] . "', weight_class_id = '" . (int)$data['weight_class_id'] . "', length = '" . (float)$data['length'] . "', width = '" . (float)$data['width'] . "', height = '" . (float)$data['height'] . "', length_class_id = '" . (int)$data['length_class_id'] . "', status = '" . (int)$data['status'] . "', tax_class_id = '" . (int)$data['tax_class_id'] . "', sort_order = '" . (int)$data['sort_order'] . "', custom_desc = '" . $this->db->escape($data['custom_desc']) . "', date_added = NOW()");

Я специально выделил жирным шрифтом "фрагмент отличия". После этого приступаем к функции editProduct($product_id, $data) и так же после sort_order добавляем строку:

custom_desc = '" . $this->db->escape($data['custom_desc']) . "',

Результат будет выглядеть так:

$this->db->query("UPDATE " . DB_PREFIX . "product SET model = '" . $this->db->escape($data['model']) . "', sku = '" . $this->db->escape($data['sku']) . "', upc = '" . $this->db->escape($data['upc']) . "', ean = '" . $this->db->escape($data['ean']) . "', jan = '" . $this->db->escape($data['jan']) . "', isbn = '" . $this->db->escape($data['isbn']) . "', mpn = '" . $this->db->escape($data['mpn']) . "', location = '" . $this->db->escape($data['location']) . "', quantity = '" . (int)$data['quantity'] . "', minimum = '" . (int)$data['minimum'] . "', subtract = '" . (int)$data['subtract'] . "', 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'] . "', points = '" . (int)$data['points'] . "', weight = '" . (float)$data['weight'] . "', weight_class_id = '" . (int)$data['weight_class_id'] . "', length = '" . (float)$data['length'] . "', width = '" . (float)$data['width'] . "', height = '" . (float)$data['height'] . "', length_class_id = '" . (int)$data['length_class_id'] . "', status = '" . (int)$data['status'] . "', tax_class_id = '" . (int)$data['tax_class_id'] . "', sort_order = '" . (int)$data['sort_order'] . "', custom_desc = '" . $this->db->escape($data['custom_desc']) . "', date_modified = NOW() WHERE product_id = '" . (int)$product_id . "'");


Переключаемся на работу с файлом admin/controller/catalog/product.php. Здесь ищем функцию getForm() и после строки:

$data['entry_sort_order'] = $this->language->get('entry_sort_order');

Добавляем строку:

$data['entry_custom_desc'] = $this->language->get('entry_custom_desc');

следом добавляем, это:

$data['help_custom_desc'] = $this->language->get('help_custom_desc');

после этой строки:

$data['help_isbn'] = $this->language->get('help_isbn');

с помощью поиска ищем этот блок (примерно 806-я строка):

if (isset($this->request->post['isbn'])) {
$data['isbn'] = $this->request->post['isbn'];
} elseif (!empty($product_info)) {
$data['isbn'] = $product_info['isbn'];
} else {
$data['isbn'] = '';
}

и добавляем этот код:

if (isset($this->request->post['custom_desc'])) {
$data['custom_desc'] = $this->request->post['custom_desc'];
} elseif (!empty($product_info)) {
$data['custom_desc'] = $product_info['custom_desc'];
} else {
$data['custom_desc'] = '';
}


Теперь открываем admin/view/template/catalog/product_form.tpl и ищем следующий блок:

<div class="tab-pane" id="tab-data">

Здесь, Вам самим предстоит определиться куда вставить нужный Вам блок поскольку именно эта процедура отвечает за размещение поля в панели администратора. Для примера, я разместил после Date Available и перед Dimensions (L x W x H). Для этого нужно после этого блока:

<div class="form-group">
<label class="col-sm-2 control-label" for="input-date-available"><?php echo $entry_date_available; ?></label>
<div class="col-sm-3">
<div class="input-group date">
<input type="text" name="date_available" value="<?php echo $date_available; ?>" placeholder="<?php echo $entry_date_available; ?>" data-date-format="YYYY-MM-DD" id="input-date-available" class="form-control" />
<span class="input-group-btn">
<button class="btn btn-default" type="button"><i class="fa fa-calendar"></i></button>
</span></div>
</div>
</div>

Добавить этот:

<div class="form-group">
<label class="col-sm-2 control-label" for="input-custom_desc">
<span data-toggle="tooltip" title="<?php echo $help_custom_desc; ?>"><?php echo $entry_custom_desc; ?></span>
</label>
<div class="col-sm-10">
<input type="text" name="custom_desc" value="<?php echo $custom_desc; ?>" placeholder="<?php echo $entry_custom_desc; ?>" id="input-custom_desc" class="form-control" />
</div>
</div>


Финальный штрих, открываем admin/language/english/catalog/product.php и здесь в области // Entry добавляем:

$_['entry_custom_desc'] = 'Custom Description';

А в области // Help добавляем:

$_['help_custom_desc'] = 'This is Custom Description Field';

Аналогичным способом можно добавить ещё поля в админ-панель.

© Студия творчества "Зелёная Ива" 2008-2017 | Пользовательское соглашение