I have created a insertListing grid inside fieldset, Now I want to save id of checked grid items inside my custom collection field news_ids
I get this data in save controller params
But I am not getting this Listing item ids in save controller params
I am using insertListing below code, I don't know what problem occurs here
<insertListing name="testListingInsert">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="autoRender" xsi:type="boolean">true</item>
<item name="ns" xsi:type="string">vtn_newsticker_listing</item>
<item name="externalProvider" xsi:type="string">vtn_newsticker_listing.vtn_newsticker_listing_data_source</item>
<item name="imports" xsi:type="array">
<item name="news_ids" xsi:type="string">${ $.provider }:data.news_ids</item>
</item>
<item name="exports" xsi:type="array">
<item name="news_ids" xsi:type="string">${ $.externalProvider }:params.news_ids</item>
</item>
</item>
</argument>
</insertListing>
This is namespace for form
<item name="config" xsi:type="array">
<item name="dataScope" xsi:type="string">data</item>
<item name="namespace" xsi:type="string">vtn_newsticker_group_edit</item>
</item>
And I am using this fieldset for getting grid
<fieldset name="assign_news">
<settings>
<collapsible>true</collapsible>
<label translate="true">News in Group</label>
</settings>
<container name="news_ids_container" sortOrder="160">
<htmlContent name="html_content">
<block name="assignnews" class="Vtn\NewsTicker\Block\Adminhtml\Newsids\AssignNews"/>
</htmlContent>
</container>
</fieldset>
Below is code of this file Vtn\NewsTicker\Block\Adminhtml\Newsids\AssignNews
<?php
namespace Vtn\NewsTicker\Block\Adminhtml\Newsids;
class AssignNews extends \Magento\Backend\Block\Template
{
/**
* Block template
*
* @var string
*/
protected $_template = 'newsgroup/assign_news.phtml';
/**
* @var \Magento\Catalog\Block\Adminhtml\Category\Tab\Product
*/
protected $blockGrid;
/**
* @var \Magento\Framework\Registry
*/
protected $registry;
/**
* @var \Magento\Framework\Json\EncoderInterface
*/
protected $jsonEncoder;
/**
* @var Vtn\NewsTicker\Model\GroupFactory $groupFactory
*/
protected $groupFactory;
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Framework\Json\EncoderInterface $jsonEncoder,
\Vtn\NewsTicker\Model\GroupFactory $groupFactory,
array $data = []
) {
$this->registry = $registry;
$this->jsonEncoder = $jsonEncoder;
$this->groupFactory = $groupFactory;
parent::__construct($context, $data);
}
public function getBlockGrid()
{
if (null === $this->blockGrid) {
$this->blockGrid = $this->getLayout()->createBlock(
\Vtn\NewsTicker\Block\Adminhtml\Group\Tab\News::class,
'news.grid'
);
}
return $this->blockGrid;
}
/**
* Return HTML of grid block
*
* @return string
*/
public function getGridHtml()
{
return $this->getBlockGrid()->toHtml();
}
/**
* @return string
*/
//public function getNewsJson() {
// $id = $this->getRequest()->getParam('id');
// $groupFactory = $this->groupFactory->create()->load($id);
// if (isset($groupFactory)) {
// $result = $groupFactory['id'];
// $result = explode(',', $result);
// return $this->jsonEncoder->encode($result);
// }
// return '{}';
//}
public function getNewsJson()
{
$id = $this->getRequest()->getParam('id');
$groupNewsId = $this->groupFactory->create()
->getCollection()
->addFieldToFilter('id',$id)
->getColumnValues('news_ids');
if (!empty($groupNewsId)) {
return $this->jsonEncoder->encode($groupNewsId);
}
return '{}';
}
}
Below code of Vtn\NewsTicker\Block\Adminhtml\Group\Tab\News
<?php
namespace Vtn\NewsTicker\Block\Adminhtml\Group\Tab;
use Magento\Backend\Block\Widget\Grid;
use Magento\Backend\Block\Widget\Grid\Column;
use Magento\Backend\Block\Widget\Grid\Extended;
use Magento\Framework\App\ObjectManager;
class News extends \Magento\Backend\Block\Widget\Grid\Extended
{
/**
* Core registry
*
* @var \Magento\Framework\Registry
*/
protected $_coreRegistry = null;
/**
* @var Vtn\NewsTicker\Model\GroupFactory $newsFactory
*/
protected $newsFactory;
/**
* @param \Magento\Backend\Block\Template\Context $context
* @param \Magento\Backend\Helper\Data $backendHelper
* @param \Vtn\NewsTicker\Model\GroupFactory $newsFactory
* @param \Magento\Framework\Registry $coreRegistry
* @param array $data
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Backend\Helper\Data $backendHelper,
\Magento\Framework\Registry $coreRegistry,
\Vtn\NewsTicker\Model\NewsFactory $newsFactory,
array $data = []
) {
$this->newsFactory = $newsFactory;
$this->_coreRegistry = $coreRegistry;
parent::__construct($context, $backendHelper, $data);
}
/**
* @return void
*/
protected function _construct()
{
parent::_construct();
$this->setId('group_news');
$this->setDefaultSort('id');
$this->setUseAjax(true);
}
/**
* @return $this
*/
protected function _prepareCollection()
{
$collection = $this->newsFactory->create()->getCollection();
$this->setCollection($collection);
return parent::_prepareCollection();
}
protected function _prepareColumns()
{
$this->addColumn(
'in_news',
[
'type' => 'checkbox',
'name' => 'in_news_ids',
'values' => $this->_getSelectedNews(),
'index' => 'id',
'header_css_class' => 'col-select col-massaction',
'column_css_class' => 'col-select col-massaction'
]
);
$this->addColumn(
'id',
[
'header' => __('ID'),
'sortable' => true,
'index' => 'id',
'header_css_class' => 'col-id',
'column_css_class' => 'col-id'
]
);
$this->addColumn(
'news_content',
[
'header' => __('News'),
'index' => 'news_content'
]
);
$this->addColumn(
'status',
[
'header' => __('Active'),
'index' => 'status',
'type'=>'options',
'options' => array('1' => 'Yes', '0' => 'No')
]
);
return parent::_prepareColumns();
}
/**
* @return string
*/
public function getGridUrl()
{
return $this->getUrl('newsticker/group/edit', ['_current' => true]);
}
/**
* @return array
*/
protected function _getSelectedNews()
{
$news = $this->getRequest()->getPost('selected_news');
return $news;
}
}
Below is phtml code Vtn\NewsTicker\view\adminhtml\templates\newsgroup\assign_news.phtml
<?php
/** @var \Vtn\NewsTicker\Block\Template $block */
/** @var \Magento\Catalog\Block\Adminhtml\Category\AssignProducts $block */
/** @var \Magento\Catalog\Block\Adminhtml\Category\Tab\Product $blockGrid */
/** @var \Magento\Framework\View\Helper\SecureHtmlRenderer $secureRenderer */
$blockGrid = $block->getBlockGrid();
$gridJsObjectName = $blockGrid->getJsObjectName();
?>
<?= $block->getGridHtml() ?>
<input type="hidden" name="news_ids" id="in_news_ids" data-form-part="vtn_newsticker_group_edit" value="" />
<script type="text/x-magento-init">
{
"*": {
"Vtn_NewsTicker/js/newsgroup/assign-news": {
"selectedNews": <?= /* @escapeNotVerified */ $block->getNewsJson() ?>,
"gridJsObjectName": <?= /* @escapeNotVerified */ '"' . '$gridJsObjectName' . '"' ?: '{}' ?>
}
}
}
</script>
<script>
require('mage/apply/main').apply();
</script>
Below is assign_news.js
define([
'mage/adminhtml/grid'
], function () {
'use strict';
return function (config) {
var selectedNews = config.selectedNews,
categoryNews = $H(selectedNews),
gridJsObject = window[config.gridJsObjectName],
tabIndex = 1000;
/**
* Show selected news when edit form in associated news grid
*/
$('in_news_ids').value = Object.toJSON(categoryNews); // add your hidden field id
/**
* Register Category Product
*
* @param {Object} grid
* @param {Object} element
* @param {Boolean} checked
*/
function registerCategoryNews(grid, element, checked) {
if (checked) {
if (element.positionElement) {
element.positionElement.disabled = false;
categoryNews.set(element.value, element.positionElement.value);
}
} else {
if (element.positionElement) {
element.positionElement.disabled = true;
}
categoryNews.unset(element.value);
}
$('in_news_ids').value = Object.toJSON(categoryNews); // add your hidden field id
grid.reloadParams = {
'selected_news[]': categoryNews.keys()
};
}
/**
* Click on news row
*
* @param {Object} grid
* @param {String} event
*/
function categoryNewsRowClick(grid, event) {
var trElement = Event.findElement(event, 'tr'),
eventElement = Event.element(event),
isInputCheckbox = eventElement.tagName === 'INPUT' && eventElement.type === 'checkbox',
isInputPosition = grid.targetElement &&
grid.targetElement.tagName === 'INPUT' &&
grid.targetElement.name === 'position',
checked = false,
checkbox = null;
if (eventElement.tagName === 'LABEL' &&
trElement.querySelector('#' + eventElement.htmlFor) &&
trElement.querySelector('#' + eventElement.htmlFor).type === 'checkbox'
) {
event.stopPropagation();
trElement.querySelector('#' + eventElement.htmlFor).trigger('click');
return;
}
if (trElement && !isInputPosition) {
checkbox = Element.getElementsBySelector(trElement, 'input');
if (checkbox[0]) {
checked = isInputCheckbox ? checkbox[0].checked : !checkbox[0].checked;
gridJsObject.setCheckboxChecked(checkbox[0], checked);
}
}
}
/**
* Change news position
*
* @param {String} event
*/
function positionChange(event) {
var element = Event.element(event);
if (element && element.checkboxElement && element.checkboxElement.checked) {
categoryNews.set(element.checkboxElement.value, element.value);
$('in_news_ids').value = Object.toJSON(categoryNews); // add your hidden field id
}
}
/**
* Initialize category news row
*
* @param {Object} grid
* @param {String} row
*/
function categoryNewsRowInit(grid, row) {
var checkbox = $(row).getElementsByClassName('checkbox')[0],
position = $(row).getElementsByClassName('input-text')[0];
if (checkbox && position) {
checkbox.positionElement = position;
position.checkboxElement = checkbox;
position.disabled = !checkbox.checked;
position.tabIndex = tabIndex++;
Event.observe(position, 'keyup', positionChange);
}
}
gridJsObject.rowClickCallback = categoryNewsRowClick;
gridJsObject.initRowCallback = categoryNewsRowInit;
gridJsObject.checkboxCheckCallback = registerCategoryNews;
if (gridJsObject.rows) {
gridJsObject.rows.each(function (row) {
categoryNewsRowInit(gridJsObject, row);
});
}
};
});