首页 > 解决方案 > 全球期权价格更新 Opencart

问题描述

我正在寻找一些关于如何在所有产品中制作/更新期权价格的建议?我在这里使用 opecart 3 是链接选项功能 http://docs.opencart.com/en-gb/catalog/option/

默认的 opencart 选项是在一个选项卡中创建的,而不是在每个产品中,您可以以很酷的价格添加此选项,但是当您需要更新当前选项的价格时,您需要逐一进行产品。我怎样才能做一些全球性的事情来更新选项价格并反映包含此选项的所有产品?

我尝试的是创建一个具有当前选项的主产品和自定义模块,以便在另一个产品中添加这个主产品选项,所以最后你可以只编辑主产品选项价格,这将反映所有其他的,但后来我面临一些问题

我在数据库中创建了另一个表,其中记录了您为当前产品添加的当前产品 ID、产品 ID 选项(这是主要产品 ID)和选项 ID

但在这里我面临问题

www.pastebin.com/d8wtpp75

例如当前 $product_id = 50 但应该拉的选项是 MAIN $product_id = 100

标签: phpdatabaseopencart

解决方案


以下是一些想到的解决方案

1.使用导出/导入到excel。

您可以使用将所有产品或过滤产品导出到 Excel 文件的模块,您可以在其中轻松更新值并重新上传。

导出/导入专业版

2.使用批量产品编辑器模块

使用基本上与仅通过管理界面进行导出/导入相同的模块。

批量产品编辑

3.使用主产品更新从产品

这是您在问题中写的选项。基本上创建一个主产品,更新时会更新其他产品。我为您制作了一个名为 ms_product_option 的模块(仅适用于 OC v3.x 的主从产品选项)

这是所需的步骤。

  1. 添加带有路径的控制器 admin/controller/extension/module/ms_product_option.php
<?php
class ControllerExtensionModuleMSProductOption extends Controller {
    private $error = array();
    private $codename = 'ms_product_option';

    public function index() {
        $this->load->language('extension/module/ms_product_option');

        $this->document->setTitle($this->language->get('heading_title'));

        $this->load->model('setting/setting');


        if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
            $this->model_setting_setting->editSetting('module_ms_product_option', $this->request->post);

            $this->session->data['success'] = $this->language->get('text_success');

            $this->load->model('setting/event');
            $this->model_setting_event->deleteEventByCode($this->codename);

            if($this->request->post['module_ms_product_option_status']){
                $this->model_setting_event->addEvent($this->codename, 'admin/model/catalog/product/editProduct/after', 'extension/module/ms_product_option/model_catalog_product_editProduct_after');
                $this->model_setting_event->addEvent($this->codename, 'admin/view/catalog/product_form/before', 'extension/module/ms_product_option/view_catalog_product_form_before');
            }

            $this->response->redirect($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=module', true));
        }

        if (isset($this->error['warning'])) {
            $data['error_warning'] = $this->error['warning'];
        } else {
            $data['error_warning'] = '';
        }

        $data['breadcrumbs'] = array();

        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_home'),
            'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true)
        );

        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_extension'),
            'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=module', true)
        );

        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('heading_title'),
            'href' => $this->url->link('extension/module/ms_product_option', 'user_token=' . $this->session->data['user_token'], true)
        );

        $data['action'] = $this->url->link('extension/module/ms_product_option', 'user_token=' . $this->session->data['user_token'], true);

        $data['cancel'] = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=module', true);

        if (isset($this->request->post['module_ms_product_option_status'])) {
            $data['module_ms_product_option_status'] = $this->request->post['module_ms_product_option_status'];
        } else {
            $data['module_ms_product_option_status'] = $this->config->get('module_ms_product_option_status');
        }

        $data['header'] = $this->load->controller('common/header');
        $data['column_left'] = $this->load->controller('common/column_left');
        $data['footer'] = $this->load->controller('common/footer');

        $this->response->setOutput($this->load->view('extension/module/ms_product_option', $data));
    }

    protected function validate() {
        if (!$this->user->hasPermission('modify', 'extension/module/ms_product_option')) {
            $this->error['warning'] = $this->language->get('error_permission');
        }

        return !$this->error;
    }

    public function install(){
        $this->load->model('extension/module/ms_product_option');
        $this->model_extension_module_ms_product_option->installDatabase();
    }

    public function uninstall(){
        $this->load->model('extension/module/ms_product_option');
        $this->model_extension_module_ms_product_option->deleteDatabase();

        $this->load->model('setting/event');
        $this->model_setting_event->deleteEventByCode($this->codename);
    }

    //OC event to trigger update of slave products
    public function model_catalog_product_editProduct_after(&$route, &$data, &$output){
        $this->load->model('extension/module/ms_product_option');
        //check if master product
        if($this->model_extension_module_ms_product_option->isProductMaster($data[0])){
            $master_product_id = $data[0];
            //trigger update of slaves

            $this->model_extension_module_ms_product_option->updateProductsOptionsFromProductMaster($master_product_id);
        }else{
            $product_id = $data[0];
            $this->model_extension_module_ms_product_option->deleteProductFromProductMaster($product_id);
            if(!empty($data[1]['master_product_id'])){
                $master_product_id = $data[1]['master_product_id'];

                $this->model_extension_module_ms_product_option->addProductToProductMaster($product_id, $master_product_id);
            }
        }


    }
    public function view_catalog_product_form_before(&$route, &$data){
        if($data && isset($this->request->get['product_id'])){
            $product_id = $this->request->get['product_id'];
            $this->load->model('extension/module/ms_product_option');

            $product_info = $this->model_extension_module_ms_product_option->getMasterProductOfProduct($product_id);

            if($product_info){
                $data['master_product_id'] = $product_info['master_product_id'];
            }
        }
    }

}


  1. 添加带路径的模型admin/model/extension/module/ms_product_option.php
<?php
class ModelExtensionModuleMSProductOption extends Model {

    public function installDatabase() {
        $this->db->query("CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "ms_product_option` (
          `product_id` int(11) NOT NULL,
          `master_product_id` int(11) NOT NULL,
          PRIMARY KEY (`product_id`)
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;");
    }

    public function deleteDatabase() {
        $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "ms_product_option`");

    }

    public function isProductMaster($master_product_id) {
        $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "ms_product_option` WHERE master_product_id = '" . (int)$master_product_id . "'");
        if($query->rows){
            return true;
        }else{
            return false;
        }
    }

    public function addProductToProductMaster($product_id, $master_product_id) {
        $this->db->query("INSERT INTO `" . DB_PREFIX . "ms_product_option` SET product_id = '" . (int)$product_id . "', master_product_id = '" . (int)$master_product_id . "'");
    }

    public function deleteProductFromProductMaster($product_id) {
        $this->db->query("DELETE FROM " . DB_PREFIX . "ms_product_option WHERE product_id = '" . (int)$product_id . "'");
    }

    public function getProductsOfProductMaster($master_product_id) {
        $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "ms_product_option` msp2p LEFT JOIN " . DB_PREFIX . "product_description pd ON (msp2p.product_id = pd.product_id) WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND msp2p.master_product_id = '".(int) $master_product_id. "'");
        return $query->rows;
    }

    public function getMasterProductOfProduct($product_id) {
        $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "ms_product_option` WHERE product_id = '".(int) $product_id. "'");
        return $query->row;
    }

    public function updateProductsOptionsFromProductMaster($master_product_id) {
        //get product master options
        $this->load->model('catalog/product');
        $data['product_option'] = $this->model_catalog_product->getProductOptions($master_product_id);

        //get list of products connected to product master
        $products = $this->getProductsOfProductMaster($master_product_id);

        //update options
        foreach($products as $product){
            $product_id = $product['product_id'];
            if (isset($data['product_option'])) {
                foreach ($data['product_option'] as $product_option) {
                    if ($product_option['type'] == 'select' || $product_option['type'] == 'radio' || $product_option['type'] == 'checkbox' || $product_option['type'] == 'image') {
                        if (isset($product_option['product_option_value'])) {
                            $this->db->query("INSERT INTO " . DB_PREFIX . "product_option SET product_id = '" . (int)$product_id . "', option_id = '" . (int)$product_option['option_id'] . "', required = '" . (int)$product_option['required'] . "'");

                            $product_option_id = $this->db->getLastId();

                            foreach ($product_option['product_option_value'] as $product_option_value) {
                                $this->db->query("INSERT INTO " . DB_PREFIX . "product_option_value SET product_option_id = '" . (int)$product_option_id . "', product_id = '" . (int)$product_id . "', option_id = '" . (int)$product_option['option_id'] . "', option_value_id = '" . (int)$product_option_value['option_value_id'] . "', quantity = '" . (int)$product_option_value['quantity'] . "', subtract = '" . (int)$product_option_value['subtract'] . "', price = '" . (float)$product_option_value['price'] . "', price_prefix = '" . $this->db->escape($product_option_value['price_prefix']) . "', points = '" . (int)$product_option_value['points'] . "', points_prefix = '" . $this->db->escape($product_option_value['points_prefix']) . "', weight = '" . (float)$product_option_value['weight'] . "', weight_prefix = '" . $this->db->escape($product_option_value['weight_prefix']) . "'");
                            }
                        }
                    } else {
                        $this->db->query("INSERT INTO " . DB_PREFIX . "product_option SET product_id = '" . (int)$product_id . "', option_id = '" . (int)$product_option['option_id'] . "', value = '" . $this->db->escape($product_option['value']) . "', required = '" . (int)$product_option['required'] . "'");
                    }
                }
            }
        }
    }
}
  1. 添加带有路径的语言文件admin/language/en-gb/extension/module/ms_product_option.php
<?php
// Heading
$_['heading_title']    = '<span style="color:#449DD0; font-weight:bold">MS Product Option</span><span style="font-size:12px; color:#999"> by <a href="http://www.opencart.com/index.php?route=extension/extension&filter_username=Dreamvention" style="font-size:1em; color:#999" target="_blank">Dreamvention</a></span>';

// Text
$_['text_extension']   = 'Extensions';
$_['text_success']     = 'Success: You have modified MS Product Option module!';
$_['text_edit']        = 'Edit MS Product Option Module';

// Entry
$_['entry_status']     = 'Status';

// Error
$_['error_permission'] = 'Warning: You do not have permission to modify MS Product Option module!';
  1. 添加带有路径的树枝文件admin/view/template/extension/module/ms_product_option.twig
{{ header }}{{ column_left }}
<div id="content">
  <div class="page-header">
    <div class="container-fluid">
      <div class="pull-right">
        <button type="submit" form="form-module" data-toggle="tooltip" title="{{ button_save }}" class="btn btn-primary"><i class="fa fa-save"></i></button>
        <a href="{{ cancel }}" data-toggle="tooltip" title="{{ button_cancel }}" class="btn btn-default"><i class="fa fa-reply"></i></a></div>
      <h1>{{ heading_title }}</h1>
      <ul class="breadcrumb">
        {% for breadcrumb in breadcrumbs %}
        <li><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
        {% endfor %}
      </ul>
    </div>
  </div>
  <div class="container-fluid">
    {% if error_warning %}
    <div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> {{ error_warning }}
      <button type="button" class="close" data-dismiss="alert">&times;</button>
    </div>
    {% endif %}
    <div class="panel panel-default">
      <div class="panel-heading">
        <h3 class="panel-title"><i class="fa fa-pencil"></i> {{ text_edit }}</h3>
      </div>
      <div class="panel-body">
        <form action="{{ action }}" method="post" enctype="multipart/form-data" id="form-module" class="form-horizontal">
          <div class="form-group">
            <label class="col-sm-2 control-label" for="input-status">{{ entry_status }}</label>
            <div class="col-sm-10">
              <select name="module_ms_product_option_status" id="input-status" class="form-control">
                {% if module_ms_product_option_status %}
                <option value="1" selected="selected">{{ text_enabled }}</option>
                <option value="0">{{ text_disabled }}</option>
                {% else %}
                <option value="1">{{ text_enabled }}</option>
                <option value="0" selected="selected">{{ text_disabled }}</option>
                {% endif %}
              </select>
            </div>
          </div>
        </form>
      </div>
    </div>
  </div>
</div>
{{ footer }}
  1. 添加带有路径的ocmod文件system/ms_product_option.ocmod.xml
<?xml version="1.0" encoding="utf-8"?>
<modification>
    <name>ms_product_option</name>
    <code>ms_product_option</code>
    <description>MS Product Option</description>
    <version>1.0.0</version>
    <author>Dreamvention</author>
    <link>http://dreamvention.ee</link>
    <file path="admin/view/template/catalog/product_form.twig">
        <operation error="skip">
            <search><![CDATA[<div class="tab-pane" id="tab-option">]]></search>
            <add position="after"><![CDATA[
            <!-- //ms_product_option.xml 1 -->
            <div class="form-group">
                <label class="col-sm-2 control-label" for="input-model">Master Product</label>
                <div class="col-sm-10">
                  <input type="text" name="master_product_id" value="{{ master_product_id }}" placeholder="master product id" id="input-model" class="form-control" />
                  </div>
              </div>
            ]]></add>
        </operation>
    </file>
</modification>
  1. system/library/d_shopunity/extension/ms_product_option.json(可选)如果您使用的是https://shopunity.net ,请添加带有路径的 shopunity json 文件
{
    "codename": "ms_product_option",
    "version": "1.0.0",
    "name": "MS Product Option",
    "description": "Create Master products and connect slave products. When updating options in saster product, you will automatically update slave products.",
    "index": "extension/d_shopunity",
    "author": {
        "name": "Dreamvention",
        "email": "info@dreamvention.com",
        "url": "https://dreamvention.ee/"
    },
    "opencart_version": [
        "3.0.0.0",
        "3.0.1.1",
        "3.0.1.2",
        "3.0.2.0"
    ],
    "type": "module",
    "license": {
        "type": "free",
        "url": "https://shopunity.net/licenses/free"
    },
    "install": {
        "url": "extension/module/install&extension=ms_product_option",
        "xml": "system/library/d_shopunity/install/ms_product_option.xml"
    },
    "uninstall": {
        "url": "extension/module/uninstall&extension=ms_product_option"
    },
    "support": {
        "email": "support@dreamvention.com",
        "url": "https://dreamvention.ee/support"
    },
    "required":{
        "d_opencart_patch": ">=1.0.0"
    },
    "files": [
        "system/library/d_shopunity/extension/ms_product_option.json",

        "admin/controller/extension/module/ms_product_option.php",
        "admin/model/extension/module/ms_product_option.php",
        "admin/language/en-gb/extension/module/ms_product_option.php",
        "admin/view/template/extension/module/ms_product_option.twig",

        "system/library/d_shopunity/install/ms_product_option.xml"
    ],
    "changelog": [
        {
            "version":"1.0.0",
            "change": "Initial commit"
        }
    ]
}

我还将打包到标准 opencart 模块中的文件上传,因此您可以通过 OpenCart 扩展安装程序安装它

https://github.com/Dreamvention/youtube_files/tree/master/ms_product_option


推荐阅读