Денис Чубенко

Денис Чубенко

С нами с 02 марта 2017; Место в рейтинге пользователей: #611
Василий Наумкин
26 января 2015, 22:03
6
0
$pdo = $modx->getService('pdoFetch');
$result = $pdo->getArray(
	// Класс
	'msProduct',
	// Условие where
	array(
		'deleted' => false,
		'published' => true,
	),
	// Параметры выборки
	array(
		'parents' => 5, // Категория с товарами
		'innerJoin' => array(
			'Data' => array('class' => 'msProductData')
		),
		'select' => array('Data' => 'price'),
		'sortby' => 'Data.price',
		'sortdir' => 'asc',
	)
);
if (!empty($result)) {
	echo $result['price'];
}
// При желании можно лог посмотреть
echo '<pre>';
print_r($modx->getPlaceholder('pdoTools.log'));
Алексей Карташов
19 ноября 2014, 16:52
2
+1
Т.к. не мне одному интересна данная тема и кто-то даже добавил этот тикет себе в избранное, то расскажу-ка я об ещё одной возникшей проблеме дабы сэкономить потомкам часы гугления и нервы.

Вот такой вот нехитрый код:
$id = 1;

$o = $modx->getObject('myObjectOne', $id);
$o->fromArray(array(
  'active' => 0
));
// или так:
// $o->set('active', 0);

var_dump($o->save());
будет приводить к вот такой вот ошибке (в modx-логе):
Attempt to save lazy object: Array( <массив объекта> )

Дело в том, что такой вот унаследованный объект полученный методом $modx->getObject будет lazy (а вот через newObject всё хорошо). Не буду расписывать что это такое и почему. Факт в том, что сохраняться ничего не будет.
Чтобы всё работало как ожидается, надо в унаследованных классах переопределять метод set:
function set ($k, $v= null, $vType= '') {
  if ($this->isLazy()) $this->_loadFieldData($this->_lazy);
  return parent::set($k, $v, $vType);
}
Либо перед изменением данных объекта делать
$o->toArray();
// а потом что-то изменяем
$o->set('active', 0);
Тогда тоже будет хорошо, но это не удобно.

Лучше переопределить метод set и не заморачиваться. В этом случае $o->fromArray() тоже будет работать адекватно.
Evgeny Epifanov
22 сентября 2014, 17:28
2
+2
Если кому-то интересно, решил все кардинально:
if ($modx->event->name == 'OnLoadWebDocument') {
	$uri = $_SERVER['REQUEST_URI'];
	if ($modx->resource->isfolder && substr($uri, -1) != '/' && !strpos($uri, '?')) {
		$modx->sendRedirect($modx->makeUrl($modx->resource->id),array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
	}
}
Наумов Алексей
25 июля 2014, 09:37
1
+2
Да, сделал!

1. Переопределяем msCartHahdler. В частности функцию status:
public function status($data = array()) {
        $status = parent::status($data);

        // margin && discount
        $status['margin'] = $this->getCartMargin();
        $status['discount'] = $this->getCartDiscount();
        $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 = $total_cost + $margin;
        }
        if(!empty($discount)){
            $result = $total_cost - $discount;
        }
        return $result;
    }
getCartMargin, getCartDiscount — считайте скидку и наценку как хотите в них, для этого у вас есть $this->cart — корзина с товарами.

2. Копируем файл minishop2.js, указываем в настройках новый путь к нему, добавляем логику:

2.1 Метод miniShop2.Cart… setup
miniShop2.Cart.margin = '.ms2_margin';
miniShop2.Cart.discount = '.ms2_discount';
2.2. Метод status:
if(status['margin'] > 0){
                    $(miniShop2.Cart.margin).show();
                    $(miniShop2.Cart.margin + ' .ms2_margin_price').text(status['margin']);
                }
                else{
                    $(miniShop2.Cart.margin).hide();
                }
                if(status['discount'] > 0){
                    $(miniShop2.Cart.discount).show();
                    $(miniShop2.Cart.discount + ' .ms2_discount_price').text(status['discount']);
                }
                else{
                    $(miniShop2.Cart.discount).hide();
                }
3. Ну и добавляем в чанк cart.Outer строчки с наценкой и скидкой:
<div class="ms2_discount">Скидка: <span class="ms2_discount_price"></span></div>

<div class="ms2_margin">Наценка: <span class="ms2_margin_price"></span></div>