Мастер Сниппет для управления другими Динамическими Сниппетами
Я работаю над проектом, который позволяет массово импортировать данные на сайт ModX.
При этом мне нужно иметь возможность отображать данные из импортированных полей, но я должен иметь возможность позволить клиенту размещать каждое отдельное поле там, где он хотел бы, чтобы оно отображалось в ресурсе контента.
Таким образом, я думал о том, чтобы создать отдельные фрагменты, которые будут использовать только отдельные поля.
Тем не менее, я знаю, что это будет полной проблемой для системы, которая будет запрашивать таблицу множество раз, поскольку потенциально существуют сотни полей.
Как я могу создать "главный фрагмент", который будет тянуть все поля, но я все еще могу разрешить их использование как фрагменты?
Например... одно нажатие, чтобы схватить Rec1Field1, Rec1Field2, Rec1Field3, Rec1Field4
, но иметь возможность использовать их в ресурсах контента, таких как [[Rec1Field1]], [[Rec1Field2]], [[Rec1Field3]], [[Rec1Field4]]
2 ответа
Другой альтернативой является использование $modx->setPlaceholders(array('placeholder'=>'value', ...));
в вашем фрагменте, который будет генерировать заполнители, доступные в любом месте вашего шаблона или вложенных кусков простым [[+placeholder]]
, Это позволило бы пользователю размещать тег в расширенном текстовом содержимом или там, где он мог бы его пожелать, без необходимости разбора строк или работы со сложными фрагментами.
Вы можете сделать другой подход к этому.
В Modx у вас есть функция под названием $modx->getChunk
это позволяет вам взять чанк с заполнителями и предоставить массив с ключами, соответствующими заполнителям. Эти заполнители будут заменены значениями ключей.
Это явно не то, что вам нужно, но уже существует рабочий пример того, как использовать строку с разбором заполнителей.
Итак, что вы делаете, это:
- Разрешите своим клиентам размещать заполнители в области содержимого там, где они хотят.
В шаблоне, в котором вы должны отображать содержимое, вызовите пользовательский фрагмент, например:
[[Parse_content_with_placeholders? &content=`[[*content]]` ]]
В этом фрагменте вы делаете что-то вроде:
// Properties
$props = array('Rec1Field1' => 'Foo','Rec1Field2' => 'Bar');
// Create the temporary chunk
$uniqid = uniqid();
$chunk = $modx->newObject('modChunk', array('name' => "{tmp}-{$uniqid}"));
$chunk->setCacheable(false);
$output = $chunk->process($props, $content);