Денис Усачев

Денис Усачев

Был в сети 08 сентября 2025, 16:16
Заказы не принимаю
Павел Романов
Павел Романов
Сниппет можно сократить до такого ):
<?php
$out = [];
$table = $modx->getOption('table_prefix').'msop_colors';
if($query = $modx->query("SELECT color, pattern FROM {$table} WHERE value = '{$color}'")){
    $out = $query->fetch(PDO::FETCH_ASSOC);
}
return $out;
Илья Александрович
Илья Александрович
вот решение:
{'!mFilter2' | snippet : [
                            'class' => 'msProduct',
                            'element' => 'msProducts',
                            'loadModels' => 'msTopProducts',
                            'parents' => $_modx->resource.id,
                            'showHidden' => '0',
                            'showUnpublished' => '0',
                            'hideContainers' => '0',
                            'showLog' => '0',
                            'suggestions' => '1',
                            'ajaxMode' => 'default',
                            
                            'includeThumbs' => 'medium,480x576',
                            'tpls'  => 'tpl.product.block,tpl.product.row',
                            
                            'tplOuter' => 'tpl.mFilter2.outer',
                            'tplFilter.outer.default' => 'tpl.mFilter2.filter.outer',
                            'tplFilter.row.default' => 'tpl.mFilter2.filter.checkbox',
                            
                            'filters' => '
                                resource|parent:parents,
                            ',
    
                            'leftJoin'=>'{
                                "P1": {
                                    "class": "msProductOption",
                                    "on": "P1.key = \'p1\' and P1.product_id = msProduct.id"
                                },
                                "P2": {
                                    "class": "msProductOption",
                                    "on": "P2.key = \'p2\' and P2.product_id = msProduct.id"
                                },
                            	"msTopProduct" : {
                            		"class" : "msTopProduct",
                            		"alias" : "msTopProduct",
                            		"on" : ["msTopProduct.product_id = msProduct.id", "msTopProduct.category_id = ' ~ $_modx->resource.id ~ ' "]
                            	}
                            }',   
                        
                            'sortAliases' => '{"p1":"P1","p2":"P2"}',
                            'aliases' => 'p1|value==p1,p2|value==p2',
                            
                            'sortby' => '{"msTopProduct.rank":"DESC", "msProduct.menuindex":"ASC"}',
                            
                            'limit' => '9',
                            'pageLimit' => '7',
                            
                            'tplPage' => '@INLINE <li class="page-item control"><a class="page-link" href="[[+href]]">[[+pageNo]]</a></li>',
                            'tplPageWrapper' => '@INLINE <div class="col-12 pagination justify-content-center"><ul class="pagination">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul></div>',
                            'tplPageActive' => '@INLINE <li class="page-item active"><span class="page-link">[[+pageNo]]</span></li>',
                            'tplPageFirst' => '@INLINE <li class="page-item control"><a class="page-link" href="[[+href]]"><i class="fas fa-angle-double-left"></i></a></li>',
                            'tplPageLast' => '@INLINE <li class="page-item control"><a class="page-link" href="[[+href]]"><i class="fas fa-angle-double-right"></i></a></li>',
                            'tplPagePrev' => '@INLINE <li class="page-item control"><a class="page-link" href="[[+href]]"><i class="fas fa-angle-left"></i></a></li>',
                            'tplPageNext' => '@INLINE <li class="page-item control"><a class="page-link" href="[[+href]]"><i class="fas fa-angle-right"></i></a></li>',
                            'tplPageSkip' => '@INLINE <li class="page-item disabled"><span>...</span></li>',
                            'tplPageFirstEmpty' => '@INLINE ',
                            'tplPageLastEmpty' => '@INLINE ',
                            'tplPagePrevEmpty' => '@INLINE ',
                            'tplPageNextEmpty' => '@INLINE ',
                            'ajaxTplMore' => '@INLINE <button class="btn btn-outline-danger rounded-0 my-3 btn-more">Загрузить ещё</button>',
                        ]}
Илья Александрович
Илья Александрович
Вот рабочий вариант, только как сразу все категории перезаписать не получилось сделать, нужно менять parent
<?php
$products = $modx->getIterator('msProduct', array('parent' => 125));
foreach($products as $product){
    $options = $product->getMany('Options');
    $options = array(
    	'quantity' => array('99999'),
    );
    $product->set('options', $options);
    $product->save();
};
Артур Шевченко
Артур Шевченко
Думаю стоить дополнить этот пост раз он есть в поиске. Во-первых на мой взгляд решение не самое лучшее, но достаточно простое, поэтому я его немного переделал для компактности
ПЛАГИН
<?php
switch ($modx->event->name) {
    case 'OnDocFormSave':
        $sql = 'SELECT article FROM modx_msop_modifications WHERE rid= ?';
        $statement = $modx->prepare($sql);
        if ( $statement->execute(array($id)) ) {
            $result = $statement->fetchAll(PDO::FETCH_COLUMN);
        }
        $resource->set('introtext', implode(',',$result));
        $resource->save();
    break;
}
КОД ДЛЯ КОСОЛИ, чтобы обновить товары
<?php
$resources = $modx->getIterator('msProduct');

foreach ($resources as $resource) {
    $id = $resource->get('id');
    $sql = 'SELECT article FROM modx_msop_modifications WHERE rid= ?';
    $statement = $modx->prepare($sql);
    if ( $statement->execute(array($id)) ) {
        $result = $statement->fetchAll(PDO::FETCH_COLUMN);
    }
    $resource->set('introtext', implode(',',$result));
    $resource->save();
}
Константин Ильин
Константин Ильин
Недавно делал для товаров Минишопа.
$gallery = array(
    'id' => $id,
    'file' => $URL_FULL // https://site.ru/img/123.jpg
);
$upload = $modx->runProcessor('gallery/upload', $gallery, array(
    'processors_path' => MODX_CORE_PATH.'components/minishop2/processors/mgr/'
));

if ($upload->isError()) {
    //print_r($upload->getResponse());
}
$modx->error->reset();

для ms2gallery
// Почему то источник у меня слетал, так что этот код возможно не нужен.
if ($resource = $modx->getObject('modResource', $id)) {
    $properties = $resource->getProperties('ms2gallery');
    $properties['media_source'] = 3;
    $resource->setProperties($properties, 'ms2gallery');
    $resource->save();
}

$gallery = array(
    'id' => $id,
    'file' => $URL_FULL // https://site.ru/img/123.jpg
);

$upload = $modx->runProcessor('gallery/upload', $gallery, array(
    'processors_path' => MODX_CORE_PATH.'components/ms2gallery/processors/mgr/'
));
Артур Шевченко
Артур Шевченко
$(document).on('msoptionsprice_product_action', function (e, action, form, response) {
    var mid = $('input[name="curmid"]').val();
    //console.log(response);   
       if(response.data.modification.count == 0){
            $('.modprice-' + response.data.modification.rid).each(function(){$(this).css('display', 'none')}); //показываем НЕТ В НАЛИЧИИ
            $('.modpricenone-' + response.data.modification.rid).each(function(){$(this).css('display', 'inline')}); //показываем В НАЛИЧИИ
            $('.jsAddToCart').prop('disabled', true);
        }else{
            //тут наоборот
            $('.modprice-' + response.data.modification.rid).each(function(){$(this).css('display', 'inline')});
            $('.modpricenone-' + response.data.modification.rid).each(function(){$(this).css('display', 'none')});
            $('.jsAddToCart').prop('disabled', false);
        }  
});
Писать тут assets/components/msoptionsprice/js/web/default.js но лучше сделать копию, поменять путь в настройках, и в копии писать.