Номера счетов и определения SFS

Рефакторинг простого PHP приложения для MODx

Если Вы подходите под большинство следующих описаний, это руководство должно быть Вам полезным:
— Вы писали скрипты, которые сочетают PHP код и HTML
— Вы понимаете циклы и массивы PHP
— Вы писали PHP код, который подключается к базе данных и извлекает записи
— У вас есть общее представление о том, как работают MODx сниппеты и другие элементы

Для примера я рассмотрю упрощенную версию реального проекта, который я недавно закончил.
Приложение было разработано на PHP/HTML и делает следующее:
— получает список записей из таблицы базы данных
— отображает записи в HTML-таблице
— отображает два выпадающих поля выбора для фильтрации результатов по определенным значениям столбцов.

Если Вам интересно, работу приложения Вы можете увидеть здесь.

Начинаем со смешанного PHP/HTML-файла

Исходный код для этого приложения выглядел примерно так (упрощен для ясности):

Файл: acctCodes.php (оригинальная версия)

    Номера счетов и определения SFS    

PHP здесь довольно прост. Есть три отдельных блока кода, где выполняется запрос, затем результаты обрамляются в подходящие HTML-теги и отображаются на странице. Третий блок несколько причудлив — PHP код прерывается, чтобы внутри цикла использовать нормальный HTML код, а не громоздкие неприятные операторы «echo».
Но ничего ужасно сложного здесь не происходит.

Тем не менее, мы должны будем сделать некоторую чистку, чтобы подготовиться к переходу в MODx.

Читайте также:  Common java program errors

Часть первая: Чистка (Сначала получаем значения, а затем вывод)

Первый шаг к чистке этого PHP кода для MODx (да и в целом) — это уход от смешивания логики приложения с разметкой страницы. Вместо выполнения каждого запроса перед тем как его использовать, мы запустим все запросы, а затем по необходимости просто выведем результаты с помощью echo.

В результате получаем что-то вроде этого (опять же, очень упрощено для ясности):

Файл: acctCodes.php (очищенная версия)

' . $value . ''; > $values = // некий код - выполняет запрос для получения значений второго выпадающего списка $options2 = ''; foreach ($values as $value) < $options2 .= ''; > $records = // некий код - выполняет запрос для получения записей для таблицы $trrows = ''; foreach ($records as $record) < $trrows .= '' . $record['category'] . '' . $record['status'] . '' . $record['account'] . '' . $record['acctType'] . '' . $record['title'] . '' . $record['definition'] . ''; > ?>
    

Номера счетов и определения SFS

select name="byType" >
. Я здесь упрощаю -->

Это делает разметку гораздо более легкой для просмотра и редактирования. Весь код PHP содержится в четырех блоках: первый же запрос устанавливает значения, а следующие три простыми командами echo выводят эти значения на экран.
Это уже более приемлемо для переноса этого небольшого веб-приложения в MODx.

Часть вторая: Сниппеты и плейсхолдеры

Чтобы перенести наш очищенный код в MODx, нам нужно сделать несколько дополнительных изменений.
Наш HTML код можно сразу копировать в ресурс MODx. (Ресурс более не изменится! — прим. пер.)
Но код PHP нам необходимо заменить сниппетами и некоторыми плейсхолдерами.

Содержимое нашего ресурса MODx будет выглядеть следующим образом:
Ресурс MODx: ‘acctCodes’

[[accountCodes]]    

Номера счетов и определения SFS

. Я здесь упрощаю -->[[+trrows]]

В нашем ресурсе четыре блока кода PHP были заменены тегами MODx. Первый, [[accountCodes]], будет вызывать сниппет accountCodes (который мы еще не написали). Следующие три тега — плейсхолдеры, которые будут заменены на значения, заданые нашим сниппетом.
Теперь нам нужно написать этот сниппет

Часть третья: Сниппет

Наш сниппет «accountCodes» будет содержать код из этого первого блока PHP — все запросы и цикл. Единственное, что мы собираемся добавить — несколько строк кода API MODx для создания плейсхолдеров.

' . $value . ''; > $values = // некий код - выполняет запрос для получения значений второго выпадающего списка $options2 = ''; foreach ($values as $value) < $options2 .= ''; > $records = // некий код - выполняет запрос для получения записей для таблицы $trrows = ''; foreach ($records as $record) < $trrows .= '' . $record['category'] .   '' . $record['status'] . '' . $record['account'] . '' . $record['acctType'] . '' . $record['title'] . '' . $record['definition'] . ''; > $modx->setPlaceholder('options1', $options1); $modx->setPlaceholder('options2', $options2); $modx->setPlaceholder('trrows', $trrows);

Это наш сниппет. По сравнению с нашим оригинальным PHP кодом он дополнен тремя строками «setPlaceholder» в нижней части. Они просто говорят MODx, что если и когда он встретит ниже на странице плейсхолдер [[+options1]], он должен заменить его на значение $options1. Плейсхолдеры — простой и элегантный способ для обработки выходных значений из сниппетов.

Теперь мы сделали всё, что нам нужно, чтобы веб-приложение работало внутри MODx. Однако мы можем предпринять несколько дополнительных шагов, которые сделают наше приложение гораздо сексуальнее, используя больше функций API в MODx. Я оценил бы нашу текущую реализацию на «удовлетворительно» (в оригинале — «C» . Давайте продолжим работу.

Часть четвертая: Используем чанки как шаблоны вывода

Одним из критических замечаний, которые могут быть сделаны нашему текущему коду PHP является то, что он по-прежнему смешивает разметку с логикой. Наш цикл ‘foreach’ по-прежнему содержит куски HTML разметки:

foreach ($values as $value) < $options1 .= '' . $value . '/option>'; >

Эта стратегия далека от идеала: предположим, босс просит HTML кодера Скиппи (в ориг. — «Skippy the HTML code monkey» — прим. пер.) , изменить HTML код этого приложения, добавив несколько дополнительных атрибутов для каждого тега . Но мы же не хотим, чтобы Скиппи («Skippy the HTML code monkey») оказался где-нибудь возле нашего PHP скрипта, не так ли?

Есть несколько способов исправить эту ситуацию в PHP — на ум приходит подтягивание HTML кода из внешних файлов и замена строк. Тем не менее нам не нужно беспокоиться и выяснять подходящее решение. Для этой задачи MODx предлагает другое простое и элегантное решение: чанки с плейсхолдерами.

Код «option» из приведенного выше сниппета может быть переписан в виде чанка, названного «option»:

В этом чанке нет ничего особенного — немного HTML с парой плейсхолдеров. «Option» — простой, полезный чанк, который можно использовать в любом месте — в нескольких сниппетах в разных ресурсах.

Теперь мы можем изменить наш сниппет, добавив немного больше кода API MODx, чтобы использовать значение этого чанка в нашем цикле:

setPlaceholder('value', $value); $options1 .= $modx->getChunk('option'); >

Теперь наш цикл создаёт плейсхолдер для $value и добавляет значение чанка ‘option’ в выходную строку.
Это позволяет полностью отделить весь HTML код от PHP. Если Скиппи («Skippy the HTML code monkey») необходимо добавить атрибут к элементам , он может сделать это путем редактирования чанка «option». (Просто скажите ему не трогать эти плейсхолдеры!)

Строки таблицы можно сделать аналогично:
Чанк: «trrows»

 [[+category]] [[+status]] [[+account]] [[+acctType]] [[+title]] [[+definition]] 
each ($records as $record) < $trrows .= $modx->getChunk('trrows', $record); >

Отметим, что в этом примере нам даже не придется устанавливать какие-либо плейсхолдеры!
Ассоциативный массив $record мы можем передать в GetChunk() в качестве аргумента, и плейсхолдеры будут автоматически** установлены для каждой пары ключ/значение в массиве!
(**MODX Awesomeness! You’re soaking in it!**) (Аналогия со слоганом какого-то стирального порошка? — прим. пер.)

Так что теперь мы можем сохранить все наши куски HTML в чанках и переписать наш сниппет вот так:

setPlaceholder('value', $value); $options1 .= $modx->getChunk('option'); > $values = // некий код - выполняет запрос для получения значений второго выпадающего списка $options2 = ''; foreach ($values as $value) < $modx->setPlaceholder('value', $value); $options2 .= $modx->getChunk('option'); > $records = // некий код - выполняет запрос для получения записей для таблицы $trrows = ''; foreach ($records as $record) < $trrows .= $modx->getChunk('trrows', $record); > $modx->setPlaceholder('options1', $options1); $modx->setPlaceholder('options2', $options2); $modx->setPlaceholder('trrows', $trrows);

Это уже начинает выглядеть очень хорошо. Мы использовали API MODx для шаблона вывода результата и наш сниппет выглядит действительно чистым. Тем не менее есть одна вещь, которая беспокоит меня, и может быть потенциально проблематична — теперь у нас вызовы MODx API приобщены к логике нашего приложения. Если мы на 100% уверены, что нам только когда-нибудь понадобятся данные, напечатанные на этой веб-странице и в этом формате, то это действительно не проблема. Но если есть вероятность, что эти данные, возможно, необходимо использовать по-другому — где-то за пределами MODx — было бы лучше держать основную логику приложения отдельно от сущностей MODx.

В настоящий момент приложение получает оценку «хорошо» (в оригинале — «B») . Давайте сделаем последний шаг и повысим нашу оценку до «отлично» (в оригинале — «A») .

Часть пятая: Отделение логики Вашего приложения

Все, что нам нужно сделать для последнего шага — разделить наш сниппет на две части. Первая часть будет содержать нашу логику приложения и вернёт все массивы как члены одного большого массива.
Это будет сделано на чистом PHP и в идеале должно быть сохранено в виде файла на нашем сервере.

Вторая часть — непосредственно сниппет. Он сначала получит массив, возвращаемый файлом логики, затем использует чанки для шаблонизации строк результата, и, наконец, установит плейсхолдеры для отображения результатов в ресурсах.

Вот чем это всё заканчивается:

$values, 'values2'=>$values2, 'records'=>$records); ?>
setPlaceholder('value', $value); $options1 .= $modx->getChunk('option'); > $options2 = ''; foreach ($data['values2'] as $value) < $modx->setPlaceholder('value', $value); $options2 .= $modx->getChunk('option'); > $trrows = ''; foreach ($data['records'] as $record) < $trrows .= $modx->getChunk('trrows', $record); > $modx->setPlaceholder('options1', $options1); $modx->setPlaceholder('options2', $options2); $modx->setPlaceholder('trrows', $trrows);

Теперь наши утки в ряд (Now we have our ducks in a row — прим. пер.) . Давайте рассмотрим, что мы сделали:
— У нас есть логика приложения в файле на сервере (полностью за пределами MODx).
— Мы передаем данные напрямую (без какой-бы то ни было HTML разметки) в наш MODx сниппет.
— Мы позволяем MODx управлять шаблонизацией наших выходных записей.
— Мы устанавливаем все значения плейсхолдеров в одном сниппете в верхней части ресурса.
— Где это необходимо, мы выводим наши данные на страницу с помощью плейсхолдеров.

Мы прошли долгий путь от нашего первоначального смешанного PHP/HTML-файла, не так ли? Я бы оценил эту окончательную реализацию на «отлично» (в оригинале — «A») . Тем не менее, у кого-то, вероятно, есть лучшие идеи, как разделить различные проблемные области. Но для знатоков PHP (в ориг. — PHP hacks — прим. пер.) подобно мне, это хорошее место для начала.

Надеюсь, вы узнали некоторые из ключевых проблем при написании простых приложений PHP для использования в MODx. Не стесняйтесь оставлять какие-нибудь мысли, вопросы или предложения по поводу этого руководства в комментариях здесь.

Прим. пер. — в результате были созданы:
— ресурс acctCodes (ч.2)
— сниппет accountCodes (ч.5)
— файл acctCodes.php (ч.5)
— чанк option (ч.4)
— чанк trrows (ч.4)

Источник

Использование PHP-вставок в шаблонах MODX Revo

В MODX Revolution существует такое понятие, как «Сниппет» – PHP-код, выполнение которого выводит результат на сайте. Сниппет вставляется в шаблон сайта, а значит, это как раз то, что нам нужно для решения задачи.

Итак, для того, чтобы вставить PHP-код в шаблон вашего сайта, вам необходимо:

1. Авторизоваться в панели управления вашим сайтом.

2. Переключиться на вкладку «Элементы» и напротив пункта «Сниппеты» нажать на +.

Использование PHP-вставок в шаблонах MODX Revo

После чего у вас откроется страница с добавлением нового сниппета.

3. На открывшейся странице в форму вписываем имя (оно может быть как на русском, так и на английском языке) и код сниппета (обязательно должен начинаться с ), а также выбираем категорию (если это необходимо).

Использование PHP-вставок в шаблонах MODX Revo

Не забываем запомнить имя нового сниппета, так как оно нам еще потребуется. И нажимаем «Сохранить».

Использование PHP-вставок в шаблонах MODX Revo

4. Далее переходим в редактирование шаблона вашего сайта. Для этого во вкладке «Элементы» выберите нужный вам шаблон и в нужное место вставьте код вызова сниппета.

Если нужно, чтобы результаты скрипта кэшировались, то используйте:

Если же кэширование не нужно, то используйте:

Вот таким способом можно внедрять различные PHP-скрипты в шаблон MODX Revo.

Источник

Оцените статью