Skip to content
intermediate Phase 54 · Frontend Components

PHTML Templates

Mastering Magento 2 PHTML templates: syntax, escaping, conditionals, loops, helper methods, and layout methods

45m
0 problems
Topic Progress 0%

PHTML Syntax Basics

Template Structure

<?php
/** @var Vendor\Module\Block\ProductView $block */
$products = $block->getProducts();
$title = $block->getTitle();
?>
<div class="product-view">
    <h1><?= $block->escapeHtml($title) ?></h1>
    
    <?php if (!empty($products)): ?>
        <div class="product-list">
            <?php foreach ($products as $product): ?>
                <div class="product-item">
                    <?= $block->escapeHtml($product->getName()) ?>
                </div>
            <?php endforeach; ?>
        </div>
    <?php endif; ?>
</div>

PHP in Templates

// Short echo tag (preferred)
<?= $block->escapeHtml($variable) ?>

// PHP echo
<?php echo $block->escapeHtml($variable); ?>

// PHP code blocks
<?php
$count = count($products);
$message = $count > 0 ? 'Products found' : 'No products';
?>

Variable Assignment

<?php
$products = $block->getProducts();
$title = $block->escapeHtml($block->getTitle());
$showPrice = (bool)$block->getData('show_price');
$limit = (int)$block->getData('limit');
?>

Conditionals in Templates

If/Else Statements

<?php if ($block->isLoggedIn()): ?>
    <p>Welcome, <?= $block->escapeHtml($block->getCustomerName()) ?>!</p>
<?php else: ?>
    <p>Please <a href="<?= $block->escapeUrl($block->getLoginUrl()) ?>">log in</a></p>
<?php endif; ?>

Complex Conditions

<?php if ($block->getProductCount() > 0 && $block->showPrice()): ?>
    <div class="price">
        <?= $block->formatPrice($block->getProduct()->getPrice()) ?>
    </div>
<?php elseif ($block->getProductCount() > 0): ?>
    <div class="price-on-request">Price on request</div>
<?php else: ?>
    <div class="no-products">No products available</div>
<?php endif; ?>

Ternary Operator

<?= $block->getProduct()->getStockStatus() ? 'In Stock' : 'Out of Stock' ?>

<?= $block->escapeHtml($block->getProduct()->getName() ?: 'Unknown Product') ?>

Switch Statements

<?php switch ($block->getProductType()): 
    case 'simple': ?>
        <div class="simple-product">Simple Product</div>
    <?php break; 
    case 'configurable': ?>
        <div class="configurable-product">Configurable Product</div>
    <?php break; 
    default: ?>
        <div class="other-product">Other Product</div>
<?php endswitch; ?>

Loops in Templates

Foreach Loop

<?php foreach ($block->getProducts() as $product): ?>
    <div class="product-item">
        <h3><?= $block->escapeHtml($product->getName()) ?></h3>
        <p><?= $block->formatPrice($product->getPrice()) ?></p>
    </div>
<?php endforeach; ?>

Foreach with Key

<?php foreach ($block->getOptions() as $key => $option): ?>
    <option value="<?= $block->escapeHtmlAttr($key) ?>">
        <?= $block->escapeHtml($option) ?>
    </option>
<?php endforeach; ?>

For Loop

<?php for ($i = 0; $i < $block->getLimit(); $i++): ?>
    <div class="item-<?= $i ?>">
        Item <?= $i + 1 ?>
    </div>
<?php endfor; ?>

While Loop

<?php $iterator = $block->getProducts()->getIterator(); ?>
<?php while ($iterator->valid()): ?>
    <?php $product = $iterator->current(); ?>
    <div class="product">
        <?= $block->escapeHtml($product->getName()) ?>
    </div>
    <?php $iterator->next(); ?>
<?php endwhile; ?>

Loop with Counter

<?php $counter = 0; ?>
<?php foreach ($block->getProducts() as $product): ?>
    <?php $counter++; ?>
    <div class="product <?= $counter % 3 === 0 ? 'last' : '' ?>">
        <?= $block->escapeHtml($product->getName()) ?>
    </div>
<?php endforeach; ?>
<p>Total: <?= $counter ?> products</p>

Helper and Layout Methods

Accessing Helpers

<?php
$helper = $block->helper('Vendor\Module\Helper\Data');
$formattedDate = $helper->formatDate($block->getDate());
$isEnabled = $helper->isEnabled();
?>

<div class="content">
    <?php if ($isEnabled): ?>
        <p>Date: <?= $formattedDate ?></p>
    <?php endif; ?>
</div>

Layout Methods

<?php
// Get layout object
$layout = $block->getLayout();

// Create block dynamically
$customBlock = $layout->createBlock(
    \Vendor\Module\Block\Custom::class,
    'custom_block'
);

// Get block by name
$headerBlock = $layout->getBlock('header');

// Get page config
$pageConfig = $block->pageConfig;
$pageConfig->getTitle()->set(__('Custom Title'));

// Get request
$request = $block->getRequest();
$param = $request->getParam('id');

// Get URL builder
$url = $block->getUrl('module/controller/action', ['id' => 1]);
$baseUrl = $block->getBaseUrl();

// Get store manager
$storeId = $block->getStoreManager()->getStore()->getId();
$storeName = $block->getStoreManager()->getStore()->getName();
?>

Common Helper Patterns

// Price formatting
$price = $block->helper('Magento\Framework\View\Element\AbstractBlock')
    ->formatPrice($product->getPrice());

// Date formatting
$date = $block->helper('Magento\Framework\Stdlib\DateTime\DateTime')
    ->formatDate($product->getCreatedAt());

// Custom helper
$helper = $block->helper('Vendor\Module\Helper\Data');
$description = $helper->processDescription($product->getDescription());

Quiz

1. What is the preferred PHP syntax for output in PHTML?

Question 1 options

2. How do you access a helper in a template?

Question 2 options

3. Which loop is most common in PHTML templates?

Question 3 options

Flashcards

Question

What is the short echo tag?

Answer

<?= $block->escapeHtml($var) ?>

Question

How do you access a helper?

Answer

$block->helper('Vendor\Module\Helper\Data')

Question

How do you get the request parameter?

Answer

$block->getRequest()->getParam('id')

Question

How do you create a URL?

Answer

$block->getUrl('route/controller/action', ['param' => 'value'])

Question

How do you format a price?

Answer

$block->formatPrice($price) or $block->helper('...')->formatPrice($price)

Revision Notes

Key Takeaways

  • 1. Use short echo tags <?= ?> for output
  • 2. Always escape output with appropriate methods
  • 3. Use foreach for most iterations
  • 4. Access helpers via $block->helper()
  • 5. Use layout methods for dynamic block creation

Interview Tips

  • Know the difference between <?= ?> and <?php echo ?>
  • Be comfortable writing conditionals and loops in templates
  • Know how to access helpers and layout methods
  • Understand when to use each escape method

Cheat Sheet

Short echo: <?= $block->escapeHtml($var) ?>
Conditionals: <?php if (): ?> ... <?php endif; ?>
Loops: <?php foreach ($arr as $item): ?> ... <?php endforeach; ?>

Helpers: $block->helper('Vendor\Helper\Data')
Layout: $block->getLayout()
Request: $block->getRequest()->getParam('id')
URL: $block->getUrl('route/action', ['id' => 1])