R2m0x94 (Vasily)

R2m0x94 (Vasily)

С нами с 07 мая 2018; Место в рейтинге пользователей: #612
R2m0x94 (Vasily)
10 июня 2021, 14:44
0
Т.е сначала вызываю msProducts
&where=`{ "id:IN":[{$_modx->resource['dopid']}]}`

Далее
{'!msProductKits' | snippet : [
    'tplWrapper' => 'outerTpl',
    'mode' => 'owner',
    'tpl' => 'tpl.msProductKits.Item2',
    'sortby' => 'id',
    'sortdir' => 'asc',
]}
Хороший компонент. Спасибо :)
R2m0x94 (Vasily)
09 июня 2021, 18:05
0
В моём случае мне хватило вывести так (в tv на админке для возможных значений в списке):
<?php
// [[!tvLabelnameCountry? &tvVal=`[[+tv.vendor_address]]`]]
$tvArr = explode('||', $tvVal);

foreach($tvArr as $n => $v) {
   echo strstr($v, '=', true);
}

А, так как задача с поставщиками и производителями перешла на ms2 в связке с ресурсами, то пришёл к такому результату, так как с id-шниками не стал заморачиваться, но потребовалось просто вывести страну [[+vendor.country]]:
<?php
/**
 * Получаем страну производителя из настроек ms2 по имени $name. 
 * Если используется для поставщика, то имя может отсутствовать, поэтому ничего не выводим.
 * Если же необходимо получить по id, то 'name' заменить на 'id' (Тodo: Кастумизация)
 * 
 * $page = $modx->getObject('modResource', ['id' => 13]);
 * $output = $page->get('pagetitle');
 * 
 * return $output;
 * 
 * Пример вызова:
 * [[!msVendorCountry? &name=`{$purveyor | resource : "pagetitle"}`]]
 * {'!msVendorCountry' | snippet : ['name' => $purveyor | resource : "pagetitle"]}
 * 
 */

//$name = 'Sony';
$vendor = $modx->getObject('msVendor', ['name' => $name]);
if (!is_object($vendor)) {
    return '';
}
$output = ', '.$vendor->get('country');
return $output;

Код чанка в чанке с mFilter2:
{if $_pls['tv.purveyor']!= ''}
   {foreach $key as $purveyor index=$index}
        {$purveyor | resource : "pagetitle"}{'!msVendorCountry' | snippet : ['name' => $purveyor | resource : "pagetitle"]}
    {/foreach}
{/if}
R2m0x94 (Vasily)
12 апреля 2021, 18:50
0
Возможно, что версия библиотеки не подходит, хотя возможно, что ссыль ссылается не на корень сайта, а на корневую директорию сервера
<script>
$.ajax({
  type: m_method, // "GET",
  url: m_action, // "assets/components/x.php",
  data: $('#connect_table').serialize() // m_data
}).done(function(result){
  $('#connect_table').html(result);
});
return false;
</script>
R2m0x94 (Vasily)
30 декабря 2020, 01:16
0
Но при добавлении к товару, когда после перейти в пакет msProductKits, там пусто :'( печалька…
R2m0x94 (Vasily)
30 декабря 2020, 00:59
0
Алексей, Спасибо. Тоже делал такой функционал, но только через тв. перечислял id дополнительных, но тут почувствовал гибкость исполнения. Только поставил и смотрю чанк. Предлагаю заменить на такой
{var $item_name = $product | resource : 'pagetitle'}
<tr>
    <td style="width: 40%;">
        {if $product > 0}
        <strong><a href="{$product | url}">{$item_name}</a></strong>
        {else}
        <strong>{$name}</strong>
        {/if}
    </td>
    <td style="width: 50%;"><small>{$description}</small></td>
    <td style="width: 10%; text-align: center;">
        <small>{$count} шт.</small>
    </td>
</tr>
R2m0x94 (Vasily)
17 декабря 2020, 19:26
+4
Когда пролистываешь вниз баг, оказываешься наверху. И такой баг уже довольно давно наблюдается. Спасибо
R2m0x94 (Vasily)
10 ноября 2020, 19:53
0
Было бы неплохо, да и посмотрел примеры vYLVjRz, ZEWJNRE, PoNjpYG — крутая тема, тут надо подумать как использовать её с getTables или с pdoTools. Так, как понимаю, что pdoTools вообще обновляться возможно не будет больше.
R2m0x94 (Vasily)
26 октября 2020, 21:15
0
Нет, он создаётся на время запроса, затем чистится и отследить сложно, поэтому в лог попадает последующий запрос, который кешируется и пишется в лог, потому что его уже нет и создался новый. Тут вариант допиливать инструкцию или комментировать например дописать условия отработки в лог
R2m0x94 (Vasily)
26 октября 2020, 19:03
0
Да ошибки так и не ушли, пока решил просто комментарием вывода этой ошибки в лог, но это не решение проблемы. Конечно можно отключить кэширование бд, но это тоже не решение проблемы. Если только частичное, но вопрос до сих пор ещё активный
R2m0x94 (Vasily)
11 октября 2020, 01:37
0
На фронте цена без success не обновляется, поэтому перезагрузка, пока как решить не знаю
R2m0x94 (Vasily)
11 октября 2020, 01:14
0
Возможно success не пишется из-за версии jQuery 3.4.1.., а на закуску рабочий вариант, правда с перезагрузкой :/
<script>
// Пришлось делать перезагрузку стр.
$(document).on('change','.autosave', function(){ 
    //$.post('assets/components/autosave/action.php', { product_id: $(this).data('product_id'), price: $(this).val()}).done(function(data) { 
    //    alert("Data Loaded: " + data);
    //});
    $.ajax({  
        type: "POST",  
        url: 'assets/components/autosave/action.php', 
        data: { product_id: $(this).data('product_id'), price: $(this).val()},
        success:  function(data) { 
            if (!data){
                miniShop2.Message.success('Успешно обновлена!' + data)
                location.reload(true);
                //setInterval('location.reload()', 444);
            } else{
                miniShop2.Message.error('Что-то пошло не так, попробуйте позже!');
                console.log($.post);
                console.log(data);
            }
        } 
    }); 
});

</script>
В чанке вывода mFilter2
<input type="number" name="price" class="autosave" data-product_id="{$id}" value="{$price | replace : ' ' : ''}"/>
А в action.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

define('MODX_API_MODE', true);
//require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php';

/** @noinspection PhpIncludeInspection */
require 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']);
        $product->save();
    }
}
R2m0x94 (Vasily)
11 октября 2020, 00:16
0
Работает, спасибо :)
У меня кэшировался mFilter2, от туда и непонятки были, но в уведомление data всё ровно не пишется :(
R2m0x94 (Vasily)
10 октября 2020, 23:44
0
<script>
$(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);
        console.log($.post);
      });
});
</script>
В пост отправляется
ƒ (a,c,d,e){return n.isFunction©&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}
R2m0x94 (Vasily)
10 октября 2020, 23:26
0
Спасибо, поправил, но сохранения не происходит, консоль пустой, data пустая, ошибок нет, единственное, что пишет консоль — предупреждение
[Violation] 'load' handler took 1776ms
И alert вылетает
Data Loaded:
R2m0x94 (Vasily)
10 октября 2020, 12:49
0
Спасибо, попробовал. /assets/components/autosave/action.php отдаёт 500 ошибку при смене цены и не сохраняет
R2m0x94 (Vasily)
10 октября 2020, 11:42
0
Ну не на всю продукцию править надо цены, а на некую часть. Да на счёт умножения я знаю как сделать, и к тому же msPre решает эту проблему, но вопрос в другом, про фронтенд
R2m0x94 (Vasily)
10 октября 2020, 01:10
0
Ещё не пробовал, попробую отпишусь. Кстати существует атрибут content=editable на саму таблицу, которую вывожу, через mFilter2. Люди говорят, что можно через процессор сохранять по ajax, следовательно вариант проще есть, просто надо вещать на элемент и сохранить будет возможно, правда, вот как через процессор это сделать с ajax пока не вникал, но через форму на php по sql запросу получается отредактировать таблицу (без процессора modx, пока тестирую). GetTables слишком трудно даётся, да и к тому же ещё не успел спросить про фильтр, так и не дошел до него, а про getTabs, тоже не вникнул почему у меня нет вкладок, как их туда прописать.

По сути мне всего то надо в уже имеющейся таблице, которую вывожу на mFilter2 — сделать ячейку или поле +price доступным для быстрого редактирования (событие doubleClick например), так как цены часто меняются и всё, вот думаю если товаров больше 100k как это сделать? И я понимаю, что это реально сделать, но с процессором MODX ещё не доводилось иметь дело, думаю вскором проработать этот вопрос, если есть решение буду очень благодарен
R2m0x94 (Vasily)
08 октября 2020, 13:37
0
Да в модульном есть, но модульное не использую, так как и так в quickview таблица в модульном выводится. И надо в таблице прикрутить редактор. Прикрутить, то получается, вот только загвоздка при авто сохранении не понимаю ничего не происходит, а когда из textarea убираю атрибут data-editor=«xml», то редактор слитает и авто сохранение происходит.

Если добавить класс к textarea[data-editor] в assets/components/gettables/js/gettables.js
$('.ace_text-input').addClass('get-table-autosave');
То вообще row не выводится