data-source-for-selected-admin-ui-form
Question
field
<field name="category_id">
<argument name="data" xsi:type="array">
<item name="options" xsi:type="object">Vendor\Blog\Model\Config\Source\CategoryTree</item>
<item name="config" xsi:type="array">
<item name="label" xsi:type="string" translate="true">Category</item>
<item name="formElement" xsi:type="string">select</item>
<item name="source" xsi:type="string">category_id</item>
<item name="component" xsi:type="string">Vender_Blog/js/components/new-category</item>
<item name="elementTmpl" xsi:type="string">ui/grid/filters/elements/ui-select</item>
<item name="dataScope" xsi:type="string">category_id</item>
<item name="filterOptions" xsi:type="boolean">true</item>
<item name="chipsEnabled" xsi:type="boolean">true</item>
<item name="showCheckbox" xsi:type="boolean">true</item>
<item name="disableLabel" xsi:type="boolean">true</item>
<item name="multiple" xsi:type="boolean">true</item>
<item name="levelsVisibility" xsi:type="number">1</item>
<item name="sortOrder" xsi:type="number">40</item>
<item name="required" xsi:type="boolean">false</item>
<item name="listens" xsi:type="array">
<item name="index=create_category:responseData" xsi:type="string">setParsed</item>
<item name="newOption" xsi:type="string">toggleOptionSelected</item>
</item>
</item>
</argument>
</field>
and new-category.js code is
define([
'Magento_Ui/js/form/element/ui-select\'], function (Select){
'use strict';
return Select.extend({
/**
* Normalize option object.
*
* @param {Object} data - Option object.
* @returns {Object}
*/
parseData: function (data) {
return {
'is_active': data.model['is_active'],
value: data.model['category_id'],
label: data.model['category_title']
};
}
});});
dataprovider for posts is
<?php
namespace Vender\Blog\Model\Post
use Vender\Blog\Model\ResourceModel\Post\CollectionFactory;
use Magento\Framework\App\Request\DataPersistorInterface;
class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider
{
protected $collection;
protected $dataPersistor;
/**
* @var array
*/
protected $loadedData;
protected $_storeManager;
/**
* Constructor
*
* @param string $name
* @param string $primaryFieldName
* @param string $requestFieldName
* @param CollectionFactory $blockCollectionFactory
* @param DataPersistorInterface $dataPersistor
* @param array $meta
* @param array $data
*/
public function __construct(
$name,
$primaryFieldName,
$requestFieldName,
CollectionFactory $blogCollectionFactory,
DataPersistorInterface $dataPersistor,
\Magento\Store\Model\StoreManagerInterface $storeManager,
array $meta = [],
array $data = []
) {
$this->collection = $blogCollectionFactory->create();
$this->dataPersistor = $dataPersistor;
$this->_storeManager=$storeManager;
parent::__construct($name, $primaryFieldName, $requestFieldName, $meta, $data);
}
/**
* Prepares Meta
*
* @param array $meta
* @return array
*/
public function prepareMeta(array $meta)
{
return $meta;
}
/**
* Get data
*
* @return array
*/
public function getData()
{
$baseurl = $this->_storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA);
if (isset($this->loadedData)) {
return $this->loadedData;
}
$items = $this->collection->getItems();
/** @var \Magento\Cms\Model\Block $block */
foreach ($items as $block) {
$temp = $block->getData();
if ($temp['featured_img']) :
$img = [];
$img[0]['image'] = $temp['featured_img'];
$img[0]['url'] = $baseurl.$temp['featured_img'];
$temp['featured_img'] = $img;
endif;
$this->loadedData[$block->getId()] = $block->getData();
}
$data = $this->dataPersistor->get('blog');
if (!empty($data)) {
$block = $this->collection->getNewEmptyItem();
$block->setData($data);
$this->loadedData[$block->getId()] = $block->getData();
$this->dataPersistor->clear('blog');
} else {
if ($items) :
if ($block->getData('featured_img') != null) {
$t2[$block->getId()] = $temp;
return $t2;
} else {
return $this->loadedData;
}
endif;
}
return $this->loadedData;
}
}
dataprovider is showing all other post details except the selected categories,so what is the solution now
Solution
i make custom join and provided the required fields in the Dataprovider
$id = $block->getPost_id(); $selectedCategories=$this->resourcePost->getCatData($id); foreach ($selectedCategories as $key => $value) $this->loadedData[$id]['category_id'][$key] = $value['category_id'];
And the function in
public function getCatData($id )//get data for selected category w.s.t post and merge it in dataprovider of post { $categoryArr=[]; $sql="SELECT category.category_id FROM pme_blog_post as post INNER JOIN vendor_blog_post_category as post_category ON post.post_id = post_category.post_id INNER JOIN vendor_blog_category as category ON post_category.category_id = category.category_id WHERE post.post_id IN ($id)";
$arrays= $this->getConnection()->query($sql);
foreach ($arrays as $key => $val)
{
$categoryArr[$key]['category_id'] = $val['category_id']; }
return $categoryArr;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange