Можно ли в MODx передавать данные между сниппетами?
Дело в том, что допустим я вывожу на сайте таблицу цен, и у меня есть одно подключение к базе данных, откуда я вытаскиваю массив данных, и вывожу нужную мне цену.
Когда это все находится в одном сниппете, а вызывать его приходится на каждое значение цены. то весь этот процесс с подключением к базе и данными в массиве происходит каждый раз. Конечно сессия быстро выходит за допустимый лимит памяти и сервер отдает ошибку.
Подскажите, пожалуйста, как можно решить эту проблему, чтобы один раз я подключался к базе и брал данные, а потом просто их везде выводил? Можно и любой другой способ решения, лишь бы сайт не падал =)
Попробуйте использовать кэшируемый вызов сниппета.
При генерации страницы он будет выполнен только один раз, пусть бы даже в коде шаблона он вызывается многократно.
Подробнее, ну например вот тут можете почитать https://itchief.ru/lessons/modx-revo/modx-caching
Сергей Нехамкин, Пока что сервер все равно ломает генерацию страницы и отдает 500.
То есть из чего состоит мой сниппет, я вытаскиваю цену из базы данных, в сниппете я подключаюсь к базе, по определенным данным в вызове сниппета я вытаскиваю цену из базы, манипулирую ей, и сниппет возвращает определенное число (return), и так до 200-х раз на странице, не знаю, может быть в таком случае кэш не будет работать?
Ну, так надо смотреть логи и уточнять причину ошибки. Они могут быть самые разные. Код 500 - это общее обозначение той ситуации, что возникла ошибка на стороне сервера.
По сниппету: а что мешает запросить из БД сразу массив цен, для всей страницы и потом делать все что нужно по ходу генерации страницы, беря данные из этого массива?
А зачем целиком сразу из базы получать все цены? Запрашивайте минимально достаточный диапазон товаров, чтобы сгенерировать одну страницу. Тогда выделенной памяти должно хватить.
В остальном, данные из сниппета в сниппет (или чанк) можно передать через параметры. Вы можете вызвать прямо из php сниппет и передать ему некий массив (данные из запроса к БД).
<?php
// $params - массив с данными товаров
$modx->runSnippet(’Второй_сниппет’, $params);
Сергей Нехамкин, Пока что решил проблему намного тупее, просто закинул весь блок html в скиппет и при помощи php вставляю в него значения, но даже так есть проблема, под блоком выводится "return; 1".