Финансовая поддержка VPS, бесплатные дополнения и docs Донаты оплачивают сервер и двигают бесплатные дополнения MODX и документацию. Поддержать

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

Oleg
Oleg
Здравствуйте. Статус заказа меняется на «Оплачено» после того как покупатель оплатил товар и произошёл редирект обратно сайт. Появились случаи когда покупатель оплатил и не дожидаясь оплаты просто закрывает сайт. И статус не меняется. Можно как-то сделать чтобы статус менялся каким-то запросом, не только редиректом?
Павел Романов
Павел Романов
Так вроде, пошустрее будет ):
$sql = "
    SELECT tvr.value, tv.caption
    FROM {$modx->getTableName('modTemplateVarResource')} tvr
    LEFT JOIN {$modx->getTableName('modTemplateVar')} tv
    ON tv.id = tvr.tmplvarid 
    WHERE tvr.contentid = {$id} AND tv.category = {$category}
";
$q = $modx->prepare($sql);
$q->execute();
$resources = $q->fetchAll(PDO::FETCH_ASSOC);
foreach($resources as $resource){
    $out .= $modx->getChunk($tpl, $resource);
}
return $out;

В чанке [[+caption]] и [[+value]]:
<div class="item-parent">
    <div class="row">
        <div class="col-9 pr-0">
            <span class="caption">[[+caption]]:</span>
            <div class="item-bg" data-rating="[[+value]]"></div>
        </div>
        <div class="col-3">
            <span class="rating">[[+value]]/10</span>
        </div>
    </div>
</div>

Кстати, верный ID категории можно узнать в Элементы » Категории.
Наумов Алексей
Наумов Алексей
Кстати, если кому интересно, mmxDatabase вроде как можно запустить и на MODX 2.x.

Сначала в консоли делаем так:
composer require mmx/database
выполнять команду install не стоит, всё равно ж не получится.

а затем уже в php вот так:

require_once dirname(__FILE__) . '/vendor/autoload.php';
class_alias(\modX::class, 'MODX\\Revolution\\modX');
$mmxDatabase = new MMX\Database\App($modx);
и можно работать:
$resource = \MMX\Database\Models\Resource::find(1);
print_r($resource->toArray());
Олег
Олег
Пока думал и читал понял, что нужна другая логика.
На странице каталога в фильтре выбираю например «Антиоксиданты» и «Аминокислоты». Появляется список подходящих товаров.
Дальше, переходя в товар надо передать из GET запроса выбранные опции.
Внизу товара отобразить 10-12 товаров, в которых эти опции тоже отмечены.
Наумов Алексей
Наумов Алексей
Слишком общий вопрос, нет волшебных решений.

Что значит у нас много опций, 20 штук? Как вы по ним хотите похожие товары искать?

Вот я к примеру делал так: мне в разделе «Стабилизатор напряжения» в карточке товара нужно вывести 12 похожих товаров, критерии такие:
1. Соответствуют количеству фаз
2. Близкая мощность, плюс минус 20%
3. Близкая цена, плюс минус 30%

Когда я определился с критериями — я написал соответствующий запрос и получил выборку. Для другой категории будет другая выборка, правда же? Ведь спортивные кроссовки по этим критериям уже не подобрать? Там Похожесть это, например, цвет, наличие или отсутствие шнурков.
Олег
Олег
у вас в примере Data это к примеру article, а Size это название опции. правильно? Но как перечислить все опции? Просто их около 20, а отмечены у каждого товара по 1-4 опции.
И как получить значения для WHERE, в котором тоже могут быть несколько опций?
Василий Наумкин
Василий Наумкин
Если же элемент не статичный, то из специальной таблички читается время его последнего обновления (которое сохряняется туда плагином, потому что MODX эти данные не хранит).
Иначе обычные чанки будут компилироваться каждый раз и никакой пользы от кэширования. В pdoTools сейчас так и есть, между прочим.
Артур Шевченко
Артур Шевченко
Управляя настройками mysql, можно задать параметр sql_mode пустым значением (после чего все заработает), но хостер такую возможность не дает… Есть ли разумное решение данной проблемы?
Поменять хостинг.
Maks
Maks
<?php
$id = $modx->getOption('id', $scriptProperties, $modx->resource->id);
$field = $modx->getOption('field', $scriptProperties);
$tpl = $modx->getOption('tpl', $scriptProperties, 'msTimeStampTpl');
if ($modx->getObject('msProduct', $id )->get($field) == null) {
    return false;  
}

$tablePrefix = $modx->getOption('table_prefix');
$table = $tablePrefix.'mstimestamp_product';
$sql = "SELECT * FROM $table WHERE product_id = $id AND field = '$field'";
$statement = $modx->query($sql);
$date = $statement->fetch(PDO::FETCH_ASSOC);
if(!empty($date)){
    $validUntil = (int)$date['valid_until']; // Преобразуем строку в число

    $currentDate = time();

    if ($validUntil < $currentDate) {
        return false; // Акция уже завершена
    }

    $secondsLeft = $validUntil - $currentDate;

    $daysLeft = floor($secondsLeft / (60 * 60 * 24));

    $hoursLeft = floor(($secondsLeft % (60 * 60 * 24)) / (60 * 60));

    $minutesLeft = floor(($secondsLeft % (60 * 60)) / 60);

    $secondsLeft = $secondsLeft % 60;

    return $modx->getChunk($tpl, [
        'field' => $field,
        'date' => date('d.m.y', $validUntil),
        'daysLeft' => $daysLeft,
        'hoursLeft' => $hoursLeft,
        'minutesLeft' => $minutesLeft,
        'secondsLeft' => $secondsLeft
    ]);
}
return false;

?>
Вот так сделал

Чанк
<p>
Акция действует до: [[+date]] </p>
<p>Осталось [[+daysLeft]] дней [[+hoursLeft]] часов [[+minutesLeft]] минут</p>
На выходе получаем

Акция действует до: 10.05.24
Осталось 7 дней 16 часов 35 минут