Bidang tambahan di kartu produk OpenCart

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:





Bidang tambahan di kartu produk OpenCart
Bidang tambahan di kartu produk OpenCart

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





Sumber








All Articles