彼の個人的なブログからの私たちの開発者による記事。
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