Написание хорошего чанка
Последнее обновление Oct 27th, 2020 | История страницы | Улучшить эту страницу | Сообщить о проблеме
Мы помещаем это здесь, потому что часто Сниппеты кода используют Чанки для форматирования данных.
НЕ переусердствуйте с логикой модификатора вывода!¶
Что такое выходные модификаторы "PHx")? Это упрощенный набор правил синтаксического анализа и модификаций вывода, который позволяет вам манипулировать данными на уровне представления (например: в ваших чанках и шаблонах).
Вероятно, это самая большая ошибка, которую вы можете сделать: добавив слишком много логики в ваши чанки или шаблоны. Прекрасная вещь в MODX как в фреймворке - это его приверженность звуковой архитектуре, и когда вы вкладываете слишком много логики в слой представления (то есть в чанки и шаблоны), вы разрушаете все, что хорошо в этом мире. Иногда вам нужно поместить выходной фильтр или небольшой оператор if в свой чанк, но, пожалуйста, держите его в абсолютном минимуме. Это очень похоже на морфин: морфин является сильным болеутоляющим, когда используется ответственно, но он ужасно вызывает привыкание и может разрушать жизни. Да, это сумасшедшая аналогия, но я подумал об открытии «Реабилитационного центра» для разработчиков с плохими привычками кодирования.
НЕПРАВИЛЬНЫЙ способ сделать это¶
Вот пример Tpl чанка, который полностью вышел из-под контроля:
[[+tv.RemovePin:eq=`active`:then=`[[+modx.user.id:memberof=`
Members`:then=`{address:'[[+tv.country]], [[+pagetitle]]', data:'<div class="googleBubble">
[[+tv.Socialicons:replace=`||==`:replace=`facebook==<img src="/assets/images/mapof/facebook.png"
alt="Facebook" width="16" height="16" class="pull-right mR2">`:replace=`linkedin==<img src="/assets/images/mapof/linkedin.png" alt="linked in" width="16" height="16" class="pull-right mR2">`:replace=`twitter==<img src="/assets/images/mapof/twitter.png" alt="twitter" width="16" height="16" class="pull-right mR2">`]]<b>[[+tv.GPGroupName:replace=`'=='`:default=`Dr [[+createdby:userinfo=`fullname`:ucwords]]`]]</b><br>[[+tv.occupation:notempty=`Occupation: [[+tv.occupation]]<br>`]][[+tv.other:notempty=`Occupation: [[+tv.other]]<br><br>`]]
[[+content:replace=`
==<br>`:replace=`'=='`:strip]]<br>[[+tv.leadadmin:notempty=`<br>Admin contact: [[+tv.leadadmin]]`]] [[+tv.opentomembers:notempty=`<br>Open to new members?: [[+tv.opentomembers]]`]]
<br>[[+tv.showEmailAddress:eq=`Yes`:then=`Email: <a href="mailto:[[+createdby:userinfo=`email`]]">
[[+createdby:userinfo=`email`]]</a>`:else=``]]</div>',options:{[[+tv.leadadmin:neq=``:then=`icon: new
google.maps.MarkerImage('/assets/images/mapof/pin-gold.png')`:else=`icon: new
google.maps.MarkerImage('/assets/images/mapof/pin-blue.png')`]]}},`:else=`{address:'[[+tv.country]], [[+pagetitle]]', data:'<div class="googleBubble"><h3>Login to view</h3><p>To view the details of this pin please <a href="[[~702]]">create an account</a> or <a href="[[~702]]">login</a></p>
</div>',options:{[[+tv.leadadmin:neq=``:then=`icon: new
google.maps.MarkerImage('/assets/images/mapof/pin-gold.png')`:else=`icon: new
google.maps.MarkerImage('/assets/images/mapof/pin-blue.png')`]]}},`]]`]]
Если вы пишете такие вещи для своего сайта, прекратите сейчас. Вы сэкономите себе часы и часы, если переосмыслите проблему и переместите всю эту логику в сниппет или поместите ее куда-то еще.
Reasons Why Output Modifiers Might Destroy Your Site¶
- Увеличение затрат на обслуживание: редактирование HTML-кода займет у вас много времени, если вы замаскируете его сложной логикой.
- Скорость! Вы не можете полностью кэшировать динамический блок или шаблон, который использует логические условия. Модификаторы вывода намного медленнее, чем простой PHP.
- В отличие от PHP, модификаторы вывода не отправляют сообщения об ошибках или номера строк, так что гораздо сложнее отлаживать ошибки!
- Модификаторы вывода не используют скобки, и в текстовом редакторе невозможно сопоставить обратные метки, поэтому в вашем коде очень легко делать синтаксические ошибки.
Существуют сотни, если не тысячи сайтов MODX, которые были испорчены и использовались из-за неэффективного логического хаоса, втиснутого в их чанки и шаблоны. Да, это отличная возможность, которую вы можете сделать в последнюю минуту для подстройки данных на уровне представления, но этим можно ужасно злоупотреблять, и хотя ваши сумасшедшие блоки могут иметь смысл для you, как только другой разработчик будет работать над ними, есть вероятность Хорошо, что они захотят удалить весь сайт и заменить его чем-нибудь более разумным.
Одной из вещей, которые отличают MODX, является то, что его слой представления является чистым (или это должно быть так или иначе). Внедрение сложных HTML и CSS является простым делом в MODX. Сравните это с WordPress, Drupal или Joomla: ставки на eLance говорят сами за себя. Намного больше работы по интеграции шаблонов с использованием этих других систем, потому что все они помещают логику в свои слои представления. Когда вы делаете это, вы побеждаете всю цель архитектуры MODX MVC.
Если вам действительно нужно их использовать, вот отличная статья описание того, как использовать модификаторы вывода в качестве условных выражений с минимальными накладными расходами.
Правильный способ сделать это¶
Держите свои чанки и шаблоны чистыми. Они должны быть легко читаемыми и легко редактируемыми.
Дорогой [[+first_name]], было приятно видеть тебя в последний раз [[+day_of_week]]
Что мы видим? Просто. Коротко. Ясно.
Чек лист хорошего чанка¶
- Дайте вашему tpl чанка хорошее описание, чтобы люди знали, что он содержит и какие сниппеты полагаются на него.
- Не включайте другие чанки в чанки! Все может стать очень запутанным, если вы начнете спускаться по этой кроличьей норе.
- Используйте правильные отступы, чтобы ваш HTML легко читался.
- Если вы используете какую-то логику в своих списках Чанков, убедитесь, что вы используете ее ответственно. Не вкладывайте теги и не объединяйте длинные операторы if-else вместе. Хорошее практическое правило таково: если ваш модификатор вывода не помещается на одной строке, то вы должны сделать это по-другому.
Практическое правило Если ваш tpl чанка использует модификатор вывода, он должен поместиться в одну строку. Если он длиннее одной строки, то вам, вероятно, следует найти другой способ выполнить то, что вы делаете, например, используйте сниппет или создайте другую страницу для обработки изменений.