Кирилл

Кирилл

Был в сети 23 августа 2025, 08:08
Заказы принимаю
Александр Туниеков
Александр Туниеков
Вообщем победил кеширование :-).
{'!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р.
Михаил
Михаил
Чтобы поменять 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 редирект.
Павел Гвоздь
Павел Гвоздь
/** @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);
}
Баха Волков
Баха Волков
Не не не, не делайте так, помните или почитайте о 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-ти
Александр
Александр
Точно!
Так и сделал. Мне тоже нужно было изменить сортировку.
В функции 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]);
			}
Пётр Молчанов
Пётр Молчанов
Лучше такое сделать плагином на событие 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();
}
Наумов Алексей
Наумов Алексей
Привет. Вот смотри:
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.