You can use Magento\Framework\App\Request\DataPersistorInterface
Using this class, you can show proceed data to form url.
One of example is Magento_Contact
module contacts form.
At post Action,you can set form data
$post = $this->getRequest()->getPostValue();
$postObject = new \Magento\Framework\DataObject();
$postObject->setData($post);
$this->getDataPersistor()->set('{formname}', $post);
And form page, you can get those data by
$this->postData = (array) $this->getDataPersistor()->get({formname});
For particular field by
$this->postData[{fieldName}]
Example:
Post Action:
<?php
namespace {Vendorname}\{Modulename}\Controller\{Controllername};
use Magento\Framework\App\Request\DataPersistorInterface;
class {PostActioName}
{
public $dataPersistor;
public function __construct(
.....
DataPersistorInterface $dataPersistor,
....
)
{
$this->dataPersistor = $dataPersistor;
}
public function execute()
{
$post = $this->getRequest()->getPostValue();
try {
$postObject = new \Magento\Framework\DataObject();
$postObject->setData($post);
/* clear form data */
$this->getDataPersistor()->clear('{form_Name}');
} catch (\Exception $e) {
....
/* set form data */
$this->getDataPersistor()->set('{form_Name}', $post);
....
}
}
}
Post value to form Url:
You can this data at block class by Magento\Framework\App\Request\DataPersistorInterface
namespace{Vendorname}\{Modulename}\Block;
use Magento\Framework\App\Request\DataPersistorInterface;
class Form extends \Magento\Framework\View\Element\Template
{
private $postData = null;
public $dataPersistor;
public function __construct(
....
\Magento\Framework\View\Element\Template\Context $context,
DataPersistorInterface $dataPersistor,
....
)
{
....
$this->dataPersistor = $dataPersistor;
parent::__construct($context);
....
}
public function getPostValue($key)
{
if (null === $this->postData) {
$this->postData = (array) $this->getDataPersistor()->get('{form_Name}');
$this->getDataPersistor()->clear('{form_Name}');
}
if (isset($this->postData[$key])) {
return (string) $this->postData[$key];
}
return '';
}
}
Calculation Layout -
Vendor/Module/view/frontend/layout/module_index_index.xml
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column"
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<head>
<title>Calculator</title>
</head>
<body>
<referenceContainer name="content">
<block class="Vendor\Module\Block\Index" name="calculation_index" template="Vendor_Module::calculation.phtml" />
</referenceContainer>
</body>
</page>
Calculation Input PHTML -
Vendor/Module/view/frontend/templates/calculation.phtml
<div class="row clearfix">
<div class="col-md-12 column">
<form name="form_height" method="POST" id="form_height">
<input type="text" name="height" class="form-control input-md">
<input type="text" name="weight" class="form-control input-md">
<input type="submit" id="calculateTotalSubmit" name="calculate-total-submit" value="Calculate Total">
</div>
</form>
</div>
</div>
<script>
require(['jquery'],function(){
jQuery(document).ready(function() {
jQuery("#form_height").submit(function(){
var heightValue = jQuery("input[name='height']").val();
var weightValue = jQuery("input[name='weight']").val();
var url = "<?php echo $block->getBaseUrl().'module/result/result/' ?>";
jQuery.ajax({
url: url,
type: "POST",
data: {height:heightValue,weight:weightValue},
showLoader: true,
cache: false
success: function(response){
console.log(response.output);
}
});
return false;
});
});
});
</script>
Block -
Vendor/Module/Block/Index.php
<?php
namespace Vendor\Module\Block;
use \Magento\Framework\View\Element\Template;
use \Magento\Framework\View\Element\Template\Context;
class Index extends Template
{
public function __construct(Context $context,
\Magento\Store\Model\StoreManagerInterface $storeManager
)
{
$this->_storeManager = $storeManager;
parent::__construct($context);
}
public function getBaseUrl()
{
return $this->_storeManager->getStore()->getBaseUrl();
}
public function getHeightData()
{
return $this->getHeight();
}
public function getWeightData()
{
return $this->getWeight();
}
}
Calculation Controller -
Vendor/Module/Controller/Index/Index.php
<?php
namespace Vendor\Module\Controller\Index;
use \Magento\Framework\App\Action\Action;
use \Magento\Framework\App\Action\Context;
use \Magento\Framework\View\Result\PageFactory;
class Index extends Action
{
/**
* @var PageFactory
*/
protected $resultPageFactory;
/**
* Result constructor.
* @param Context $context
* @param PageFactory $pageFactory
*/
public function __construct(Context $context, PageFactory $pageFactory)
{
$this->resultPageFactory = $pageFactory;
parent::__construct($context);
}
/**
* The controller action
*
* @return \Magento\Framework\View\Result\Page
*/
public function execute()
{
$resultPage = $this->resultPageFactory->create();
return $resultPage;
}
}
Result Page Controller -
Vendor/Module/Controller/Result/Result.php
<?php
namespace Vendor\Module\Controller\Result;
use Magento\Framework\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
use Magento\Framework\Controller\Result\JsonFactory;
class Result extends \Magento\Framework\App\Action\Action
{
/**
* @var Magento\Framework\View\Result\PageFactory
*/
protected $resultPageFactory;
protected $resultJsonFactory;
/**
* @param Context $context
* @param PageFactory $resultPageFactory
*/
public function __construct(
Context $context,
PageFactory $resultPageFactory,
JsonFactory $resultJsonFactory
)
{
$this->resultPageFactory = $resultPageFactory;
$this->resultJsonFactory = $resultJsonFactory;
return parent::__construct($context);
}
public function execute()
{
$height = $this->getRequest()->getParam('height');
$weight = $this->getRequest()->getParam('weight');
$result = $this->resultJsonFactory->create();
$resultPage = $this->resultPageFactory->create();
$block = $resultPage->getLayout()
->createBlock('Vendor\Module\Block\Index')
->setTemplate('Vendor_Module::result.phtml')
->setData('height',$height)
->setData('weight',$weight)
->toHtml();
$result->setData(['output' => $block]);
return $result;
}
}
Result Layout File -
Vendor/Module/view/frontend/layout/module_result_result.xml
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column"
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<head>
<title>Result</title>
</head>
<body>
<referenceContainer name="content">
<block class="Vendor\Module\Block\Index" name="result_result" template="Vendor_Module::result.phtml" />
</referenceContainer>
</body>
</page>
Result PHTML file -
Vendor/Module/view/frontend/templates/result.phtml
<?php
echo $block->getHeightData();
echo $block->getWeightData();
?>
Best Answer
You can create function in block example as below:
Using below code you can call this function in phtml file
EDIT: How to get post data in block. you need to add below code in block