Роман Воропаев (Volk)

Роман Воропаев (Volk)

С нами с 03 декабря 2015; Место в рейтинге пользователей: #80
Андрей Коробков
16 февраля 2017, 01:00
1
0
Сделайте плагин на событие msOnChangeOrderStatus — в него параметр передается — order — анализируете его, а дальше ставите:
$modx->setOption('ms2_email_manager', $emails_string);

думаю должно сработать.
Александр
16 января 2017, 15:00
1
+1
Решил подобную проблему путем прикручивания костылей создания нового модификатора. сам вид размеров у меня 450*1800*115 или 450x1800x115.
в итоге чанк вызова опций tpl.msOptions:
{foreach $options as $name => $values}
    <div class="rowform">
        <span class="levoin" for="option_{$name}">{('ms2_product_' ~ $name) | lexicon}</span>
        <select name="options[{$name}]" class="in1" id="option_{$name}">
            {$values | sort : $name}
        </select>
    </div>
{/foreach}
модификатор sort:
<?php
if (!function_exists('first_num')) {
    function first_num(&$item) {		//функции получения первого и второго размера (ширины и высоты)
        if ( strpos($item,'*') )
            $item = substr($item,0,strpos($item,'*'));
        else
            $item = substr($item,0,strpos($item,'x'));
    };
    function second_num(&$item) {
        if ( strpos($item,'*') )
            $item = substr($item,strpos($item,'*'),3);
        else
            $item = substr($item,strpos($item,'x'),3);
    }
}
$output = '';
switch ($options) {		//ищем только поле размера, остальные выводятся без сортировки
    case 'size' :
        $vals = $input;		//$vals и $vals2 будущие массивы ключей
        $vals2 = $input;
        array_walk($vals, 'first_num');		//тут собственно обрезаются элементы исходного массива
        array_walk($vals2, 'second_num');
        $arr = ( count(array_unique($vals)) == 1 ) ? array_combine($vals2, $input) : array_combine($vals, $input);  // выбираем в первом случае массив с разной шириной, во втором с разной высотой
        ksort($arr);  //непосредственно сортировка по ключам
        foreach ($arr as $val)
            $output .= '<option value="'.$val.'">'.$val.'</option>';
        break;
    default :
        foreach ($input as $val)
            $output .= '<option value="'.$val.'">'.$val.'</option>';
        break;
}
return $output;
Fi1osof
14 января 2017, 04:04
5
+4
Здесь важно учесть следующий момент: проиндексирован http-сайт уже или нет. Если нет, то можно смело сразу зарубать на https с настройкой редиректа. А если да, то такая процедура запросто может выбить сайт из индекса на месяц-два, а то и больше (что вряд ли кому-то понравится). Дело в том, что http — Это 80-ый порт, а https — 443. Для поисковиков это разные сайты (технически ведь на разных портах могут быть разные сайты и может быть разный контент). И получается, что новый сайт еще не проиндексирован, а новый (https) еще не индексированный. По этой причине надо делать сайт доступным и по http и по https. Но тут возникает еще один момент: Страницы в MODX кешируются и могут возникать случаи, когда на http-страницах все ссылки на https и наоборот. Если с https-ссылками http- страницах еще не особо страшно, то на https-страницах это может приводить к тому, что часть контента просто не будет подгружаться (браузер заблокирует соединения на http с https-страниц). Я в таких случаях на сайте прописываю такой плагин:
if($modx->context->key == 'mgr'){
    return;
}
 
switch($modx->event->name){
    
    case 'OnMODXInit':
    // case 'OnHandleRequest':
        
        if(!empty($_SERVER['SERVER_PORT']) AND $_SERVER['SERVER_PORT'] == '443'){
            
            $modx->setOption('server_protocol', 'https');
            
            $modx->setOption('site_url', 'https://' . $modx->getOption('http_host', null) . $modx->getOption('base_url', null));
            
            $cache_prefix = $modx->getOption('cache_prefix', null, '/') . '443/';
            $modx->setOption('cache_prefix', $cache_prefix);
        }
        
        break;
}
Суть его в том, чтобы кеш-префикс поменять для https-запросов.
Важно: на разных хостингах вместо $_SERVER['SERVER_PORT'] может быть другой параметр, надо смотреть индивидуально

Тогда сайт не будет потерян поисковиком и не вызовет выпода из индекса.
В robots.txt еще надо прописать жестко Host: site_domain.
После этого месяца через три (когда поисковики полностью перестроят индексы), можно уже будет настроить и редирект.
Василий Наумкин
07 января 2017, 21:00
1
+2
Если речь про новую версию с одним чанком, то
{foreach $files as $file}
	{$file.properties.width}
	{$file.properties.height}
{/foreach}
Fi1osof
04 января 2017, 18:57
1
+2
Если ты не понял зачем, может тогда ты себя переоцениваешь?
Нет, это я тебя переоценил. Не думал, что ты до такого еще более мощного хардкода дойдешь… Все это ради того, чтобы добавить возможность регион в ExtJS-лейауте менять и кастомные JS-ки добавлять? Не кажется, что это слишком? Нельзя такое оправдывать словами «Конфликты приложений существовали до меня и будут существовать после». Не кажется, что надо все-таки какое-то более мягкое решение искать?

Ладно, это лирика. Я так понял, подмену в контроллере ты делаешь для того, чтобы можно было дерево документов справа выводить через кастомный JS-layout?
ОК, тогда такое решение, для примера:
# $scripts .= $this->getBaseManagerPageScripts();
$scripts .= $this->modx->smarty->get_template_vars('maincssjs');

$compressJs = $this->modx->getOption('compress_js', null);
if (!$compressJs) {
$layout_src = $this->getOption('jsUrl') .'mgr/core/modx.layout.js';
$scripts = preg_replace("/<script .+?assets\/modext\/core\/modx.layout.js.*?><\/script>/", "", $scripts);
}
Замена через регулярки, конечно, жестко, но в твоем случае это меньший хардкод, чем было. И в таком случае дерево справа выводится, и modxSDK работает.


А теперь интересное: я так понял, при включенной JS-компрессии в админке у тебя эта штука не работает? Ведь ты вклиниваешься только в блоке отключенной компрессии. Поэтому я и добавил проверку включена ли компрессия. Включаем компрессию, и уже кастомный JS отсутствует, и функционал не работает.


Не работает и без моих модификаций (без них только еще и modxSDK работать перестает).


Правда тут сложнее становится? Надо в компрессированный JS-файл вклиниться, а это уже гораздо сложнее и простой регулярочкой сложно, а главное — глупо. Поэтому ищем более правильное решение, а именно расширение самого MODx.Layout. Вот тебе такой расширяющий Layout.

Согласись, 90 строк лучше 420-ти?

А в классе твоем итоговый код будет таким:
# $scripts .= $this->getBaseManagerPageScripts();
$scripts .= $this->modx->smarty->get_template_vars('maincssjs');

$layout_src = $this->getOption('jsUrl') .'mgr/core/modx.layout.js';
$scripts .= "<script type=\"text/javascript\" src=\"{$layout_src}\"></script>";
И здесь сразу несколько плюсов:
1. Это работает теперь в том числе и на включенной компрессии.
2. Это не перетирает чужие кастомные скрипты.
3. Это не ломает чужие лейауты (сейчас, если кто-то переопределит на свой лад modx-layout, свой код его затрет).
4. Гораздо меньше кода (что обслуживать легче).
5. БОльшая обратная совместимость (не придется отслеживать версию MODX-а в случае, если в новой версии MODX-а будут изменения на уровне твоего текущего переопределенного блока контроллера).

В общем, если ты хочешь писать правильные компоненты, во-первых, меньше огрызайся и больше слушай других, а во-вторых, научись хотеть писать правильный код. У тебя есть мышление, но нет правильного взгляда на такие вещи.

P.S. А еще лучше пуллреквест бы в MODX отправил. Там вопрос в двух строчках.
lexikon
22 ноября 2016, 12:10
1
0
есть небольшая проблема в логике!
Если мы формируем заказ будучи не авторизованными, а потом авторизовываемся на странице оформления заказа, то корзина заменяется и мы теряем товары, которые только что сложили.
Для исправления необходимо чуть поправить событие OnWebLogin
case 'OnWebLogin':
        if ( $user = $modx->getAuthenticatedUser('web') and  $ms2 = $modx->getService('minishop2')) {
            $ms2->initialize($modx->context->key);
            $profile = $user->getOne('Profile');
            $extended = $profile->get('extended');
            if ( isset($extended['ms2cart']) && !empty($extended['ms2cart']) ) {
                $currentcart = $ms2->cart->get();
                $cart = array_merge($currentcart, $extended['ms2cart']);
                $ms2->cart->set($cart);
            }
        }
        break;
Василий Столейков
15 ноября 2016, 10:20
2
+2
Заметил баг в новой версии MODX — в управлении пакетами при нажатии на кнопку Посмотреть детали не подгружаются версии установленных пакетов:



Раньше я так постоянно чистил систему от старых ненужных версий…
Евгений Борисов
06 ноября 2016, 20:30
1
0
P.S.: Писать на Laravel приятно. Но куда девать любовь к MODX?
Сюда. Я это использую для того, чтобы манагер мог в любое место контента вставить галлерею или несколько. Форму обратной связи/подбора тура.
<?php $content = isset($content) ? Modx::mergeSnippets($content) : ''; ?>
@if( ! empty($content))
    <div class="contacts-form text-content" itemprop="articleBody">
        {!!  $content !!}
    </div>
@endif
Как пример https://premier-tur.com/sanitariums/abzakovo — страница объекта с несколькими каруселями и формой в произвольных местах. В итоге MODX теги обрабатываются не везде, а только там, где это нужно.
Семён Кудрявцев
12 октября 2016, 09:14
1
0
Классное решение, не знал, что так можно, в своё время решил этот момент с помощью компонента Quickstart Buttons от ребят из modmore.com — получалось вот такое — yadi.sk/i/v8u1NZoVwgRkz
Сергей Шлоков
03 сентября 2016, 08:04
1
+1
В файле snippets/game.php добавить работу с кэшем. Документация.