Champ supplémentaire dans la fiche produit OpenCart

Un article de notre développeur issu de son blog personnel.





Lors du développement d'un module pour OpenCart, il est devenu nécessaire de créer un champ arbitraire dans la fiche produit, qui ne devrait être visible  que dans le panneau d'administration . Ce doit être un champ avec la  valeur booléenne  "marqué ou non". Donc à la fin:





Champ supplémentaire dans la fiche produit OpenCart
Champ supplémentaire dans la fiche produit OpenCart

Après avoir brièvement fouillé dans le panneau d'administration, j'ai découvert que,  hors de la boîte,  OpenCart ne prend pas en charge les champs personnalisés, mais il existe des modules payants, par exemple ici . Vous devez donc créer vous-même un champ personnalisé dans OpenCart. 





Options pour résoudre le problème :





  • utiliser des champs inutilisés  (sku, upc, ean, jan, isbn, mpn) -  presque instantanément , mais peut-être qu'un de nos clients utilisera le champ que nous avons occupé.





  • interférer avec le code du moteur  est  rapide et peu de code , mais alors la solution n'est pas portable et lorsque le moteur est mis à jour, la solution elle-même devra être mise à jour, car les modifications seront perdues lors de la mise à jour du moteur.





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



En général, ce n'est pas si difficile, mais il semble un peu étrange que la mise en page doive être modifiée à la main, car il n'y a pas d'outil intégré pratique pour changer l'interface.





Pour ceux qui ont lu jusqu'à la fin - un  lien  vers l'archive avec le code source du module.









Auteur: Vitaly Buturlin





Une source








All Articles