Как парсить количество товаров в корзине?

Делаю смс уведомления для shopkeeper3.
Всё это дело работает через хук в formIt, код которого пишу снизу.

<?php
global $phone;
global $name;
global $email;
global $message;
global $payment;
global $shk_delivery;
global $address;

$phone = $hook->getValue('phone');
$name = $hook->getValue('fullname');
$email = $hook->getValue('email');
$message = $hook->getValue('message');
$payment = $hook->getValue('payment');
$shk_delivery = $hook->getValue('shk_delivery');
$address = $hook->getValue('address');

global $zakaz;

require_once $modx->getOption('core_path') . "components/shopkeeper3/model/shopkeeper.class.php";

$shopCart = new Shopkeeper($modx, $scriptProperties, true);

        $shk_data = array(
            'price_total' => number_format(Shopkeeper::$price_total, 2, '.', ''),
            'items_total' => Shopkeeper::$items_total,
            'items_unique_total' => Shopkeeper::$items_unique_total,
            'delivery_price' => $delivery_price,
            'delivery_name' => $delivery_name,
            'ids:' => $shopCart->getProdIds()
        );

$col = $shk_data['items_total'];
$sum = $shk_data['price_total'];
$zakname = '';
foreach ( $shk_data["ids:"] as $key => $value ) {
    $resource = $modx->getObject('modResource',$value);
    $title = $resource->get('pagetitle');
    $zakname = $zakname . $title . '.';
}
global $zakaz;
$zakaz = str_replace (' ', '%20', $zakname);

global $phone;
$phone = str_replace (' ', '%20', $phone);

global $name;
$name = str_replace (' ', '%20', $name);

global $email;
$email = str_replace (' ', '%20', $email);

global $message;
$message = str_replace (' ', '%20', $message);

global $shk_delivery;
$shk_delivery = str_replace (' ', '%20', $shk_delivery);

global $address;
$address = str_replace (' ', '%20', $address);

global $payment;
$payment = str_replace (' ', '%20', $payment);





$tot = 'Всего:%20'. $col .'%20шт.';
$tot_sum =  'На%20сумму:'.$sum.'руб.';
$zakaz = $zakaz . $tot . $tot_sum;
global $zakaz;

function sendSMS()
{
    global $phone;
    global $name;
    global $email;
    global $message;
    global $payment;
    global $shk_delivery;
    global $address;
    global $zakaz;
    
    $result = @file_get_contents('http://bytehand.com:3800/send?id=27907&key=4FB570CE82E0B665&to=79231588266&from=test&text='.$zakaz.'%20От%20-%20'.$name.'.%20Номер%20-%20'.$phone.'.%20Адрес%20-%20'.$address.'.%20Доставка%20-%20'.$shk_delivery.'.%20Оплата%20-%20'.$payment.'.%20Почта%20-%20'.$email.'.%20Примечание%20-%20'.$message);
    echo $result;
    if ($result === false)
        return false;
    else
        return true;
}
sendSMS("79231588266", "Test");

header('Location: http://doca-pizza.ru/spasibo.html');

Осталось лишь вытащить количество каждого товара в корзине. Подскажите, дорогие программисты, как же это распарсить?

Оффтопом, редактирование не работает, я сразу хотел отредактировать. И ошибка "Вы можете редактировать запись только в течение 15 мин. после публикации."

Кстати, код желательно бы поправить (или убрать его с глаз долой, чтобы другие не использовали). Все global надо убрать, в них нет необходимости. Передавайте переменные, которые нужны внутри функции sendSMS(), как аргументы. Можно сделать один аргумент - массив.

sendSMS("79231588266", "Test");

Тут вы передаете данные, но внутри функции их не используете.
Пример:

function sendSMS( $options )
{
    //код функции, использующий данные из массива $options
}
$options = array(
    'phone' => $phone,
    'name' => $name,
    'email' => $email
    // и так далее
);

sendSMS( $options );

@Andchir Большое спасибо за подсказку с массивом, можно хорошо оптимизировать код.
А тот код, что вы скинули выше, я уже видел. Страница не загружается с оператором Public.
Без него пустоту выдает, если код вызвать просто через сниппет.
Если через хук, то при отправке заказа ошибка появляется, сайт вообще не загружается.
Может попробуете у себя, наверняка давно не тестили.. :)) Буду очень благодарен.

По идее, после подключения класса Shopkeeper и создания объекта вам должны быть доступны все методы, т.е. можно просто вот так сделать:

$purchases = $shopCart->getPurchases( $order_id )

Только не знаю, где у вас $order_id заказа, хотя это вроде основной параметр.

Участник @slaad написал в Как парсить количество товаров в корзине?:

$purchases = $shopCart->getPurchases( $order_id )

C такой строчкой сайт не загружается.

Давайте посмотрим на минимальном простом примере:

require_once $modx->getOption('core_path') . "components/shopkeeper3/model/shopkeeper.class.php";

$shopCart = new Shopkeeper($modx, $scriptProperties, true);

$shk_data = array(
    'price_total' => number_format(Shopkeeper::$price_total, 2, '.', ''),
    'items_total' => Shopkeeper::$items_total,
    'items_unique_total' => Shopkeeper::$items_unique_total,
    'delivery_price' => $delivery_price,
    'delivery_name' => $delivery_name,
    'ids:' => $shopCart->getProdIds()
);
        
print_r ($shk_data);

Получаем следующее:

Array ( [price_total] => 1700.00 [items_total] => 3 [items_unique_total] => 2 [delivery_price] => [delivery_name] => [ids:] => Array ( [0] => 129 [1] => 128 ) )

ID так хорошо выводятся, так бы и количество каждого товара))

Для наглядности скрин:

alt text

Такое ощущение, что надо вытаскивать количество скриптом и отправлять в php. Но этот план я оставил на крайний случай.

Помогли ребята из поодержки bytehand.

Таком вот кодом:

$zakname = '';
$purchases = !empty($_SESSION['shk_order']) ? $_SESSION['shk_order'] : array();
if ($purchases) {
    foreach ($purchases as $p) {
        $zakname .= $p['name'] . ":" . $p['count'] . "; ";
    }
}

Участник @kostya_slam написал в Как парсить количество товаров в корзине?:

$purchases = $shopCart->getPurchases( $order_id )

C такой строчкой сайт не загружается.

Он и не будет загружаться ведь нужно $order_id передать...

Ладно, нашли решение и отлично, через год перепишите))

Похоже, подключение к Форум | MODX Shopkeeper было разорвано, подождите, пока мы пытаемся восстановить соединение.