Fi1osof

Fi1osof

Был в сети 15 февраля 2026, 22:30
Заказы не принимаю
0
Иван, привет!

Нет, пока только текстовый тип поддерживается. Мне его хватает, а на развитие пока народ не спонсирует.
UPD: сегодня вот на modMonitor дополнительно проспонсировали, вот его обновленная версия интересная выйдет в воскресенье.
+2
Выносим core за вебрут
Фигня все это. core необходим для работы сайта. Не важно где он у вас лежит (в корне сайта, где-то внутри или за пределами корневого раздела), он должен быть доступен для исполняемых скриптов, а значит если у вас что-то выполняется на уровне php, core будет доступен через MODX_CORE_PATH (вам можно не знать прямой путь к ядру). А запросы извне на core итак закрыты в большинстве случаев (мало кто не закрывает по халатности). Еще раз говорю: основная угроза именно в коннекторах, потому что именно они принимают на себя запросы извне и далее уже отправляют на выполнение в ядро. Вы даже здесь в топике посмотрите приведенные листинги, запросы идут на коннектор.
URL: http://victim.site/connectors/index.php?action=resource/getNodes&id=web  
================[ src start ]================  
POST /connectors/index.php?action=resource/getNodes&id=web HTTP/1.1
В свою очередь для работы фронта, как правило, системные коннекторы не требуются вообще (хотя есть умельцы, которые пихают туда свои скрипты (и я в начале своего пути туда же совал свои коннекторы)). Так вот, если вы удалите из прода папку коннекторов (или хотя бы закроете именно ее по ip), вы значительно сократите риск взлома.
+1
Не, ну не так жестко)))
А если серьезно, то тогда уж rm -rf ./connectors

Кстати, очень хорошая идея… Держать отдельный закрытый манагер-сайт для наполнения, и просто публичную часть без коннекторов. У меня так на одном серьезном проекте помимо дев сайта есть еще тест-сайт. Он как и боевой, работает с единой базой данных, но у него полностью своя файловая система. Позволяет на боевой базе данных обкатывать новый функционал прежде чем накатить окончательно на боевой сайт для всех.
+1
Если у тебя каждый контекст в отдельности будет доступен только по определенному протоколу (или http или https), то можно с префиксами не заморачиваться (то есть плагин не ставить вообще). В системных настройках не трогай переменную server_protocol, а вот в том контексте, который должен быть доступен по https, укажи эту настройку. Далее все редиректы настрой на уровне веб-сервера, то есть один и тот же контекст не должен быть доступен по разным протоколам.
Но далее вопрос стоит в том, как ты контексты переключаешь и инициируешь MODX. Если на уровне index.php с четким указанием контекста и его настроек протокола, то тогда ОК все. Но ведь так делают очень редко? В основном на уровне плагина делают свич контекста. А значит велика доля конфликтов в кеше. Если конфликты возникнут, тогда ставь плагин, без него никуда.
0
Что может смущать в такой простой задаче? Я тоже форевер заюзал. Его запустил и забыл про него. Какая разница про что забывать? Здесь скорее сработал принцип «он мне первый попался». Я про pm2 тоже только от вас узнал. У форевера более маркетинговое название.
+1
0
Во-первых, я не переписываюсь сам с собой, а публикую последние новости. На них не обязательно отвечать, но прочитать кому-то будет интересно. Плюс к этому скоро накачу дополнительный функционал, и писать там буду не только я.
Во-вторых, где именно вы кликнули на ссылку демо-магазина и какое отношение это имеет к modMonitor?
+2
Проверьте системные настройки, найдите в Пакетах расширений такое: joxi.ru/12M1KMNhM1x7R2
Если есть, соответственно удалите и сбросьте кеш. Только не вообще все удалите оттуда (если там помимо монитора еще что-то есть), а только данные о нем.

Хочу предостеречь народ, чтобы не ставили эту приблуду на рабочий сайт. Лог забиваются мегабайтами ошибок во время работы и… после удаления.
Специально для этого были добавлены настройки, позволяющие исключать отслеживаемые контексты и выставлять минимальное время выполнения запроса, при превышении которого сохраняется информация в БД. При чем информация об ошибках будет сохраняться независимо от этого порога. Таким образом можно поставить порог секунд в 10, и все равно потом видеть ранее возникшие ошибки.

P.S. Хочу предостеречь народ, чтобы не летали на самолетах. Опасное это дело. Надежней пешком.

А если серьезно, учту, что какие-то вещи не очевидны, и подправлю описание и сам компонент.
2
+2
Посмотрите www.paysera.com/v2/ru-RU/index
Очень интересный мировой сервис. Главная фишка в том, что он учитывает законодательство различных стран при формировании платежей. То есть если участники платежа находятся в разных странах, будет выбрана оптимальная банковская цепочка и юридические моменты учтены.
Не совсем точно изучал вопрос оплаты в России в разных валютах, но вы почитайте у них, наверняка все можно.
Готового компонента сейчас нет, но на одном сайте клиенту интегрировал, так что вполне можно докрутить и оформить в компонент. Цена вопроса 10 000. Если будут другие заинтересованные пользователи, можно объявить краудфандинг и собраться вскладчину. Цена готового компонента будет 1990 рублей, по краудфандингу можно по 1000 оформить.
+1
Для пример: мой код, который создает Сделку, Контакт с тегами, связывает Контакт со Сделкой, и создает заметку по Контакту.

if (!$amo = $this->modx->getService('amocrm', 'amoCRM', $this->modx->getOption('amocrm_core_path', null,
        $this->modx->getOption('core_path') . 'components/amocrm/') . 'model/amocrm/', array())
) {
    $this->modx->log(modX::LOG_LEVEL_ERROR, "[". __CLASS__ ."] Could not load amoCRM class!");
}

if($amo->auth()){
    
    /*
    Создаем сделку
    */
    $data = array(
        'name'          => "Заявка с сайта",  
    );
    
    $lead_id = $amo->addLead($data);    
    
    /*
    Создаем контакт
    */
    $contact = $amo->prepareContact(array(
        'name' => $this->getProperty('name'),
        'phone' => $this->getProperty('phone'),
        'email' => $this->getProperty('email'),
    ));
    
    $contact['tags'] = 'ClientsFromWebsite,RUS';
    $contact['linked_leads_id'] = $lead_id;
    
    $data = array('request' => array('contacts' => array()));
    $data['request']['contacts']['add'] = array($contact);
    
    $result = $amo->sendRequest('/private/api/v2/json/contacts/set', $data);
    
    if(!empty($result['out']['contacts']['add'][0]['id'])){
        $contact_id = $result['out']['contacts']['add'][0]['id'];
    }
    
    /*
    Создаем заметку по контакту
    */
    if(
        $message = $this->getProperty("message")
        AND $contact_id
    ){
        
        $note = array(
            'element_type'          => 1,  
            'element_id'   => $contact_id,  
            'note_type'   => 4,
            'text'   => $message,
        );
        
        $data = array('request' => array('notes' => array()));
        $data['request']['notes']['add'] = array($note);
        
        $result = $amo->sendRequest('/private/api/v2/json/notes/set', $data);
    }
    
}
else{
    $this->modx->log(modX::LOG_LEVEL_ERROR, "[". __CLASS__ ."] amoCRM Error auth");
}
Получается вот такой результат: