Денис

Денис

С нами с 11 декабря 2015; Место в рейтинге пользователей: #229
Денис
20 июня 2019, 09:42
+1
$modx->filterPathSegment($pagetitle)
Денис
11 июня 2019, 09:32
1
0
Зачем переключать что-то кроном, если ваш первый комментарий решит проблему. Только обработать условие нужно в шаблоне.
Делаем tv поле флажками со значениями от 1 до 7 и назовем например его day_of_sale. И в чанках вывода товаров используем
{if (''|date:'N') | in : ($_pls['tv.day_of_sale']|split:'||')}
    <button>Продается</button>
{else}
   Не продается
{/if}

И еще по хорошему добавить такое же условие в плагин на событие msOnBeforeAddToCart, если покупка идет через минишоп, чтобы нельзя было вообще в корзину добавить товар
switch($modx->event->name) {
    case 'msOnBeforeAddToCart':
        $days = explode('||', $product->getTVValue('day_of_sale'));
        if(!in_array(date('N'),$days)) {
            $modx->event->output('Вы не можете купить этот товар сегодня.');
        }
    break;
}

Все условия, естественно, можно сделать сложнее и любыми, но общий посыл думаю ясен.
Денис
21 мая 2019, 14:49
+2
За модуль webpack-assets-manifest спасибо, прикручу к своему конфигу и теперь нормально свяжу с modx.
Денис
11 января 2019, 18:18
+1
Можете phpthumbon использовать, там нет такой проблемы с русским языком.
Денис
09 января 2019, 09:31
+1
Спасибо за статьи по vuejs. Буквально месяц назад сам заинтересовался им. Применяли ли вы vuejs во frontend в связке с modx, на сколько его рентабельно использовать разработке коммерческих сайтов? На данный момент использовал vue в качестве компонентов корзины-заказа minishop2 на одном сайте, ради эксперимента, но не уверен, что не возникнут проблемы, если fronend будет полностью на vue. В основном интересует поддержка поисковиков и настройка SSR. Был ли подобный опыт?
Денис
26 декабря 2018, 09:46
0
Эх, немного не дождался обновления, сам поправил код под новый формат, на рабочих проектах. Те, кто сидят на АТОЛ, отправляйте заявку на смену ФФД сейчас, потому что она будет долго обрабатываться, не как у них заявлено 30-60 минут. Ждем уже несколько дней :)
Денис
14 декабря 2018, 15:20
+1
Предлагаю несколько вариантов решения проблемы.

Вариант первый, костыльный.
Нужно поставить слэш перед вызовом tv поля.
<img src="[[!phpthumbof? &input=`/[[+tv.image]]`&options=`&w=349&h=190&zc=C`]]" alt="[[+tv.image-alt]]">

Вариант второй.
Заходите в файл /core/components/phpthumbof/model/phpthumbof/phpthumbof.class.php
И меняете строку
220: if (strpos($input,'/') != 0 && strpos($input,'http') != 0) {
на
if (strpos($input,'/') != 0 && strpos($input,'http') !== 0) {

Вариант третий.
Ставите компонент phpthumbon от Павла Гвоздя и не знаете горя.
Денис
14 декабря 2018, 13:50
0
У вас отдельный медиаисточник для картинок?
Денис
14 декабря 2018, 13:31
0
Если $_modx->config.some_id это строка вида 1,18,19, то
{if $_modx->resource.id in list  $_modx->config.some_id|split}
    выводим 
{/if}
Денис
11 декабря 2018, 19:19
5
+5
Судя по исходникам просто так не выйдет.
Создайте плагин и повесьте на событие OnManagerPageBeforeRender
После вставьте следующий код:
<?php
switch ($modx->event->name) {
	case 'OnManagerPageBeforeRender':
        if($controller->config['controller'] == "mgr/orders") {
            if ($miniShop2 = $modx->getService('miniShop2')) {
                $modx->controller->addHtml('<style>.x-grid3-col-order-product-image img {width:40px;display:block;}</style>');
                $modx->controller->addHtml('
                    <script>
                        Ext.onReady(function(){
                            var originalGetColumns = miniShop2.grid.OrderProducts.prototype.getColumns;
                            miniShop2.config["default_thumb"] = miniShop2.config["defaultThumb"];
                            Ext.override(miniShop2.grid.OrderProducts,{
                                getColumns: function () {
                                	var imgFields = [ "product_thumb", "product_image" ];
                                    var columns = originalGetColumns.apply(this);
                                    for(var i=0; i<columns.length; i++){
                                    	if(imgFields.indexOf(columns[i]["dataIndex"]) != -1){
                                    		columns[i]["renderer"] = miniShop2.utils.renderImage;
                                    		columns[i]["id"] = "order-product-image";
                                    	}
                                    }
                                    return columns;
                                }
                            });
                        });
                    </script>
                ');
            }
        }
    break;
}

Если в системной настройке ms2_order_product_fields указан product_thumb или product_image, то вы увидите уже не ссылку, а картинку.
Денис
11 декабря 2018, 08:49
0
Попробуйте в конце цикла написать $modx->error->reset();
Денис
03 октября 2018, 09:22
+2
Исправил. Вся проблема в том, что строится неверный sql запрос.
Изначально он выглядит так (упрощу для читабельности):
SELECT * FROM `modx_site_content` AS `modResource` WHERE ( `modResource`.`pagetitle` LIKE '%%' OR `modResource`.`longtitle` LIKE '%%' OR `modResource`.`description` LIKE '%%' OR `modResource`.`content` LIKE '%%'  AND `modResource`.`published` = 1 AND `modResource`.`deleted` = 0 AND `modResource`.`context_key` = 'ru' )

По этому запросу у нас выходит, что мы получаем любые ресурсы, в которых содержится подстрока запроса, а если его нет, то вообще все ресурсы. Для того чтобы такого не происходило, нам нужно все условия для фильтрации по запросу сгруппировать, чтобы запрос выглядел так:
SELECT * FROM `modx_site_content` AS `modResource` WHERE ( ( `modResource`.`pagetitle` LIKE '%%' OR `modResource`.`longtitle` LIKE '%%' OR `modResource`.`description` LIKE '%%' OR `modResource`.`content` LIKE '%%' ) AND `modResource`.`published` = 1 AND `modResource`.`deleted` = 0 AND `modResource`.`context_key` = 'ru' )

Т.е. мы просто оборачиваем наши условия в скобки. Но построением запроса у нас занимается pdoResources. Для того, чтобы он составил такой запрос нам нужно вместо:
'where' => '{ 
    "OR:pagetitle:LIKE":"%' ~ $.get.query ~ '%", 
    "OR:longtitle:LIKE":"%' ~ $.get.query ~ '%", 
    "OR:description:LIKE":"%' ~ $.get.query ~ '%", 
    "OR:content:LIKE":"%' ~ $.get.query ~ '%"
}'

написать так:
'where' => '[{ 
    "OR:pagetitle:LIKE":"%' ~ $.get.query ~ '%", 
    "OR:longtitle:LIKE":"%' ~ $.get.query ~ '%", 
    "OR:description:LIKE":"%' ~ $.get.query ~ '%", 
    "OR:content:LIKE":"%' ~ $.get.query ~ '%"
}]'
Квадратные скобки в json запросе как раз и будут группировать наши условия и всё будет работать как надо.
Денис
20 сентября 2018, 10:34
+1
&suggestionsMaxFilters (по умолчанию 200) — Максимальное количество операций фильтрации (не самих фильтров), для которых работают предварительные результаты. Если операций требуется больше — suggestions отключатся.
&suggestionsMaxResults (по умолчанию 1000) — Максимальное количество ресурсов, для которых работают предварительные результаты. Если ресурсов будет больше — suggestions отключатся.
https://docs.modx.pro/komponentyi/msearch2/snippetyi/mfilter2
Денис
13 сентября 2018, 09:44
0
Спасибо огромное за анализ проблемы. На одном проекте тоже возникала проблема с тормозами, все никак руки не доходили разобраться в причине, думал что какая то карта генерируется при каждом обновлении, поскольку тормозить начинало с увеличением количества товаров.
Денис
09 августа 2018, 08:43
0
Черт побери, как лаконично. Я пытался в get это учесть. У меня работает. Насколько я понимаю, проблема в чем:
1) Вызывается метод get класса acProduct, в нем есть вызов loadData
2) В loadData вызывается метод getOne
3) В getOne класса msProduct вызывается родительский метод getOne класса xPDOObject
4) В getOne класса xPDOObject в этом куске кода
if ($criteria === null) {
    $criteria= array ($fk => $this->get($k));
    if (isset($fkdef['criteria']) && isset($fkdef['criteria']['foreign'])) {
        $criteria= array($fkdef['criteria']['foreign'], $criteria);
    }
}
вызывается снова метод get из класса acProduct, в котором вызывается loadData и все уходит в цикл.

Дмитрий, касательно того, что не проставляются связи без указания их в схеме. Я полагаю, что вы подключаете файл класса через require? Если так, то стоит в главном классе компонента вручную загрузить класс msProduct и тогда acProduct наследует все связи.
$this->modx->getService('miniShop2');
$this->modx->loadClass('msProduct');
Денис
08 августа 2018, 14:58
0
Если не ошибаюсь, то модель acProduct при расширении msProduct должна получить все её связи, т.е. эти четыре связи:
<aggregate alias="Category" class="msCategory" local="parent" foreign="id" cardinality="one" owner="foreign"/>
<composite alias="Data" class="msProductData" local="id" foreign="id" cardinality="one" owner="local"/>
<composite alias="Categories" class="msCategoryMember" local="id" foreign="product_id" cardinality="many" owner="local"/>
<composite alias="Options" class="msProductOption" local="id" foreign="product_id" cardinality="many" owner="local"/>
не нужны, поскольку они уже указаны в msProduct, и их нужно удалить из схемы и перегенерировать модель. Возможно возникает конфликт из-за того, что в acProduct и в родительском msProduct указаны связи с одинаковыми алиасами.
Денис
08 августа 2018, 14:28
0
Вам Володя верно написал, используйте его пример. У вас случайно нет сниппета «in», который переопределяет стандартный модификатор fenom?
Денис
08 августа 2018, 14:21
0
Можете показать схему таблицы этой модели? И еще конструктор (метод __construct). Есть подозрение, что неверно устанавливаются связи.
Денис
08 августа 2018, 14:10
0
Возможно вам подойдет компонент msSetInCart
Денис
08 августа 2018, 08:29
+1
Работать будет, только нужно одинарные кавычки заменить на двойные

{$_modx->resource.template | in : [20, 17, 32] ? "ключ найден: {$_modx->resource.template}" : "ключ не найден: {$_modx->resource.template}"}