10 月 CMS - 覆盖模型方法



我正在开发为创意商店提供扩展的插件。我的问题是我已经在我的扩展插件中的产品模型中添加了一些新字段,但这些字段不适用于更新或创建一些新产品等操作,因为结构是来自产品控制器的数据发送到想法\商店\外观\产品方法 saveProductData((,然后它们保存在想法\商店\模型\产品模型中。我的问题是如何在我的插件扩展中覆盖 saveProductData((。

namespace IdeasShopControllers;
//class Products extends IdeasShopController
/**
* Override create_onSave()
*/
public function create_onSave()
{
$post = post();
$rs = ProductFacades::saveProduct($post);
if ($rs['rs'] != IdeasShop::SUCCESS) {
Flash::error($rs['msg'][0]);//save flash in next refresh
} else {
$url = $this->handleSaveResult($rs, $post, 'create');
return redirect($url);
}
}
/**
* Override update_onSave()
*/
public function update_onSave()
{
$post = post();
$rs = ProductFacades::saveProduct($post);
if ($rs['rs'] != IdeasShop::SUCCESS) {
Flash::error($rs['msg'][0]);//save flash in next refresh
} else {
$url = $this->handleSaveResult($rs, $post, 'update');
return redirect($url);
}
}

在这个模型中,是我想在我的插件扩展中覆盖的方法......

namespace IdeasShopFacades;
//class Product extends Model
public static function saveProductData($post)
{
$id = $post['id'];
$model = new Products();
if ($id != 0) {//create
$model = Products::find($id);
}
$product = $post['Products'];
$model->name = $product['name'];
$model->slug = $product['slug'];
$model->sku = $product['sku'];
$model->price = $product['price'];
$model->price_promotion = $product['price_promotion'];
$model->qty = $product['qty'];
if ($id == 0) {
$model->qty_order = 0;
}
$model->featured_image = $product['featured_image'];
$model->product_order = $product['product_order'];
if ($id == 0) {//create
$model->product_type = $product['product_type'];
$model->attribute_group_id = $product['attribute_group_id'];
}
$model->tax_class_id = $product['tax_class_id'];
$model->weight = $product['weight'];
$model->weight_id = $product['weight_id'];
$model->status = $product['status'];
$model->is_virtual_product = $product['is_virtual_product'];
$model->save();
return $model;
}

这是用于将数据从产品保存到数据库的模型

namespace IdeasShopModels;    
class Products extends Model
{
...
}

嗯,你不能覆盖它的方法,但你可以侦听它before save事件,然后分配你添加的额外字段

IdeasShopModelsProducts::extend(function($model) {
$model->bindEvent('model.beforeSave', function() use ($model) {
// you can receive data from post() may be and assign
$model->my_new_field = 'some data';
});
});

它将在保存之前设置字段数据,因此当保存模型时,它将将该数据保存到数据库中。

如果你需要扩展更多的东西,你可以使用这个参考: https://octobercms.com/docs/database/model#extending-models

如有任何疑问,请发表评论。

最新更新