R2m0x94 (Vasily)

R2m0x94 (Vasily)

С нами с 07 мая 2018; Место в рейтинге пользователей: #396
R2m0x94 (Vasily)
23 декабря 2021, 19:26
1
0
На всякий случай если не заработает, то
// удаляем плагин
if ($miniShop2 = $modx->getService('miniShop2')) {
    $miniShop2->removePlugin('cart');
}
// добавляем вновь
$plugin = '{core_path}components/minishop2/plugins/cart/availability/index.php';
if ($miniShop2 = $modx->getService('miniShop2')) {
    $miniShop2->addPlugin('availability', $plugin);
}
// результат в ms2_plugins: {"availability":"{core_path}components\/minishop2\/plugins\/cart\/availability\/index.php"}

/* Вложенность иерархии в дереве и подключение, тоже имеют значение:
plugins
|_cart
|_|_availability
|_|_|_index.php
|_|_|_msproductdata.map.inc.php
*/
Евгений Лазарев
27 февраля 2021, 17:18
2
0
Уважаемые разработчики, хотел бы попросить. Можно ли в следующем релизе изменить формат телефона в msorderhandler.class.php? Каждый раз приходится строчку менять на
substr(preg_replace('/[^-+()0-9]/iu', '', $value), 0, 16);
Нужен многим формат +7(999)999-99-99, то есть и "+" нужен и скобки, а в общей сумме получается 16 символов. Буду очень признателен.
Александр Туниеков
10 октября 2020, 04:10
1
+1
А вообще можно примерно так сделать простой редактор поля price
в чанке вывода результатов mfilter2 для поля price пишем:
<input type="number" class="autosave" data-product_id="[[+id]]" value="[[+price]]"/>
На страницу или в отдельный файл пишем скрипт
<script>
$(function() {
    $(document).on('change','.autosave',function(){
        $.post( "/assets/components/autosave/action.php", 
        { product_id: $(this).data('product_id'), value: $(this).val() })
          .done(function( data ) {
            alert( "Data Loaded: " + data );
          });
    });
});
</script>
Создаем файл /assets/components/autosave/action.php
<?php
define('MODX_API_MODE', true);
require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php';

$modx->getService('error', 'error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('FILE');

if (!$modx->user->hasSessionContext('mgr')){
    echo 'Access denied';
    exit;
}

if((int)$_POST['product_id'] > 0){
    if($product = $modx->getObject('msProduct',(int)$_POST['product_id']){
        $product->set('price', $_POST['price']);
        if($product->save()) echo 'success';
    }
}
Batys
14 мая 2020, 17:55
1
+1
Спасибо за наводку, разобрался и сделал так:
Сниппет addcart:
<?php
$miniShop2 = $modx->getService('minishop2');
$miniShop2->initialize($ctx, array('json_response' => $isAjax));
$article = $modx->getObject('msProductData', ['article' => $article]);
$miniShop2->cart->add($article->id, $count, $options);
Пример вызова:
[[!AjaxForm?
&snippet=`addcart`
&form=`tpl.AF.addcard`
&article=`11981000`
&count=`2`
]]
R2m0x94 (Vasily)
06 марта 2020, 10:33
1
+1
Впервые столкнулся с куки. Ранее не пробовал даже вникнуть в них. (
Первое, что пришло в голову после того, как хром с версией PHP 7.3 включил атрибут в куки `SameSite=None` and `Secure` or `SameSite=Lax`, так это добавить в $head элемент разметки
<meta http-equiv="set-cookie" content="name=yandex_login;lang=ru;expires=[[!+nowdate:default=`now`:strtotime:mpy=`1.002`:date=`%a, %e %b %Y %T`]] GMT;domain=.yandex.ru;path=/;SameSite=None;Secure" />
Но консоль не убрала предупреждений, а наоборот сообщила об ошибке.
Blocked setting the `name=yandex_login;lang=ru;expires= GMT;domain=.yandex.ru;path=/;SameSite=None;Secure` cookie from a `<meta>` tag.
Читал про это тут и тут, но решение получить куки сниппетом или исходя из этого решенияпроблему решить не удалось. Знаю только, что некоторые из них есть в Инструментах разработчика «Applications > Cookies (Storage)

Возможно, кто-то уже сталкивался с кукисами. Подскажите, как сделать сниппет [[!getCookie]] и [[!setCookie]]. И как пользоваться ими, для того чтобы предупреждения в консоле пропали о межсайтовых ресурсах <url>?

UPD: Чтобы не плодить кучу топиков ещё ссылка MODX session и cookie — помогите разобраться (https://modx.pro/help/8159)
Петропавловский Артем
30 апреля 2019, 10:50
1
0
Можете использовать конструкцию FIND_IN_SET запрос будет примерно такой:
$prefix = $modx->getOption('table_prefix');
$sql1 = "SELECT * FROM ".$prefix."site_tmplvar_contentvalues WHERE tmplvarid = 14 AND FIND_IN_SET('".$id."', replace(value, '||', ','))";
$statement = $modx->query($sql1);
$arr1 = $statement->fetchAll(PDO::FETCH_ASSOC);
foreach($arr1 as $item){
    $output[] = $item['contentid'];
}
Идентификатор TV и ресурса измените на свои. Здесь это уже обсуждалось, например, здесь. Ну, и из поста можете использовать в параметре where pdoResources:
[[!pdoPage?
&limit=`18`
&includeTVs=`categories`
&where=`["1 = 1 AND FIND_IN_SET('[[*id]]', replace(categories, '||', ','))"]`
]]
Илья
07 августа 2018, 14:35
4
+5
В общем пишу инструкцию для «чайников» (таких как я, и как делал я):
1. Скачиваем PuTTY для SSH (putty.exe)
2. Запускаем putty.exe и подключаемся введя данные SSH из панели управления сайтом.

Пароль пишите руками или вставляйте нажатием правой кнопки мыши. Пароль не будет виден, нажимайте enter и подключение пойдет дальше.
3. После того как Вы подключились вводим команду скачать и распаковать архив ай-болита (она указана выше):
wget https://revisium.com/ai/index.php?q=715147663154063253513112476309509 -O ~/aibolit.zip
unzip ~/aibolit.zip -d ~/aibolit
php ~/aibolit/ai-bolit/ai-bolit.php -p ~/ --mode=1 -o ~/report.json --no-html --delay=5 --all
Не забудьте обновить ссылку на айболит, которую можно взять здесь: revisium.com/ai/
Нажимаем enter и получаем вот это:

4. Ещё раз нажимаем enter, ждем 2-3 секунды и пошла проверка, которая может продлится несколько минут.
5. После окончания проверки, когда вы увидите результат в 100%, вводим команду
cat ~/report.json
и нажимаем enter.
6. На экране появится отчёт, который копируем от одной до другой узоной скобки (включительно).

7. После чего вставляем его сюда bezumkin.ru/utils/json
Получаем расшифровку отчёта, в котором перечислены файлы.

8. Ищем подозрительные файлы, с незнакомым названием. Если файл вам незнаком, проверяем его наличие в чистом modx revo, сравнивая его с github.com/modxcms/revolution

Я проверил все свои сайты. На одном нашёл несколько файлов, которые удалил.
Надеюсь, кому-то будет полезно.
Володя
15 мая 2018, 15:10
4
+1
как минимум переделать так
<?php


if ($modx->event->name === 'OnDocFormSave') {
   
    if($mode == 'new'){
        $modx->log(1, 'Новый');
        
        if (!$user = $modx->getAuthenticatedUser('web')) {
            // не получен пользователь
            return;
        }
        
        $user_id = $user->get('id');
        if (!$user_money_profile = $modx->getObject('msCustomerProfile', $user_id)) {
            // не получе профиль пользователя
            return;
        }
        
        $balance = (float)$user_money_profile->get('account');
       
        if (!empty($_POST['pricetpl'])){
            if ($balance >= 100) {
                $new_balance = $balance - 100;
                $user_money_profile->set('account', $new_balance);
                $user_money_profile->save();
                $modx->log(1, 'Списал баланс');
            }else { $modx->log(1, 'Недостаточно средств');}
        }
    }
}
Павел Романов
31 января 2018, 21:04
2
0
Можно на простых ресурсах.
Категории, к которым привязывать — просто через TV с типом «Множественный выбор».
Возможные значения формировать таким образом, чтобы при отметке получались ID через какой-нибудь разделитель.

Например, у категорий шаблон с ID = 5. В возможных значениях у TV пишете:
@EVAL return $modx->runSnippet('pdoResources',array(
'parents'=>15, // ID родителя категорий
'templates' => 5,
'limit'=>0,
'sortby'=>'{"pagetitle":"ASC"}',
'tpl'=>'@INLINE [[+pagetitle]]==#[[+id]]#',
'outputSeparator'=>'||'
));

Называете эту TV categories. У ресурсов выбираете, где выводить.

Вывод же в самой категории через tvFilters:
[[pdoResources?
&tvFilters=`categories==%#[[*id]]#%`
.....
]]

А комменты можете через TicketsComments к любому ресурсу прикрутить.
Олег Захаров
18 декабря 2017, 09:51
1
0
в чанке был такой код:
[[!If?
   &subject=`[[!isCustomer]]`
   &operator=`EQ`
   &operand=`1`
   &then=`
[[!pdoUsers?
	&limit=`0`
	&tpl=`@INLINE [[+product_id]]`
	&leftJoin=`{
        "msOrder": {
            "class": "msOrder",
            "on": "modUser.id = msOrder.user_id"
        },
        "msOrderProduct": {
            "class": "msOrderProduct",
            "on": "msOrder.id = msOrderProduct.order_id"
         }
    }`
    &select=`{
        "modUser": "*",
        "msOrder": "SUM(msOrder.cost) as sum",
        "msOrderProduct": "*"
    }`
    &sortby=`sum`
    &sortdir=`DESC`
    &where=`{"modUser.id:=":[[!+modx.user.id]], "msOrder.status":2}`
    &toPlaceholder=`userProductId`
]]

            [[!pdoResources?
            	&tpl=`@INLINE [[+id]]`
            	&where=`{"description:=" : "[[!+userProductId]]"}`
            	&sortby=`{"menuindex":"ASC", "pagetitle":"DESC"}`
            	&limit=`1`
            	&parents=`[[*id]]`
            	&toPlaceholder=`months`
            ]]
            [[!pdoResources?
            	&tpl=`lessonListTpl`
            	&where=`{ "template:=" : "11"}`
            	&sortby=`{"menuindex":"ASC", "pagetitle":"DESC"}`
            	&parents=`[[+months]]`
            	&showUnpublished=`1`
            	&product=`[[!+userProductId]]`
            ]]
`
   &else=`
       [[$ghostTemplate8Content]]
   `
]]
Код используется для поиска всех пользователей оплативших заказы (Minishop2) и выборки из них текущего пользователя для отображения купленных им товаров.
Код не я придумывал, пока сам не вкурил его.
Может подскажете где может быть проблема?