TransWikia.com

Custom controller goes to 404 for custom form in Magento 2?

Magento Asked by Prits on November 9, 2020

I have created a custom controller to show a custom form but it goes to 404 page in Magento 2 ?

Controller file path : ( app/code/Company/Module/Controller/Index/Booking.php )

<?php

namespace CompanyModuleControllerIndex;

use MagentoFrameworkControllerResultFactory;
use MagentoFrameworkViewResultPageFactory;
use MagentoFrameworkAppActionContext;

class Booking extends MagentoFrameworkAppActionAction
{
protected $customerSession;
protected $urlInterface;

public function __construct(
    MagentoCustomerModelSession $customerSession,
    MagentoFrameworkUrlInterface $urlInterface,
    MagentoFrameworkAppActionContext $context
) {
    $this->urlInterface = $urlInterface;
    $this->customerSession = $customerSession; 
    parent::__construct($context);
}
/**
 * Booking action
 *
 * @return void
 */
public function execute()
{
    if(!$this->customerSession->isLoggedIn()) {
        $this->messageManager->addErrorMessage("You must be logged in to view product");
        $this->customerSession->setAfterAuthUrl($this->urlInterface->getCurrentUrl());
        $this->customerSession->authenticate();
        return;
    }
    // 1. POST request : Get booking data
    $post = (array) $this->getRequest()->getPost();

    if (!empty($post)) {
        // Retrieve your form data
        $firstname   = $post['firstname'];
        $lastname    = $post['lastname'];
        $phone       = $post['phone'];
        $bookingTime = $post['bookingTime'];

        // Doing-something with...

        // Display the succes form validation message
        $this->messageManager->addSuccessMessage('Booking done !');

        // Redirect to your form page (or anywhere you want...)
        $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
        $resultRedirect->setUrl('/companymodule/index/booking');

        return $resultRedirect;
    }
    // 2. GET request : Render the booking page 
    $this->_view->loadLayout();
    $this->_view->renderLayout();
}
}

My routes file path ( app/code/Company/Module/etc/frontend/routes.xml )

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="standard">
    <route id="companymodule" frontName="companymodule">
        <module name="Company_Module"/>
    </route>
</router>
</config>

My companymodule_index_booking.xml file path ( app/code/Company/Module/view/frontend/layout/companymodule_index_booking.xml )

<?xml version="1.0"?>
<page layout="2columns-left" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<head>
    <title>HTML title - The booking form page</title>
</head>
<body>
    <referenceBlock name="navigation.sections" remove="true" />
    <referenceContainer name="content">
        <block class="CompanyModuleBlockBooking" 
name="companymodule.booking" template="Company_Module::booking.phtml"/>
    </referenceContainer>
</body>
</page>

My Block code path ( app/code/Company/Module/Block/Booking.php )

<?php

namespace CompanyModuleBlock;

class Booking extends MagentoFrameworkViewElementTemplate
{
/**
 * Construct
 *
 * @param MagentoFrameworkViewElementTemplateContext $context
 * @param array $data
 */
public function __construct(
    MagentoFrameworkViewElementTemplate $context,
    array $data = []
)
{
    parent::__construct($context, $data);
   }

/**
 * Get form action URL for POST booking request
 *
 * @return string
 */
public function getFormAction()
{
        // companymodule is given in routes.xml
        // controller_name is folder name inside controller folder
        // action is php file name inside above controller_name folder

    return '/companymodule/controller_name/action';
    // here controller_name is index, action is booking
}
}

I have followed this How to Create Custom Form in Magento2 Frontend? for that but 404 comes how to solve that error.
Any help is appriciated.

2 Answers

Please update the below files

Block

<?php 
namespace namespace CompanyModuleBlock;


class Booking extends MagentoFrameworkViewElementTemplate
{
public function __construct(
    MagentoFrameworkViewElementTemplateContext $context
) {
    parent::__construct($context);
}

public function _prepareLayout()
{   
    return parent::_prepareLayout();
}
}

Controller

<?php
namespace CompanyModuleControllerIndex;

class Index extends MagentoFrameworkAppActionAction
{
public function execute()
{
    $this->_view->loadLayout();
    $this->_view->getLayout()->initMessages();
    $this->_view->renderLayout();
}
}

Layout

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
    <referenceContainer name="content">
        <block class="CompanyModuleBlockBooking" name="booking" template="booking.phtml">
        </block>
    </referenceContainer>
</body>

Answered by Harsh Jayswal on November 9, 2020

Change your controller like this :

<?php
namespace CompanyModuleControllerIndex;

use MagentoFrameworkControllerResultFactory;

class Booking extends MagentoFrameworkAppActionAction
{
   public function execute()
   {
       $this->_view->loadLayout();
       $this->_view->renderLayout();
   }
}

And then check does your URL is access or not.

Answered by Dhiren Vasoya on November 9, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP