Перенос заказов shopkeeper в shopkeeper3

Всем привет.

Может кому-то пригодится. Переносил заказы из shopkeeper в shopkeeper3, использовано на основе сниппета shk_fihook, через консоль. Предварительно сделав бекап таблицы в виде PHP файла.

Пример:
<?php

$modx_shopkeeper_orders = [
    [
        "id" => "1",
        "combined_object" =>
            '{"id": 1, "date": "2013-05-08 14:04:10.000000", "note": "", "addit": "a:2:{i:0;a:0:{}i:1;a:0:{}}", "email": "andchir@hotmail.ru", "phone": "555-555", "price": 600, "status": "0", "userid": 0, "allowed": "all", "content": "a:2:{i:0;a:8:{s:12:\\"catalogClass\\";s:11:\\"modResource\\";s:5:\\"count\\";d:1;s:2:\\"id\\";i:37;s:4:\\"link\\";s:56:\\"http://gkz2.ru/catalog/slonovaya-kost/evro-/-0,7-nf.html\\";s:4:\\"name\\";s:19:\\"Евро / 0,7 НФ\\";s:5:\\"price\\";d:0;s:2:\\"tv\\";a:0:{}s:6:\\"tv_add\\";a:2:{s:16:\\"parent.pagetitle\\";s:27:\\"Слоновая кость\\";s:9:\\"parent.id\\";i:22;}}i:1;a:8:{s:12:\\"catalogClass\\";s:11:\\"modResource\\";s:5:\\"count\\";d:1;s:2:\\"id\\";i:36;s:4:\\"link\\";s:55:\\"http://gkz2.ru/catalog/slonovaya-kost/ik-2-/-0,5nf.html\\";s:4:\\"name\\";s:16:\\"ИК-2 / 0,5НФ\\";s:5:\\"price\\";d:600;s:2:\\"tv\\";a:0:{}s:6:\\"tv_add\\";a:2:{s:16:\\"parent.pagetitle\\";s:27:\\"Слоновая кость\\";s:9:\\"parent.id\\";i:22;}}}", "payment": "", "contacts": "a:11:{s:5:\\"order\\";s:1:\\"1\\";s:7:\\"address\\";s:51:\\"г. Такой-то, ул. Такая-то, 10 - 20\\";s:6:\\"export\\";s:6:\\"нет\\";s:7:\\"company\\";s:23:\\"Моя компания\\";s:8:\\"fullname\\";s:48:\\"Фамилиев Имён Отчествович\\";s:5:\\"phone\\";s:7:\\"555-555\\";s:5:\\"email\\";s:18:\\"andchir@hotmail.ru\\";s:8:\\"question\\";s:17:\\"из газеты\\";s:7:\\"message\\";s:53:\\"Жду звонка для подтверждения\\";s:13:\\"submit_button\\";s:18:\\"Отправить\\";s:6:\\"nospam\\";s:0:\\"\\";}", "currency": "руб.", "delivery": "", "sentdate": "0000-00-00 00:00:00.000000", "tracking_num": ""}',
    ],
];


Сам сниппет для выполнения в консоли:

<?php

include $_SERVER["DOCUMENT_ROOT"] . "/text.php";
$data = [];

if (!defined("SHOPKEEPER_PATH")) {
    define("SHOPKEEPER_PATH", MODX_CORE_PATH . "components/shopkeeper3/");
}

//Определяем параметры сниппета Shopkeeper
$sys_property_sets = $modx->getOption(
    "shk3.property_sets",
    $modx->config,
    "default"
);
$sys_property_sets = explode(",", $sys_property_sets);
$propertySetName = trim(current($sys_property_sets));

$snippet = $modx->getObject("modSnippet", ["name" => "Shopkeeper3"]);
$properties = $snippet->getProperties();
if (
    $propertySetName != "default" &&
    $modx->getCount("modPropertySet", ["name" => $propertySetName]) > 0
) {
    $propSet = $modx->getObject("modPropertySet", ["name" => $propertySetName]);
    $propSetProperties = $propSet->getProperties();
    if (is_array($propSetProperties)) {
        $properties = array_merge($properties, $propSetProperties);
    }
}

$lang = $modx->getOption("lang", $properties, "ru");
$modx->getService("lexicon", "modLexicon");
$modx->lexicon->load($lang . ":shopkeeper3:default");

require_once SHOPKEEPER_PATH . "model/shopkeeper.class.php";

foreach ($modx_shopkeeper_orders as $index => $item) {
    $shopCart = new Shopkeeper($modx, $properties);
    $dataFromDatabase = json_decode($item["combined_object"]);
    $modx->addPackage("shopkeeper3", SHOPKEEPER_PATH . "model/");

    //shopkeeper settings
    $contacts_fields = [];
    $response = $modx->runProcessor(
        "getsettings",
        ["settings" => ["contacts_fields"]],
        [
            "processors_path" =>
                $modx->getOption("core_path") .
                "components/shopkeeper3/processors/mgr/",
        ]
    );
    if ($response->isError()) {
        echo $response->getMessage();
    }
    if ($result = $response->getResponse()) {
        $temp_arr = !empty($result["object"]["contacts_fields"])
            ? $result["object"]["contacts_fields"]
            : [];
        if (!empty($temp_arr)) {
            foreach ($temp_arr as $opt) {
                $contacts_fields[$opt["name"]] = $opt;
            }
        }
    }

    $userId = $dataFromDatabase->userid;

    //Контактные данные
    $contacts = [];
    $allFormFields = unserialize($dataFromDatabase->contacts);
    foreach ($allFormFields as $key => $val) {
        if (in_array($key, array_keys($contacts_fields))) {
            $temp_arr = [
                "name" => $contacts_fields[$key]["name"],
                "value" => $val,
                "label" => $contacts_fields[$key]["label"],
            ];

            array_push($contacts, $temp_arr);
        }
    }

    $contacts = json_encode($contacts);

    $emailField = $modx->getOption("fiarToField", $hook->config, "email");
    $phoneField = $modx->getOption("phoneField", $hook->config, "phone");
    $deliveryField = $modx->getOption(
        "deliveryField",
        $hook->config,
        "shk_delivery"
    );
    $paymentField = $modx->getOption("paymentField", $hook->config, "payment");

    $delivery_price = !empty($shopCart->delivery["price"])
        ? $shopCart->delivery["price"]
        : 0;
    $delivery_name = !empty($shopCart->delivery["label"])
        ? $shopCart->delivery["label"]
        : "";

    if (!$delivery_name) {
        $delivery_name = !empty($allFormFields[$deliveryField])
            ? $allFormFields[$deliveryField]
            : "";
    }

    //Сохраняем данные заказа
    $order = $modx->newObject("shk_order");
    $insert_data = [
        "contacts" => $contacts,
        "options" => "",
        "price" => $dataFromDatabase->price,
        "currency" => $dataFromDatabase->currency,
        "date" => $dataFromDatabase->date,
        "sentdate" => $dataFromDatabase->sentdate,
        "note" => $dataFromDatabase->note,
        "email" => isset($allFormFields[$emailField])
            ? $allFormFields[$emailField]
            : "",
        "delivery" => unserialize($dataFromDatabase->contacts)["shk_delivery"],
        "delivery_price" => $delivery_price,
        "payment" => isset($allFormFields[$paymentField])
            ? $allFormFields[$paymentField]
            : "",
        "tracking_num" => $dataFromDatabase->tracking_num,
        "phone" => isset($allFormFields[$phoneField])
            ? $allFormFields[$phoneField]
            : "",
        "status" => $modx->getOption("shk3.first_status", null, "1"),
    ];
    $insert_data["userid"] = $dataFromDatabase->userid;
    $order->fromArray($insert_data);

    $saved = $order->save();

    $purchasesData = $shopCart->getProductsData(true);

    $shopData = unserialize($dataFromDatabase->content);

    foreach ($shopData as $key => $p_data) {
        $options = !empty($p_data["options"])
            ? json_encode($p_data["options"])
            : "";
        $fields_data = !empty($purchasesData[$key]) ? $purchasesData[$key] : [];
        $fields_data["url"] = !empty($p_data["link"]) ? $p_data["link"] : "";
        unset($fields_data["id"]);
        $fields_data_str = json_encode($fields_data);

        $insert_data = [
            "p_id" => $p_data["id"],
            "order_id" => $order->id,
            "name" => $p_data["name"],
            "price" => $p_data["price"],
            "count" => $p_data["count"],
            "class_name" => $p_data["className"],
            "package_name" => $p_data["packageName"],
            "data" => $fields_data_str,
            "options" => $options,
        ];

        $purchase = $modx->newObject("shk_purchases");
        $purchase->fromArray($insert_data);

        $purchase->save();
    }

    $shopCart->setOrderDataSession($order->toArray());

    $modx->invokeEvent("OnSHKChangeStatus", [
        "order_ids" => [$order->id],
        "status" => $order->status,
    ]);

    $orderOutputData = $shopCart->getOrderData($order->id);

    //OnSHKsaveOrder
    $evtOut = $modx->invokeEvent("OnSHKsaveOrder", [
        "order_id" => $order->get("id"),
    ]);
    if (is_array($evtOut)) {
        $orderOutputData .= implode("", $evtOut);
    }
}

Может быть, кому-то пригодится легко расширяемый и можно добавлять ваши поля.
Alexander
25 февраля 2024, 13:39
modx.pro
405
0

Комментарии: 4

Артур Шевченко
25 февраля 2024, 21:35
0
Ты бы код в соответствующий тег обернул что ли, читать же невозможно.
    Артур Шевченко
    25 февраля 2024, 21:36
    0
    И под cut портянку убери.
      Андрей
      25 февраля 2024, 21:37
      +1
      Для каких целей это нужно? 3й шопкипер выпущен 7 лет назад, давно не поддерживается и имеет достаточно много проблем. Если уже и переносить, то в минишоп =)
        Иван Бочкарев
        26 февраля 2024, 06:41
        0
        Поправил пост
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          4