Наверх

Программное создание и заполнение опций товара miniShop2

<?php
$resources = array($modx->getObject('modResource', $id));

$miniShop2 = $modx->getService('miniShop2');
require_once MODX_CORE_PATH . 'components/simplehtmldom/simple_html_dom.php';
foreach ($resources as $res) {
    $content = $res->get('content');
    $props = $res->getProperties();
    if (!isset($props['original_content']) || !$props['original_content']) {
        $props['original_content'] = $content;
        $res->setProperties($props);
        $res->save();
    }
    $html = str_get_html($content);
    $characters = $html->find('.character');
    $content = $html->find('.content', 0)->innertext;
    foreach ($characters as $char) {
        $name = $char->find('span', 0)->innertext;
        $val = $char->find('span', 1)->innertext;
        print '<b>'.$name . ' - ' . $val . '</b>' . PHP_EOL;
        if (!$option = $modx->getObject('msOption', array('caption' => $name))) {
            print 'Option not found' . PHP_EOL;
            $key = $res->cleanAlias($name);
            if ($found = $modx->getObject('msOption', array('key' => $key))) {
                print 'Option key exists' . PHP_EOL;
                $key = $key . '_2';
            }
            $option = $modx->newObject('msOption');
            $option->fromArray(array('key' => $key, 'caption' => $name, 'type' => 'textfield'));
            $option->save();
            print 'Option '.$key.' created' . PHP_EOL;
        } else {
            print 'Option found' . PHP_EOL;
        }
        if (!$cop = $modx->getObject('msCategoryOption', array('option_id' => $option->id, 'category_id' => $res->parent))) {
            print 'Category option not found' . PHP_EOL;
            $table = $modx->getTableName('msCategoryOption');
            $sql = "INSERT INTO {$table} (`option_id`,`category_id`,`active`) VALUES ({$option->id}, {$res->parent}, 1);";
            $stmt = $this->modx->prepare($sql);
            $stmt->execute();
            print 'Category option created' . PHP_EOL;
        } else {
            print 'Category option found' . PHP_EOL;
            $q = $modx->newQuery('msCategoryOption');
            $q->command('UPDATE');
            $q->where(array('option_id' => $option->id, 'category_id' => $res->parent));
            $q->set(array('active' => 1));
            $q->prepare();
            $q->stmt->execute();
            print 'Category option updated' . PHP_EOL;
        }
        
        if ($po = $modx->getObject('msProductOption', array('product_id' => $res->id, 'key' => $option->key))) {
            print 'Value found' . PHP_EOL;
            $q = $modx->newQuery('msProductOption');
            $q->command('UPDATE');
            $q->where(array('key' => $option->key));
            $q->set(array('value' => $val));
            $q->prepare();
            $q->stmt->execute();
            print 'Value updated' . PHP_EOL;
        } else {
            print 'Value not found' . PHP_EOL;
            $table = $modx->getTableName('msProductOption');
            if (!is_int($val)) {
                $val = '"' . $val . '"';
            }
            $sql = "INSERT INTO {$table} (`product_id`,`key`,`value`) VALUES ({$res->id}, \"{$option->key}\", {$val});";
            $stmt = $this->modx->prepare($sql);
            $stmt->execute();
            print 'Value created' . PHP_EOL;
        }
    }
}


7 комментариев

  1. Сергей 20 апреля 2018, 15:53 # 0
    Илья, привет. А можешь выложить еще этот файлик simple_html_dom.php?
    1. Илья Уткин 23 апреля 2018, 07:44 # 0
      Так это бесплатная утилита: sourceforge.net/projects/simplehtmldom/files/
    2. Евгений 06 февраля 2020, 00:38 # 0
      А как быть с опциями size и color, в таблицу добавляет, а что с обновлением полей size и color в таблицы товара?
      1. Михаил Дега 02 марта 2021, 17:16(Комментарий был изменён) # 0
        А как записать (поменять) отдельную дополнительную опцию у отдельного продукта?
        Типо как то так:
        $po = $modx->getObject('msProductOption', array('product_id' => 1, 'key' => 'pak'));
        $po->set(array('value' => 'Без упаковки'));
        $po->save();

        1. Михаил Дега 02 марта 2021, 18:50 # 0
          Аа всё додумался)))
          Вот работает так:
          $q = $modx->newQuery('msProductOption');
          $q->command('UPDATE');
          $q->where(array('product_id' => 28, 'key' => 'anatom'));
          $q->set(array('value' => 'Да'));
          $q->prepare();
          $q->stmt->execute();
          1. Илья Уткин 02 марта 2021, 21:27 # 0
            Да, проблема с опциями в том, что они являются наследниками xPDOObject, а не xPDOSimpleObject. У них нет поля id, поэтому методы set и save «не работают».
            1. Sanch0ss 27 июня 2023, 14:17 # 0
              Уфф спасибо, намучался с опциями своими)))

            Авторизация

            через сервис Loginza:


            Шаблоны MODX

            1 2 Дальше »

            Объектная
            модель
            MODX