# Extending


# Models

All models are defined in the Rapidez config:

'models' => [
    'page'         => Rapidez\Core\Models\Page::class,
    'attribute'    => Rapidez\Core\Models\Attribute::class,
    'product'      => Rapidez\Core\Models\Product::class,
    ...
]

To overwrite a model just create one, for example: app/Models/Product.php and extend the Rapidez model:

<?php

namespace App\Models;

use Rapidez\Core\Models\Product as BaseProduct;

class Product extends BaseProduct {
    //
}

Then change it in the configuration file:

'models' => [
    ...
    'product'      => App\Models\Product::class,
    ...
]

# Controllers

All controllers are defined in the Rapidez config:

'controllers' => [
    'page'     => Rapidez\Core\Http\Controllers\PageController::class,
    'product'  => Rapidez\Core\Http\Controllers\ProductController::class,
    'category' => Rapidez\Core\Http\Controllers\CategoryController::class,
],

Create your own, for example: app/Controllers/Product.php, make sure you implement the methods as defined in the controller in the core and define it in the configuration as with models.

# Widgets

Magento widgets can be defined in the Rapidez config:

'widgets' => [
    'Magento\Cms\Block\Widget\Block'                   => Rapidez\Core\Widgets\Block::class,
    'Magento\CatalogWidget\Block\Product\ProductsList' => Rapidez\Core\Widgets\ProductList::class,
],

They're rendered with the widget directive. You can implement additional widgets by adding them to the configuration and creating a class. All parameters will be added to the constructor and a render() method should return the output. Have a look at the existing widgets (opens new window).

If the widget doesn't need any extra logic and just needs a view with the available parameters you can just specify the view name. All parameters will be available within the $options variable.

'widgets' => [
    ...
    'Your\Custom\Widget' => 'viewname',
],

Alternatives to Magento's CMS functionalities

Have a look at the CMS packages!

# Routes

You can add any additional routes just "the Laravel way", check out the Laravel routing docs (opens new window). Additionally Rapidez adds a handy store_code route middleware so you can create routes for specify stores:

Route::middleware('store_code:YOUR_STORE_CODE')->get('customroute', function () {
    // 
});

Alternatively you can create a custom routes file if you've multiple routes specific for a store within your RouteServiceProvider

Route::middleware(['web', 'store_code:YOUR_STORE_CODE'])
    ->group(base_path('routes/YOUR_STORE_CODE.php'));

# Autocomplete

The autocomplete can contain as many ElasticSearch indexes as you wish. You can add these in the frontend.php config file. For example:

'autocomplete' => [
    'additionals' => [
        'categories' => ['name^3', 'description'],
        'blogs' => [
            'fields' => ['title', 'tags'],
            'size' => 3,
            'sort' => ['date' => 'desc'] // See: https://www.elastic.co/guide/en/elasticsearch/reference/7.17/sort-search-results.html
        ],
    ],

    'debounce' => 500,
    'size' => 10,
],

You can use categories.blade.php as an example for how to display new indexes properly in the autocomplete.