📊 State of Magento 2025

The Home for Magento 2 Excellence

Quality-tested Magento 2 modules. Explore. Evaluate. Elevate. #magento2

613 Modules
401 Ready
211 Need Help
🏆 Leaderboard
Potentially Abandoned v2.1.5

Magento Twig

schumacherfm/magento-twig

Enables the use of Twig template engine for Magento 2, allowing developers to write templates using the `.twig` file extension. It dispatches events for modifying Twig's loader and environment.

13,815
Downloads
Below average
60
GitHub Stars
Above average
3y ago
Last Release
1
Open Issues
Build Passing
Ready to install

Build Tests

Composer Install
DI Compile
Templates

Code Quality

CS Coding Standard
29 warnings
L2 PHPStan

Tested on Magento 2.4.8-p3

Recent Test History

Each release is tested against the latest Magento version at that time.

v2.1.5 on Magento 2.4.8-p3
Dec 27, 2025

Share This Module's Status

Magento Twig Magento compatibility status badge

README

Loaded from GitHub

Magento 2 Twig Template Engine

Twig template engine for Magento2.

This template engine is meant to be used additionally to the .phtml files and does not provide any .twig template file.

A use case would be if you write your first Magento2 module you can require this package and write all your template files in Twig.

Installation

  1. Add dependency
composer require schumacherfm/magento-twig
  1. Enable the module
bin/magento module:enable SchumacherFM_Twig
  1. Update the database entries
bin/magento setup:upgrade

Events & Configuration

The Twig template engine class dispatches two events so that you can modify Twig.

Event twig_loader with event object loader. You can set loader any other class which implements Twig_LoaderInterface. http://twig.sensiolabs.org/doc/api.html#loaders

Event twig_init with event object twig. You can add here more functions, filters, tags, etc. http://twig.sensiolabs.org/doc/advanced.html

Configuration options can be found Stores -> Settings -> Configuration -> Advanced -> Developer -> Twig.

Frontend Integration

Your template files must have the file extension .twig to get automatically recognized.

In your layout xml files or blocks please specify the new template

<referenceBlock name="top.links">
    <block class="Magento\Theme\Block\Html\Header" template="html/header.twig" name="header" as="header" before="-">
        <arguments>
            <argument name="show_part" xsi:type="string">welcome</argument>
        </arguments>
    </block>
</referenceBlock>

Example header.phtml converted to header.twig

<?php switch ($this->getShowPart()):
    case 'welcome': ?>
        <li class="greet welcome"><?php echo $this->getWelcome() ?></li>
    <?php break; ?>
    <?php case 'other': ?>
        <?php echo $this->getChildHtml(); ?>
    <?php break; ?>
<?php endswitch; ?>
{% if getShowPart() == 'welcome' %}
    <li class="greet welcome">{{ getWelcome() }}</li>
{% endif %}

{% if getShowPart() == 'other' %}
    {{ getChildHtml()|raw }}
{% endif %}

Example breadcrumbs.phtml converted to breadcrumbs.twig

<?php if ($crumbs && is_array($crumbs)) : ?>
<div class="breadcrumbs">
    <ul class="items">
        <?php foreach ($crumbs as $crumbName => $crumbInfo) : ?>
            <li class="item <?php echo $crumbName ?>">
            <?php if ($crumbInfo['link']) : ?>
                <a href="<?php echo $crumbInfo['link'] ?>" title="<?php echo $this->escapeHtml($crumbInfo['title']) ?>">
                    <?php echo $this->escapeHtml($crumbInfo['label']) ?>
                </a>
            <?php elseif ($crumbInfo['last']) : ?>
                <strong><?php echo $this->escapeHtml($crumbInfo['label']) ?></strong>
            <?php else: ?>
                <?php echo $this->escapeHtml($crumbInfo['label']) ?>
            <?php endif; ?>
            </li>
        <?php endforeach; ?>
    </ul>
</div>
<?php endif; ?>
{% if crumbs %}
<div class="breadcrumbs">
    <ul class="items">
    {% for crumbName,crumbInfo in crumbs %}
        <li class="item {{ crumbName }}">
            {% if crumbInfo.link %}
                <a href="{{ crumbInfo.link }}" title="{{ crumbInfo.title }}">
                    {{ crumbInfo.label }}
                </a>
            {% elseif crumbInfo.last %}
                <strong>{{ crumbInfo.label }}</strong>
            {% else %}
                {{ crumbInfo.label }}
            {% endif %}
        </li>
    {% endfor %}
    </ul>
</div>
{% endif %}

Access helper methods

Write in your .twig file:

{{ helper("Magento\\Core\\Helper\\Url").getHomeUrl() }}

Tests

@todo

Support / Contribution

Report a bug using the issue tracker or send us a pull request.

Instead of forking I can add you as a Collaborator IF you really intend to develop on this module. Just ask :-)

I am using that model: A successful Git branching model

For versioning have a look at Semantic Versioning 2.0.0

History

2.0.0

  • Added Magento 2.4.0 compatibility
  • Removed helper functions from app/functions.php since the file is no longer available in Magento 2.4
  • Removed deprecated function layoutBlock from twig environment
  • Updated to twig to 3.0.*

Compatibility

  • Magento >= 2
  • php >= 5.4.0

License

OSL-30

Author

Cyrill Schumacher

My pgp public key

This content is fetched directly from the module's GitHub repository. We are not the authors of this content and take no responsibility for its accuracy, completeness, or any consequences arising from its use.