Artikel oleh pengembang kami dari blog pribadinya.
Saat mengembangkan modul untuk OpenCart, menjadi perlu untuk membuat bidang arbitrer di kartu produk, yang seharusnya hanya terlihat di panel admin . Ini harus berupa bidang dengan nilai boolean "bertanda atau tidak". Jadi pada akhirnya:
Setelah menggali sebentar ke panel admin, saya menemukan bahwa di luar kotak OpenCart tidak mendukung bidang khusus, tetapi ada modul berbayar, misalnya, di sini . Jadi, Anda perlu membuat bidang khusus di OpenCart sendiri.
Pilihan untuk memecahkan masalah :
menggunakan bidang yang tidak terpakai (sku, upc, ean, jan, isbn, mpn) - hampir seketika , tetapi mungkin salah satu klien kami akan menggunakan bidang yang telah kami tempati.
mengganggu kode mesin adalah cepat dan sedikit kode , tetapi kemudian solusinya tidak portabel dan ketika mesin diperbarui, solusinya sendiri harus diperbarui, karena perubahan akan hilang ketika mesin diperbarui.
- , , OpenCart, ( ).
ProductMarkedField. :
.
OpenCart.
.
opencart , .
admin/controller/extension/module/productmarkedfield.php. "" ( /) admin/language/ru-ru/extension/module/productmarkedfield.php :
<?php $_['heading_title'] = ' ""';
install product:
$this->db->query("ALTER TABLE `".DB_PREFIX."product` ADD `marked` TINYINT UNSIGNED NOT NULL DEFAULT '0';");
ocStore 2.3.x , ocStore 3.0.2.0 MySQL 8, :
date_available:
$this->db->query("ALTER TABLE `".DB_PREFIX."product` CHANGE `date_available` `date_available` DATE NOT NULL;");
, ( ocStore 2.3.x):
$this->load->model('extension/event');
// " " - ( )
$this->model_extension_event->addEvent(
'productmarkedfield', //,
'admin/view/catalog/product_form/after', //
'extension/module/productmarkedfield/eventProductFormAfter' //
);
// " " -
$this->model_extension_event->addEvent(
'productmarkedfield',
'admin/model/catalog/product/editProduct/after',
'extension/module/productmarkedfield/eventProductEditAfter'
);
ocStore 3.0.x :
$this->load->model('setting/event');
model_extension_event model_setting_event .
admin/view/template/catalog/product_form.twig. 3 :
public function eventProductFormAfter( &$route, &$args, // &$output//html )
&$output, .
Simple HTML DOM, . system/library, (@ , ):
@$this->load->library('simple_html_dom');
id . ( , id $args ):
preg_match("/product_id=(\d+)/", $args["action"], $aMatch);
$idProdict = $aMatch[1];
( product product_description):
$this->load->model('catalog/product');
$aProduct = $this->model_catalog_product->getProduct($idProdict);
, - .
, , , id . :
$isMarked = false;
if(preg_match("/product_id=(\d+)/", $args["action"], $aMatch))
{
$idProduct = $aMatch[1];
$this->load->model('catalog/product');
$aProduct = $this->model_catalog_product->getProduct($idProduct);
$isMarked = $aProduct["marked"];
}
isMarked, false id , isMarked .
Simple HTML DOM "" , gui admin/view/template/catalog/product_form.twig ( ocStore 2.3.x tpl , Twig):
$html = str_get_html($output);
$html->find('div#tab-data', 0)->innertext =
'<div class="form-group">
<label class="col-sm-2 control-label"></label>
<div class="col-sm-10">
<label class="radio-inline">
<input type="radio" name="marked" value="1" '.($aProduct["marked"] ? 'checked="checked"' : "").'>
</label>
<label class="radio-inline">
<input type="radio" name="marked" value="0" '.(!$aProduct["marked"] ? 'checked="checked"' : "").'>
</label>
</div>
</div>' . $html->find('div#tab-data', 0)->innertext;
:
public function eventProductFormAfter(&$route, &$args, &$output)
{
@$this->load->library('simple_html_dom');
$isMarked = false;
if(preg_match("/product_id=(\d+)/", $args["action"], $aMatch))
{
$idProduct = $aMatch[1];
$this->load->model('catalog/product');
$aProduct = $this->model_catalog_product->getProduct($idProduct);
$isMarked = $aProduct["marked"];
}
$html = str_get_html($output);
$html->find('div#tab-data', 0)->innertext =
'<div class="form-group">
<label class="col-sm-2 control-label"></label>
<div class="col-sm-10">
<label class="radio-inline">
<input type="radio" name="marked" value="1" '.($isMarked ? 'checked="checked"' : "").'>
</label>
<label class="radio-inline">
<input type="radio" name="marked" value="0" '.(!$isMarked ? 'checked="checked"' : "").'>
</label>
</div>
</div>' . $html->find('div#tab-data', 0)->innertext;
$output = $html->outertext;
}
"", ( ) , catalog/product (ModelCatalogProduct::editProduct) , .
" ":
public function eventProductEditAfter(&$route, &$args)
{
// $args[0] id
$sSql = "UPDATE " . DB_PREFIX . "product SET marked = " . $this->db->escape($args[1]['marked']) . " WHERE product_id = '" . (int)$args[0] . "'";
$this->db->query($sSql);
}
marked product , . uninstall.
:
$this->db->query("ALTER TABLE `".DB_PREFIX."product` DROP `marked`");
( ocStore 2.3.x):
$this->load->model('extension/event');
$this->model_extension_event->deleteEvent('productmarkedfield');
(ocStore 3.0.x):
$this->load->model('setting/event');
$this->model_setting_event->deleteEventByCode('productmarkedfield');
Secara umum, ini tidak terlalu sulit, tetapi tampaknya agak aneh bahwa tata letak harus diubah dengan tangan, karena tidak ada alat bawaan yang nyaman untuk mengubah antarmuka.
Bagi mereka yang telah membaca sampai akhir - tautan ke arsip dengan kode sumber modul.
Penulis: Vitaly Buturlin