Campo adicional no cartão de produto OpenCart

Um artigo de nosso desenvolvedor de seu blog pessoal.





Durante o desenvolvimento de um módulo para OpenCart, tornou-se necessário fazer um campo arbitrário no cartão do produto, que deveria ficar visível  apenas no painel de administração . Deve ser um campo com o  valor booleano  "marcado ou não". Então, no final:





Campo adicional no cartão de produto OpenCart
Campo adicional no cartão de produto OpenCart

Após pesquisar rapidamente no painel de administração, descobri que  o  OpenCart pronto para uso não oferece suporte a campos personalizados, mas existem módulos pagos, por exemplo, aqui . Portanto, você mesmo precisa fazer um campo personalizado no OpenCart. 





Opções para resolver o problema :





  • use campos não utilizados  (sku, upc, ean, jan, isbn, mpn) -  quase que instantaneamente , mas talvez um de nossos clientes use o campo que ocupamos.





  • interferir no código do motor  é  rápido e pouco código , mas aí a solução não é portável e quando o motor for atualizado, a própria solução terá que ser atualizada, pois as alterações serão perdidas quando o motor for atualizado.





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



Em geral, não é tão difícil, mas parece um pouco estranho que o layout deva ser alterado à mão, já que não há uma ferramenta interna conveniente para alterar a interface.





Para quem leu até o fim - um  link  para o arquivo com o código-fonte do módulo.









Autor: Vitaly Buturlin





Uma fonte








All Articles