В самом деле, чем меньше PHP в вашем, .phtml
тем лучше, потому что:
- Сочетание PHP и HTML гораздо сложнее расшифровать, чем каждый из них в отдельности, особенно для тех, кто предпочитает работать только с одним из них (например, дизайнеры внешнего интерфейса)
- Логично иметь смысл размещать взаимодействие с серверным кодом в Блоке, вдали от того, что должно быть представлено в браузере - это старая мантра «разделения интересов».
Файл ядра Magento /app/design/frontend/base/default/template/catalog/product/price.phtml
является болезненным примером. Этот HTML-код «презентации» отображает цену. Это 471 строка! Главным образом из-за логики PHP.
Чтобы сделать ваш .phtml
стройнее и чище:
Избегайте ненужных последовательностей <?php … ?>
, объединяйте их в куски с одним<?php … ?>
вставьте столько, сколько сможете PHP в блок, а не в .phtml
Чтобы помочь с вышесказанным, в блоке использовать assign(‘myvar’,
[expression])
для создания $ переменных, которые можно ссылаться без
$this->...
в .phtml, так что вы можете быть действительно кратким<?php echo $myvar; ?>
желаю Magento принять Twig в будущем для еще более чистого взгляда
Давайте применим вышеизложенное к фрагменту из исходного кода приведенного выше примера: /app/design/frontend/base/default/template/catalog/product/price.phtml
<?php if ($this->getDisplayMinimalPrice() && $_minimalPriceValue && $_minimalPriceValue < $_product->getFinalPrice()): ?>
<?php $_minimalPriceDisplayValue = $_minimalPrice; ?>
<?php if ($_weeeTaxAmount && $_weeeHelper->typeOfDisplay($_product, array(0, 1, 4))): ?>
<?php $_minimalPriceDisplayValue = $_minimalPrice+$_weeeTaxAmount; ?>
<?php endif; ?>
….
<?php echo $_coreHelper->currencyByStore($_minimalPriceDisplayValue, $_storeId, true, false) ?>
Первый шаг: удалите повторение <?php … ?>
чтобы получить что-то вроде этого:
if ($this->getDisplayMinimalPrice() && $_minimalPriceValue && $_minimalPriceValue < $_product->getFinalPrice()) {
$_minimalPriceDisplayValue = $_minimalPrice;
if ($_weeeTaxAmount && $_weeeHelper->typeOfDisplay($_product, array(0, 1, 4))) {
$_minimalPriceDisplayValue = $_minimalPrice+$_weeeTaxAmount;
}
…
echo $_coreHelper->currencyByStore($_minimalPriceDisplayValue, $_storeId, true, false)
?>
Выше все помещает весь PHP в один блок кода.
2 + 3. Развиваясь во что-то лучшее, переместите этот код в свой блок:
protected function _prepareLayout() {
$this->assign(‘minPrice’, $this->calculateMinPrice(…));
}
protected function calculateMinPrice(…) {
if ($this->getDisplayMinimalPrice() && $_minimalPriceValue && $_minimalPriceValue < $_product->getFinalPrice()) {
// etc...
}
}
Обратите внимание на использование _prepareLayout()
и assign()
функций для этого.
Теперь этот извилистый раздел .phtml можно сократить до простой строки:
<?php echo $minPrice; ?>
Я думаю, что мы все можем жить с этим!