Павел Романов

Павел Романов

С нами с 03 марта 2014; Место в рейтинге пользователей: #70
Павел Романов
15 ноября 2022, 18:03
0
Атрибуты name у полей корректные?
tv**, где ** — ID TV-шек?
В параметр &allowedFields они добавлены (таким же образом)?
Павел Романов
18 октября 2022, 16:08
1
+1
Да, пардон, там же темы в отдельной таблице и они с сообщениями линкуются по ID.
Вот так должно сработать:
<?php
$mess = array();
$thrs = array();
$table_mess = $modx->getOption('table_prefix').'ec_messages';
$table_threads = $modx->getOption('table_prefix').'ec_threads';

$sql = "SELECT * FROM {$table_threads}";
$q = $modx->prepare($sql);
$q->execute();
$threads = $q->fetchAll(PDO::FETCH_ASSOC);
foreach($threads as $thread){
    $thrs[$thread['resource']] = $thread['id'];
}

$ids = $modx->getChildIds(5,10,array('context' => 'web'));
foreach ($ids as $id){
    $tid = $thrs[$id];
    $sql = "SELECT * FROM {$table_mess} WHERE `thread` = {$tid}";
    $q = $modx->prepare($sql);
    $q->execute();
    $messages = $q->fetchAll(PDO::FETCH_ASSOC);
    foreach ($messages as $message) {
       	$mess[] = $message['id'];
    }
}
return implode(',', $mess);

В чанках вот так попробуйте:
[[#[[+thread_resource]].pagetitle]]
[[#[[+thread_resource]].logo]]
Павел Романов
18 октября 2022, 14:11
+1
В &tpl указан чанк или @INLINE...?
Что выводит просто [[+thread]].
Павел Романов
18 октября 2022, 14:08
+1
Да, 5 — родитель, 10 — глубина выборки.
Подробности тут
Павел Романов
18 октября 2022, 12:45
1
+1
Попробуйте сделать сниппет getMessagesIds:
$ids = $modx->getChildIds(5,10,array('context' => 'web'));
$mess = array();
$table_mess = $modx->getOption('table_prefix').'ec_messages';
foreach ($ids as $id) {
    $sql = "SELECT * FROM {$table_mess} WHERE `thread` = {$id}";
    $q = $modx->prepare($sql);
    $q->execute();
    $messages = $q->fetchAll(PDO::FETCH_ASSOC);
    foreach ($messages as $message) {
       	$mess[] = $message['id'];
    }
}
return implode(',', $mess);

И используйте его в качестве &messages в вызове:
[[!pdoPage?
    &element=`ecMessages`
    &threads=`*`
    &messages=`[[!getMessagesIds]]`
    ......
]]

Что касается полей ресурса, то в чанке сообщения можно использовать FastField:
[[#[[+thread]].pagetitle]]
[[#[[+thread]].logo]]
Павел Романов
16 октября 2022, 09:42
+1
Сделайте плагин на событие OnWebPagePrerender — заодно и type у скриптов и стилей уберете:
<?php
$arr1 = array('type="text/css"', 'type="text/javascript"',' />','/>');
$arr2 = array('','','>','>');
$output = &$modx->resource->_output;
$output = str_replace($arr1,$arr2,$output);
Павел Романов
15 октября 2022, 10:06
+1
Попробуйте так:
[[!msProducts?  
    &limit=`1`
    &tpl=`@INLINE [[+price]] ₽`
    &sortby=`Data.price`
    &where=`{ "Data.price:!=":0 }`
]]
Павел Романов
13 октября 2022, 11:33
+1
Для удаления заказов через phpMyAdmin очистите в базе таблицы modx_ms2_orders и modx_ms2_order_addresses.
Потом для этих таблиц на вкладке «Операции» выставьте значение AUTO_INCREMENT в 1

Естественно, предварительно сделайте бэкап.
Павел Романов
06 октября 2022, 14:41
0
Можете просто сделать страницу с пустым шаблоном и вызовом чанка и подгружать ее посредством Ajax
Павел Романов
06 октября 2022, 14:37
0
В сниппете и сделайте вывод:
return $modx->getChunk('chunkname', array());
Павел Романов
28 сентября 2022, 11:33
+1
В HEAD так:
<base href="[[!+site_url]]" />

Или жестко пропишите:
<base href="https://izmeritel.by/" />
Павел Романов
11 сентября 2022, 15:43
1
0
Редактор использует источник по умолчанию, который указывается в системной настройке default_media_source
Павел Романов
06 августа 2022, 17:28
+1
Это понятно, но MODX не знает об этом и воспринимает как сниппет, который начинается на #
Павел Романов
06 августа 2022, 14:48
+1
MODX не знает тег [[# и воспринимает его как сниппет, с названием #[[*archive…, а такого сниппета с системе нет.
Либо, как сказал Alexey, используйте Fenom, либо просто отключите системную настройку log_snippet_not_found
Павел Романов
01 августа 2022, 12:25
1
+1
К строке приведите:
// .............
foreach($content_currency->Record as $currency) {
    $items .= $modx->getChunk($tpl, array(
        'date' => (string)$currency->attributes()->Date,
        'value' => (string)$currency->Value,
    ));
}
// .............
Павел Романов
01 августа 2022, 12:00
1
+1
Да, добавьте точку с запятой, я опечатался.

Если Вы используете функцию, то нужно в ней объявить глобальную переменную $modx:
function get_currency_td($currency_code = 'R01235') {
    global $modx;
    $out = '';
    $date_start = date('d/m/Y', strtotime('-30 days')); // Дата начала выборки
    $date = date('d/m/Y'); // Текущая дата (используется для кэша и для конца выборки)
    $cache_time_out = 86400; // Время жизни кэша в секундах
    $file_currency_cache = './currency.xml'; // Файл кэша
    if(!is_file($file_currency_cache) || filemtime($file_currency_cache) < (time() - $cache_time_out)) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 'https://www.cbr.ru/scripts/XML_dynamic.asp?date_req1='.$date_start.'&date_req2='.$date.'&VAL_NM_RQ='.$currency_code);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $out = curl_exec($ch);
        curl_close($ch);
        file_put_contents($file_currency_cache, $out);
    }
    $content_currency = simplexml_load_file($file_currency_cache);
    $content_currency_result = ''; // Переменная для объединения всех дней в одну группу
    
    foreach($content_currency->Record as $currency) {
        $items .= $modx->getChunk($tpl, array(
            'date' => $currency->attributes()->Date,
            'value' => $currency->Value,
        ));
    }	
    if($items != '') $out = $modx->getChunk($tplWrapper, array('items' => $items));
    return $out;
}
Но потом, естественно, в сниппете где-то нужно эту функцию вызывать.

Но если у Вас задача вывести этим сниппетом только курсы доллара, функция не нужна, но надо непосредственно указать код валюты (в 9 строке):
<?php
$out = '';
$date_start = date('d/m/Y', strtotime('-30 days')); // Дата начала выборки
$date = date('d/m/Y'); // Текущая дата (используется для кэша и для конца выборки)
$cache_time_out = 86400; // Время жизни кэша в секундах
$file_currency_cache = './currency.xml'; // Файл кэша
if(!is_file($file_currency_cache) || filemtime($file_currency_cache) < (time() - $cache_time_out)) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://www.cbr.ru/scripts/XML_dynamic.asp?date_req1='.$date_start.'&date_req2='.$date.'&VAL_NM_RQ=R01235');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    $out = curl_exec($ch);
    curl_close($ch);
    file_put_contents($file_currency_cache, $out);
}
$content_currency = simplexml_load_file($file_currency_cache);
$content_currency_result = ''; // Переменная для объединения всех дней в одну группу

foreach($content_currency->Record as $currency) {
    $items .= $modx->getChunk($tpl, array(
        'date' => $currency->attributes()->Date,
        'value' => $currency->Value,
    ));
}	
if($items != '') $out = $modx->getChunk($tplWrapper, array('items' => $items));
return $out;
Павел Романов
01 августа 2022, 10:27
1
+1
Поскольку тут уже HTML, то через getChunk.
Сниппет:
<?php
$out = '';
$date_start = date('d/m/Y', strtotime('-30 days')); // Дата начала выборки
$date = date('d/m/Y'); // Текущая дата (используется для кэша и для конца выборки)
$cache_time_out = 86400; // Время жизни кэша в секундах
$file_currency_cache = './currency.xml'; // Файл кэша
if(!is_file($file_currency_cache) || filemtime($file_currency_cache) < (time() - $cache_time_out)) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://www.cbr.ru/scripts/XML_dynamic.asp?date_req1='.$date_start.'&date_req2='.$date.'&VAL_NM_RQ='.$currency_code);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    $out = curl_exec($ch);
    curl_close($ch);
    file_put_contents($file_currency_cache, $out);
}
$content_currency = simplexml_load_file($file_currency_cache);
$content_currency_result = ''; // Переменная для объединения всех дней в одну группу

foreach($content_currency->Record as $currency) {
    $items .= $modx->getChunk($tpl, array(
        'date' => $currency->attributes()->Date,
        'value' => $currency->Value,
    ))
}	
if($items != '') $out = $modx->getChunk($tplWrapper, array('items' => $items));
return $out;

Вызов:
[[snippetName?
    &tplWrapper=`chunk_wrapper`
    &tpl=`chunk_item`
]]

Чанк chunk_wrapper:
<div class="currency-exchange">
    <div class="ce-title">Таблица изменений курса доллара США за 30 дней</div>
    <table class="table table-condensed ce-table">
        <thead>
            <tr>
                <td>Дата</td>
                <td>Курс рублей за 1 usd</td>
                <td>Изменение</td>
            </tr>
        </thead>

        <tbody>
            [[+items]]
        </tbody>
    </table>
</div>

Чанк chunk_item:
<tr>
    <td>[[+date]]</td>
    <td>[[+value]]</td>
    <td></td>
</tr>
Павел Романов
31 июля 2022, 17:16
1
+1
Тут тоже чанк не нужен. Используйте setPlaceholders:
<?php
$dates= array();
$values = array();

foreach($content_currency->Record as $currency) {
    $dates[] = '"'.(string)$currency->attributes()->Date.'"';
    $values[] = str_replace(',', '.', $currency->Value);
}

$modx->setPlaceholders(array(
    'dates' => implode(', ', $dates),
    'values' => implode(', ', $values),
));

return;

Вызывайте сниппет где-нибудь в начале страницы, а в скрипте вставьте плейсхолдеры:
//..........
series: [
    {
      name: "Курс",    
      data: [ [[+values]] ]
    }
  ],
  xaxis: {
    categories: [ [[+dates]]  ]
  },
//..........