مقال من قبل مطورنا من مدونته الشخصية.
أثناء تطوير وحدة نمطية لـ OpenCart ، أصبح من الضروري إنشاء حقل عشوائي في بطاقة المنتج ، والذي يجب أن يكون مرئيًا فقط في لوحة الإدارة . يجب أن يكون هذا الحقل بالقيمة المنطقية "تم تمييزها أم لا". لذلك في النهاية:
بعد البحث لفترة وجيزة في لوحة الإدارة ، اكتشفت أن OpenCart خارج الصندوق لا يدعم الحقول المخصصة ، ولكن هناك وحدات مدفوعة ، على سبيل المثال ، هنا . لذلك تحتاج إلى إنشاء حقل مخصص في OpenCart بنفسك.
خيارات حل المشكلة :
استخدم الحقول غير المستخدمة (sku ، upc ، ean ، jan ، isbn ، mpn) - على الفور تقريبًا ، ولكن ربما يستخدم أحد عملائنا المجال الذي شغلناه .
التدخل مع رمز المحرك هو رمز سريعة وصغيرة ، ولكن بعد ذلك الحل ليس محمول وعند تحديث المحرك، فإن الحل في حد ذاته يجب أن يتم تحديثه، حيث سيتم فقد التغييرات عند تحديث المحرك.
- , , 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');
بشكل عام ، ليس من الصعب جدًا ، ولكن يبدو من الغريب أن يتم تغيير التخطيط يدويًا ، نظرًا لعدم وجود أداة مضمنة ملائمة لتغيير الواجهة.
بالنسبة لأولئك الذين قرأوا حتى النهاية - رابط للأرشيف مع الكود المصدري للوحدة.
المؤلف: فيتالي بوتورلين