Leafiny Documentation

Rewrite

Leafiny offers a rewrite URL system that can be used with all routes.

Note: If you don't need to rewrite the routes, simply remove the Leafiny_Rewrite module.

Routes

Routes are declared in config files (see Routes section). For example:

/** modules/Frontend/etc/config.php **/

'page' => [
    '/foo/example.html' => [
        /* ... */
    ],
],
/* ... */

If we want to rewrite /foo/example.html with /bar/example.html, we add a new rewrite.

From the admin

Menu: URL > Rewrites

Click on the Add button.

Programmatically

/** @var Rewrite_Model_Rewrite $rewrite */
$rewrite = App::getObject('model', 'rewrite');

if (!$rewrite->exists('/foo/example.html')) {
    $object = new Leafiny_Object();
    $object->setData(
        [
            'source_identifier' => '/foo/example.html',
            'target_identifier' => '/bar/example.html',
        ]
    );
    $rewrite->save($object);
}

Entities

The rewrite module allows to automatically add rewrite for entities. For example, the route for a simple CMS page is declared as follows:

/** modules/Leafiny_Cms/etc/config.php **/

'page' => [
    '/page/*.html' => [
        /* ... */
    ],
],
/* ... */

We don't want to have /page/*.html, but only *.html.

For the rewrite model, we have an entity rewrite configuration:

/** modules/Leafiny_Cms/etc/config.php **/

'model' => [
    /* ... */
    'rewrite' => [
        'entity' => [
            'cms_page' => [                  // The model identifier
                'enabled' => 1,              // Enabled or disabled the rewrite
                'table'   => 'cms_page',     // The entity table name
                'column'  => 'path_key',     // The entity URL path column
                'source'  => '/*.html',      // The URL we want
                'target'  => '/page/*.html', // The original route
            ]
        ]
    ],
],
/* ... */

On the CMS page save, the rewrite is added. When /my-page.html is opened, the system use /page/my-page.html.

Note: Be sure to have an unique URL. If 2 entities use the same rewrite, one of them will be never retrieved.

Get the URL

In any template, we use the getUrlRewrite method to get the URL:

{{ page.getUrlRewrite('my-page', 'cms_page') }}

Make sure that the option is enabled for the rewrite model. Otherwise, the original route will be returned.

/** etc/config.default.php **/

'model' => [
    'rewrite' => [
        'enabled' => 1,
    ],
    /* ... */
],

Refresh

From the admin

When an entity URL path is updated, the old rewrite is never removed. You can remove it manually from the admin: URL > Rewrites.

For a total refresh, remove all the entity URLs by filtering on the type. Then click the Refresh button on the rewrites page.

Programmatically

/** @var Rewrite_Model_Rewrite $rewriteModel */
$rewriteModel = App::getObject('model', 'rewrite');

$objectType = 'category';  // category, catalog_product, cms_page, blog_post

$filters = [
    [
        'column'   => 'object_type',
        'value'    => $objectType,
    ]
];

$rewrites = $rewriteModel->getList($filters);

foreach ($rewrites as $rewrite) {
    $rewriteModel->delete((int)$rewrite->getData('rewrite_id'));
}

$rewriteModel->refreshAll($objectType);