Alexey T

Alexey T

С нами с 06 апреля 2014; Место в рейтинге пользователей: #130
Kakorin Stanislav
01 октября 2023, 14:38
2
+9
Быстрое решение, без перехода на php 8
github.com/modxcms/revolution/issues/16468#issuecomment-1708335830

В файле core/model/phpthumb/phpthumb.class.php на 317
Заменяем
public function __set(string $name, mixed $value): void {
на
public function __set(string $name, $value): void {
Илья Уткин
10 января 2022, 15:20
2
+5
Есть же метод parsePropertyString — он как раз составит массив из MODX-синтаксиса. То есть что-то типа такого

<?php
$parser = $modx->getParser();
$html = '[[!pdoResources?
	&parents=`1`
	&depth=`0`
	&tpl=`ListRowTpl`
	&tplWrapper=`@INLINE [[+output]]`
	&includeTVs=`image`
]]';

$properties = $parser->parsePropertyString($html);

Там же можно подсмотреть, как MODX определяет тип элемента — в методе processTag
Евгений Шеронов
02 августа 2021, 14:51
1
+2
У вас нет ссылок на примеры реализации?
Я делал. Для начала нужно установить на сервер github.com/phpredis/phpredis

В MODX нужно всего лишь очистить системную настройку session_handler_class — в этом случае за сессии будет отвечать PHP и по умолчанию будет хранить их в файлах.

Для хранения их в redis нужно в php.ini указать:
session.save_handler = redis
session.save_path = "tcp://host1:6379?weight=1, tcp://host2:6379?weight=2&timeout=2.5, tcp://host3:6379?weight=2&read_timeout=2.5"
; а для тех кто, как и я предпочитает подключение по сокету в пределах одной машины: 
session.save_path = "unix:///var/run/redis/redis.sock?persistent=1&weight=1&database=0"
; но в этом случае нужно ещё в redis.conf указать этот же путь в unixcocket

И теперь уже PHP будет отвечать за хранение сессий в redis.
Более подробнее уже несложно нагуглить)
Fi1osof
12 апреля 2021, 09:25
2
+2
Александр, если докером еще интересуетесь, можно с этим поиграться: github.com/MODX-Club/docker-lnmp
Здесь все необходимое для запуска MODX-3 (ну, просто он там в зависимостях, но можно и другие добавить в app/www).

Сам по себе докер (именно как один отдельно взятый контейнер) не очень интересно. Интересна возможность именно создания нескольких контейнеров, и чтобы они между собой взаимодействовали. Здесь у нас php-fpm, nginx, mysql, PhpMyAdmin и сам MODX. Но MODX пока не удалось запустить на полном автомате (мне лень было это копать без особой мотивации). Тем не менее, контейнер под него подготовлен, в том числе и устанавливается composer github.com/MODX-Club/docker-lnmp/blob/master/php-fpm/Dockerfile#L36

Только клонировать проект надо с субмодулями
git clone --recursive github.com/MODX-Club/docker-lnmp docker-modx
cd docker-modx

После этого проверяем, директория должна быть не пустой app/www/modx3

И вот чего не автоматизировал — это создание modx3/core/packages/core.transport.zip
По идее его должна быть возможность как-то билдить через CLI, но я с наскока не нашел. Если найдете, то в связке с общей установкой MODX через CLI можно полностью автоматизировать установку и запуск.
docs.modx.com/3.x/en/getting-started/installation/cli

Пока же приходится качать этот пакет с оффсайта и закидывать туда, иначе установка не может быть завершена.

Запуск

Копируем .env
copy .sample.env .env

Может затем отредактировать его и установить рет-пароль для мускула.

Для надежности сначала запускаем mysql и pma
docker-compose up -d --build mysql pma

Затем php-fpm
docker-compose up -d --build php-fpm

После запуска надо собрать MODX (я забыл это прописать в Dockerfile).
Заходим в контейнер php-fpm
docker exec -it modx-docker_php-fpm_1 bash (имя контейнера может отличаться, ищем актуальное docker ps или docker-compose ps).
Заходим в папку modx3 и выполняем
composer install

Ну и в конце nginx
Только хост подправить при необходимости: github.com/MODX-Club/docker-lnmp/blob/master/nginx/conf.d/modx3.local.conf

docker-compose up -d --build nginx

После запуска идет modx3.local/setup и устанавливаем.
Алексей Шумаев
13 декабря 2020, 22:41
1
0
Поддержу: в msOrderHandler->getCost можно расширить массив данными корзина/сумма/доставка для случая $only_cost=false. Расширение массива в response не повлияет ни на что, зато js-callback на Order.getCost позволит удобнее и проще организовать фронт. Это удобно и лично я всегда переопределяю этот метод (плюсом мои методы доставки возвращают кучу данных для фронта, получается примерно так: http://prntscr.com/w1w38w).
К сожалению, цивилизованно (PR) поучаствовать не могу, поддерживаем донатом )
Спасибо, ребята!
Василий Наумкин
19 сентября 2019, 08:10
3
+4
Другой вариант, который уже больше подходит для концепции REST — отсылаем все запросы как и договаривались на адрес по маске /api/**/*
MODX предсказуемо выдаст событие onPageNotFound — ну а дальше как завещал @Василий Наумкин выстраиваем плагин маршрутизации — и делаем что захотим.
Это если решать все вопросы одним MODX. Да и тогда лучше использовать OnHandleRequest.

А так, лично я давно всё отправляю через Nginx:
location ~ ^/api/ {
    rewrite ^/api/(.*)$ /api.php?q=$1;
}
И там уже любые маршруты с контроллерами.
Дмитрий Танцирев
12 сентября 2019, 10:00
2
+1
1. Откройте файл: "/{core_path}/components/yandexmaps/tv/input/tpl/tv.yandexMaps.input.tpl

2. Вырежьте из 108-ой строки:
window.suggestView = new ymaps.SuggestView('suggest', {literal}{'results':'9'}{/literal});
3.1 И вставьте её перед: (примерно 180-я строка)
suggestView.events.add('select', function (e) {
3.2 Таким вот образом:
var suggestView = new ymaps.SuggestView('suggest', {'results':'9'});
Сергей Шлоков
28 ноября 2018, 08:42
1
+4
Новое системное событие OnBeforeRegScripts даёт возможность манипуляции со скриптами и стилями перед их включением на страницу.
Если точнее "OnBeforeRegisterClientScripts".

При регистрации скриптов теперь не добавляется type=«text/javascript»
Наверно разговор про это. Но видимо это осталось только в планах.

И ещё отмечу это изменение. Несмотря на споры, его всё-таки приняли. Напомню, про что это. Т.е. создаёте CRC FenomResource, в котором меняете механизм парсинга — парсите только fenom (прям как у фреймворков). И никаких глюков и костылей.

А вообще не понятно, какой вектор развития MODX. Будут поддерживать 2 ветки — 2.х и 3.х? Или только 3.х? Тройка вроде ещё в альфа. Ладно, пошёл обновляться.
Андрей
22 января 2018, 17:22
2
+2
Написать парсер xml и так же по крону обновлять товары.

Просто в файле подключаете modx api, разбираете xml и из готового массива с данными товаров обновляете цены с помощью процессора modx.

если очень схематично, то так
// API
require_once '/absolute/path/to/modx/config.core.php';
require_once MODX_CORE_PATH.'model/modx/modx.class.php';
$modx = new modX();
$modx->initialize('mgr');
$modx->getService('error','error.modError', '', '');

//Разбор xml
$xmlData = array(); // данные о товарах

// Обновление товаров
foreach ($xmlData as $item) {

	$id = $item['id'];
	$action = 'create';

	if ($product = $modx->getObject('msProduct', $id)) {
		$data = $product->toArray();
		$data['price'] = $item['price'];

		$response = $modx->runProcessor('resource/'.$action, $data);

		if ($response->isError()) {
			$modx->log(1, $response->getResponse());
		}
	}

}

Если нужно обновлять только одно поле, то можно не через процессор а так
if ($product = $modx->getObject('msProduct', $id)) {
	$product->set('price', $item['price']);
	$product->save();
}
Konstantin
04 декабря 2017, 18:49
1
+2
Подскажите, как это решить?
Для начала читать документацию, проще будет.
Можно как-то так:
{set $image = 'phpthumbon'| snippet:[
'includeTV' => 'image',
'input' => example.com/$image,
'options' => 'w=255&h=180&zc=1',
'alt' => $alias
]}
{'!pdoPage'| snippet : [
        'parents' => 2,
        'tpl' => '@INLINE <img src="{$image}"/>',
        'limit' => 10
 ]}
то еще велосипед, но должен работать.