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?
2. How do you access a helper in a template?
3. Which loop is most common in PHTML templates?
Flashcards
Question
What is the short echo tag?
Click to reveal answer
Answer
<?= $block->escapeHtml($var) ?>
Question
How do you access a helper?
Click to reveal answer
Answer
$block->helper('Vendor\Module\Helper\Data')
Question
How do you get the request parameter?
Click to reveal answer
Answer
$block->getRequest()->getParam('id')
Question
How do you create a URL?
Click to reveal answer
Answer
$block->getUrl('route/controller/action', ['param' => 'value'])
Question
How do you format a price?
Click to reveal answer
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])