Всего 123 802 комментария

Василий Наумкин
02 мая 2024, 12:11
0
Если же элемент не статичный, то из специальной таблички читается время его последнего обновления (которое сохряняется туда плагином, потому что MODX эти данные не хранит).
Иначе обычные чанки будут компилироваться каждый раз и никакой пользы от кэширования. В pdoTools сейчас так и есть, между прочим.
Алексей Соин
02 мая 2024, 12:07
0
а для чего таблицы chunks_time и templates_time?
Артур Шевченко
02 мая 2024, 11:30
0
Управляя настройками mysql, можно задать параметр sql_mode пустым значением (после чего все заработает), но хостер такую возможность не дает… Есть ли разумное решение данной проблемы?
Поменять хостинг.
Maks
02 мая 2024, 10:27
0
<?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 минут
Maks
02 мая 2024, 07:45
0
Что то не хочет выводить сколько осталось до конца акции. Выводит только Успейте сегодня!
Артур Шевченко
01 мая 2024, 21:40
+1
$pdoTools = $modx->getParser()->pdoTools;
$data['count_products'] = count($data['products']);
$renderedHtml = $pdoTools->getChunk('pdfHtmlTemplate', $data);
В чанке pdfHtmlTemplate все ключи массива $data будут доступны как переменные
Pandemic
01 мая 2024, 15:18
0
Пардон, плохо смотрел
Баха Волков
01 мая 2024, 15:09
+1
В документации написано:

Системная настройка: msync_alias_with_id — Выберите ДА, чтобы к псевдониму товаров при создании добавлялся идентификатор ресурса. Решает проблему повторяющихся псевдонимов.
Василий Наумкин
30 апреля 2024, 11:46
+3
— эта заготовка для создания ОДНОГО дополнения?
Да

Или можно в рамках одного сайта разработать сразу 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);

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

— эта заготовка для создания ОДНОГО дополнения? Или можно в рамках одного сайта разработать сразу 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?
Константин
29 апреля 2024, 20:52
0
Добрый день, подскажите, перестал работать плагин в Хроме и Эдж, а в Яндекс браузере работает. Что может быть?
Павел Романов
29 апреля 2024, 12:40
+1
Если $data — массив с номером, товарами и датой, можно так:
<?php
$pdo = $modx->getService('pdoTools');
$data['count_products'] = count($data['products']);
return $pdo->getChunk('pdfHtmlTemplate', $data);

В чанке pdfHtmlTemplate:
{$num}
{$date}
{$products}
{$count_products}
Моисей
28 апреля 2024, 22:59
0
Настроил всё по инструкции, но заказы в Сделки не попадают.
al1ve
28 апреля 2024, 20:45
0
хорошо, тогда уточню у клиента) но на будущее хотелось бы знать — как добавляется новый столбец? либо попросить добавить такой функционал)
Alexey
28 апреля 2024, 11:25
0
Тут уж вопрос рациональности… если есть готовое поле, которое не планируется применять для вывода старой цены, то логично будет его использовать, а не тратить время на кастомизацию компонента.

А чтобы это не казалось неправильным, можно в лексиконах msOptionsPrice2 поменять подпись к полю)))
al1ve
28 апреля 2024, 11:12
0
Ну как временное решение — можно, но думал, что это немного неправильно — использовать поле не по назначению
Alexey
28 апреля 2024, 10:45
0
Привет! А почему для этой цели нельзя использовать существующее поле «старая цена»? Судя по скрину, оно не используется.
Vladyslav
28 апреля 2024, 01:36
0
Ответ оказался элементарным) Спасибо вам большое)
Артур Шевченко
27 апреля 2024, 17:23
+1
У любого ресурса в настройках есть чекбокс «Использовать псевдоним в пути псевдонимов» сделай его неактивным и обнови урлы через верхнее меню.
al1ve
27 апреля 2024, 14:52
0
Здравствуйте. Я немного ошибся. Там 1000 руб — это за упаковку, и в этой упаковке определённое кол-во пог. м. Насчёт вычислить я не уверен, так как клиент прислал документ с ценами за 1 пог. метр для каждой модификации товара.
Если под ТП имеется в виду техподдержка плагина в модсторе, то я вчера пробовал написать для этого дополнения, но пишет, что год поддержки уже истёк.