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

Ilya
31 июля 2022, 23:11
0
Павел, а как быть с выводом данных в таблицу? В обычном php файле, следующий код работает, но используя в сниппете выходит ошибка return;1.
<?php
function get_currency_td($currency_code = 'R01235') {

$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) {

$content_currency_result .= '<tr><td>'.$currency->attributes()->Date.' </td><td> '.$currency->Value.'</td><td></td></tr>';

}

return $content_currency_result;

}

?>
<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>

<?php echo get_currency_td('R01235'); ?>

</tbody>

</table>
</div>
Оставив только php код в сниппете и переносив html код в шаблон, пробовал использовать setPlaceholders, но с таблицей не получается. Данные отображаются внутри одного
<tr>
<td></td>
<td></td>
<td></td>
</tr>
Вот скриншот: https://skr.sh/sFCZaUMux90?a
А необходимо чтобы данные распределились в отдельные tr td.

Предполагаю, что тут уже без чанка/ов не обойтись, верно?
Если да, то как это реализовать? Заранее спасибо!
Артур Шевченко
31 июля 2022, 22:31
0
Я не говорил, что мой вариант проще, я говорил, что Ваш вариант неправильный и костыльный, да к тому же не работает. А если сделать правильно, то всё будет работать. Но раз у вас полтора десятка лет за плечами, я не буду лезть к Вам со своими советами.
Сергей
31 июля 2022, 21:57
0
ошибочно
Ilya
31 июля 2022, 20:27
0
Павел, большое вам спасибо за помощь! Все отлично работает.
Ilya
31 июля 2022, 20:26
0
Не знаю, что сделал, но теперь уже работает.
tracersani
31 июля 2022, 19:51
+1
На MODX 2.8.4 ломает админку.
Сбрасывал кэш, обновлял etc 0 толку.

Кто столкнулся с подобным, через PMA (напр.) меняем в базе manager_theme => value на default
Удаляем содержимое папки /core/cache/ и обновляем страницу.
Ilya
31 июля 2022, 18:47
0
Что-то
[[+value]] и [[+dates]]
пустыми отображаются.
Павел Романов
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]]  ]
  },
//..........
Ilya
31 июля 2022, 17:03
0
Добрый день, Павел. Большое спасибо за ответ!
Дело в том, что эти данные я вывожу в графиках с помощью Apexcharts.
Код был большим. Поэтому я сокращенно написал их.
Вот как оно выглядит:
<div id="chart" style="max-width: 760px; margin: 35px auto; opacity: 0.9;">
  <div id="responsive-chart"></div>
</div>

<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
<script>
    var options = {
  chart: {
    width: "100%",
    height: 380,
    type: "area"
  },
  plotOptions: {
    bar: {
      horizontal: true
    }
  },
  dataLabels: {
    enabled: false
  },
  fill: {
          type: 'gradient',
          gradient: {
            shadeIntensity: 1,
            inverseColors: false,
            opacityFrom: 0.5,
            opacityTo: 0,
            stops: [0, 90, 100]
          },
  series: [
    {
      name: "Курс",    
      data: [<?php echo implode(', ', $currencyArr[1]); ?>]
    }
  ],
  xaxis: {
    categories: [<?php echo implode(', ', $currencyArr[0]); ?>]
  },
  title: {
          text: 'Динамика курса доллара США',
          align: 'left'
        },
        stroke: {
          curve: 'straight'
        },
  legend: {
    position: "right",
    verticalAlign: "top",
    containerMargin: {
      left: 35,
      right: 60
    }
  },
  responsive: [
    {
      breakpoint: 1000,
      options: {
        plotOptions: {
          bar: {
            horizontal: false
          }
        },
        legend: {
          position: "bottom"
        }
      }
    }
  ]
};

var chart = new ApexCharts(
  document.querySelector("#responsive-chart"),
  options
);

chart.render();

</script>
Данный html код я выводил вместе с php кодом внутри сниппета. Поэтому под графикой выводилась ошибка return; 1.
Павел Романов
31 июля 2022, 16:49
+1
У Вас нет HTML и выводить в чанк нет смысла.
Сделайте вывод прямо в сниппете:
<?php
$dates= array();
$values = array();

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

Этого, естественно, не нужно:
<?php echo implode(', ', $currencyArr[1]); ?>
<?php echo implode(', ', $currencyArr[0]); ?>
Евгений Дубровин
31 июля 2022, 16:41
-1
ну да, то что Вы предлагаете — это точно проще, ага)
при чем тут html?
я сам в основном учился и уже почти полтора десятка лет довольно успешно этим занимаюсь.
я спросил только как там вывести цену и количество, т.к. феном там не отрабатывает.
Ilya
31 июля 2022, 16:29
0
У меня тоже под результатом выходит текст return; 1 если в сниппете смешиваются html и php коды.
Пытался разделить смешанный код на сниппет и чанк, но не получается.

Павел, надеюсь, что вы и мне тоже поможете. Заранее спасибо!
Ilya
31 июля 2022, 14:30
0
Здравствуйте, Павел.
Вы можете помочь разделить нижеследующий код на сниппет и чанк/и?:

foreach($content_currency->Record as $currency) {

	$content_currency_result[0][] = '"'.(string)$currency->attributes()->Date.'"';
	$content_currency_result[1][] = str_replace(',', '.', $currency->Value);

}
	return $content_currency_result;
}
На сайте я вывожу их так:
<?php echo implode(', ', $currencyArr[1]); ?>
  <?php echo implode(', ', $currencyArr[0]); ?>
Кирилл Киселев
31 июля 2022, 11:42
0
Буду признателен!
Роман
31 июля 2022, 08:33
0
Можно проще добавить groupby
deleted
31 июля 2022, 07:25
+1
У нас в компании все кроме меня пишут код в админке. Предположу, что таких много. Ещё на многих хостингах нет доступа по ssh. Для css и js удобный редактор
Кирилл Киселев
30 июля 2022, 22:05
0
Опыт и знание как оно работает под капотом, тем более поможет в будущем, если надо будет внедрить PR для ACE MODX
Артур Шевченко
30 июля 2022, 21:48
0
Можно создать шаблоны для визуального редактора.
Артур Шевченко
30 июля 2022, 21:47
0
Кто вас учил смешивать js и html? Что вам мешает вынести js в отдельный файл, делать ajax-запросы на сервер за нужными данными? Что мешает использовать массивы callbacks доступные в minishop2?
Артур Шевченко
30 июля 2022, 21:25
0
Мой вопрос остался прежним: зачем?