Кирилл

Кирилл

С нами с 02 мая 2019; Место в рейтинге пользователей: #88
Александр Туниеков
17 августа 2021, 13:06
2
+1
Вообщем победил кеширование :-).
{'!mFilter2' | snippet : ['cacheTime'=>3600]}
Параметр cacheTime на 3600 включает кеширование запросов в базу. В mFilter2 кеширование не доработано. Сейчас 8 часов возился и сделал. Нужно заменить код файла core/components/msearch2/model/msearch2/msearch2.class.php кодом из https://gist.github.com/touol/a1c46d7fd199c0889c361c4075c28d39
К сожалению, не правя компонент, не исправишь кеширование.
На виндоус локалке при кешировании время ответа на категории с 4000 товаров сокращается с 30-60сек до 3-8сек со включенными подсказками. На боевом сайте не тестировал.
Можите попробовать у себя.
Можно еще ускорить вывод страницы кешируя сам выводmfilter2. Но это если договоримся по работе. Если что мой час стоит 600р.
Михаил
20 апреля 2020, 11:51
2
0
Чтобы поменять 302 редирект на 301, не правя исходники и с сохранением возможности обновления pdoTools, нужно:
1. Создать в системных настройках modx настройку pdoPage.class со значением pdotools.pdopagecustom joxi.ru/Dr8ygaRhoEYjgm
2. Создать в папке core/components/pdotools/model/pdotools файл pdopagecustom.class.php со следующим содержимым:
<?php

require_once MODX_CORE_PATH . 'components/pdotools/model/pdotools/pdopage.class.php';

class pdoPageCustom extends pdoPage
{
    /** @var modX $modx */
    public $modx;
    /** @var pdoTools $pdoTools */
    public $pdoTools;
    /** @var string $req_var */
    protected $req_var = '';


    /**
     * @param modX $modx
     * @param array $config
     */
    public function __construct(modX & $modx, $config = array())
    {
        $this->modx = &$modx;

        $fqn = $modx->getOption('pdoTools.class', null, 'pdotools.pdotools', true);
        $path = $modx->getOption('pdotools_class_path', null, MODX_CORE_PATH . 'components/pdotools/model/', true);
        if ($pdoClass = $modx->loadClass($fqn, $path, false, true)) {
            $this->pdoTools = new $pdoClass($modx, $config);
        } else {
            return;
        }
        $modx->lexicon->load('pdotools:pdopage');
    }
    
    /**
     * Redirect user to the first page of pagination
     *
     * @param $isAjax
     *
     * @return string
     */
    public function redirectToFirst($isAjax = false)
    {
        unset($_GET[$this->pdoTools->config['pageVarKey']]);
        unset($_GET[$this->modx->getOption('request_param_alias', null, 'q')]);
        if (!$isAjax) {
            $this->modx->sendRedirect(
                $this->modx->makeUrl(
                    $this->modx->resource->id,
                    $this->modx->context->key,
                    $_GET,
                    'full'
                ),
                array('responseCode' => 'HTTP/1.1 301 Moved Permanently')
            );

            return '';
        } else {
            $_GET[$this->pdoTools->config['pageVarKey']] = 1;
            $_REQUEST = $_GET;

            return $this->pdoTools->runSnippet('pdoPage', $this->pdoTools->config);
        }
    }

}
В функции redirectToFirst добавлен 301 редирект.
Павел Гвоздь
10 марта 2020, 14:19
1
0
/** @var msDelivery $delivery */
if (!empty($this->order['delivery']) && $delivery = $this->modx->getObject('msDelivery',
$this->order['delivery'])
) {
$cost = $delivery->getCost($this, $cost);
$deliveryCost = $delivery->getCost($this, 0);//Добавил переменную где получаем price доставки
}
А что если в методе msDeliveryHandler::getCost стоимость доставки зависит от стоимости заказа во втором переданном параметре $cost? А вы туда «0» передаёте. Следовательно ваша стоимость доставки будет одна, а по сути — другая. Надо делать как-то так:

/** @var msDelivery $delivery */
if (!empty($this->order['delivery']) && $delivery = $this->modx->getObject('msDelivery',
        $this->order['delivery'])
) {
    $cost_old = $cost;
    $cost = $delivery->getCost($this, $cost);
    $delivery_cost = $cost - $cost_old;
    unset($cost_old);
}
Баха Волков
06 февраля 2020, 22:07
5
+12
Не не не, не делайте так, помните или почитайте о DRY. С парсером MODX все понятно, ей сложно помочь, но феном-то полноценный шаблонизатор:

{foreach ['receiver', 'phone', 'index', 'region', 'city', 'street', 'building', 'room', 'comment', 'customfield'] as $field}
    {if $address[$field]?}
        <tr>
            <td style="{$style.th};width: 200px; font-weight: 600;">{('ms2_frontend_' ~ $field) | lexicon}: </td>
            <td style="{$style.th}">{$address[$field]}</td>
        </tr>
    {/if}
{/foreach}

8 моих строчек против твоих 80-ти
Александр
22 июля 2017, 22:57
2
0
Точно!
Так и сделал. Мне тоже нужно было изменить сортировку.
В функции buildTVsFilter закомментировал ksort($results);
А в функцию getTvValues после:
else {
						$filters[$name][$v] = array($row['id'] => $row['id']);
					}
				}
			}
Добавил:
foreach ($filters as $tvName => $values) {
				if ($tvName == 'item_when') ksort($filters[$tvName], SORT_NUMERIC);
				else if ($tvName == 'item_rooms') ksort($filters[$tvName], SORT_NUMERIC);
				else ksort($filters[$tvName]);
			}
Воеводский Михаил
11 июня 2015, 17:36
2
+2
Номер заказа появляется только в событии msOnCreateOrder. До того заказа не существует.
В плагине, срабатывающем по этому событию, уже существует объект $msOrder:
$msOrder->get('num');
$msOrder->get('id');
Пётр Молчанов
25 мая 2015, 10:55
5
+2
Лучше такое сделать плагином на событие OnUserRegister. Что-то типа такого:
if ($modx->event->name == 'OnUserSave' && $mode=='new') {
    // генерим пароль
    $pass = $modx->user->generatePassword();
    $user->set('password',$pass);
    $user->set('active','1');
    $user->save();
    // получаем мыло
    $profile = $user->getOne('Profile');
    $email = $profile->get('email');
    // отправляем письмо
		$messageFields = [массив каких-то данных, например, логин и пароль];
                $message = $modx->getChunk('UserRegEmailTpl', $messageFields);
                $modx->getService('mail', 'mail.modPHPMailer');
                $modx->mail->set(modMail::MAIL_BODY,$message);
                $modx->mail->set(modMail::MAIL_FROM,$modx->getOption('emailsender'));
                $modx->mail->set(modMail::MAIL_FROM_NAME,$modx->getOption('site_name'));
                $modx->mail->set(modMail::MAIL_SENDER,$modx->getOption('site_name'));
                $modx->mail->set(modMail::MAIL_SUBJECT,'Благодарим за регистрацию');
                $modx->mail->address('to',$email);
                $modx->mail->address('reply-to',$modx->getOption('emailsender'));
                $modx->mail->setHTML(true);
                
                if (!$modx->mail->send()) {
                  $modx->log(modX::LOG_LEVEL_ERROR,'An error occurred while trying to send the email: '.$modx->mail->mailer->ErrorInfo);
                  return false;
                }
                $modx->mail->reset();
}
Наумов Алексей
22 марта 2014, 08:54
4
0
Привет. Вот смотри:
1. В системной настройке ms2_order_handler_class указываем myOrderHandler
2. Создаем файл core/components/minishop2/custom/order/myOrderHandler.class.php
3. В него код:
<?
class myOrderHandler extends msOrderHandler{	
	public function submit($data = array()) {
		if(empty($data['email'])){
			$data['email'] = uniqid('user_').'@MYSITE.ru';
		}
		return parent::submit($data);
	}
}
Это один из вариантов. Мы просто при отправке заказа, если пользователь не указал почту, генерируем случайный email.

Можешь посмотреть исходный msOrderHandler и переопределить в нем другой метод, например, где идет проверка email.