Денис Усачев

Денис Усачев

С нами с 26 июля 2016; Место в рейтинге пользователей: #823
Семен Морозов
27 октября 2016, 17:57
4
0
Мне тут подсказалаи, что вот так можно сделать:

Изменения в msMiniCartDynamic строка 37
$out .= $modx->getChunk($tpl, array(
            'name_d' => $t['title'],
            'id_d' => $v['id'],
            'key_d' => $k,
            'count_d' => $v['count'],
            'price_d' => $v['price'],
            'sum_d' => $v['count'] * $v['price'],
            'img_d' => $t['img_path'],
            'options_d' => implode(';',$v['options']),
        ));
в core/components/msminicartdynamic/model/msminicartdynamic/msminicartdynamic.class.php строка 80
$success['data'] = array(
                        'key_d' => $k,
                        'id_d' => $v['id'],
                        'name_d' => $t['title'],
                        'count_d' => $v['count'],
                        'price_d' => $v['price'],
                        'sum_d' => $v['count'] * $v['price'],
                        'img_d' => $t['img_path'],
                        'options_d' => implode(';',$v['options']),
                    );
 В [[+options_d]] выводятся все опции через ;
Если все гуд, внесете в компонент?
Марат Марабар
25 августа 2016, 14:30
1
0
Не знаю. Я таких проблем не встречал, да и ты только об этом написал. Видимо у других тоже всё хорошо.
Даже не знаю чем помочь. Ссылка есть, чтоб посмотреть?
Володя
05 августа 2016, 22:35
21
+5
можно добавить так
создать плагин на pdoToolsOnFenomInit, в нем добавить модификатор detector
<?php
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
    if (!$fenom = $modx->getOption('fenom', $scriptProperties)) {
        return;
    }
    if (!$MobileDetect = $modx->getService('mobiledetect', 'MobileDetect', MODX_CORE_PATH . 'components/mobiledetect/')) {
	    return;
    }
    
    $key = $MobileDetect->config['force_browser_variable'];
    $device = !empty($_GET) && array_key_exists($key, $_GET)
		? $modx->stripTags($_GET[$key])
		: '';
	if (empty($device)) {
	    $device = $MobileDetect->getSettings();
    }
    if (empty($device)) {
        $detector = $MobileDetect->getDetector();
        $device = ($detector->isMobile() ? ($detector->isTablet() ? 'tablet' : 'mobile') : 'standard');
        $MobileDetect->saveSettings($device);
    }

    $fenom->addModifier("detector", function ($value) use ($device) {
        return $value == $device;
    });

    break;
}

и теперь в любом месте можно делать так
{if 'mobile'|detector}
mobile
{/if}

{if 'tablet'|detector}
tablet
{/if}

{if 'standard'|detector}
standard
{/if}
Андрей
22 июля 2016, 18:36
2
+2
Тут уже отвечали на подобный вопрос https://modx.pro/solutions/4844-dynamic-buy-button-in-the-shopping-cart/

Для себя сделал проще, при клике на корзину товара, к контейнеру добавляется класс -in-cart, по нему стилями заменяется кнопка. Что бы при перезагрузке страницы все не сбрасывалось сделал такой сниппет

$cart = $_SESSION['minishop2']['cart'];

foreach($cart as $product) {
  if ($product['id'] == $id) {
    $result = '-in-cart';
  }
}

return $result;

Принимает id товара, если он есть в корзине подставляет класс -in-cart.
Артур
30 июня 2016, 16:44
1
0
Здравствуйте, не подскажете, в чем может быть проблема?
Снипет msProducts некоторые товары выводит по два раза, причем никакой логики и закономерности обнаружить не удалось( Просто рандомные товары… Только первый раз товар выводится с первой фоткой из галереи, а второй раз — со второй. Лог чистый
Вот вызов снипета
[[!msProducts?
        &tpl=`tpl.msProducts.row.TPL`
        &includeThumbs=`227x170`
        &limit=`0`
        ]]
Вот чанк
<div class="item">
    
    <form method="post" class="ms2_form">
        <input type="hidden" name="id" value="{$id}">
		<input type="hidden" name="count" value="1">
		<input type="hidden" name="options" value="[]">
			
	<a href="{$id | url}">
		<img src="[[+227x170]]" alt="{$pagetitle}" title="{$pagetitle}"/>
		<div class="prev_item_name os3">{$pagetitle}</div>
	</a>
	<div class="prev_item_info">
		<table class="size_table">
			<tr>
				<td class="size_name">Размер, см:</td>
				<td class="size">
					[[!msOptions?
    					&tpl=`tpl.msOptions.TPL`
    					&product=`{$id}`
    					&name=`size`
    				]]
				</td>
			</tr>
		</table>
		<table class="char_table">
			<tr>
				<td>Чехол:</td>
				<td>{$cover_pr}</td>
			</tr>
			<tr>
				<td>Вес на 1 место:</td>
				<td>{$load}</td>
			</tr>
			<tr>
				<td>Жесткость:</td>
				<td>{$hard_pr}</td>
			</tr>
			<tr>
				<td>Блок пружин:</td>
				<td>{$block_pr}</td>
			</tr>
		</table>
		<table class="price_table os3">
			<tr>
				<td>
				    {if $old_price?}
                    <span class="prev_old_price">{$old_price}</span>
                    {/if}
					<span class="msop2 product-{$id} prev_price os4">{$price}</span>
				</td>
				<td><a href="{$id | url}">подробнее</a></td>
			</tr>
		</table>
	</div>
	
	</form>
</div>
Заранее огромное спасибо!
Володя
03 декабря 2015, 16:07
2
+1
да все нормально работает.
Ток что попробовал.

t1.vgrish.ru/img/img.php?text=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82!,%20%D1%8F%20%D0%BD%D0%B0%D0%B4%D0%BF%D0%B8%D1%81%D1%8C%20%D0%BD%D0%B0%20%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B5%20%20))))
<?php
define('MODX_API_MODE', true);
require_once dirname(dirname(__FILE__)) . '/core/config/config.inc.php';
require_once MODX_BASE_PATH . 'index.php';
if (empty($_GET['text'])) {
	die('введите текст');
}
$opts = [
	'background' => MODX_ASSETS_PATH . 'img/background.jpg',
	'font' => MODX_BASE_PATH . 'img/arial.ttf',
	'save' => MODX_ASSETS_PATH . 'img/g/',
	'size' => 30,
	'top' => 200,
	'left' => 200,
	'text' => $_GET['text']
];
$path = $opts['save'] . sha1($opts['text']) . '.jpg';
if (!file_exists($path)) {
	$img = imagecreatefromjpeg($opts['background']);
	$color = imagecolorallocate($img, 250, 0, 0);
	/* выводим текст на изображение */
	imagettftext(
		$img,
		$opts['size'],
		0,
		$opts['left'],
		$opts['top'],
		$color,
		$opts['font'],
		$opts['text']
	);
	imagejpeg($img, $path, 100);
	imagedestroy($img);
}
echo '<img src="' . str_replace(MODX_BASE_PATH, MODX_BASE_URL, $path) . '">';
gist.github.com/vgrish/5212d75feea58e96b08b
Павел Романов
19 ноября 2015, 17:27
5
+4
Делаете два сниппета.

Первый sortLink:
<?php
if($_GET['sort'] == $field and $_GET['dir'] == 'ASC') {$arr='&_uarr;';}
if($_GET['sort'] == $field and $_GET['dir'] == 'DESC') {$arr='&_darr;';}
if(!$_GET[$field]){
	if($_GET['dir'] == 'ASC'){
		$output = '<a href="'.$url.'?'.$q.'sort='.$field.'&dir=DESC#prod">'.$name.''.$arr.'</a>';
	} else {
		$output = '<a href="'.$url.'?'.$q.'sort='.$field.'&dir=ASC#prod">'.$name.''.$arr.'</a>';
	}
} else {
	$output = '<a href="'.$url.'?'.$q.'sort='.$field.'&dir=ASC#prod">'.$name.'</a>';
}
return $output;
(во второй и третьей строке только уберите нижнее подчеркивание в &_uarr; и &_darr;)

Второй Sort:
<?php
$sort = $_GET['sort'];
if($sort == '') {
    $output='&sortby=`{"menuindex":"ASC"}`';
} else {
    $output = '&sortby=`{"'.$sort.'":"'.$_GET['dir'].'"}`';
}
return $output;

Используете так:
<div class="sort">
Сортировать: 
[[!sortLink? &url=`[[*uri]]` &field=`pagetitle` &name=`по названию`]]  
[[!sortLink? &url=`[[*uri]]` &field=`price` &name=`по цене`]]  
</div>
<div class="results">
[[!pdoResources?
&parents=`...`
&tpl=`...`
.........
[[!Sort]]
]]
</div>
Максим Кузнецов
02 августа 2015, 18:42
7
+7
Необходимо создать кастомный класс доставки:

1) Идем в core/components/minishop2/custom/delivery/ и создаем здесь свой пхп файл (допустим, mscustomdeliveryhandler.class.php) со следующим содержимым:

<?php

//Важно: при изменении названия файла, вот в этом месте также нужно изменить класс
class mscustomdeliveryhandler extends msDeliveryHandler{

	public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0) {
        $cart = $this->ms2->cart->status();
        
	//условие начисление доставки
        if ($cart['total_cost'] < 5000) {
            $add_price = $delivery->get('price');
            if (preg_match('/%$/', $add_price)) {
                $add_price = str_replace('%', '', $add_price);
                $add_price = $cost / 100 * $add_price;
            }
            $cost += $add_price;
        }
        
        return $cost;
    }

}

2) Идем в настройки магазина -> Варианты доставки.
Создаем новый вариант «Доставка» (или редактируем исходный), после чего заполняем в «дополнительную стоимость» требуемое значение (300 рублей), в Класс-обработчик пишем название созданного файла — mscustomdeliveryhandler, заполняем доступные способы оплаты и ставим галочку напротив «включен».
Наумов Алексей
09 апреля 2015, 09:50
1
+1
Даю полный код своей расширенной корзины:

<?php
class myCartHandler extends msCartHandler{

    private $marginPercent = 5.0;
    private $discountPercent = 2.0;

    public function getMarginPercent(){
        return $this->marginPercent;
    }
    public function getDiscountPercent(){
        return $this->discountPercent;
    }

    /* @inheritdoc} */
    public function status($data = array()) {
        $status = parent::status($data);

        // margin && discount
        $status['margin'] = $this->getCartMargin();
        $status['discount'] = $this->getCartDiscount();
        //$status['total_cost_ex'] = $this->calcTotalCostEx($status['total_cost'], $status['margin'], $status['discount']);
        $status['total_cost'] = $this->calcTotalCostEx($status['total_cost'], $status['margin'], $status['discount']);

        return $status;
    }

    public function calcTotalCostEx($total_cost, $margin, $discount){
        $result = $total_cost;
        if(!empty($margin)){
            //$result = $this->roundCost($total_cost + $margin);
            $result = $total_cost + $margin;
        }
        if(!empty($discount)){
            //$result = $this->roundCost($total_cost - $discount);
            $result = $total_cost - $discount;
        }
        return $result;
    }

    public function getCartMargin(){
        $count = 0;
        $totalCount = 0;
        $totalCost = 0;
        $tmpPrice = 0;
        foreach ($this->cart as $item) {
            if (empty($item['ctx']) || $item['ctx'] == $this->modx->context->key){
                $count++;
                $totalCount += $item['count'];
                $tmpPrice = $item['price'];
                $totalCost += $item['price'] * $item['count'];
            }
        }

        // наценка, если в корзине 1 товарная позиция, с кол-вом 2 шт и ценой менее 4000 рублей
        if($count == 1 && $totalCount <= 2 && $tmpPrice < 4000){
            return $this->roundCost($totalCost * ($this->marginPercent / 100.0));
        }
        return 0;
    }

    public function getCartDiscount(){
        $countSet = 0;
        $totalCost = 0;
        foreach ($this->cart as $item) {
            if (empty($item['ctx']) || $item['ctx'] == $this->modx->context->key){
                if($item['count'] >= 4){
                    $countSet ++;
                }
                $totalCost += $item['price'] * $item['count'];
            }
        }

        // скидка, если в корзине 2 комплекта
        if($countSet >= 2){
            return $this->roundCost($totalCost * ($this->discountPercent / 100.0));
        }
        return 0;
    }

    public function roundCost($cost){
        return round($cost / 50) * 50;
    }
}
Она делает скидку 2%, если в корзине есть как минимум 2 разных товара по 4 штуки (это магазин шин и дисков, т.е. имеется ввиду что в корзине минимум 2 набора по 4 колеса или диска). Так е есть наценка 5% если в корзине всего 1 товарная позиция с кол-вом меньшим или раным 2 штук (например 1 или 2 покрышки) и общей суммой заказа меньше 4 тысяч рублей…

+ тут еще есть округление скидки или наценки до 50 рублей функцией roundCost
Володя
05 февраля 2015, 21:54
1
+2
ага, точно, про это я чет не подумал )
тогда вот так можно
<?php
if ($modx->event->name == 'OnBeforeDocFormSave') {

    if($resource->get('class_key') !== 'msProduct') {return;}
    $article = $resource->get('article');
    if(empty($article)) {return;}
    $q = $modx->newQuery('msProductData', array('article' => $article ));
    $q->where(array(
	    'msProductData.id:!=' => $resource->get('id')
    ));
    foreach ($modx->getIterator('msProductData', $q) as $re) {
        $response = array(
			'success' => false,
			'message' => 'Продукт с таким артикулом уже существует',
			'data' => array(),
		);
		echo $modx->toJSON($response);
		exit;
    }

}