How to add grid items in Magento 2
Create Allnews Interface
Rsgitech\News\Api\Data\AllnewsInterface.php
Create interface for fields
<?php
namespace Rsgitech\News\Api\Data;
interface AllnewsInterface
{
const NEWS_ID = 'news_id';
const TITLE = 'title';
const DESCRIPTION = 'description';
const STATUS = 'status';
const CREATED_AT = 'created_at';
const UPDATED_AT = 'updated_at';
public function getId();
public function getTitle();
public function getDescription();
public function getStatus();
public function getCreatedAt();
public function getUpdatedAt();
public function setId($id);
public function setTitle($title);
public function setDescription($description);
public function setStatus($status);
public function setCreatedAt($created_at);
public function setUpdatedAt($updated_at);
}
?>
Implement Interface in Allnews Model
Rsgitech\News\Model\Allnews.php
<?php
namespace Rsgitech\News\Model;
use Rsgitech\News\Api\Data\AllnewsInterface;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\DataObject\IdentityInterface;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Model\AbstractModel;
class Allnews extends AbstractModel implements AllnewsInterface, IdentityInterface
{
const STATUS_ENABLED = 1;
const STATUS_DISABLED = 0;
const CACHE_TAG = 'rsgitech_news';
//Unique identifier for use within caching
protected $_cacheTag = self::CACHE_TAG;
protected function _construct()
{
$this->_init('Rsgitech\News\Model\ResourceModel\Allnews');
}
public function getIdentities()
{
return [self::CACHE_TAG . '_' . $this->getId()];
}
public function getDefaultValues()
{
$values = [];
return $values;
}
public function getAvailableStatuses()
{
return [self::STATUS_ENABLED => __('Enabled'), self::STATUS_DISABLED => __('Disabled')];
}
public function getId()
{
return parent::getData(self::NEWS_ID);
}
public function getTitle()
{
return $this->getData(self::TITLE);
}
public function getDescription()
{
return $this->getData(self::DESCRIPTION);
}
public function getStatus()
{
return $this->getData(self::STATUS);
}
public function getCreatedAt()
{
return $this->getData(self::CREATED_AT);
}
public function getUpdatedAt()
{
return $this->getData(self::UPDATED_AT);
}
public function setId($id)
{
return $this->setData(self::NEWS_ID, $id);
}
public function setTitle($title)
{
return $this->setData(self::TITLE, $title);
}
public function setDescription($description)
{
return $this->setData(self::DESCRIPTION, $description);
}
public function setStatus($status)
{
return $this->setData(self::STATUS, $status);
}
public function setCreatedAt($created_at)
{
return $this->setData(self::CREATED_AT, $created_at);
}
public function setUpdatedAt($updated_at)
{
return $this->setData(self::UPDATED_AT, $updated_at);
}
}
?>
Create AllnewsRepositoryInterface
Rsgitech\News\Api\AllnewsRepositoryInterface.php
Create AllnewsRepositoryInterface for save, delete, getById, deleteById
<?php
namespace Rsgitech\News\Api;
interface AllnewsRepositoryInterface
{
public function save(\Rsgitech\News\Api\Data\AllnewsInterface $news);
public function getById($newsId);
public function delete(\Rsgitech\News\Api\Data\AllnewsInterface $news);
public function deleteById($newsId);
}
?>
Create class AllnewsRepository
Rsgitech\News\Model\AllnewsRepository.php
Create class AllnewsRepository and implements interface AllnewsRepositoryInterface
<?php
namespace Rsgitech\News\Model;
use Rsgitech\News\Api\Data;
use Rsgitech\News\Api\AllnewsRepositoryInterface;
use Magento\Framework\Api\DataObjectHelper;
use Magento\Framework\Exception\CouldNotDeleteException;
use Magento\Framework\Exception\CouldNotSaveException;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\Reflection\DataObjectProcessor;
use Rsgitech\News\Model\ResourceModel\Allnews as ResourceAllnews;
use Rsgitech\News\Model\ResourceModel\Allnews\CollectionFactory as AllnewsCollectionFactory;
use Magento\Store\Model\StoreManagerInterface;
class AllnewsRepository implements AllnewsRepositoryInterface
{
protected $resource;
protected $allnewsFactory;
protected $dataObjectHelper;
protected $dataObjectProcessor;
protected $dataAllnewsFactory;
private $storeManager;
public function __construct(
ResourceAllnews $resource,
AllnewsFactory $allnewsFactory,
Data\AllnewsInterfaceFactory $dataAllnewsFactory,
DataObjectHelper $dataObjectHelper,
DataObjectProcessor $dataObjectProcessor,
StoreManagerInterface $storeManager
) {
$this->resource = $resource;
$this->allnewsFactory = $allnewsFactory;
$this->dataObjectHelper = $dataObjectHelper;
$this->dataAllnewsFactory = $dataAllnewsFactory;
$this->dataObjectProcessor = $dataObjectProcessor;
$this->storeManager = $storeManager;
}
public function save(\Rsgitech\News\Api\Data\AllnewsInterface $news)
{
if ($news->getStoreId() === null) {
$storeId = $this->storeManager->getStore()->getId();
$news->setStoreId($storeId);
}
try {
$this->resource->save($news);
} catch (\Exception $exception) {
throw new CouldNotSaveException(
__('Could not save the news: %1', $exception->getMessage()),
$exception
);
}
return $news;
}
public function getById($newsId)
{
$news = $this->allnewsFactory->create();
$news->load($newsId);
if (!$news->getId()) {
throw new NoSuchEntityException(__('News with id "%1" does not exist.', $newsId));
}
return $news;
}
public function delete(\Rsgitech\News\Api\Data\AllnewsInterface $news)
{
try {
$this->resource->delete($news);
} catch (\Exception $exception) {
throw new CouldNotDeleteException(__(
'Could not delete the news: %1',
$exception->getMessage()
));
}
return true;
}
public function deleteById($newsId)
{
return $this->delete($this->getById($newsId));
}
}
?>
Resource model Allnews
Rsgitech\News\Model\ResourceModel\Allnews.php
Here set created at and updated at date before save
<?php
namespace Rsgitech\News\Model\ResourceModel;
use Magento\Framework\Model\AbstractModel;
class Allnews extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
{
protected $_date;
public function __construct(
\Magento\Framework\Model\ResourceModel\Db\Context $context,
\Magento\Framework\Stdlib\DateTime\DateTime $date
) {
parent::__construct($context);
$this->_date = $date;
}
/**
* Define main table
*/
protected function _construct()
{
$this->_init('rsgitech_news', 'news_id');
}
protected function _beforeSave(\Magento\Framework\Model\AbstractModel $object)
{
$object->setUpdatedAt($this->_date->date());
if ($object->isObjectNew()) {
$object->setCreatedAt($this->_date->date());
}
return parent::_beforeSave($object);
}
}
?>
Create file di.xml
Rsgitech\News\etc\di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Rsgitech\News\Api\Data\AllnewsInterface" type="Rsgitech\News\Model\Allnews" />
<preference for="Rsgitech\News\Api\AllnewsRepositoryInterface" type="Rsgitech\News\Model\AllnewsRepository" />
<virtualType name="AllnewsGridDataProvider" type="Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider">
<arguments>
<argument name="collection" xsi:type="object" shared="false">Rsgitech\News\Model\ResourceModel\Allnews\Collection</argument>
</arguments>
</virtualType>
<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
<arguments>
<argument name="collections" xsi:type="array">
<item name="news_allnews_listing_data_source" xsi:type="string">Rsgitech\News\Model\ResourceModel\Allnews\Grid\Collection</item>
</argument>
</arguments>
</type>
<type name="Rsgitech\News\Model\ResourceModel\Allnews\Grid\Collection">
<arguments>
<argument name="mainTable" xsi:type="string">rsgitech_news</argument>
<argument name="eventPrefix" xsi:type="string">rsgitech_news_grid_collection</argument>
<argument name="eventObject" xsi:type="string">rsgitech_news_collection</argument>
<argument name="resourceModel" xsi:type="string">Rsgitech\Rsgitech\Model\ResourceModel\Allnews</argument>
</arguments>
</type>
<type name="Magento\Framework\Model\Entity\RepositoryFactory">
<arguments>
<argument name="entities" xsi:type="array">
<item name="Rsgitech\News\Api\Data\AllnewsInterface" xsi:type="string">Rsgitech\News\Api\AllnewsRepositoryInterface</item>
</argument>
</arguments>
</type>
</config>
Create file acl.xml
Rsgitech\News\etc\acl.xml
Create ACL file for user authorization
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">
<acl>
<resources>
<resource id="Magento_Backend::admin">
<resource id="Rsgitech_News::rsgitech" title="Rsgitech" sortOrder="51">
<resource id="Rsgitech_News::news_allnews" title="All News" sortOrder="10">
<resource id="Rsgitech_News::save" title="Save News" translate="title" sortOrder="10" />
<resource id="Rsgitech_News::news_delete" title="Delete News" translate="title" sortOrder="20" />
</resource>
</resource>
<resource id="Magento_Backend::stores">
<resource id="Magento_Backend::stores_settings">
<resource id="Magento_Config::config">
<resource id="Rsgitech_News::news_config" title="Rsgitech News" translate="title"/>
</resource>
</resource>
</resource>
</resource>
</resources>
</acl>
</config>
Create block Allnews
Rsgitech\News\Block\Adminhtml\Allnews.php
<?php
namespace Rsgitech\News\Block\Adminhtml;
class Allnews extends \Magento\Backend\Block\Widget\Grid\Container
{
protected function _construct()
{
$this->_controller = 'adminhtml_allnews';
$this->_blockGroup = 'Rsgitech_News';
$this->_headerText = __('Manage News');
parent::_construct();
if ($this->_isAllowedAction('Rsgitech_News::save')) {
$this->buttonList->update('add', 'label', __('Add News'));
} else {
$this->buttonList->remove('add');
}
}
protected function _isAllowedAction($resourceId)
{
return $this->_authorization->isAllowed($resourceId);
}
}
?>
Create Grid Block
Rsgitech\News\Block\Adminhtml\Allnews\Grid.php
<?php
namespace Rsgitech\News\Block\Adminhtml\Allnews;
class Grid extends \Magento\Backend\Block\Widget\Grid
{
}
?>
Create GenericButton Block
Rsgitech\News\Block\Adminhtml\Allnews\Edit\GenericButton.php
<?php
namespace Rsgitech\News\Block\Adminhtml\Allnews\Edit;
use Magento\Backend\Block\Widget\Context;
use Rsgitech\News\Api\AllnewsRepositoryInterface;
use Magento\Framework\Exception\NoSuchEntityException;
class GenericButton
{
protected $context;
protected $allnewsRepository;
public function __construct(
Context $context,
AllnewsRepositoryInterface $allnewsRepository
) {
$this->context = $context;
$this->allnewsRepository = $allnewsRepository;
}
public function getNewsId()
{
try {
return $this->allnewsRepository->getById(
$this->context->getRequest()->getParam('news_id')
)->getId();
} catch (NoSuchEntityException $e) {
}
return null;
}
public function getUrl($route = '', $params = [])
{
return $this->context->getUrlBuilder()->getUrl($route, $params);
}
}
?>
Create BackButton Block
Rsgitech\News\Block\Adminhtml\Allnews\Edit\BackButton.php
<?php
namespace Rsgitech\News\Block\Adminhtml\Allnews\Edit;
use Magento\Framework\View\Element\UiComponent\Control\ButtonProviderInterface;
/**
* Class BackButton
*/
class BackButton extends GenericButton implements ButtonProviderInterface
{
/**
* @return array
*/
public function getButtonData()
{
return [
'label' => __('Back'),
'on_click' => sprintf("location.href = '%s';", $this->getBackUrl()),
'class' => 'back',
'sort_order' => 10
];
}
/**
* Get URL for back (reset) button
*
* @return string
*/
public function getBackUrl()
{
return $this->getUrl('*/*/');
}
}
?>
Create DeleteButton Block
Rsgitech\News\Block\Adminhtml\Allnews\Edit\DeleteButton.php
<?php
namespace Rsgitech\News\Block\Adminhtml\Allnews\Edit;
use Magento\Framework\View\Element\UiComponent\Control\ButtonProviderInterface;
/**
* Class DeleteButton
*/
class DeleteButton extends GenericButton implements ButtonProviderInterface
{
/**
* @return array
*/
public function getButtonData()
{
$data = [];
if ($this->getNewsId()) {
$data = [
'label' => __('Delete News'),
'class' => 'delete',
'on_click' => 'deleteConfirm(\'' . __(
'Are you sure you want to do this?'
) . '\', \'' . $this->getDeleteUrl() . '\')',
'sort_order' => 20,
];
}
return $data;
}
/**
* @return string
*/
public function getDeleteUrl()
{
return $this->getUrl('*/*/delete', ['news_id' => $this->getNewsId()]);
}
}
?>
Create ResetButton Block
Rsgitech\News\Block\Adminhtml\Allnews\Edit\ResetButton.php
<?php
namespace Rsgitech\News\Block\Adminhtml\Allnews\Edit;
use Magento\Framework\View\Element\UiComponent\Control\ButtonProviderInterface;
/**
* Class ResetButton
*/
class ResetButton implements ButtonProviderInterface
{
/**
* @return array
*/
public function getButtonData()
{
return [
'label' => __('Reset'),
'class' => 'reset',
'on_click' => 'location.reload();',
'sort_order' => 30
];
}
}
?>
Create SaveAndContinueButton Block
Rsgitech\News\Block\Adminhtml\Allnews\Edit\SaveAndContinueButton.php
<?php
namespace Rsgitech\News\Block\Adminhtml\Allnews\Edit;
use Magento\Framework\View\Element\UiComponent\Control\ButtonProviderInterface;
/**
* Class SaveAndContinueButton
*/
class SaveAndContinueButton extends GenericButton implements ButtonProviderInterface
{
/**
* @return array
*/
public function getButtonData()
{
return [
'label' => __('Save and Continue Edit'),
'class' => 'save',
'data_attribute' => [
'mage-init' => [
'button' => ['event' => 'saveAndContinueEdit'],
],
],
'sort_order' => 80,
];
}
}
?>
Create SaveButton Block
Rsgitech\News\Block\Adminhtml\Allnews\Edit\SaveButton.php
<?php
namespace Rsgitech\News\Block\Adminhtml\Allnews\Edit;
use Magento\Framework\View\Element\UiComponent\Control\ButtonProviderInterface;
/**
* Class SaveButton
*/
class SaveButton extends GenericButton implements ButtonProviderInterface
{
/**
* @return array
*/
public function getButtonData()
{
return [
'label' => __('Save News'),
'class' => 'save primary',
'data_attribute' => [
'mage-init' => ['button' => ['event' => 'save']],
'form-role' => 'save',
],
'sort_order' => 90,
];
}
}
?>
Create Controller Action NewAction
Rsgitech\News\Controller\Adminhtml\Allnews\NewAction.php
Create new grid item
0 comments:
Post a Comment
Thanks