Руслан Кундиус

Руслан Кундиус

С нами с 01 июля 2013; Место в рейтинге пользователей: #264
Максим Кузнецов
25 января 2017, 16:39
2
+3
Понял, ну тогда со своей стороны предлагаю осветить «область действия» сугубо в связке с MODX'ом, т.к. вне него предостаточно примеров того, что можно сделать на голой ноде.

С уже существующими компонентами:

Tickets — оповещения о новых комментариях/созданных тикетах/активности в подписанных разделах. Также динамичное обновление ветки, при появлении новых комментариев. Какие-нибудь аналоги вконтактовских «Х понравилось ваше сообщение» для лайков, «На вашу тему подписался Х» и прочее как вариант.
miniShop2 — оповещение о создании или оплате заказа/смене статуса заказа/возможно, обновление корзины, при удалении или отключении товара. Вероятно, можно придумать что-нибудь для связки с курсом валют.
Также вырисовывается полноценный фронтэнд-интерфейс для менеджеров по обработке заказов.
(сам реализую нечто подобное в связке с нодой, выглядит примерно вот так):


— Любой календарный модуль (eventsCalendar2 и прочие) — динамичное обновление «событий» в календаре, при добавлении новых


Связка с остальными готовыми дополнениями, на мой взгляд, ограничивается простым «оповещением».

Компонентов, которых нет в общем пользовании, но периодически востребованные и подразумевающие реалтайм для полноценной работы и связку с данными MODX'a:

— чаты пользователей (общение/добавить-удалить участника/создать чат)
— переписки с администрацией без внешних сервисов
— мессенджеры с динамичным обновлением «новых сообщений»
— виджеты (динамичный мониторинг активности/покупок пользователей, их передвижение по сайту и тд и тп)
— оповещение об ошибках администрации (лог и прочее)
— динамичное отключение/обновление пользователя при изменении его прав/группы/статуса
— динамичный модуль тех, кто сейчас просматривает ресурс/раздел и тд.


В итоге, на мой взгляд, за редким исключением в виде полноценных модулей, основные возможности данной связки MODX + нода, которые уйдут в массы — это чаты и оповещение. В остальном задачи или слишком заточены под конкретный проект, или не требуют самого MODX'a, за исключением, возможно, авторизации.
Артём Добряков
02 октября 2014, 01:15
2
+1
Спасибо Володе за помощь, выкладываю решение данного вопроса, думаю многим пригодится.
1. Нужно создать класс-наследника msDeliveryInterface
2. Положить в /core/components/minishop2/custom/delivery/имякласса.class.php
3. Указать имя класса (не файла) в методе доставки, в админке.
Вот нашел рабочий код для кастомного класса:
<?php
class msDeliveryHandler_free10 extends msDeliveryHandler{
    public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0) {
        $cart = $this->ms2->cart->status();
        if ($cart['total_cost']<10000) { 
            $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;
    }
}
В коде выше мы написали что у нас стоимость доставки при сумме заказа больше 10 т.р. = 0.
4. Дальше создаем свой класс заказа и прописываем имя в настройках минишопа, кладем его сюда
core/components/minishop2/custom/order/Имя класса.class.php
Содиржимое:
<?php
if(!class_exists('msOrderInterface')) {
	require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/msorderhandler.class.php';
}

class Имя класса extends msOrderHandler implements msOrderInterface {

	public function getCost($with_cart = true, $only_cost = false) {
		$cart = $this->ms2->cart->status();
		$cost = $with_cart
			? $cart['total_cost']
			: 0;
		$deliveryCost = 0;


		/* @var msDelivery $delivery */
		if ($delivery = $this->modx->getObject('msDelivery', $this->order['delivery'])) {
			$cost = $delivery->getCost($this, $cost);
			$deliveryCost = $delivery->getCost($this, 0);
		}

		/* @var msPayment $payment */
		if ($payment = $this->modx->getObject('msPayment', $this->order['payment'])) {
			$cost = $payment->getCost($this, $cost);
		}

		return $only_cost
			? $cost
			: $this->success('', array(
									'cost' => $cost
									,'delivery_cost'=>$deliveryCost
									,'delivery_id'=> $this->order['delivery']['id']
									)
							);
	}
}
В коде вместо Имя класса, указываем свой.
5. Далее в чанке со строками вывода цены доставки (в нашем случае tpl.msOrder.delivery), оборачиваем плейсхолдер в
<span id="delivery_cost_[[+id]]">[[+price]]</span>
Вот и все, должно работать.