vrm13

vrm13

С нами с 15 октября 2014; Место в рейтинге пользователей: #491
Отправить деньги
vrm13
16 декабря 2019, 10:31
0
то что, нужно. спасибо большое!
vrm13
16 декабря 2019, 10:19
0
кажется понял, моя ошибка в том что я этот же сниппет пытался переделать, а нужно другой плагин писать, Сейчас сниппет сначала берёт все заказы, а потом ищет определённого юзера, а мне нужно брать конкретный ордер и с ним работать.

Осталось понять как сделать запрос именно к тому ордеру который сработал на msOnCreateOrder, msOnUpdateOrder и msOnRemoveOrder
vrm13
16 декабря 2019, 09:55
0
Спасибо! Вроде бы так и надо, ещё скорее всего нужно на msOnUpdateOrder тоже его вешать, чтобы учитывались отменённые заказы и заказы которые «на уточнении» (у меня 4 статуса заказа)

Но я в таком варианте не пойму как выбирать именно того пользователя чей Ордер срабатывает на событие. Можно добавлять юзера из сессии, но я так понимаю, что тогда плагин будет брать id менеджера если он отредактирует заказ из админки
vrm13
13 декабря 2019, 20:06
0
Вообще не знаю как работает Evo, но в Revo я сначала бы посмотрел файл .htaccess в корне, возможно там редирект на ru версию есть, который нужно просто убрать. Если там нет, то уже искал бы в плагинах.

Бывают проблемы с вёрсткой, картинками и т.д. после того как меняешь редиректы такие, нужно смотреть ещё и как пути к стилям и картинкам прописаны.

p.s.
я так себе программист, просто недавно делал языковую версию на Revo
vrm13
29 июля 2019, 10:32
0
действительно, огромное вам спасибо!
vrm13
29 июля 2019, 08:58
0
Это работает, Огромное спасибо!

Добавил прямо в pdousers, надо подумать как закрепить чтоб после обновления не слетало.
vrm13
05 июля 2019, 13:23
0
Да, действительно! Огромное спасибо

$res = json_decode($res, true);
foreach ($res['_embedded']['items'] as $names) {
    foreach ($names as $k => $v) {
        if ($k == 'preview'){
         echo '<div class="p-1 img-userload-w"><img src=' . $v . ' class="img-userload rounded"></div>';
        }
    }
}
так без ошибок. Правда время загрузки не сократилось, видимо это уже из-за запросов к яндекс диску
vrm13
05 июля 2019, 12:59
0
Массив $res
Array
(
    [_embedded] => Array
        (
            [items] => Array
                (
                    [0] => Array
                        (
                            [preview] => ...
                            [name] => IMG_20190630_153913-742af.jpg
                        )

                    [1] => Array
                        (
                            [preview] => ...
                            [name] => IMG_20190704_162123-23458.jpg
                        )

                )

            [public_key] => ...
        )

)
vrm13
11 февраля 2019, 18:34
+1
на 1000 + заказов очень тормозило

Total parse time 2.7370908 s
Total queries 3713
Total queries time 1.4645813 s
Memory peak usage 14 Mb
MODX version	MODX Revolution 2.7.0-pl (advanced)
PHP version 7.1.26
Database version mysql 5.6.33-79.0-log
From cache false

Попробовал избавиться от лишнего, хотя я не особо силён в php. То есть у меня заработало, но я не до конца понимаю всё ли сделал правильно.

Просто напрямую выбираю из таблицы msOrderProduct айди товаров и сразу считаю. Код сниппета получился такой:
<?php
$q = $modx->newQuery('msOrderProduct', array('id:>' => 0));
$q->limit(0);
$res = $modx->getCollection('msOrderProduct', $q);
foreach ($res as $v) {
	$list[]= $v->get('product_id');
}
$products=[];
foreach ($list as $product) {
   $products[(int)$product]++;
}
arsort($products);
$result=[];
$pdoFetch = new pdoFetch($modx, $scriptProperties);
foreach ($products as $id=>$oneProduct){
    $url = $modx->makeUrl($id);
    $test = $modx->getObject('modResource',$id);
    $name = $test->get('pagetitle');
    $result[]=['id'=>$id,'name'=>$name,'url'=>$url,'counter'=>$oneProduct];
}

$output = $pdoFetch->getChunk($tpl, array(
    'products' => $result
    
));
return $output;

Теперь гораздо быстрее, а результат тот же
Total parse time 0.4497349 s
Total queries 338
Total queries time 0.0402529 s
Memory peak usage 6 Mb

повторюсь, я так себе программист, всё методом тыка, но вроде бы работает. Автору спасибо за идею!
vrm13
09 февраля 2019, 17:19
0
В лог вылезала ошибка «A non-numeric value encountered» оказывается в php 7.1 нужно добавить (int)
$arr[0] += (int)$arr[$i];
vrm13
26 января 2019, 14:22
1
0
Случайно наткнулся на урок от Василия и вот что получилось:

<?php
$ids = explode(',', $input);
$q = $modx->newQuery('msProductData', array('id:IN' => $ids));
$q->limit(0);

$q->prepare();
$q->stmt->execute();
$res = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($res as $v) {
    $all = $v['msProductData_price'];
    $c.= str_replace(".00", ",", "$all");
}
$arr = explode(',', $c);
for($i=1;$i<sizeof($arr);++$i) { 
   $arr[0] += $arr[$i];
}
echo $arr[0];
теперь {$allprod | unisum} справляется в 1 запрос. какая-то магия. Я мало что понял, но кажется работает
vrm13
25 января 2019, 16:44
0
Добавил в select
GROUP_CONCAT(DISTINCT msOrderProduct.product_id) as allprod
и создал сниппет unisum
<?php
$ids = explode(',', $input);
$products = $modx->getCollection('msProduct', [
	'id:IN' => $ids
]);

if ($products) {
$prices = [];
foreach ($products as $product) {
        $prices[] = $product->get('price');
}

$sumprice = array_sum($prices);
echo $sumprice;

}
вызываю в таблице статистики
{$allprod | unisum}
хммм, заработало конечно, но что-то медленно грузится, смотрю через debug ёмаё 1000 запросов…
думаю дальше
vrm13
18 января 2019, 12:10
0
Согласен, так проще, но мне нужно решить вопрос по-другому. Уже есть много пользователей с разными именами, не хочу заставлять их менять.
vrm13
18 января 2019, 12:08
0
Да. Только я не могу в адресную строку потом имя передать. Если сверка по id то в строке браузера будет .../users/777. Как сделать чтобы было .../users/Гена после плагина со сверкой по id не могу придумать.

Дело в том, что первый плагин отрабатывает ссылку вида .../users/{$username}, а второй .../users/{$user_id}
vrm13
18 января 2019, 11:51
0
Спасибо за идею, попробовал.
Только это же плейсхолдер, до него дело не доходит, знак плюс мешает где-то выше в запросе страницы.

пока сделал по другому:
<?php
if ($modx->event->name != 'OnPageNotFound') {return false;}
$alias = $modx->context->getOption('request_param_alias', 'q');
if (!isset($_REQUEST[$alias])) {return false;}

$request = $_REQUEST[$alias];
$tmp = explode('/', $request);
if ($tmp[0] == 'users' && count($tmp) >= 2) {
	$section = 1262;
	$iduser = str_replace('.html', '', $tmp[1]);
    $user = $modx->getObject('modUser', array('id' => $iduser));
	$username = $user->get('username');
		$modx->setPlaceholder('username', $username);
		$modx->setPlaceholder('user_id', $iduser);
		$modx->setPlaceholders($user->Profile->toArray());
		$modx->sendForward($section);
}
теперь у меня в алиас уходит id юзера и все ссылки на юзеров через id. В целом получилось удобно для моих целей, но если найдётся способ с транслитерацией, будет здорово.
vrm13
09 ноября 2018, 11:32
0
да, конечно убрал. Видимо я не правильно понял как работает showLog, думал это только печать на экран, но не запись в журнал.
vrm13
08 ноября 2018, 21:46
0
доброго вечера. Нашёл, как мне кажется, небольшой баг, компонент куплен больше года назад, в поддержку написать не могу.
Просто немного неудобно при отладке отчищать лог ошибок. Хочу вывести на страницу полный список всех заказов пользователей через mslistorders и pdopage. Если в сниппете showLog=1 то в лог ошибок модекса вываливается весь полученный массив array (… при тысяче заказов это забивает лог на 10мб одна перезагрузка страницы.

[2018-11-08 23:38:55] (ERROR @ /core/components/mslistorders/model/mslistorders/mslistorders.class.php : 336) [mslistorders]
[2018-11-08 23:38:55] (ERROR @ /core/components/mslistorders/model/mslistorders/mslistorders.class.php : 338 Array
(
    [total] => Array
        (.........
вот эти строки. если я правильно понял, ошибки ведь нет, просто showLog отправляет ещё и в журнал ошибок вместо простого вывода на фронтэнд у менеджера.
vrm13
28 октября 2018, 17:18
0
Всё-таки проблема была и оставалась до сегодняшнего дня.
на
<link rel="canonical" href="http://мой_сайт/"/>
ругались все сео проверки ведь с этого каноничного адреса тут же шла переадресация на https
Проблему нашёл в core/config/config.inc.php

if (!defined('MODX_URL_SCHEME')) {
    $url_scheme=  $isSecureRequest ? 'https://' : 'http://';
    define('MODX_URL_SCHEME', $url_scheme);
}
Поменял на:
if (!defined('MODX_URL_SCHEME')) {
    $url_scheme=  'https://';
    define('MODX_URL_SCHEME', $url_scheme);
}
теперь pdoPage выдаёт верный canonical

<link rel="canonical" href="https://мой_сайт/"/>
<link rel="next" href="https://мой_сайт/?page=2"/>
единственное, что при обновлении modx, нужно будет снова смотреть config.
vrm13
17 октября 2018, 12:11
+1
Огромное спасибо! Теперь работает.

Рабочий плаин:
<?php
if ($modx->event->name == 'OnDocFormSave') {

	if ($resource->template != 5) { // id шаблона с товаром
		return;
	}

	// получаем id выбранных в TV продуктов
	$tv = $resource->getTVValue('clothes');

	if (empty($tv)) {
		return;
	}

	$ids = explode(',', $tv);

	// получаем сами продукты
	$products = $modx->getCollection('msProduct', [
		'id:IN' => $ids
	]);

	if ($products) {

		$prices = [];
		
		// получаем цены для выбранных продуктов
		foreach ($products as $product) {
			$prices[] = $product->get('price');
		}

		// получаем минимальную цену
		$min_price = min($prices);

		if ($min_price) {
			// сохраняем цену для товара
			$resource->set('price', $min_price);
			$resource->save();
		}

	}
}
Благодарен вам! И научили как и за меня написали.
vrm13
17 октября 2018, 12:00
0
полезная вещь!
$modx->log(1, print_r($ids, 1)); // распечатает массив с ids
массив пустой —
Array
(
    [0] => ,
)
хотя
$modx->log(1, print_r($tv, 1));
выдаёт правильные id причём с разделителем запятая: 2689,2690,2691,2692,2693,2951,2952