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

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

Олег
Олег
Пока думал и читал понял, что нужна другая логика.
На странице каталога в фильтре выбираю например «Антиоксиданты» и «Аминокислоты». Появляется список подходящих товаров.
Дальше, переходя в товар надо передать из 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 минут
Василий Наумкин
Василий Наумкин
— эта заготовка для создания ОДНОГО дополнения?
Да

Или можно в рамках одного сайта разработать сразу 5 несвязанных друг с другом дополнений?
Наверное можно, но я с трудом могу себе представить как кто-то зачем-то разрабатывает 5 несвязанных дополнений на одном сайте. Это же Docker — сделай 5 проектов и разрабыватывай независимо.

— это именно инструмент разработки ДОПОЛНЕНИЙ? Или же я могу так же удобно запустить сайт в докере, разработать нужный мне функционал, но не создавать никаких дополнений, а просто перенести весь код на сервер?
Кто ж тебе помешает?

Придумано для дополнений, но можно делать и запускать целиком сайты в Docker со своим функционалом.

Тоесть если захочется дотянутся до категорий извне вашего дополнения, то либо на уровне sql запросов или же создавать xml схему и модель, которую понимает modx и затем следить, чтобы модель eloquent и модель modx всегда были синхронизированы.
В MODX 3 есть Composer с автозагрузкой, так что модели дополения доступны отовсюду. Можно просто создать сниппет и выбрать все категории вот так:

$categories = \MMX\Super\Shop\Models\Category::query()->get()->toArray();

return print_r($categories, true);

непонятно какой шаблонизатор используется
Это решает автор дополнения, никакого «шаблонизатора по умолчанию» нет.
Александр Мельник
Александр Мельник
Безусловно, видео со звуком в десятки раз информативнее, чем просто видео. Автору всегда кажется что то что он делает на экране, так очевидно, что ничего и комментировать не нужно. Но как правило, автор ошибается.
За длинное видео со звуком спасибо.
Есть много вещей, которые я не понял даже со звуком).

— эта заготовка для создания ОДНОГО дополнения? Или можно в рамках одного сайта разработать сразу 5 несвязанных друг с другом дополнений?

— это именно инструмент разработки ДОПОЛНЕНИЙ? Или же я могу так же удобно запустить сайт в докере, разработать нужный мне функционал, но не создавать никаких дополнений, а просто перенести весь код на сервер?

— я плохо знаю modx 3 и может поэтому мне показалось, что дополнения «на уровне кода» очень слабо связаны с самим modx. Модель вы используете eloquent, контроллеры свои, визуализация своя, ну или скажем vue — шная. И мне показалось, что при таком подходе данные например из модели categories никто другой достать не сможет. Ведь есть что то подобное как modx->getService() и для modx3? Тоесть если захочется дотянутся до категорий извне вашего дополнения, то либо на уровне sql запросов или же создавать xml схему и модель, которую понимает modx и затем следить, чтобы модель eloquent и модель modx всегда были синхронизированы.

— очень не хватило в видео (но я вижу в загловке видео написано — ПЕРВЫЙ урок, поэтому наверное будет второй и это отлично) показа php сниппета для отображения данных в публичной части. Можно предположить что там внутри чистый laravel, но непонятно какой шаблонизатор используется. Eloquent любит blade, modx имеет свой «квадратно скобочный» шаблонизатор. И если на уровне «админки» еще позволительно каждому разработчику делать что он хочет и как он хочет, то публичная часть в рамках одного сайта должна сохранять некую стандартизацию, а то одни разработчик для показа категорий сделает spa, страницы новостей будет рендерится на сервере и так далее.

— наверное в следующих видео это станет очевидно, но уточню. Правильно я понял, что КОНЕЧНОЙ целью всех этих действия является получение отдельной директории с исходным кодом дополнения, которую можно взять под контрль версий, разместить на github, затем зарегистрировать репозиторий github как репозиторий composer и затем подключать этот код на сайт с modx через менеджер пакетов composer?
Павел Романов
Павел Романов
Если $data — массив с номером, товарами и датой, можно так:
<?php
$pdo = $modx->getService('pdoTools');
$data['count_products'] = count($data['products']);
return $pdo->getChunk('pdfHtmlTemplate', $data);

В чанке pdfHtmlTemplate:
{$num}
{$date}
{$products}
{$count_products}