Октябрь CMS - метод переопределения модели

Я работаю над плагином, который делает расширение для магазина идей. Моя проблема в том, что я добавил несколько новых полей в модель продукта в своем плагине расширения, но эти поля не работают с такими операциями, как обновление или создание какого-либо нового продукта, поскольку структура такова, что данные из контроллера продуктов отправляются в Ideas\Shop\ Фасады \ Метод продукта saveProductData(), а затем они сохраняются в разделе Идеи \ Магазин \ Модели \ Продукты. Мой вопрос, как я могу переопределить saveProductData() в моем расширении плагина.

namespace Ideas\Shop\Controllers;
//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 Ideas\Shop\Facades;
//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 Ideas\Shop\Models;    
class Products extends Model
    {
      ...
    }

1 ответ

Хм, вы не можете переопределить его метод, но вы можете слушать его before save событие, а затем назначить дополнительные поля, которые вы добавили

\Ideas\Shop\Models\Products::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

если есть сомнения, пожалуйста, прокомментируйте.

Другие вопросы по тегам