Константин Ильин

Константин Ильин

С нами с 10 февраля 2014; Место в рейтинге пользователей: #162
Константин Ильин
23 июня 2022, 22:04
0
Спасибо большое Николай, сколько гуглил не на нашел такого.

для поиска: Авторизация админа api
Константин Ильин
23 июня 2022, 17:44
0
Подскажите пожалуйста, столкнулся примерно с такой же проблемой.
<?php
define('MODX_API_MODE', true);
require_once $_SERVER['DOCUMENT_ROOT'].'/index.php';

$resp = $modx->runProcessor('/security/login', array(
    'username' => 'admin',
    'password' => '123123',
    'rememberme' => true,
    'login_context' => 'mgr',
));
Пробовал session_abort или session_destroy, но мне кажется тут не все так просто из-за метода подключения API.

Как правильно залогиниться под админом, например в login.php с «примерно» вышеуказанным кодом?
Константин Ильин
23 июня 2022, 10:16
0
Повышаем популярность)

есть еще замечательный готовый компонент DateAgo

вызов на феноме
{'dateAgo' | snippet : ['input' => strtotime('+1 day'), 'dateFormat' => 'F Y']}
Константин Ильин
22 июня 2022, 19:33
+1
Вообще разницу не видите или не хотите?
Константин Ильин
22 июня 2022, 19:19
0
Ну естественно неверно, date() от завтрашней даты должно работать.
<?
return date('d',$nextDay). " $month";
<?
$nextDay = strtotime("+1 day");
$arr = array(
    '01' => 'января',
    '02' => 'февраля',
    '03' => 'марта',
    '04' => 'апреля',
    '05' => 'мая',
    '06' => 'июня',
    '07' => 'июля',
    '08' => 'августа',
    '09' => 'сентября',
    '10' => 'октября',
    '11' => 'ноября',
    '12' => 'декабря'
);
 $month = date('m',$nextDay);
 $month = $arr[$month];
 return date('d',$nextDay).' '.$month;
Константин Ильин
21 мая 2022, 20:44
0
не будет ли простым решением перейти на CKEditor?
там codemirror по умолчанию идет
Константин Ильин
19 мая 2022, 12:46
0
Чудеса кончено, спасибо Павел!
Константин Ильин
19 мая 2022, 12:37
0
Ого, вот я первым делом полез в плагин и он был пустой(!).
Прошелся до самого файла он тоже оказался пустым.

Подскажите почему плагин Статичный «очищается»? как так вообще происходит? или это только с CKEditor

Вот сейчас переустановил CKEditor, код в плагине есть.
Спасибо за решение, сделал, буду проверять-тестировать.
Константин Ильин
19 мая 2022, 11:49
0
Реализация возможно не совсем понятная, но сама идея довольно популярная.

Не так давно делал сайт, там много посадочный страниц и обираются из блоков, менеджеру, сеошнику, достаточно загрузить блоки и страница собрана.
Тоже через MIGX реализовал.

Вот пример позиции блоков:
prnt.sc/buLcskvS_nBr

Если редактировать запись, внутри каждой есть выпадашка с готовыпи блоками и Кодом блока.
prnt.sc/dBuQ7WP6N2Qu
Выбираешь, загружаешь код кнопкой в редактор и уже там можно что-то поменять если оно надо(Например заголовок блока или какой то текст), а так просто нажал сохранить и все — блок готов.
Константин Ильин
11 мая 2022, 16:07
0
Спасибо!
Так и сделал, погуглил седня хорошенько, но только щас увидел ваш комментарий)

Установил стандартный CKEditor из репозитория
Первое что надо сделать — включить codemirorr
Системные настройки->CKEditor
Прописываем настройке ckeditor.extra_plugins значение codemirror

Далее
Открываем файл: manager/assets/components/ckeditor/ckeditor/config.js
Добавляем 
config.startupMode = 'source';

Еще одно действие, но возможно только у меня так, файлы как то кешируются, так что надо в браузере надо открыть manager/assets/components/ckeditor/ckeditor/config.js и обновить.
Убедится, что изменения появились и должно заработать.
Константин Ильин
14 апреля 2022, 20:02
+1
'optionFilters' => ('{"proizvoitel:LIKE": "'~$_modx->resource.pagetitle~'"}'),
Константин Ильин
27 марта 2022, 22:00
+1
Если я правильно понял о поиске языковой версии в урл, то вот
<?
// Массив допустимых язоковые версий, можно сделать настройку в модх и через getOption() получить, но это лишний запрос к БД
$allowLanguages = ['en','es'];

// Разбор урла
$queryArray = parse_url($_SERVER['HTTP_REFERER']);


// Разбор пути запроса 
$urlArray = explode('/',  $queryArray['path']);

// Если первый сегмент пути есть в массиве допустимых языков, соответственно урл содержит языковую версию
if(in_array($urlArray[1], $allowLanguages)){
    
    // Тут ищем контекст с языковой версией и делаем переключение на него или что-то другое

}
Константин Ильин
22 марта 2022, 15:54
+1
Сам пользуюсь приемом ajax запросов. Использовать ajaxForm — слишком ограничений много, можно проще:
1. создаем страничку, там кнопку старт
2. js, ну для быстроты сборки конечно jquery
3. Пишем запрос по нажатию кнопки ".startProcessing"
const urlRequests = '/ajaxQuester/request.php';

function requestToHandler(data = {}, btn = '') {

    $.ajax({
        dataType: 'json',
        type: 'POST',
        url: urlRequests,
        data: {
            action: 'Processing',
            data: data,
        },
        success: function( r) {
            console.log( r);
            if(r.success){

                if(r.data.done){
                    //Здесь делаем что-то по завершению
                    removeLoader(btn,1);

                }else {
                    //если обработка не завершена вызываем заново
                    // так же можно выводить на страницу информацию(лог), что сделал какой этап и offset
                    requestToHandler(r.data,btn);
                }

            }else{
                removeLoader(btn);
                console.log('err');
            }
        }
    });
}

$(document).ready(function() {
    $(document).on('click', '.startProcessing', function (e) {
        requestToHandler({'offset' : 0,'firstQuery' : 1}, $(this));
        addLoader($(this),'',1)
        e.preventDefault();
    })
});

4. создаем request.php в нем обрабатываем, что посылает ajax. Типа того(код не 100% рабочий)
// тут всякие проверки и подключение к modx api
.....

switch ($_POST['action']){

    /*
        Processing
    */
    case 'Processing':

        if(empty($_POST['data']) || !isset($_POST['data']['offset'])){
            echo returnError('no Processing', $resp);return;
        }

        $resp['data'] = $_POST['data'];
        $data = &$resp['data'];

        $offset = $data['offset'];

        $arrayObjects = [];
        $arrayObjects = $testArr;

        if($data['firstQuery']){
            $data['totalObjects'] = count($arrayObjects);
            $data['firstQuery'] = 0;
        }

        $done = false;
        $steps = 35;
        if($data['totalObjects'] < $steps + $offset){
            $steps = $data['totalObjects'] - $offset;
            $done = true;
        }


        //здесь цикл обработки


        $data['done'] = $done;
        $data['offset'] += $steps;


        if($done){
            $resp['text'] .= '<div class="text-success ">Успешно завершено</div>';
        }else{
            $resp['text'] .= '<div class="text-secondary ">Выполнено '.$data['offset']. 'из '.$data['totalObjects'].'</div>';
        }

        echo json_encode($resp);return;
    break;
}
Преимущество перед ajaxForm в том, что как угодно можно построить лог на самой странице например
«Выполнено 7847 из 270000»
Константин Ильин
04 марта 2022, 12:20
0
Гляньте:
1. ошибка в Консоли браузера
2. ошибка в Логе modx
3. ошибка в Логе Сервера
4. Если зайти в Админке, в ресурс, MIGX нормально показывает? Это вопрос про ошибку на 1860 строке prnt.sc/3CQsst937gOr
5. Попробовать(естественно с переделками) данный код в Console
Константин Ильин
22 февраля 2022, 23:06
+1
Спасибо всем за отзывы и Спасибо за пояснение Евгению! И спасибо за исправления заголовка, чет косячнул.

Подмечу.
В комментах верно написали, что домены реализованы без контекстов, поэтому сделал по другому.
Домены прописаны у ресурсов в отдельном контексте, в доп поле скрин прикладываю.
prnt.sc/iN53u16cimo8

Получилось повесить плагин на событие OnMODXInit. Код на коленке, но думаю смысл понятен.
if ($modx->event->name != "OnMODXInit" || $modx->context->key == 'mgr') {
    return;
}
$host = $_SERVER['HTTP_HOST'];
$SMTParr = [];
$pos = strripos($host, 'site.ru');
if ($pos === false) {
   /* тут основной домен или же ничего не делать*/
} else {
    $SMTParr = [
        'mail_smtp_helo' => 'smtp.mail.ru', //тут меняем на яндекс если надо
        'mail_smtp_hosts' => 'smtp.mail.ru', //тут меняем на яндекс если надо
        'mail_smtp_user' => 'info@site.ru',
        'mail_smtp_pass' => 'парольпароль',
        'mail_smtp_single_to' => 1,
        'mail_smtp_prefix' => 'ssl',
        'mail_smtp_port' => 465,
        'mail_smtp_auth' => 1,
        'mail_use_smtp' => 1,
    ];
}

if(!empty($SMTParr)){
    foreach ($SMTParr as $k => $v){
        //Тут как раз переназначаем настройки
        $modx->setOption($k, $v);
        $modx->config[$k] = $v;
    }
}
Попробовал отправить форму через ajaxForm все прошло ок. Грубо говоря в яндекс почте куда пришло письмо горит зеленый замочек.

А так резюмируя:
Смотрим что за домен, из условно базы(оно может быть ресурсами отдельными или в тупую массивами прописано) берем данные для сравнения и данные SMTP, и меняем в цикле данные.
www.mail-tester.com/ показывает нормально.

Готов выслушать другие решения.
Константин Ильин
16 декабря 2021, 16:32
0
С pdoMenu проблемы.
В документации написано
&tplOuter — Чанк оформления всего блока меню. По умолчанию: @INLINE <ul [[+classes]]>[[+wrapper]]
При указании tplOuter работает неверно, он начинает использовать его для всех подменю.
prnt.sc/239rcei

Попробовал указать tplParentRow и у него указал ul, помогло.

Решил сделать тест на модхосте, тоже самое
s28405.h8.modhost.pro/

Не могу утверждать данная проблема связана с последними изменениями, но она как видно есть либо в документации неверно написано.
<ul class="test">
    {'!pdoMenu' | snippet : [
        'parents' => 0,
        'level' => 2,
        'tplOuter' => '@INLINE {$wrapper}',
        '-tplParentRow' => '@INLINE <li class="submenu_wrapp {$classnames}"><a href="{$link}" {$attributes}>{$menutitle}</a><ul>{$wrapper}<ul></li>'
    ]}
    <li>
        <a href="#">Заказ звонка</a>
    </li>
</ul>

п.с. Раньше использовал такой «прием» и норм было.
Константин Ильин
30 ноября 2021, 17:24
0
Есть ли ссылки примеры?

Я просто не совсем понимаю, если у меня скрипт будет автоматически логинится, то будет получать права. Он доступен через урл, напрямую. Т.е. «Иван» зайдет по адресу и получит сессию с правами?
и будет ли работать этот прием для CRON
Константин Ильин
30 ноября 2021, 10:24
0
Тоже про все это подумал, решил не рисковать с правами. Создавать процессоры и т.п.
Сделал через newObject. Думал проблема будет с опциями, а там все просто оказалось.

Кому пригодится
// Нестандартные опции, cтандартные опции товара записываются вместе с полями товара
$options['idads'] = $idADS;
$options['floor'] = $floor;

$newProduct = $modx->newObject('msProduct');
$alias = $newProduct->cleanAlias($pagetitle);

//Поля товара(ресурса)
$arrRes = [
    'pagetitle' => $pagetitle,
    'published' => 1,
    'alias' => $alias,
    'content' => $ADS['description'] ?: '',
    'parent' => $parent,
    'show_in_tree' => 0,
    'template' => 20,

    //Стандартные опции товара
    'color' => ['синий', 'красный']
    'old_price' => 0,
    'price' => $ADS['price']['value'] ?: 0,
];

// Можно было использовать fromArray()
foreach ($arrRes as $field => $v){
    $newProduct->set($field,$v);
}

// Собственно, запись нестандартных опций, простая передача массива
$newProduct->set('options', $options);

// сохраняем
$newProduct->save();
Сейчас проблема с загрузкой изображений gallery/upload, там тоже через процессор, видимо тоже права, разбираться надо