製品カードOpenCartの追加フィールド

彼の個人的なブログからの私たちの開発者による記事。





OpenCartのモジュールを開発しているときに、製品カードに任意のフィールドを作成する必要がありました。このフィールド は、管理パネルにのみ表示されます。これは、ブール値が 「マークされているかどうか」のフィールドである必要があります だから最後に:





製品カードOpenCartの追加フィールド
製品カードOpenCartの追加フィールド

管理パネルを簡単に 調べたところ OpenCartはカスタムフィールドをサポートしていないことがわかりましたが 、たとえば、ここに有料モジュールがありますしたがって、OpenCartでカスタムフィールドを自分で作成する必要があります。 





問題を解決するためのオプション





  • 未使用のフィールド (sku、upc、ean、jan、isbn、mpn)を使用しますほぼ瞬時に、しかしおそらく私たちのクライアントの1人が私たちが占有したフィールドを使用するでしょう。





  • エンジンコードへの干渉 は高速でコードが 少ないですが、ソリューションは移植性がなく、エンジンが更新されるとソリューション自体を更新する必要があります。これは、エンジンが更新されると変更が失われるためです。





  •  - , , 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');
      
      



一般的にはそれほど難しいことではありませんが、インターフェースを変更するための便利な組み込みツールがないため、手動でレイアウトを変更する必要があるのは少し奇妙に思えます。





最後まで読んだ人のために-  モジュールのソースコードを含むアーカイブへのリンク









著者:Vitaly Buturlin





ソース








All Articles