Customers can manage and view their activities from account dashboard. The customer dashboard consists of several sections like “My Accounts”, “Orders” and “addresses” etc. Sometimes a store owner may require to enhance the user experience or create a new feature by adding a particular tab to the customer dashboard.
So today we will find out how we can achieve it in a few steps.
Begin with creating a frontend layout customer_account.xml inside your module and add a block with required arguments:
Know/Module/view/frontend/layout/customer_account.xml
<? xml version = "1.0" ?>
< body >
< referenceBlock name = "customer_account_navigation" >
< block class = "Magento\Customer\Block\Account\SortLinkInterface" name = "customer-account-navigation-my-calendar" >
< arguments >
< argument name = "label" xsi:type = "string" translate = "true" >My Calendar</ argument >
< argument name = "path" xsi:type = "string" >module/calendar</ argument >
< argument name = "sortOrder" xsi:type = "number" >15</ argument >
</ arguments >
</ block >
</ referenceBlock >
</ body >
</ page >
|
Name | Description |
---|
Magento\Customer\Block\Account\SortLinkInterface | A sortable interface used to sort the navigation links. The sort order is provided in arguments. |
label | Specifies the tab label. |
path | Path is used to specify the target path or url when customer clicks the tab link. |
sortOrder | Sorts the tab link display position. |
Flush the cache and load the customer dashboard index page. The output should be similar to the screenshot below:

Let us go ahead and add a separator before our tab link. Open your customer_account.xml layout file. This is an optional step. We are using it because we want to categories our feature tab.
Edit the layout: Know/Module/view/frontend/layout/customer_account.xml
<? xml version = "1.0" ?>
< body >
< referenceBlock name = "customer_account_navigation" >
< block class = "Magento\Customer\Block\Account\SortLinkInterface" name = "customer-account-navigation-my-calendar" >
< arguments >
< argument name = "label" xsi:type = "string" translate = "true" >My Calendar</ argument >
< argument name = "path" xsi:type = "string" >module/calendar</ argument >
< argument name = "sortOrder" xsi:type = "number" >15</ argument >
</ arguments >
</ block >
< block class = "Magento\Customer\Block\Account\Delimiter" name = "customer-account-navigation-delimiter-3" template = "Magento_Customer::account/navigation-delimiter.phtml" >
< arguments >
< argument name = "sortOrder" xsi:type = "number" >20</ argument >
</ arguments >
</ block >
</ referenceBlock >
</ body >
</ page >
|
Make sure the sort order for delimiter is greater than the tab link. The output should look like this now:

In next step we will create a custom page for our new tab link. The page should appear inside the customer dashboard. First define a route by creating the routes.xml file under etc/frontend directory.
Create file: Know/Module/etc/frontend/routes.xml
<? xml version = "1.0" ?>
< router id = "standard" >
< route id = "module" frontName = "module" >
< module name = "Know_Module" />
</ route >
</ router >
</ config >
|
Now create Index controller under Controller/Calendar directories.
Create the controller: Know/Module/Controller/Calendar/Index.php
<?php
namespace Know\Module\Controller\Calendar;
use Magento\Framework\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
class Index extends \Magento\Customer\Controller\AbstractAccount
{
protected $resultPageFactory ;
public function __construct(
Context $context ,
PageFactory $resultPageFactory
) {
$this ->resultPageFactory = $resultPageFactory ;
parent::__construct( $context );
}
public function execute()
{
return $this ->resultPageFactory->create();
}
}
|
In next and last step create a layout and associated phtml template file.
Create layout first: Know/Module/view/frontend/layout/module_calendar_index.xml
<? xml version = "1.0" ?>
< update handle = "customer_account" />
< head >
< title >My Calendar - Dashboard</ title >
</ head >
< body >
< referenceBlock name = "page.main.title" >
< action method = "setPageTitle" >
< argument translate = "true" name = "title" xsi:type = "string" >My Calendar</ argument >
</ action >
</ referenceBlock >
< referenceContainer name = "content" >
< block class = "Magento\Framework\View\Element\Template" name = "tab.mycalendar" template = "Know_Module::mycalendar.phtml" />
</ referenceContainer >
</ body >
</ page >
|
Now create the specified template: Know/Module/view/frontend/templates/mycalendar.phtml
<?php
?>
<div class = "message info empty" ><span><?= $escaper ->escapeHtml(__( 'You have no schedule in your calendar. Click Add Schedule button to begin creating the schedules.' )) ?></span></div>
<div class = "actions-toolbar" >
<div class = "primary" >
<button type= "button" role= "add-schedule" title= "<?= $block->escapeHtmlAttr(__('Add New Schedule')) ?>" class = "action primary add" ><span><?= $block ->escapeHtml(__( 'Add New Schedule' )) ?></span></button>
</div>
<div class = "secondary" >
<a class = "action back" href= "<?= $escaper->escapeUrl($block->getUrl('customer/account/')) ?>" >
<span><?= $escaper ->escapeHtml(__( 'Back' )) ?></span>
</a>
</div>
</div>
|
The output for our new tab looks like below:
