Прочитать значение пользовательских параметров продукта в пользовательском скрипте Opencart 2.x - PullRequest
0 голосов
/ 22 апреля 2019

Можно ли прочитать значение переменной пользовательской опции, используя пару ключ-значение?

Я пытаюсь прочитать значение параметра для продукта в пользовательской функции. Я могу прочитать значение, ссылаясь на него с индексом массива, как показано ниже

$option = array_filter($this->request->post['option']); $product_serial_no = $option['93'] ;

Я получаю индекс магического массива $option[93], читая значение переменной в режиме отладки Neatbean.

enter image description here

Но индекс варианта меняется для разных продуктов, поэтому я хочу прочитать значение переменной 'Serial Number', используя что-то вроде ассоциативного массива. Возможно ли это?

Параметры на странице продукта выглядят как на картинке ниже.

enter image description here

1 Ответ

1 голос
/ 22 апреля 2019

когда вы просматриваете страницу продукта и говорите, что выбираете некоторые параметры и нажимаете «добавить в корзину», сообщение будет содержать этот массив

$ _ POST ['option'] = array (93 => '22222') (как вы представили в своем примере)

93 - это $product_option_id, и он позволяет вам получить всю необходимую информацию по этому запросу:

$product_id = $this->request->post['product_id'];
foreach ($this->request->post['option']) as $product_option_id => $value) {
    $option_query = $this->db->query("SELECT 
    po.product_option_id, 
    po.option_id, 
    od.name, 
    o.type 
    FROM " . DB_PREFIX . "product_option po 
    LEFT JOIN `" . DB_PREFIX . "option` o ON (po.option_id = o.option_id) 
    LEFT JOIN " . DB_PREFIX . "option_description od ON (o.option_id = od.option_id)
    WHERE po.product_option_id = '" . (int)$product_option_id . "' 
    AND po.product_id = '" . (int)$product_id . "' 
    AND od.language_id = '" . (int)$this->config->get('config_language_id') . "'");

    print_r($option_query->row);
}

Этой информации должно быть достаточно для любых манипуляций с опциями.

если опция имеет тип select или radio, вы можете также запросить возможные варианты, подобные этой

//... put this inside the foreach loop, listed above right after print_r($option_query->row);
if ($option_query->row['type'] == 'select' || $option_query->row['type'] == 'radio') {
    $option_value_query = $this->db->query("SELECT 
    pov.option_value_id, 
    ovd.name, 
    pov.quantity, 
    pov.subtract, 
    pov.price, 
    pov.price_prefix, 
    pov.points, 
    pov.points_prefix, 
    pov.weight, 
    pov.weight_prefix 
    FROM " . DB_PREFIX . "product_option_value pov 
    LEFT JOIN " . DB_PREFIX . "option_value ov ON (pov.option_value_id =     ov.option_value_id) 
    LEFT JOIN " . DB_PREFIX . "option_value_description ovd ON (ov.option_value_id = ovd.option_value_id) 
    WHERE pov.product_option_value_id = '" . (int)$value . "' 
    AND pov.product_option_id = '" . (int)$product_option_id . "' 
    AND ovd.language_id = '" . (int)$this->config->get('config_language_id') . "'");

    print_r($option_value_query->row);
}

И в случае, если у вас есть флажок (как в примере выше)

//...also place this in the loop foreach in the code above.
if ($option_query->row['type'] == 'checkbox' && is_array($value)){
    foreach ($value as $product_option_value_id) {
        $option_value_query = $this->db->query("SELECT 
        pov.option_value_id, 
        pov.quantity, 
        pov.subtract, 
        pov.price, 
        pov.price_prefix, 
        pov.points, 
        pov.points_prefix, 
        pov.weight, 
        pov.weight_prefix, 
        ovd.name 
        FROM " . DB_PREFIX . "product_option_value pov 
        LEFT JOIN " . DB_PREFIX . "option_value_description ovd ON (pov.option_value_id = ovd.option_value_id) 
        WHERE pov.product_option_value_id = '" . (int)$product_option_value_id . "' 
        AND pov.product_option_id = '" . (int)$product_option_id . "' 
        AND ovd.language_id = '" . (int)$this->config->get('config_language_id') . "'");

        print_r($option_value_query->row);
    }
}

Вы можете просмотреть этот точный код в system/library/cart/cart.php

надеюсь, это поможет.

...