Всего 123 789 комментариев

Максим
04 августа 2023, 10:18
0
Спасибо Николай за наводку. Не силен в бэке, по наитию сделал так. Заказ улетает, но корзина не восстанавливается с товарами из старой сессии. После отправки заказа корзина становится пустой:

$values = $hook->getValues();
$ms2 = $modx->getService('minishop2');
$ms2->initialize('web');

$count = (float)$values['count'] ?: 1;

// Step 1: Temporarily save the current cart to the session
$_SESSION['tmp_cart'] = $ms2->cart->get();

// Step 2: Clear the cart
$ms2->cart->clean();

// Step 3: Add the specific product to the cart with the desired quantity
$ms2->cart->add((int)$values['id'], $count, $values['options']);

$ms2->order->config['json_response'] = true; // Ask to return JSON

// Add fields to the order
$ms2->order->add('receiver', $values['receiver']);
$ms2->order->add('email', $values['email']);
$ms2->order->add('phone', $values['phone']);
$ms2->order->add('delivery', $values['delivery']);
$ms2->order->add('payment', $values['payment']);
$ms2->order->add('comment', $values['comment']);

// Step 4: Create a new order
$ms2->order->submit();

// Step 5: Add other cart items from the session back to the cart
if (isset($_SESSION['tmp_cart']) && is_array($_SESSION['tmp_cart']['products'])) {
    $ms2->cart->set($_SESSION['tmp_cart']);
}
Николай Савин
04 августа 2023, 10:16
0
Да хороший наглядный пример. Ты как всегда на высоте Семен. Спасибо.
Семён Кудрявцев
04 августа 2023, 10:14
+1
Можно позаимствовать реализацию у онлайнтрейда — www.onlinetrade.ru/basket.html,
очень удобно создаешь сколько угодно тебе корзин, называешь их как тебе надо, типа — присмотрел к др, подраки на нг, ит.д
Лежат себе и кушать не просят, актуализируются автоматически.
Если сделать грамотно, очень удобно будет. Корзины хранятся в бд, доступны менеджерам из админки, в любой момент могут их посмотреть, помочь клиенту дособрать, или оформить любую из корзин.
Николай Савин
04 августа 2023, 09:06
+1
Ты кстати уже не первый, кто об этом спрашиваешь. Я начинаю задумываться о реализации вариантов корзин.
Но пока на данный момент решение может быть только следующим (примерно):
1. Временно сохраняем текущую корзину в сессию через $ms2->cart->get();
2. Очищаем корзину
3. Добавляем в нее новый товар
4. Создаем заказ.
5. Если не пустая сессия с сохраненной корзиной закидываем ее опять в корзину через $ms2->cart->set($_SESSION['tmp_cart'])
Максим
04 августа 2023, 08:42
0
Артур, может есть вариант как при реализации сделать отправку заказа именно 1 товара? Суть: когда в корзине лежит уже 10 товаров и посетитель на другом товаре оформляет купить в один клик, то в админку прилетеает не один товар, а 10+1. Заранее спасибо!
Максим
04 августа 2023, 08:36
0
Артур, может есть вариант как при реализации сделать отправку заказа именно 1 товара? Суть: когда в корзине лежит уже 10 товаров и посетитель на другом товаре оформляет купить в один клик, то в админку прилетеает не один товар, а 10+1. Заранее спасибо!
Антон
04 августа 2023, 01:06
0
Спасибо за наводку.
Проблема оказалась в кодировке столбцов таблицы msop_modifications, была указана latin1_swedish_ci.
Замена на utf8mb4_unicode_ci исправила ситуацию.
Олег
03 августа 2023, 20:17
0
В сопоставлении таблиц MySQL utf8mb4_general_ci, в config.inc.php поменял utf8 на utf8mb4. Не помогает
Дмитрий
03 августа 2023, 15:23
0
Добрый день. Ну, что, MiniShop3 канул в лету? Магазин на ModX3 не сделать?
Андрей
03 августа 2023, 14:23
0
Проверяйте кодировку таблиц и сравнение БД, должно быть utf8_general_ci, utf8mb4_general_ci или utf8mb4_unicode_ci.

Также в файле core/config/config.inc.php должна быть выставлена нужная кодировка:
$database_connection_charset = 'utf8mb4';
$database_dsn = 'mysql:host=127.0.0.1;dbname=111;charset=utf8mb4';
Андрей
03 августа 2023, 14:23
0
Проверяйте кодировку таблиц и сравнение БД, должно быть utf8_general_ci, utf8mb4_general_ci или utf8mb4_unicode_ci.

Также в файле core/config/config.inc.php должна быть выставлена нужная кодировка:
$database_connection_charset = 'utf8mb4';
$database_dsn = 'mysql:host=127.0.0.1;dbname=111;charset=utf8mb4';
Vladimir
03 августа 2023, 11:59
0
Повторил всё за вами, но кнопка не появилась, пагинация появилась но при клике перезагружает страницу.
&ajaxMode=`button`
&ajaxHistory=`1`
&frontend_js=`/assets/pdopage.js`
Правда запускается через mFilter2
Денис Усманов
02 августа 2023, 23:20
0
Вопрос возможно давно не актуальный, но вот решение:

<?php
switch ($modx->event->name) {
    case "msOnGetProductPrice":
        $returned = (array)$modx->getPlaceholder('_returned_price');
        if (!isset($returned['price'])) {
            return;
        }
        $id = $returned['id'];
        foreach (array_keys($options) as $k) {
            if (!empty($options[$k]) && is_array($options[$k])) {
                foreach ($options[$k] as $v) {
                    $q = $modx->newQuery('msopModification')
                        ->innerJoin('msopModificationOption', 'Option',
                            "Option.mid = msopModification.id AND Option.key = '{$k}' AND Option.value = '{$v}'")
                        ->select(array('price'))
                        ->where(array(
                            'msopModification.rid' => $id,
                            'msopModification.type' => 2,
                            'msopModification.active' => true,
                        ))
                        ;
                    if ($q->prepare() && $q->stmt->execute()) {
                        $price = $price - $q->stmt->fetchColumn();
                    }
                }
            }
        }
        $options = !empty($returned['msoptionsprice_options'])
            ? $returned['msoptionsprice_options']
            : (!empty($_REQUEST['options'])
                ? $_REQUEST['options']
                : array());
        $options = array_diff_key($options, array_flip(array('modifications', 'modification')));
        
        foreach (array_keys($options) as $k) {
            if (!empty($options[$k]) && is_array($options[$k])) {
                foreach ($options[$k] as $v) {
                    $q = $modx->newQuery('msopModification')
                        ->innerJoin('msopModificationOption', 'Option',
                            "Option.mid = msopModification.id AND Option.key = '{$k}' AND Option.value = '{$v}'")
                        ->select(array('price'))
                        ->where(array(
                            'msopModification.rid' => $id,
                            'msopModification.type' => 2,
                            'msopModification.active' => true,
                        ))
                        ;
                    if ($q->prepare() && $q->stmt->execute()) {
                        // $price = $price - $q->stmt->fetchColumn();
                        if ($price_add = $q->stmt->fetchColumn()) {
                            $price += $price_add;
                        }
                    }
                }
            }
        }
        $modx->event->returnedValues['price'] = $returned['price'] = $price;
        $modx->setPlaceholder('_returned_price', $returned);
        break;
}
Антон
02 августа 2023, 23:10
0
Подскажите, пожалуйста, в чем может быть проблема.
Заполняю модификацию на русском, все отображается до момента сохранения.
После сохранения в админке вижу замененные на знак вопроса все русские буквы, при этом на сайте все отображается нормально.




Игорь
02 августа 2023, 21:41
0
Спасибо кто откликнулся и за помощь)) Сработал свой костыль Сниппет getTV + js (подстановка номера через поиск на странице и замену пустого значения).

в шаблоне вызова так:
[[!getTV]]
[[!$vitrina]]
Ivan
02 августа 2023, 19:30
0
[[!#[[*parent]].tovar_forel_chekbox:ne=‘’:then=‘hello’]]

Писал с телефона. Кавычки исправите.
Павел Романов
02 августа 2023, 16:07
0
Вам нужно проверять стоит ли в определенных TV у родительского ресурса «1» и если стоит, то выводить их название?
  • Для чего получать все TV родителя?
  • Зачем прописывать текущему ресурсу родительские TV?

Сделайте как я написал выше — это универсальное решение.

Если требуется выводить не название TV а какой-то произвольный текст, то можете так:
<?php
$docid = $modx->getOption('docid', $scriptProperties, $resource->get('id'));
$tvs = json_decode($tvs,1);
$out = array();
foreach($tvs as $tv => $name){
	if(!$tvo = $modx->getObject('modTemplateVar', array('name' => trim($tv)))) continue;
	if(!$tvres = $modx->getObject('modTemplateVarResource', array('tmplvarid' => $tvo->get('id'),'contentid' => $docid, 'value' => 1))) continue;
	$out[] = $name;
}
return implode(', ', $out);

А в вызове указывайте для какой TV какой текст выводить:
[[checkTV?
    &tvs = `{ "tovar_forel_chekbox":"форель","tovar_shuka_chekbox":"щука","tovar_kit_chekbox":"кит" }`
    &docid=`[[*parent]]`
]]
Игорь
02 августа 2023, 15:40
0
Пробовал даже так, хотел замену сделать

[[*city_phone_whatsapp]]
на
[[#[[*parent]].city_phone_whatsapp]]

Сниппет:
<?php
// Получить содержимое чанка 'vitrina'
$chunkContent = $modx->getChunk('vitrina');

$updatedChunkContent = str_replace('*', '#[[*parent]].', $chunkContent);

return $updatedChunkContent;

Вызов в шаблоне:
[[!getUpdatedVitrina]]

не помогло.