I have to pass a FK parameter from GridView Master to GridView Details.
GridView Master (GVM):
GridView Details (GVD):
PROBLEM: After click on 'Questions' on GVM for ID = 22, in GVD is showed all details of table (I want show only details linked to parent for ID = 22).
For GVD I have this controller called after click on action 'Questions' (on method execute I registry the FK:
/app/code/Alkemy/ChatBot/Controller/Adminhtml/QuestionSetFlow/Index.php
<?php namespace Alkemy\ChatBot\Controller\Adminhtml\QuestionSetFlow; class Index extends \Alkemy\ChatBot\Controller\Adminhtml\QuestionSetFlow { protected $_backendSession; protected $_resultPageFactory; protected $_resultPage; protected $_questionSetId; public function __construct( \Magento\Backend\Model\Session $backendSession, \Magento\Framework\View\Result\PageFactory $resultPageFactory, \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory, \Alkemy\ChatBot\Model\QuestionSetFlowFactory $questionsetflowFactory, \Magento\Framework\Registry $registry, \Magento\Backend\Model\View\Result\RedirectFactory $resultRedirectFactory, \Magento\Backend\App\Action\Context $context ) { $this->_backendSession = $backendSession; $this->_resultPageFactory = $resultPageFactory; $this->_resultJsonFactory = $resultJsonFactory; parent::__construct($questionsetflowFactory, $registry, $resultRedirectFactory, $context); } public function execute() { //recupero ID of question set $id = $this->getRequest()->getParam('questionset_id'); //Registry Question Set Id selected $questionsetId = (int) $this->getRequest()->getParam('questionset_id'); $this->_coreRegistry->register('questionset_id', $questionsetId); //$this->saveQuestionSetIdSelected(); $questionsetFlow = $this->_questionsetFlowFactory->create(); $questionset = $questionsetFlow->selectQuestionSetById($id); if (!isset($questionset) || sizeof($questionset) == 0 ) { $this->messageManager->addError(__('This Question set no longer exists.')); $resultRedirect = $this->_resultRedirectFactory->create(); $resultRedirect->setPath('alkemy_chatbot/questionset/index', ['questionset_id' => $id]); $this->_questionSetId = $id; return $resultRedirect; } // $qustionSetFlowModel = $this->_objectManager->create('Alkemy\ChatBot\Model\QuestionSetFlow'); // $qustionSetFlowModel->getCollection()->addFilter('questionset_id', $id); $this->_setPageData($questionset); return $this->getResultPage(); } public function getResultPage() { if (is_null($this->_resultPage)) { $this->_resultPage = $this->_resultPageFactory->create(); } return $this->_resultPage; } protected function _setPageData($questionset) { $resultPage = $this->getResultPage(); //mostro il nome della Question Set come titolo $name = $questionset; if (isset($questionset) && is_array($questionset)){ $temp = array_values($questionset)[0]; $name = $temp['name']; } $resultPage->getConfig()->getTitle()->prepend((__($name))); return $this; } }
Model for GVD is (in construct I set the FK):
/app/code/Alkemy/ChatBot/Model/QuestionSetFlow.php
<?php namespace Alkemy\ChatBot\Model; class QuestionSetFlow extends \Magento\Framework\Model\AbstractModel implements \Alkemy\ChatBot\Api\Data\QuestionSetFlowInterface, \Magento\Framework\DataObject\IdentityInterface { const CACHE_TAG = 'alkemy_chatbot_questionsetflow'; protected $_cacheTag = 'alkemy_chatbot_questionsetflow'; protected $_eventPrefix = 'alkemy_chatbot_questionsetflow'; //Id di QuestionSet protected $_questionSetId; public function __construct(\Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = []) { array_push($data, $registry->registry('questionset_id')); parent::__construct($context, $registry, $resource, $resourceCollection, $data); //setto id del padre (FK) $this->setFK($registry->registry('questionset_id')); } /** * */ protected function _construct() { $this->_init('Alkemy\ChatBot\Model\ResourceModel\QuestionSetFlow'); } public function selectQuestionSetById($id) { return $this->getResource()->selectQuestionSetById($id); } /** * @param $id */ public function setFK($id) { $this->_questionSetId = $id; //call Resource MOdel $this->getResource()->setQuestionSetId($id); } }
Resource Model for GVD is:
/app/code/Alkemy/ChatBot/Model/ResourceModel/QuestionSetFlow.php
namespace Alkemy\ChatBot\Model\ResourceModel; class QuestionSetFlow extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb { protected $_date; //FK protected $_questionSetId; public function __construct( \Magento\Framework\Stdlib\DateTime\DateTime $date, \Magento\Framework\Model\ResourceModel\Db\Context $context ) { $this->_date = $date; parent::__construct($context); } protected function _construct() { $this->_init('alkemy_chatbot_questionsetflow', 'questionsetflow_id'); } public function selectQuestionSetById($id) { $dbh = $this->getConnection(); $tableName = $this->getTable(\Alkemy\ChatBot\Setup\InstallSchema::alkemy_chatbot_questionset); $binds = ['id' => (int)$id]; $select = $dbh->select()->from($tableName) ->where('questionset_id = :id') ; return $dbh->fetchAll($select, $binds); } public function setQuestionSetId($questionSetId) { $this->_questionSetId = $questionSetId; } }
Then I have Collection for GVD:
/app/code/Alkemy/ChatBot/Model/ResourceModel/QuestionSetFlow/Collection.php
namespace Alkemy\ChatBot\Model\ResourceModel\QuestionSetFlow; use Alkemy\ChatBot\Model\QuestionSetFlow; class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection { protected $_idFieldName = 'questionsetflow_id'; protected $_eventPrefix = 'alkemy_chatbot_questionsetflow_collection'; protected $_eventObject = 'questionsetflow_collection'; protected function _construct() { $this->_init('Alkemy\ChatBot\Model\QuestionSetFlow', 'Alkemy\ChatBot\Model\ResourceModel\QuestionSetFlow'); } protected function _renderFiltersBefore() { //find model $questionSetFlowModel = $this->_entityFactory->create(QuestionSetFlow::class); //fin fk in model $fk = $questionSetFlowModel->getFK(); //set parent (FK) for filter $this->addFilter('questionset_id', $fk ); //view only questions for filter $this->addFieldToFilter('question', [['notnull' => true]]); parent::_renderFiltersBefore(); } }
In DEBUG, I verified that method _renderFiltersBefore is called two time:
FIRST TIME:
$fk = 22 route = alkemy_chatbot path = /admin/alkemy_chatbot/questionsetflow/index/questionset_id/22/key/7d1db25520ab7012a61f01e9b1b8c8e4b8ec97264003eef8dc41512a80eaa2dd/
SECOND TIME:
$fk = null route = mui path: /admin/mui/index/render/handle/bulk_bulk_details_modal/buttons/1/key/ee8f7151c618aebb613d21b0870ae0d6e8a910d6947ac9e9cdc57ce4c1925e65/
Why? Help me please