Un art铆culo de nuestro desarrollador de su blog personal.
Al desarrollar un m贸dulo para OpenCart, se hizo necesario crear un campo arbitrario en la tarjeta del producto, que deber铆a ser visible solo en el panel de administraci贸n . Debe ser un campo con el valor booleano "marcado o no". As铆 que al final:
Despu茅s de cavar brevemente en el panel de administraci贸n, descubr铆 que fuera de la caja OpenCart hace campos personalizados no de apoyo, pero hay m贸dulos pagado, por ejemplo, aqu铆 . Por lo tanto, debe crear un campo personalizado en OpenCart usted mismo.
Opciones para resolver el problema :
use campos no utilizados (sku, upc, ean, jan, isbn, mpn) - casi instant谩neamente , pero tal vez uno de nuestros clientes use el campo que hemos ocupado.
interferir con el c贸digo del motor es r谩pido y poco c贸digo , pero luego la soluci贸n no es port谩til y cuando se actualiza el motor, la soluci贸n en s铆 tendr谩 que actualizarse, ya que los cambios se perder谩n cuando se actualice el motor.
- , , 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 general, no es tan dif铆cil, pero parece un poco extra帽o que el dise帽o deba cambiarse a mano, ya que no hay una herramienta incorporada conveniente para cambiar la interfaz.
Para aquellos que han le铆do hasta el final, un enlace al archivo con el c贸digo fuente del m贸dulo.
Autor: Vitaly Buturlin