2ball
@2ball
Хардкор кодер

Может ли один спиппет быть продолжением другого по php коду?

Доброго, хабр.

Стоит Revo 2.2.6


Сегодня решил разделить один большой сниппет в 2000 строк на несколько логических участков и поместить в отдельные сниппеты для более удобной корректировки и отладки. Но тут же столкнулся с проблемой.

Условно: в предыдущем сниппете идет инициализация и присваивание значения переменной. В последующем нужно с этой переменной работать. Такое вообще возможно?


Просто у меня MySQL сначала ругается на синтаксис, в после, когда я прописываю искомое напрямую, выводит пустой экран, т.е. ничего не возвращает из базы.


В связи с этим вопрос: один сниппет может продолжаться другим по принципу include?


Заранее спасибо за ответы.


P.S. — передавать параметры через $modx->runSnippet пробовал, не помогает.
  • Вопрос задан
  • 3937 просмотров
Решения вопроса 1
Fi1osof
@Fi1osof
Как и в любом элементе (чанк, сниппет и т.п.), внутри сниппета есть параметр $scriptProperties.
Вы его можете передать как аргумент в последующий сниппет, к примеру внутри своего сниппета вызвать $modx->runSnippet($name, $scriptProperties); (и так сколько угодно вложенностей.). При этом по ходу можно переопределять и/или дополнять $scriptProperties.
Смотрите код кеша снипета.
<?php
function elements_modsnippet_35($scriptProperties= array()) {
    global $modx;
    if (is_array($scriptProperties)) {
         extract($scriptProperties, EXTR_SKIP);
    } 
    print_R($scriptProperties); 
    exit;
}

exit специально оставил, чтобы вывод сразу видеть.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
rasstroen
@rasstroen
include или require фактически продолжает код, да, только глобальные переменные это не очень хорошо. Лучше классы, методы и функция autoloader.

Сниппет будет один, но будет как класс иметь разные методы. Методам будут доступны свойства этого класса.
Ответ написан
Andchir
@Andchir
Копать в эту сторону:
rtfm.modx.com/display/revolution20/modX.getService

Можно плагином загрузить свой ксласс в $modx. И потом любые методы и свойства этого класса будут доступны в любом сниппете.
Ответ написан
2ball
@2ball Автор вопроса
Хардкор кодер
В общем. Оптимальным решением этой проблемы стало использование глобальных переменных через $_SESSION с обязательным unset после выполнения основного сниппета.

Принцип следующий. В сниппете, который собирает в себе все остальные задается глобальная переменная, из всех остальных она вызывается без проблем.
Обычное использование глобальных переменных не дает никаких результатов.
Видимо, они принудительно убиваются самим MODx в процессе обработки сниппетов во избежание ошибок и случайной мешанины с именами переменных. Что, вполне, логично.
Ответ написан
Evengard
@Evengard
Вообще-то, в сниппеты можно передавать свои переменные. Понятное дело, что сниппеты сами по себе будут изолированы, но если перекидывать их (например, при помощи референсов) неким враппер-сниппетом то все возможно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы