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

Андрей Степаненко
08 мая 2024, 09:37
0
Нашел альтернативное решение для написания комментариев к функциям, чтобы можно было в два клика добраться до неё.

Для modx @see \modX::getOption
<?php
namespace FacadeApp\Facades;
use Illuminate\Support\Facades\Facade;
/**
 * @method static mixed getOption($key, $options = null, $default = null, $skipEmpty = false)
 * @see \modX::getOption
 * @see modX
 */
class ModX extends Facade
{
    protected static function getFacadeAccessor(): string
    {
        return 'modx';
    }
}

Для pdoTools @see \pdoTools::getChunk

<?php
namespace FacadeApp\Facades;

use Illuminate\Support\Facades\Facade;

/**
 * @method static string getChunk($name = '', array $properties = array(), $fastMode = false)
 * @see \pdoTools::getChunk
 * @see modX
 */
class Pdo extends Facade
{
    protected static function getFacadeAccessor(): string
    {
        return 'modx';
    }
}


Cобрал пакеn по старинке через modExtra
Github: github.com/webnitros/facade-app

На модерацию уже отправил в modstore

Кому интересно, disk.yandex.ru/d/EtmO2tOPCYC6xA

Работает как в Modx 2 так и в 3 версии
Проверил на обоих версиях, одинаково отрабатывает код
# modx 2 и 3 запуск одинаковый
$site = \FacadeApp\Facades\ModX::getOption('site_name');

echo '<pre>';
print_r($site);
die;

С composer все еще могут возникать проблемы совместимости.

Еще событие добавил FacadeAppAddSingleton чтобы свои фасады можно было добавить github.com/webnitros/facade-app/blob/master/FACADE.md
Василий Наумкин
08 мая 2024, 09:01
0
Composer — это главная фишка MODX 3, которую никто не использует.
Lori
07 мая 2024, 22:02
0
Странно то, что точно также указаны пути в других компонентах, например migx или clientconfig. Но у них на странице CMP они подключаются норм, а у меня путь абсолютный строится относительно адреса сайта
Андрей Степаненко
07 мая 2024, 19:24
0
Проблема, вероятно, связана с тем, что вы используете неправильные переменные для формирования путей к CSS и JS файлам. В вашем коде вы обращаетесь к переменным `jsUrl` и `cssUrl` в свойстве `config` вашего объекта `xmlReader`. По умолчанию, эти переменные должны содержать относительные пути к JS и CSS файлам относительно корня сайта.

Однако, поскольку пути формируются неправильно и указывают на абсолютные пути на сервере, вам нужно убедиться, что переменные `jsUrl` и `cssUrl` в вашем объекте `xmlReader` правильно сконфигурированы. Возможно, они вам неправильно заданы в конфигурационном файле или в другом месте, откуда вы получаете этот объект.

Если переменные `jsUrl` и `cssUrl` должны содержать абсолютные пути, вы можете изменить их в вашем объекте `xmlReader` таким образом, чтобы они содержали правильные абсолютные пути к вашим JS и CSS файлам.

Пожалуйста, убедитесь, что вы используете правильные переменные для формирования путей к вашим файлам.
Андрей Степаненко
07 мая 2024, 19:20
+1
спасибо за ответ, сначала поверить не смог что modx 3 это сделано.
Андрей Степаненко
07 мая 2024, 19:14
+1
Проблема в том что в статье, я еще пару файлов подключал, что лишним было
Как раз про это писал что в modx 3 плохо разобрался.

Вспомнил про контракты.
Кто то все такие реализовал полноценную контейнеризацию ))
github.com/modxcms/revolution/commits/3.x/core/src/Revolution/Services/Container.php

Респект))))
Василий Наумкин
07 мая 2024, 18:48
+1
Если установлены через composer, то да, будет автозагрузка.

Судя по коду ты их просто положил в namespace MODX, так что да, так тоже работает.
Андрей Степаненко
07 мая 2024, 17:44
0
@Василий Наумкин подскажи плиз, Facades из коробки получается работают в modx 3?

core/src/Facades/Fenom.php
<?php
namespace MODX\Facades;

use Illuminate\Support\Facades\Facade;
use MMX\Fenom\App;

/**
 * @method static void addModifier(string $modifier, callable $callback)
 * @method static void fetch($template, array $vars = [])
 * @see App
 */
class Fenom extends Facade
{
    protected static function getFacadeAccessor(): string
    {
        return 'mmxFenom';
    }
}


Для запуска

<?php

use Illuminate\Support\Facades\Facade;
define('MODX_API_MODE', true);
require 'index.php';


Facade::clearResolvedInstances();
Facade::setFacadeApplication($modx->services);

echo \MODX\Facades\Fenom::fetch('file:chunks/test.tpl', ['name' => 'Hello']);
Андрей Степаненко
07 мая 2024, 17:29
0
Отлично, у $modx->services еще контракты подходящие

$modx->services->add('fenom', function (use $modx) {
    return $modx->services->get('mmxFenom');
});
Facade::clearResolvedInstances();
Facade::setFacadeApplication($modx->services);

echo \MODX\Facades\Fenom::fetch('file:chunks/test.tpl', ['name' => 'Hello']);
Андрей Степаненко
07 мая 2024, 14:37
+3
Записал видео, 12 минутное
Разобрал более подробней работу Facade
Несколько вариантов представил для сравнения
Наумов Алексей
07 мая 2024, 12:32
+2
Я тоже пересмотрел, не до конца понял профит (сокращение кол-ва подписей к объектам?).

Зато увидел усложнение, в виде накрутки над классом фасада, который еще сильнее усложнит жизнь).

А может у меня проекты такие, где это не нужно, не знаю)
Алексей Шумаев
07 мая 2024, 12:09
+3
После такого пинка по тушке modx у меня появилось желание наконец-то поставить 3 и что-то уже на нём сделать :-)
Андрей Степаненко
07 мая 2024, 11:46
0
Понимаю
Есть такое
По этому в конце комментариев See оставляется
use MMX\Fenom\App;

/**
 * @method static void addModifier(string $modifier, callable $callback)
 * @method static void fetch($template, array $vars = [])
 * @see \MMX\Fenom\App
 */
То же раздражала навигация.

Спустя какое-то время понял, как ориентироваться, привыкаешь к этому, после того как запомнишь, как функция вызывается и что она делает.

Для разработки чего-то нового, конечно же, не подходит, лучше обычным методом класс вызывать. Но для кода, который уже не первый год, вот тут выигрываешь сильно.
Кровельный
07 мая 2024, 11:38
0
MODX Revolution 2.8.3-pl
Ace 1.9.4-pl
При выборе ACE ошибка:
Uncaught TypeError: Cannot read properties of null (reading 'match')
    at a.$detectNewLine (ace.min.js?v=2.9.3-pl:1:120718)
    at a.insert (ace.min.js?v=2.9.3-pl:1:122464)
    at a.setValue (ace.min.js?v=2.9.3-pl:1:120356)
    at p.setValue (ace.min.js?v=2.9.3-pl:1:153026)
    at S.setValue (modx.texteditor.js?v=2.9.3-pl:185:38)
    at constructor.setValues (ext-all.js:21:603600)
    at miniShop2.panel.UpdateCategory.setup (modx.panel.resource.js?v=2.9.3-pl:57:28)
    at h.Event.fire (ext-all.js:21:3699)
    at miniShop2.panel.UpdateCategory.fireEvent (ext-all.js:21:687)
    at MODx.FormPanel [as constructor] (modx.panel.js:62:14)
Как выбрать текстовый редактор?
Василий Наумкин
07 мая 2024, 11:16
0
Лично я терпеть не могу фасады Laravel, и это одна из основных причин, почему мы с ним не сработались.

Дело в том, что при переходе в addModifier здесь, мы попадём в фасад, а не в класс \Fenom, где этот метод и объявлен:

И это жутко бесит, когда пытаешь проследить логику работы.

Уж лучше вызывать нормально класс и подписывать его комментарием, зато никаких проблем с навигацией через IDE.

По моему, это гораздо проще и удобнее, чем городить фасады.

Но, в любом случае, спасибо за заметку. Кому-то, может, такое наоборот удобнее.
Василий Наумкин
07 мая 2024, 07:55
+1
Я же выше объяснил, что происходит.

Ничего удалять не надо, просто добавляешь разрешение менять версии уже установленных пакетов ключом -W, что означает --with-all-dependencies.

Это не ошибка, там нет никаких ошибок. Он просто не может разрешить зависимость автоматически и просит тебя указать ему явно разрешение:
composer require mmx/fenom --update-no-dev --with-all-dependencies
Андрей Степаненко
07 мая 2024, 07:05
0
По тестировал, на modhost.pro
попробуй вот так сделать:

wget https://raw.githubusercontent.com/modxcms/revolution/v3.0.5-pl/composer.json
composer install
composer require mmx/fenom --update-no-dev
будет ругаться на зависимости

Удаление core/vendor и composer.lock обязателен получается.
И затем установка
wget https://raw.githubusercontent.com/modxcms/revolution/v3.0.5-pl/composer.json
composer require mmx/fenom --update-no-dev

Либо вариант, проблемы с зависимостями в ручную разруливать: modx.pro/development/24702#comment-143093
Василий Наумкин
07 мая 2024, 05:15
+1
У меня всё норм — вот, записал видосик
Василий Наумкин
07 мая 2024, 02:20
0
Тебе там пишут, что у тебя уже установлен пакет psr/container 2й версии. Проверяем, почему именно второй:

Просто потому, что можно или 1ю, или 2ю. Никаких особых требований нет, поэтому Composer выбрал версию 2.

Затем ты требуешь установить mmx/fenom — и тебе говорят, что для этого надо изменить зафиксированную версию psr/container.
illuminate/container[v8.0.0, ..., 8.x-dev] require psr/container ^1.0 -> found psr/container[1.0.0, ..., 1.x-dev] but the package is fixed to 2.0.2 (lock file version)
Как это сделать тебе говорят чуть ниже:
Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.
Просто разреши даунгрейднуть версию ключом:
composer require mmx/fenom -W

Всё устанавливается, только что проверил на modhost.pro
Андрей Степаненко
06 мая 2024, 23:02
0
изначально делал так
wget raw.githubusercontent.com/modxcms/revolution/v3.0.4-pl/composer.json
composer install
composer require mmx/fenom
Получал ошибку modx.pro/development/24702#comment-143091

Попробовал по другому
Удалил composer.lock и core/vendor
сразу выполнил команду
composer require mmx/fenom

все установилось

Update:
кроме самого пакета mmx/fenom (перепутал))) сначала подумал что он то же установился
при повторе, опять ошибка не совместимости
composer require mmx/fenom