Всего 125 676 комментариев

Роман
03 августа 2021, 11:05
0
Попробуй передавать не type, а какую-то другую переменную.
$modx->log(1, $type);
Algirdas
03 августа 2021, 10:55
0
Если вы имели ввиду на сколько много будет ресурсов, поля в которых надо пересчитать, то на первое время не более 100 штук
Algirdas
03 августа 2021, 10:51
0
<?php
$values = array();
$type = "1";
$ids = $modx->runSnippet('pdoResources', array(
	 'parents' => $parents,
	 'limit' => 0,
	 'returnIds' => 1,
	 'includeTVs' => 'certificateBuildingType',
	 'tvFilters' => 'certificateBuildingType=='.$type

));
$resources = explode(',', $ids);
foreach($resources as $id){
	 $resource = $modx->getObject('modResource', $id);
	 $tv = $resource->getTVValue($tvname);
	 if(is_numeric($tv)) $values[] = $tv;
}
$out = array_sum($values); 
print_r($scriptProperties);
return $out;
Мне кажется я не правильно им воспользовался. Если так вставлять, то просто перестает считать и вместо цифры выводит NaN. Я чайник (facepalm)
Наумов Алексей
03 августа 2021, 10:45
+1
А что выводит?
print_r($scriptProperties);
Algirdas
03 августа 2021, 10:42
0
Неа, так тоже не сработало. Вот такая конструкция работает:

<?php

$values = array();
$type = "1";
$ids = $modx->runSnippet('pdoResources', array(
	 'parents' => $parents,
	 'limit' => 0,
	 'returnIds' => 1,
	 'includeTVs' => 'certificateBuildingType',
	 'tvFilters' => 'certificateBuildingType=='.$type

));
$resources = explode(',', $ids);
foreach($resources as $id){
	 $resource = $modx->getObject('modResource', $id);
	 $tv = $resource->getTVValue($tvname);
	 if(is_numeric($tv)) $values[] = $tv;
}
$out = array_sum($values); 

return $out;
То есть я так понимаю без разницы в каком виде передается цифра. Что интересно, значение $parents которое берется из вызова сниппета передается нормально, а вот с $type почему-то так же не работает. Это ломает мне мозг.
Algirdas
03 августа 2021, 10:38
0
У меня там всего около 5-6 тестовых ресурсов, у них у всех есть поле в котором находится цифра. Плагин эти цифры просто складывает и выводит сумму значений всех полей
Роман
03 августа 2021, 09:29
0
Решение нашли?
Роман
03 августа 2021, 09:21
+1
Попробуйте так передать, может в базе ищется, как строка.
'tvFilters' => 'certificateBuildingType=='. intval($type)
Может быстрее будет, если сделать такой запрос, вместо перебора:
SELECT SUM(value) as sum FROM `modx_site_tmplvar_contentvalues` WHERE tmplvarid='2'
Сергей Шлоков
03 августа 2021, 08:31
+1
А какое количество ресурсов возвращает первый сниппет? Максимально. Просто интересно оценить размер, так сказать, ущерба.
Денис Мижеревич
03 августа 2021, 01:08
0
Доброго времени.
Подскажите, что нужно сделать, чтобы примененные бонусы, при оформлении заказа, вычитались из итоговой стоимости заказа? Скрин: prnt.sc/1ihe2ii
Algirdas
02 августа 2021, 23:35
0
Чот вот так
$modx->log(1, print_r($array, 1),'HTML');
пробовал в начале конструкции вставлять, ничего не выводится дополнительно к тому что должно.

А так когда не срабатывает в целом, страница не загружается и ругается таким образом:

Fatal error: Uncaught Error: Call to a member function getTVValue() on null in C:\bla-bla\core\cache\includes\elements\modsnippet\34.include.cache.php:15 Stack trace: #0 C:\bla-bla\core\model\modx\modscript.class.php(76): include() #1 C:\bla-bla\core\model\modx\modparser.class.php(537): modScript->process(NULL) #2 C:\bla-bla\core\components\pdotools\model\pdotools\pdoparser.class.php(273): modParser->processTag(Array, true) #3 C:\bla-bla\core\model\modx\modparser.class.php(251): pdoParser->processTag(Array, true) #4 C:\bla-bla\core\components\pdotools\model\pdotools\pdoparser.class.php(65): modParser->processElementTags('', '<!DOCTYPE html>...', true, false, '[[', ']]', Array, 9) #5 C:\bla-bla\core\model\modx\modresource.class.php(546): pdoParser->processElementTags('', '<!DOCTYPE html>...', true, false, '[[', ']]', Array, 10) #6 C:\bla-bla\core\model\modx\modresou in C:\bla-bla\core\cache\includes\elements\modsnippet\34.include.cache.php on line 15
Баха Волков
02 августа 2021, 22:58
+1
$modx->log(level, string)
в помощь
Павел Романов
02 августа 2021, 17:57
+1
Если TV со списком городов принадлежит этой странице, то просто:
[[*tvname]]
В случае, если у данной TV тип вывода строит «Разделитель» и в качестве самого разделителя указана запятая, то выведутся значения через запятую.

Если у Вас в качестве значений TV прописаны не названия городов, а ID соответствующих ресурсов, то делаете такой сниппет:

<?php
$arr = explode(',',$input);
$out = array();
foreach($arr as $id){
    if(!$res = $modx->getObject('modResource', $id)) continue;
    $out[] == $res->get('pagetitle');
}
return implode(', ', $out);

Назовите его, к примеру, getCities и используйте как модификатор:
[[*tvname:getCities]]
Сергій
02 августа 2021, 17:44
0
Не совсем понял ваш совет.
Пример есть страница компании. На этой странице выводится список городов. Как вывести весь список через кому.
Можно пример кода.
Дмитрий
02 августа 2021, 17:16
0
подскажите решение проблемы
Александр Мельник
02 августа 2021, 16:30
0
Да спасибо Евгений, примерно по такому пути и я смотрел.
Правда не стал использовать phpredis а взял вот эту программу cheprasov/php-redis-client
Но дело ведь в том, что редис сам по себе не гарантирует сохранность данных.
Если мы храним сессии в файлах, то они там и остаются. Храним сессии в базе — они там и остаются. А редис это все таки хранилище которое живет в оперативной памяти и при выключении питания на сервере к примеру — все будет потеряно. Да редис умеет периодически сбрасывать данные на жесткий диск, но все это не гарантируется разработчиком.
Павел Романов
02 августа 2021, 15:10
+1
У TV на вкладке «Параметры вывода» выберите «Разделитель» и поставьте в качестве него запятую.
После этого вывод [[*tvname]] в шаблоне страницы будет содержать разделитель.

Чтобы разделитель выводился через [[+tv.tvname]] в чанках, в вызовах pdoResources и т. д., добавляйте параметр &processTVs=`tvname`

В сниппетах для вывода через разделитель используйте
$tv = $resource->getTVValue('tvname');
Евгений Шеронов
02 августа 2021, 14:51
1
+2
У вас нет ссылок на примеры реализации?
Я делал. Для начала нужно установить на сервер github.com/phpredis/phpredis

В MODX нужно всего лишь очистить системную настройку session_handler_class — в этом случае за сессии будет отвечать PHP и по умолчанию будет хранить их в файлах.

Для хранения их в redis нужно в php.ini указать:
session.save_handler = redis
session.save_path = "tcp://host1:6379?weight=1, tcp://host2:6379?weight=2&timeout=2.5, tcp://host3:6379?weight=2&read_timeout=2.5"
; а для тех кто, как и я предпочитает подключение по сокету в пределах одной машины: 
session.save_path = "unix:///var/run/redis/redis.sock?persistent=1&weight=1&database=0"
; но в этом случае нужно ещё в redis.conf указать этот же путь в unixcocket

И теперь уже PHP будет отвечать за хранение сессий в redis.
Более подробнее уже несложно нагуглить)
Юрий
02 августа 2021, 09:37
0
Спасибо, и вправду было легко
Вот как выглядеть мой чанк msGetOrder
<div class="row" id="msCart">
    <div class="col-lg-6 col-sm-12 col-md-12">
        <h3><i class="fas fa-check-circle"></i> Спасибо за заказ</h3>
        <p>Ваш заказ принят оператором. Мы свяжемся с Вами в ближайшее время.</p>
        <hr>
    </div>
    <div class="col-lg-6 col-sm-12 col-md-12">
        <div class="alert alert-dark" role="alert">
            <p><strong><i class="fas fa-info"></i> Иформация о заказе</strong></p>
            <hr>
            <p>Номер заказа: <strong>{$order.num}</strong>
            Способ доставки: <strong>{$delivery.name} </strong>
            Способ оплати: <strong>{$payment.name} </strong></p>
            <hr>
            <p><strong>Сумма заказа: {$total.cart_cost} грн.</strong></p>
        </div>
    </div>    
</div>

<script src="https://apis.google.com/js/platform.js?onload=renderOptIn" async defer></script>

<script>
  window.renderOptIn = function() {
    window.gapi.load('surveyoptin', function() {
      window.gapi.surveyoptin.render(
        {
          // REQUIRED FIELDS
          "merchant_id": 0000000000,
          "order_id": "{$order.id}",
          "email": "{$user.email}",
          "delivery_country": "UA",
          "estimated_delivery_date": "{'' | date : "Y-m-d"}",
        });
    });
  }
</script>
Наумов Алексей
02 августа 2021, 07:46
0
Так вот компонент и решает задачу:
1. отдельно управлять временем жизни сессий для авторизованных пользователей (например, поставить им месяц);
2. отдельно управлять временем жизни сессий ботов (к примеру, поставить им 3 часа);
3. У всех остальных — ну пусть будет стандартная неделя.

И на моих сайтах, за счет п.2. размер таблицы и объем данных уменьшился в десятки раз, т.к. именно сессии различных ботов составляли 90% записей в таблице.