The learning curve for Magento 2, with all of the updates, has become even steeper. In this blog, I plan to showcase you how to develop admin form and grid in Magento 2.
Magento 2 provides two ways for development of admin form and grid.
I have already blogged on “UI Component” approach link. In this blog, I will cover the second” Conventional” approach.
The most critical part in both approaches is appending of store-field and filter under admin form and grid. The reason for writing this blog, is to simplify the appending process of store-field and filter, by highlighting the necessary development steps.
The “Conventional” module development will be divided into 2 parts.
For complete “conventional” approach, module overview and structure, I have provided multiple screen-shots:
Create module required files and folder:
app/code/Folo3/ConventionalFormGridStoreFilter/registration.php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Folio3_ConventionalFormGridStoreFilter',
__DIR__
);
app/code/Folo3/ConventionalFormGridStoreFilter/etc/module.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Folio3_ConventionalFormGridStoreFilter" setup_version="1.0.0" />
</config>
Define admin menu configurations with necessary routes:
app/code/Folo3/ConventionalFormGridStoreFilter/etc/adminhtml/menu.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd">
<menu>
<add id="Folio3_ConventionalFormGridStoreFilter::conventionalformgridstorefilter" title="Folio3" module="Folio3_ConventionalFormGridStoreFilter" sortOrder="30" resource="Folio3_ConventionalFormGridStoreFilter::conventionalformgridstorefilter"/>
<add id="Folio3_ConventionalFormGridStoreFilter::conventionalformgridstorefilter_manage" title="Form" module="Folio3_ConventionalFormGridStoreFilter" sortOrder="10" parent="Folio3_ConventionalFormGridStoreFilter::conventionalformgridstorefilter" action="conventionalformgridstorefilter/index/" resource="Folio3_ConventionalFormGridStoreFilter::manage"/>
</menu>
</config>
app/code/Folo3/ConventionalFormGridStoreFilter/etc/adminhtml/routes.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="admin">
<route id="conventionalformgridstorefilter" frontName="conventionalformgridstorefilter">
<module name="Folio3_ConventionalFormGridStoreFilter" />
</route>
</router>
</config>
Write installer script that will create DB table “folio3_conventionalformgridstorefilter”:
app/code/Folo3/ConventionalFormGridStoreFilter/Setup/InstallSchema.php
namespace Folio3\ConventionalFormGridStoreFilter\Setup;
use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
/**
* @codeCoverageIgnore
*/
class InstallSchema implements InstallSchemaInterface
{
/**
* {@inheritdoc}
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/
public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
{
$installer = $setup;
$installer->startSetup();
/**
* Creating table folio3_conventionalformgridstorefilter
*/
$table = $installer->getConnection()->newTable(
$installer->getTable('folio3_conventionalformgridstorefilter')
)->addColumn(
'conventionalformgridstorefilter_id',
\Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
null,
['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true],
'Entity Id'
)->addColumn(
'title',
\Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
255,
['nullable' => true],
'News Title'
)->addColumn(
'author',
\Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
255,
['nullable' => true,'default' => null],
'Author'
)->addColumn(
'content',
\Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
'2M',
['nullable' => true,'default' => null],
'Content'
)->addColumn(
'image',
\Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
null,
['nullable' => true,'default' => null],
'ConventionalFormGridStoreFilter image media path'
)->addColumn(
'created_at',
\Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
null,
['nullable' => false],
'Created At'
)->addColumn(
'published_at',
\Magento\Framework\DB\Ddl\Table::TYPE_DATE,
null,
['nullable' => true,'default' => null],
'publish date'
)->setComment(
'ConventionalFormGridStoreFilter item'
);
$installer->getConnection()->createTable($table);
$installer->endSetup();
}
}
Note:
From next steps we will cover (admin) MVC (module-view-contoller) part of the module.
Create (admin) required view XML files.
app/code/Folo3/ConventionalFormGridStoreFilter/view/adminhtml/layout/conventionalformgridstorefilter_index_edit.xml
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="admin-2columns-left" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<update handle="editor"/>
<body>
<referenceContainer name="content">
<block class="Folio3\ConventionalFormGridStoreFilter\Block\Adminhtml\ConventionalFormGridStoreFilter\Edit" name="conventionalformgridstorefilter_edit"/>
</referenceContainer>
<referenceContainer name="left">
<block class="Folio3\ConventionalFormGridStoreFilter\Block\Adminhtml\ConventionalFormGridStoreFilter\Edit\Tabs" name="conventionalformgridstorefilter_edit_tabs">
<block class="Folio3\ConventionalFormGridStoreFilter\Block\Adminhtml\ConventionalFormGridStoreFilter\Edit\Tab\Main" name="conventionalformgridstorefilter_edit_tab_main"/>
<action method="addTab">
<argument name="name" xsi:type="string">main_section</argument>
<argument name="block" xsi:type="string">conventionalformgridstorefilter_edit_tab_main</argument>
</action>
</block>
</referenceContainer>
</body>
</page>
app/code/Folo3/ConventionalFormGridStoreFilter/view/adminhtml/layout/conventionalformgridstorefilter_index_grid.xml
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<update handle="formkey"/>
<container name="root" label="Root">
<block class="Folio3\ConventionalFormGridStoreFilter\Block\Adminhtml\ConventionalFormGridStoreFilter\Grid" name="admin.conventionalformgridstorefilter.grid"/>
</container>
</page>
app/code/Folo3/ConventionalFormGridStoreFilter/view/adminhtml/layout/conventionalformgridstorefilter_index_index.xml
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="content">
<block class="Folio3\ConventionalFormGridStoreFilter\Block\Adminhtml\ConventionalFormGridStoreFilter" name="admin.conventionalformgridstorefilter.grid"/>
</referenceContainer>
</body>
</page>
app/code/Folo3/ConventionalFormGridStoreFilter/view/adminhtml/layout/conventionalformgridstorefilter_index_new.xml
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="admin-2columns-left" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <update handle="conventionalformgridstorefilter_index_edit"/> <body/> </page>
Create (admin) required view BLOCK files.
app/code/Folo3/ConventionalFormGridStoreFilter/Block/Adminhtml/ConventionalFormGridStoreFilter.php
namespace Folio3\ConventionalFormGridStoreFilter\Block\Adminhtml;
class ConventionalFormGridStoreFilter extends \Magento\Backend\Block\Widget\Grid\Container
{
/**
* Constructor
*
* @return void
*/
protected function _construct()
{
$this->_controller = 'adminhtml_ConventionalFormGridStoreFilter';
$this->_blockGroup = 'Folio3_ConventionalFormGridStoreFilter';
$this->_headerText = __('Folio3 Form');
$this->_addButtonLabel = __('Add New Form');
parent::_construct();
if ($this->_isAllowedAction('Folio3_ConventionalFormGridStoreFilter::save')) {
$this->buttonList->update('add', 'label', __('Add New Form'));
} else {
$this->buttonList->remove('add');
}
}
/**
* Check permission for passed action
*
* @param string $resourceId
* @return bool
*/
protected function _isAllowedAction($resourceId)
{
return $this->_authorization->isAllowed($resourceId);
}
}
app/code/Folo3/ConventionalFormGridStoreFilter/Block/Adminhtml/ConventionalFormGridStoreFilter/Edit.php
namespace Folio3\ConventionalFormGridStoreFilter\Block\Adminhtml\ConventionalFormGridStoreFilter;
/**
* Admin ConventionalFormGridStoreFilter page
*
*/
class Edit extends \Magento\Backend\Block\Widget\Form\Container
{
/**
* Core registry
*
* @var \Magento\Framework\Registry
*/
protected $_coreRegistry = null;
/**
* @param \Magento\Backend\Block\Widget\Context $context
* @param \Magento\Framework\Registry $registry
* @param array $data
*/
public function __construct(
\Magento\Backend\Block\Widget\Context $context,
\Magento\Framework\Registry $registry,
array $data = []
) {
$this->_coreRegistry = $registry;
parent::__construct($context, $data);
}
/**
* Initialize cms page edit block
*
* @return void
*/
protected function _construct()
{
$this->_objectId = 'conventionalformgridstorefilter_id';
$this->_blockGroup = 'Folio3_ConventionalFormGridStoreFilter';
$this->_controller = 'adminhtml_ConventionalFormGridStoreFilter';
parent::_construct();
if ($this->_isAllowedAction('Folio3_ConventionalFormGridStoreFilter::save')) {
$this->buttonList->update('save', 'label', __('Save Form'));
$this->buttonList->add(
'saveandcontinue',
[
'label' => __('Save and Continue Edit'),
'class' => 'save',
'data_attribute' => [
'mage-init' => [
'button' => ['event' => 'saveAndContinueEdit', 'target' => '#edit_form'],
],
]
],
-100
);
} else {
$this->buttonList->remove('save');
}
if ($this->_isAllowedAction('Folio3_ConventionalFormGridStoreFilter::conventionalformgridstorefilter_delete')) {
$this->buttonList->update('delete', 'label', __('Delete Form'));
} else {
$this->buttonList->remove('delete');
}
}
/**
* Retrieve text for header element depending on loaded page
*
* @return string
*/
public function getHeaderText()
{
if ($this->_coreRegistry->registry('conventionalformgridstorefilter')->getId()) {
return __("Edit Form '%1'", $this->escapeHtml($this->_coreRegistry->registry('conventionalformgridstorefilter')->getTitle()));
} else {
return __('New Form');
}
}
/**
* Check permission for passed action
*
* @param string $resourceId
* @return bool
*/
protected function _isAllowedAction($resourceId)
{
return $this->_authorization->isAllowed($resourceId);
}
/**
* Getter of url for "Save and Continue" button
* tab_id will be replaced by desired by JS later
*
* @return string
*/
protected function _getSaveAndContinueUrl()
{
return $this->getUrl('conventionalformgridstorefilter/*/save', ['_current' => true, 'back' => 'edit', 'active_tab' => '{{tab_id}}']);
}
/**
* Prepare layout
*
* @return \Magento\Framework\View\Element\AbstractBlock
*/
protected function _prepareLayout()
{
$this->_formScripts[] = "
function toggleEditor() {
if (tinyMCE.getInstanceById('page_content') == null) {
tinyMCE.execCommand('mceAddControl', false, 'page_content');
} else {
tinyMCE.execCommand('mceRemoveControl', false, 'page_content');
}
};
";
return parent::_prepareLayout();
}
}
app/code/Folo3/ConventionalFormGridStoreFilter/Block/Adminhtml/ConventionalFormGridStoreFilter/Grid.php
namespace Folio3\ConventionalFormGridStoreFilter\Block\Adminhtml\ConventionalFormGridStoreFilter;
/**
* Adminhtml ConventionalFormGridStoreFilter grid
*/
class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
{
/**
* @var \Folio3\ConventionalFormGridStoreFilter\Model\ResourceModel\ConventionalFormGridStoreFilter\CollectionFactory
*/
protected $_collectionFactory;
/**
* @var \Folio3\ConventionalFormGridStoreFilter\Model\ConventionalFormGridStoreFilter
*/
protected $_conventionalformgridstorefilter;
/**
* @param \Magento\Backend\Block\Template\Context $context
* @param \Magento\Backend\Helper\Data $backendHelper
* @param \Folio3\ConventionalFormGridStoreFilter\Model\ConventionalFormGridStoreFilter $conventionalformgridstorefilterPage
* @param \Folio3\ConventionalFormGridStoreFilter\Model\ResourceModel\ConventionalFormGridStoreFilter\CollectionFactory $collectionFactory
* @param \Magento\Core\Model\PageLayout\Config\Builder $pageLayoutBuilder
* @param array $data
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Backend\Helper\Data $backendHelper,
\Folio3\ConventionalFormGridStoreFilter\Model\ConventionalFormGridStoreFilter $conventionalformgridstorefilter,
\Folio3\ConventionalFormGridStoreFilter\Model\ResourceModel\ConventionalFormGridStoreFilter\CollectionFactory $collectionFactory,
array $data = []
) {
$this->_collectionFactory = $collectionFactory;
$this->_conventionalformgridstorefilter = $conventionalformgridstorefilter;
parent::__construct($context, $backendHelper, $data);
}
/**
* @return void
*/
protected function _construct()
{
parent::_construct();
$this->setId('conventionalformgridstorefilterGrid');
$this->setDefaultSort('conventionalformgridstorefilter_id');
$this->setDefaultDir('DESC');
$this->setUseAjax(true);
$this->setSaveParametersInSession(true);
}
/**
* Prepare collection
*
* @return \Magento\Backend\Block\Widget\Grid
*/
protected function _prepareCollection()
{
$collection = $this->_collectionFactory->create();
/* @var $collection \Folio3\ConventionalFormGridStoreFilter\Model\ResourceModel\ConventionalFormGridStoreFilter\Collection */
$this->setCollection($collection);
return parent::_prepareCollection();
}
/**
* Prepare columns
*
* @return \Magento\Backend\Block\Widget\Grid\Extended
*/
protected function _prepareColumns()
{
$this->addColumn('conventionalformgridstorefilter_id', [
'header' => __('ID'),
'index' => 'conventionalformgridstorefilter_id',
]);
$this->addColumn('title', ['header' => __('Title'), 'index' => 'title']);
$this->addColumn('author', ['header' => __('Author'), 'index' => 'author']);
$this->addColumn(
'published_at',
[
'header' => __('Published On'),
'index' => 'published_at',
'type' => 'date',
'header_css_class' => 'col-date',
'column_css_class' => 'col-date'
]
);
$this->addColumn(
'created_at',
[
'header' => __('Created'),
'index' => 'created_at',
'type' => 'datetime',
'header_css_class' => 'col-date',
'column_css_class' => 'col-date'
]
);
$this->addColumn(
'action',
[
'header' => __('Edit'),
'type' => 'action',
'getter' => 'getId',
'actions' => [
[
'caption' => __('Edit'),
'url' => [
'base' => '*/*/edit',
'params' => ['store' => $this->getRequest()->getParam('store')]
],
'field' => 'conventionalformgridstorefilter_id'
]
],
'sortable' => false,
'filter' => false,
'header_css_class' => 'col-action',
'column_css_class' => 'col-action'
]
);
return parent::_prepareColumns();
}
/**
* Row click url
*
* @param \Magento\Framework\Object $row
* @return string
*/
public function getRowUrl($row)
{
return $this->getUrl('*/*/edit', ['conventionalformgridstorefilter_id' => $row->getId()]);
}
/**
* Get grid url
*
* @return string
*/
public function getGridUrl()
{
return $this->getUrl('*/*/grid', ['_current' => true]);
}
}
app/code/Folo3/ConventionalFormGridStoreFilter/Block/Adminhtml/ConventionalFormGridStoreFilter/Edit/Form.php
namespace Folio3\ConventionalFormGridStoreFilter\Block\Adminhtml\ConventionalFormGridStoreFilter\Edit;
/**
* Adminhtml conventionalformgridstorefilter edit form block
*
*/
class Form extends \Magento\Backend\Block\Widget\Form\Generic
{
/**
* Prepare form
*
* @return $this
*/
protected function _prepareForm()
{
/** @var \Magento\Framework\Data\Form $form */
$form = $this->_formFactory->create(
['data' => ['id' => 'edit_form', 'action' => $this->getData('action'), 'method' => 'post','enctype' => 'multipart/form-data']]
);
$form->setUseContainer(true);
$this->setForm($form);
return parent::_prepareForm();
}
}
app/code/Folo3/ConventionalFormGridStoreFilter/Block/Adminhtml/ConventionalFormGridStoreFilter/Edit/Tabs.php
namespace Folio3\ConventionalFormGridStoreFilter\Block\Adminhtml\ConventionalFormGridStoreFilter\Edit;
/**
* Admin conventionalformgridstorefilter left menu
*/
class Tabs extends \Magento\Backend\Block\Widget\Tabs
{
/**
* @return void
*/
protected function _construct()
{
parent::_construct();
$this->setId('page_tabs');
$this->setDestElementId('edit_form');
$this->setTitle(__('Folio3'));
}
}
app/code/Folo3/ConventionalFormGridStoreFilter/Block/Adminhtml/ConventionalFormGridStoreFilter/Edit/Tab/Main.php
namespace Folio3\ConventionalFormGridStoreFilter\Block\Adminhtml\ConventionalFormGridStoreFilter\Edit\Tab;
/**
* Cms page edit form main tab
*/
class Main extends \Magento\Backend\Block\Widget\Form\Generic implements \Magento\Backend\Block\Widget\Tab\TabInterface
{
/**
* @var \Magento\Store\Model\System\Store
*/
protected $_systemStore;
protected $wysiwygConfig;
/**
* @param \Magento\Backend\Block\Template\Context $context
* @param \Magento\Framework\Registry $registry
* @param \Magento\Framework\Data\FormFactory $formFactory
* @param \Magento\Store\Model\System\Store $systemStore
* @param array $data
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Framework\Data\FormFactory $formFactory,
\Magento\Store\Model\System\Store $systemStore,
\Magento\Cms\Model\Wysiwyg\Config $wysiwygConfig,
array $data = []
) {
$this->_systemStore = $systemStore;
$this->wysiwygConfig = $wysiwygConfig;
parent::__construct($context, $registry, $formFactory, $data);
}
/**
* Prepare form
*
* @return $this
*/
protected function _prepareForm()
{
/* @var $model \Magento\Cms\Model\Page */
$model = $this->_coreRegistry->registry('conventionalformgridstorefilter');
/*
* Checking if user have permissions to save information
*/
if ($this->_isAllowedAction('Folio3_ConventionalFormGridStoreFilter::save')) {
$isElementDisabled = false;
} else {
$isElementDisabled = true;
}
/** @var \Magento\Framework\Data\Form $form */
$form = $this->_formFactory->create();
$form->setHtmlIdPrefix('conventionalformgridstorefilter_main_');
$fieldset = $form->addFieldset('base_fieldset', ['legend' => __('Form Information')]);
if ($model->getId()) {
$fieldset->addField('conventionalformgridstorefilter_id', 'hidden', ['name' => 'conventionalformgridstorefilter_id']);
}
$fieldset->addField(
'title',
'text',
[
'name' => 'title',
'label' => __('Form Title'),
'title' => __('Form Title'),
'required' => true,
'disabled' => $isElementDisabled
]
);
$fieldset->addField(
'author',
'text',
[
'name' => 'author',
'label' => __('Author'),
'title' => __('Author'),
'required' => true,
'disabled' => $isElementDisabled
]
);
$dateFormat = $this->_localeDate->getDateFormat(\IntlDateFormatter::SHORT);
$fieldset->addField('published_at', 'date', [
'name' => 'published_at',
'date_format' => $dateFormat,
'image' => '',//$this->getViewFileUrl('images/grid-cal.gif'),
'value' => $model->getPublishedAt(),
'label' => __('Publishing Date'),
'title' => __('Publishing Date'),
'required' => true
]);
$layoutFieldset = $form->addFieldset(
'image_fieldset',
['legend' => __('Image Thumbnail'), 'class' => 'fieldset-wide', 'disabled' => $isElementDisabled]
);
$layoutFieldset->addField(
'image',
'image',
[
'name' => 'image',
'label' => __('Image'),
'title' => __('Image'),
'required' => false,
'disabled' => $isElementDisabled
]
);
$fieldset = $form->addFieldset(
'content_fieldset',
['legend' => __('Content'), 'class' => 'fieldset-wide']
);
$wysiwygConfig = $this->wysiwygConfig->getConfig(['tab_id' => $this->getTabId()]);
$contentField = $fieldset->addField(
'content',
'editor',
[
'name' => 'content',
'style' => 'height:36em;',
'required' => true,
'disabled' => $isElementDisabled,
'config' => $wysiwygConfig
]
);
// Setting custom renderer for content field to remove label column
$renderer = $this->getLayout()->createBlock(
'Magento\Backend\Block\Widget\Form\Renderer\Fieldset\Element'
)->setTemplate(
'Magento_Cms::page/edit/form/renderer/content.phtml'
);
$contentField->setRenderer($renderer);
$this->_eventManager->dispatch('adminhtml_conventionalformgridstorefilter_edit_tab_main_prepare_form', ['form' => $form]);
$form->setValues($model->getData());
$this->setForm($form);
return parent::_prepareForm();
}
/**
* Prepare label for tab
*
* @return string
*/
public function getTabLabel()
{
return __('Form Information');
}
/**
* Prepare title for tab
*
* @return string
*/
public function getTabTitle()
{
return __('Form Information');
}
/**
* {@inheritdoc}
*/
public function canShowTab()
{
return true;
}
/**
* {@inheritdoc}
*/
public function isHidden()
{
return false;
}
/**
* Check permission for passed action
*
* @param string $resourceId
* @return bool
*/
protected function _isAllowedAction($resourceId)
{
return $this->_authorization->isAllowed($resourceId);
}
}
app/code/Folo3/ConventionalFormGridStoreFilter/Block/Adminhtml/Form/Element/Image.php
namespace Folio3\ConventionalFormGridStoreFilter\Block\Adminhtml\Form\Element;
class Image extends \Magento\Framework\Data\Form\Element\Image
{
/**
* Get image preview url
*
* @return string
*/
protected function _getUrl()
{
return $this->getValue();
}
}
Create MODEL files required for CRUD operations.
app/code/Folo3/ConventionalFormGridStoreFilter/Model/ConventionalFormGridStoreFilter.php
namespace Folio3\ConventionalFormGridStoreFilter\Model;
/**
* ConventionalFormGridStoreFilter Model
*
* @method \Folio3\ConventionalFormGridStoreFilter\Model\Resource\Page getResource()
*/
class ConventionalFormGridStoreFilter extends \Magento\Framework\Model\AbstractModel
{
/**
* Initialize resource model
*
* @return void
*/
protected function _construct()
{
$this->_init('Folio3\ConventionalFormGridStoreFilter\Model\ResourceModel\ConventionalFormGridStoreFilter');
}
}
app/code/Folo3/ConventionalFormGridStoreFilter/Model/ResourceModel/ConventionalFormGridStoreFilter.php
namespace Folio3\ConventionalFormGridStoreFilter\Model\ResourceModel;
/**
* ConventionalFormGridStoreFilter Resource Model
*/
class ConventionalFormGridStoreFilter extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
{
/**
* Initialize resource model
*
* @return void
*/
protected function _construct()
{
$this->_init('folio3_conventionalformgridstorefilter', 'conventionalformgridstorefilter_id');
}
}
app/code/Folo3/ConventionalFormGridStoreFilter/Model/ResourceModel/ConventionalFormGridStoreFilter/Collection.php
namespace Folio3\ConventionalFormGridStoreFilter\Model\ResourceModel\ConventionalFormGridStoreFilter;
class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
{
/**
* Resource initialization
*
* @return void
*/
protected function _construct()
{
$this->_init('Folio3\ConventionalFormGridStoreFilter\Model\ConventionalFormGridStoreFilter', 'Folio3\ConventionalFormGridStoreFilter\Model\ResourceModel\ConventionalFormGridStoreFilter');
}
}
Create CONTROLLER file(s) required for routing and requests processing.
app/code/Folo3/ConventionalFormGridStoreFilter/Controller/Adminhtml/Index/Delete.php
namespace Folio3\ConventionalFormGridStoreFilter\Controller\Adminhtml\Index;
class Delete extends \Magento\Backend\App\Action
{
/**
* {@inheritdoc}
*/
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Folio3_ConventionalFormGridStoreFilter::conventionalformgridstorefilter_delete');
}
/**
* Delete action
*
* @return void
*/
public function execute()
{
// check if we know what should be deleted
$id = $this->getRequest()->getParam('conventionalformgridstorefilter_id');
/** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
$resultRedirect = $this->resultRedirectFactory->create();
if ($id) {
$title = "";
try {
// init model and delete
$model = $this->_objectManager->create('Folio3\ConventionalFormGridStoreFilter\Model\ConventionalFormGridStoreFilter');
$model->load($id);
$title = $model->getTitle();
$model->delete();
// display success message
$this->messageManager->addSuccess(__('The data has been deleted.'));
// go to grid
return $resultRedirect->setPath('*/*/');
} catch (\Exception $e) {
// display error message
$this->messageManager->addError($e->getMessage());
// go back to edit form
return $resultRedirect->setPath('*/*/edit', ['page_id' => $id]);
}
}
// display error message
$this->messageManager->addError(__('We can\'t find a data to delete.'));
// go to grid
return $resultRedirect->setPath('*/*/');
}
}
app/code/Folo3/ConventionalFormGridStoreFilter/Controller/Adminhtml/Index/Edit.php
namespace Folio3\ConventionalFormGridStoreFilter\Controller\Adminhtml\Index;
use Magento\Backend\App\Action;
class Edit extends \Magento\Backend\App\Action
{
/**
* Core registry
*
* @var \Magento\Framework\Registry
*/
protected $_coreRegistry = null;
/**
* @var \Magento\Framework\View\Result\PageFactory
*/
protected $resultPageFactory;
/**
* @param Action\Context $context
* @param \Magento\Framework\View\Result\PageFactory $resultPageFactory
* @param \Magento\Framework\Registry $registry
*/
public function __construct(Action\Context $context, \Magento\Framework\View\Result\PageFactory $resultPageFactory, \Magento\Framework\Registry $registry)
{
$this->resultPageFactory = $resultPageFactory;
$this->_coreRegistry = $registry;
parent::__construct($context);
}
/**
* {@inheritdoc}
*/
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Folio3_ConventionalFormGridStoreFilter::save');
}
/**
* Init actions
*
* @return $this
*/
protected function _initAction()
{
// load layout, set active menu and breadcrumbs
/** @var \Magento\Backend\Model\View\Result\Page $resultPage */
$resultPage = $this->resultPageFactory->create();
$resultPage->setActiveMenu(
'Folio3_ConventionalFormGridStoreFilter::conventionalformgridstorefilter_manage'
)->addBreadcrumb(
__('ConventionalFormGridStoreFilter'),
__('ConventionalFormGridStoreFilter')
)->addBreadcrumb(
__('Manage Form'),
__('Manage Form')
);
return $resultPage;
}
/**
* Edit CMS page
*
* @return void
*/
public function execute()
{
// 1. Get ID and create model
$id = $this->getRequest()->getParam('conventionalformgridstorefilter_id');
$model = $this->_objectManager->create('Folio3\ConventionalFormGridStoreFilter\Model\ConventionalFormGridStoreFilter');
// 2. Initial checking
if ($id) {
$model->load($id);
if (!$model->getId()) {
$this->messageManager->addError(__('This form no longer exists.'));
/** \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
$resultRedirect = $this->resultRedirectFactory->create();
return $resultRedirect->setPath('*/*/');
}
}
// 3. Set entered data if was error when we do save
$data = $this->_objectManager->get('Magento\Backend\Model\Session')->getFormData(true);
if (!empty($data)) {
$model->setData($data);
}
// 4. Register model to use later in blocks
$this->_coreRegistry->register('conventionalformgridstorefilter', $model);
// 5. Build edit form
/** @var \Magento\Backend\Model\View\Result\Page $resultPage */
$resultPage = $this->_initAction();
$resultPage->addBreadcrumb(
$id ? __('Edit Form') : __('New Form'),
$id ? __('Edit Form') : __('New Form')
);
$resultPage->getConfig()->getTitle()->prepend(__('Folio3 Form'));
$resultPage->getConfig()->getTitle()
->prepend($model->getId() ? $model->getTitle() : __('New Form'));
return $resultPage;
}
}
app/code/Folo3/ConventionalFormGridStoreFilter/Controller/Adminhtml/Index/Grid.php
namespace Folio3\ConventionalFormGridStoreFilter\Controller\Adminhtml\Index;
class Grid extends \Magento\Customer\Controller\Adminhtml\Index
{
/**
* Customer grid action
*
* @return void
*/
public function execute()
{
$this->_view->loadLayout(false);
$this->_view->renderLayout();
}
}
app/code/Folo3/ConventionalFormGridStoreFilter/Controller/Adminhtml/Index/Index.php
namespace Folio3\ConventionalFormGridStoreFilter\Controller\Adminhtml\Index;
use Magento\Backend\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
class Index extends \Magento\Backend\App\Action
{
/**
* @var PageFactory
*/
protected $resultPageFactory;
/**
* @param Context $context
* @param PageFactory $resultPageFactory
*/
public function __construct(
Context $context,
PageFactory $resultPageFactory
) {
parent::__construct($context);
$this->resultPageFactory = $resultPageFactory;
}
/**
* Check the permission to run it
*
* @return bool
*/
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Folio3_ConventionalFormGridStoreFilter::conventionalformgridstorefilter_manage');
}
/**
* ConventionalFormGridStoreFilter List action
*
* @return void
*/
public function execute()
{
/** @var \Magento\Backend\Model\View\Result\Page $resultPage */
$resultPage = $this->resultPageFactory->create();
$resultPage->setActiveMenu(
'Folio3_ConventionalFormGridStoreFilter::conventionalformgridstorefilter_manage'
)->addBreadcrumb(
__('ConventionalFormGridStoreFilter'),
__('ConventionalFormGridStoreFilter')
)->addBreadcrumb(
__('Manage Form'),
__('Manage Form')
);
$resultPage->getConfig()->getTitle()->prepend(__('Folio3 Form'));
return $resultPage;
}
}
app/code/Folo3/ConventionalFormGridStoreFilter/Controller/Adminhtml/Index/NewAction.php
namespace Folio3\ConventionalFormGridStoreFilter\Controller\Adminhtml\Index;
class NewAction extends \Magento\Backend\App\Action
{
/**
* @var \Magento\Backend\Model\View\Result\Forward
*/
protected $resultForwardFactory;
/**
* @param \Magento\Backend\App\Action\Context $context
* @param \Magento\Backend\Model\View\Result\ForwardFactory $resultForwardFactory
*/
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Backend\Model\View\Result\ForwardFactory $resultForwardFactory
) {
$this->resultForwardFactory = $resultForwardFactory;
parent::__construct($context);
}
/**
* {@inheritdoc}
*/
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Folio3_ConventionalFormGridStoreFilter::save');
}
/**
* Forward to edit
*
* @return void
*/
public function execute()
{
/** @var \Magento\Backend\Model\View\Result\Forward $resultForward */
$resultForward = $this->resultForwardFactory->create();
return $resultForward->forward('edit');
}
}
app/code/Folo3/ConventionalFormGridStoreFilter/Controller/Adminhtml/Index/PostDataProcessor.php
namespace Folio3\ConventionalFormGridStoreFilter\Controller\Adminhtml\Index;
class PostDataProcessor
{
/**
* @var \Magento\Framework\Stdlib\DateTime\Filter\Date
*/
protected $dateFilter;
/**
* @var \Magento\Framework\Message\ManagerInterface
*/
protected $messageManager;
/**
* @param \Magento\Framework\Stdlib\DateTime\Filter\Date $dateFilter
* @param \Magento\Framework\Message\ManagerInterface $messageManager
* @param \Magento\Core\Model\Layout\Update\ValidatorFactory $validatorFactory
*/
public function __construct(
\Magento\Framework\Stdlib\DateTime\Filter\Date $dateFilter,
\Magento\Framework\Message\ManagerInterface $messageManager
) {
$this->dateFilter = $dateFilter;
$this->messageManager = $messageManager;
}
/**
* Filtering posted data. Converting localized data if needed
*
* @param array $data
* @return array
*/
public function filter($data)
{
$inputFilter = new \Zend_Filter_Input(
['published_at' => $this->dateFilter],
[],
$data
);
$data = $inputFilter->getUnescaped();
return $data;
}
/**
* Validate post data
*
* @param array $data
* @return bool Return FALSE if someone item is invalid
*/
public function validate($data)
{
$errorNo = true;
return $errorNo;
}
}
app/code/Folo3/ConventionalFormGridStoreFilter/Controller/Adminhtml/Index/Save.php
namespace Folio3\ConventionalFormGridStoreFilter\Controller\Adminhtml\Index;
use Magento\Backend\App\Action;
class Save extends \Magento\Backend\App\Action
{
/**
* @var PostDataProcessor
*/
protected $dataProcessor;
/**
* @param Action\Context $context
* @param PostDataProcessor $dataProcessor
*/
public function __construct(Action\Context $context, PostDataProcessor $dataProcessor)
{
$this->dataProcessor = $dataProcessor;
parent::__construct($context);
}
/**
* {@inheritdoc}
*/
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Folio3_ConventionalFormGridStoreFilter::save');
}
/**
* Save action
*
* @return void
*/
public function execute()
{
$data = $this->getRequest()->getPostValue();
if ($data) {
$data = $this->dataProcessor->filter($data);
$model = $this->_objectManager->create('Folio3\ConventionalFormGridStoreFilter\Model\ConventionalFormGridStoreFilter');
$id = $this->getRequest()->getParam('conventionalformgridstorefilter_id');
if ($id) {
$model->load($id);
}
// save image data and remove from data array
if (isset($data['image'])) {
$imageData = $data['image'];
unset($data['image']);
} else {
$imageData = array();
}
$model->addData($data);
if (!$this->dataProcessor->validate($data)) {
$this->_redirect('*/*/edit', ['conventionalformgridstorefilter_id' => $model->getId(), '_current' => true]);
return;
}
try {
$imageHelper = $this->_objectManager->get('Folio3\ConventionalFormGridStoreFilter\Helper\Data');
if (isset($imageData['delete']) && $model->getImage()) {
$imageHelper->removeImage($model->getImage());
$model->setImage(null);
}
$imageFile = $imageHelper->uploadImage('image');
//print_r($imageFile);
if ($imageFile) {
$model->setImage('ConventionalFormGridStoreFilter/'.$imageFile);
}
$model->save();
$this->messageManager->addSuccess(__('The Data has been saved.'));
$this->_objectManager->get('Magento\Backend\Model\Session')->setFormData(false);
if ($this->getRequest()->getParam('back')) {
$this->_redirect('*/*/edit', ['conventionalformgridstorefilter_id' => $model->getId(), '_current' => true]);
return;
}
$this->_redirect('*/*/');
return;
} catch (\Magento\Framework\Model\Exception $e) {
$this->messageManager->addError($e->getMessage());
} catch (\RuntimeException $e) {
$this->messageManager->addError($e->getMessage());
} catch (\Exception $e) {
$this->messageManager->addException($e, __('Something went wrong while saving the data.'));
}
$this->_getSession()->setFormData($data);
$this->_redirect('*/*/edit', ['conventionalformgridstorefilter_id' => $this->getRequest()->getParam('conventionalformgridstorefilter_id')]);
return;
}
$this->_redirect('*/*/');
}
}
Create HELPER file for accessing friendly methods, like image resizing etc.
app/code/Folo3/ConventionalFormGridStoreFilter/Helper/Data.php
namespace Folio3\ConventionalFormGridStoreFilter\Helper;
use Magento\Framework\App\Filesystem\DirectoryList;
class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
/**
* Path to store config where count of conventionalformgridstorefilter posts per page is stored
*
* @var string
*/
const XML_PATH_ITEMS_PER_PAGE = 'conventionalformgridstorefilter/view/items_per_page';
/**
* Media path to extension images
*
* @var string
*/
const MEDIA_PATH = 'ConventionalFormGridStoreFilter';
/**
* Maximum size for image in bytes
* Default value is 1M
*
* @var int
*/
const MAX_FILE_SIZE = 1048576;
/**
* Manimum image height in pixels
*
* @var int
*/
const MIN_HEIGHT = 50;
/**
* Maximum image height in pixels
*
* @var int
*/
const MAX_HEIGHT = 800;
/**
* Manimum image width in pixels
*
* @var int
*/
const MIN_WIDTH = 50;
/**
* Maximum image width in pixels
*
* @var int
*/
const MAX_WIDTH = 1024;
/**
* Array of image size limitation
*
* @var array
*/
protected $_imageSize = array(
'minheight' => self::MIN_HEIGHT,
'minwidth' => self::MIN_WIDTH,
'maxheight' => self::MAX_HEIGHT,
'maxwidth' => self::MAX_WIDTH,
);
/**
* @var \Magento\Framework\Filesystem\Directory\WriteInterface
*/
protected $mediaDirectory;
/**
* @var \Magento\Framework\Filesystem
*/
protected $filesystem;
/**
* @var \Magento\Framework\HTTP\Adapter\FileTransferFactory
*/
protected $httpFactory;
/**
* File Uploader factory
*
* @var \Magento\Core\Model\File\UploaderFactory
*/
protected $_fileUploaderFactory;
/**
* File Uploader factory
*
* @var \Magento\Framework\Io\File
*/
protected $_ioFile;
/**
* Store manager
*
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $_storeManager;
/**
* @param \Magento\Framework\App\Helper\Context $context
*/
public function __construct(
\Magento\Framework\App\Helper\Context $context,
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Framework\Filesystem $filesystem,
\Magento\Framework\File\Size $fileSize,
\Magento\Framework\HTTP\Adapter\FileTransferFactory $httpFactory,
\Magento\MediaStorage\Model\File\UploaderFactory $fileUploaderFactory,
\Magento\Framework\Filesystem\Io\File $ioFile,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Framework\Image\Factory $imageFactory
) {
$this->_scopeConfig = $scopeConfig;
$this->filesystem = $filesystem;
$this->mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);
$this->httpFactory = $httpFactory;
$this->_fileUploaderFactory = $fileUploaderFactory;
$this->_ioFile = $ioFile;
$this->_storeManager = $storeManager;
$this->_imageFactory = $imageFactory;
parent::__construct($context);
}
/**
* Remove ConventionalFormGridStoreFilter item image by image filename
*
* @param string $imageFile
* @return bool
*/
public function removeImage($imageFile)
{
$io = $this->_ioFile;
$io->open(array('path' => $this->getBaseDir()));
if ($io->fileExists($imageFile)) {
return $io->rm($imageFile);
}
return false;
}
/**
* Return URL for resized ConventionalFormGridStoreFilter Item Image
*
* @param Folio3\ConventionalFormGridStoreFilter\Model\ConventionalFormGridStoreFilter $item
* @param integer $width
* @param integer $height
* @return bool|string
*/
public function resize(\Folio3\ConventionalFormGridStoreFilter\Model\ConventionalFormGridStoreFilter $item, $width, $height = null)
{
if (!$item->getImage()) {
return false;
}
if ($width < self::MIN_WIDTH || $width > self::MAX_WIDTH) {
return false;
}
$width = (int)$width;
if (!is_null($height)) {
if ($height < self::MIN_HEIGHT || $height > self::MAX_HEIGHT) {
return false;
}
$height = (int)$height;
}
$imageFile = $item->getImage();
$cacheDir = $this->getBaseDir() . '/' . 'cache' . '/' . $width;
$cacheUrl = $this->getBaseUrl() . '/' . 'cache' . '/' . $width . '/';
$io = $this->_ioFile;
$io->checkAndCreateFolder($cacheDir);
$io->open(array('path' => $cacheDir));
if ($io->fileExists($imageFile)) {
return $cacheUrl . $imageFile;
}
try {
$image = $this->_imageFactory->create($this->getBaseDir() . '/' . $imageFile);
$image->resize($width, $height);
$image->save($cacheDir . '/' . $imageFile);
return $cacheUrl . $imageFile;
} catch (\Exception $e) {
return false;
}
}
/**
* Upload image and return uploaded image file name or false
*
* @throws Mage_Core_Exception
* @param string $scope the request key for file
* @return bool|string
*/
public function uploadImage($scope)
{
$adapter = $this->httpFactory->create();
$adapter->addValidator(new \Zend_Validate_File_ImageSize($this->_imageSize));
$adapter->addValidator(
new \Zend_Validate_File_FilesSize(['max' => self::MAX_FILE_SIZE])
);
if ($adapter->isUploaded($scope)) {
// validate image
if (!$adapter->isValid($scope)) {
throw new \Exception(__('Uploaded image is not valid.'));
}
$uploader = $this->_fileUploaderFactory->create(['fileId' => $scope]);
$uploader->setAllowedExtensions(['jpg', 'jpeg', 'gif', 'png']);
$uploader->setAllowRenameFiles(true);
$uploader->setFilesDispersion(false);
$uploader->setAllowCreateFolders(true);
if ($uploader->save($this->getBaseDir())) {
return $uploader->getUploadedFileName();
}
}
return false;
}
/**
* Return the base media directory for ConventionalFormGridStoreFilter Item images
*
* @return string
*/
public function getBaseDir()
{
$path = $this->filesystem->getDirectoryRead(
DirectoryList::MEDIA
)->getAbsolutePath(self::MEDIA_PATH);
return $path;
}
/**
* Return the Base URL for ConventionalFormGridStoreFilter Item images
*
* @return string
*/
public function getBaseUrl()
{
return $this->_storeManager->getStore()->getBaseUrl(
\Magento\Framework\UrlInterface::URL_TYPE_MEDIA
) . '/' . self::MEDIA_PATH;
}
/**
* Return the number of items per page
* @return int
*/
public function getConventionalFormGridStoreFilterPerPage()
{
return abs((int)$this->_scopeConfig->getValue(self::XML_PATH_ITEMS_PER_PAGE, \Magento\Store\Model\ScopeInterface::SCOPE_STORE));
}
}
First we will show how to append store-field under form then will render under GRID with filter work.
Add new table “folio3_conventionalformgridstorefilter_store”, by upgradeschema script:
app/code/Folo3/ConventionalFormGridStoreFilter/Setup/UpgradeSchema.php
namespace Folio3\ConventionalFormGridStoreFilter\Setup;
use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
class UpgradeSchema implements UpgradeSchemaInterface
{
/**
* {@inheritdoc}
*/
public function upgrade(
SchemaSetupInterface $setup,
ModuleContextInterface $context
) {
$setup->startSetup();
if (version_compare($context->getVersion(), "1.0.1", "<")) {
/**
* Create table 'folio3_conventionalformgridstorefilter_store'
*/
$table = $setup->getConnection()->newTable(
$setup->getTable('folio3_conventionalformgridstorefilter_store')
)->addColumn(
'conventionalformgridstorefilter_id',
\Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
null,
['unsigned' => true, 'nullable' => false, 'primary' => true],
'Entity ID'
)->addColumn(
'store_id',
\Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
null,
['unsigned' => true, 'nullable' => false, 'primary' => true],
'Store ID'
)
->addIndex(
$setup->getIdxName('folio3_conventionalformgridstorefilter_store', ['store_id']),
['store_id']
)
->addForeignKey(
$setup->getFkName('folio3_conventionalformgridstorefilter_store', 'conventionalformgridstorefilter_id', 'folio3_conventionalformgridstorefilter', 'conventionalformgridstorefilter_id'),
'conventionalformgridstorefilter_id',
$setup->getTable('folio3_conventionalformgridstorefilter'),
'conventionalformgridstorefilter_id',
\Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
)
->addForeignKey(
$setup->getFkName('folio3_conventionalformgridstorefilter_store', 'store_id', 'store', 'store_id'),
'store_id',
$setup->getTable('store'),
'store_id',
\Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
)
->setComment(
'Folio3 Conventional Form Grid Store Filter Store Linkage Table'
);
$setup->getConnection()->createTable($table);
}
$setup->endSetup();
}
}
Update module version, to run (above) upgrade script.
app/code/Folo3/ConventionalFormGridStoreFilter/etc/module.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Folio3_ConventionalFormGridStoreFilter" setup_version="1.0.1" />
</config>
In order to show store-field under form, insert following code by editing the following file:
app/code/Folo3/ConventionalFormGridStoreFilter/Block/Adminhtml/ConventionalFormGridStoreFilter/Edit/Tab/Main.php
$field = $fieldset->addField(
'select_stores',
'multiselect',
[
'label' => __('Visibility'),
'required' => false,
'name' => 'stores[]',
'values' => $this->_systemStore->getStoreValuesForForm()
]
);
$renderer = $this->getLayout()->createBlock(
\Magento\Backend\Block\Store\Switcher\Form\Renderer\Fieldset\Element::class
);
$field->setRenderer($renderer);
$model→setSelectStores($model→getStores());
Store field CRUD operation(s) can be code by editing the following MODEL and CONTROLLER file(s):
app/code/Folo3/ConventionalFormGridStoreFilter/Model/ResourceModel/ConventionalFormGridStoreFilter.php
namespace Folio3\ConventionalFormGridStoreFilter\Model\ResourceModel;
use Magento\Framework\Model\AbstractModel;
/**
* ConventionalFormGridStoreFilter Resource Model
*/
class ConventionalFormGridStoreFilter extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
{
/**
* Core model store manager interface
*
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $_storeManager;
/**
* @param \Magento\Framework\Model\ResourceModel\Db\Context $context
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
* @param string $connectionName
*/
public function __construct(
\Magento\Framework\Model\ResourceModel\Db\Context $context,
\Magento\Store\Model\StoreManagerInterface $storeManager,
$connectionName = null
) {
$this->_storeManager = $storeManager;
parent::__construct($context, $connectionName);
}
/**
* Initialize resource model
*
* @return void
*/
protected function _construct()
{
$this->_init('folio3_conventionalformgridstorefilter', 'conventionalformgridstorefilter_id');
$this->_conventionalformgridstorefilterTable = $this->getTable('folio3_conventionalformgridstorefilter');
$this->_conventionalformgridstorefilterStoreTable = $this->getTable('folio3_conventionalformgridstorefilter_store');
}
/**
* Perform actions before object save
*
* @param AbstractModel $object
* @return $this
*/
protected function _beforeSave(AbstractModel $object)
{
if ($object->hasData('stores') && is_array($object->getStores())) {
$stores = $object->getStores();
$stores[] = 0;
$object->setStores($stores);
} elseif ($object->hasData('stores')) {
$object->setStores([$object->getStores(), 0]);
}
return $this;
}
/**
* Perform actions after object save
*
* @param \Magento\Framework\Model\AbstractModel $object
* @return $this
*/
protected function _afterSave(AbstractModel $object)
{
$connection = $this->getConnection();
/**
* save stores
*/
$stores = $object->getStores();
if (!empty($stores)) {
$condition = ['conventionalformgridstorefilter_id = ?' => $object->getId()];
$connection->delete($this->_conventionalformgridstorefilterStoreTable, $condition);
$insertedStoreIds = [];
foreach ($stores as $storeId) {
if (in_array($storeId, $insertedStoreIds)) {
continue;
}
$insertedStoreIds[] = $storeId;
$storeInsert = ['store_id' => $storeId, 'conventionalformgridstorefilter_id' => $object->getId()];
$connection->insert($this->_conventionalformgridstorefilterStoreTable, $storeInsert);
}
}
return $this;
}
/**
* Perform actions after object load
*
* @param \Magento\Framework\Model\AbstractModel $object
* @return $this
*/
protected function _afterLoad(AbstractModel $object)
{
$connection = $this->getConnection();
$select = $connection
->select()
->from($this->_conventionalformgridstorefilterStoreTable,['store_id'])
->where(
'conventionalformgridstorefilter_id = :conventionalformgridstorefilter_id'
);
$stores = $connection->fetchCol($select, [':conventionalformgridstorefilter_id' => $object->getId()]);
if (empty($stores) && $this->_storeManager->hasSingleStore()) {
$object->setStores([$this->_storeManager->getStore(true)->getId()]);
} else {
$object->setStores($stores);
}
//return $this;
return parent::_afterLoad($object);
}
/**
* Get load select
*
* @param string $field
* @param mixed $value
* @param \Magento\Framework\Model\AbstractModel $object
* @return \Magento\Framework\DB\Select
*/
protected function _getLoadSelect($field, $value, $object)
{
$select = parent::_getLoadSelect($field, $value, $object);
if ($object->getStoreId()) {
$select->join(
['cps' => $this->_conventionalformgridstorefilterStoreTable],
$this->getMainTable() . '.conventionalformgridstorefilter_id = cps.conventionalformgridstorefilter_id'
)->where(
'cps.store_id IN (0, ?)',
$object->getStoreId()
)->order(
'store_id DESC'
)->limit(
1
);
}
return $select;
}
}
Edit following CONTROLLER file, execute() method:
app/code/Folo3/ConventionalFormGridStoreFilter/Controller/Adminhtml/Index/Save.php
public function execute()
{
$data = $this->getRequest()->getPostValue();
if ($data) {
$data = $this->dataProcessor->filter($data);
$model = $this->_objectManager->create('Folio3\ConventionalFormGridStoreFilter\Model\ConventionalFormGridStoreFilter');
$id = $this->getRequest()->getParam('conventionalformgridstorefilter_id');
if ($id) {
$model->load($id);
}
// save image data and remove from data array
if (isset($data['image'])) {
$imageData = $data['image'];
unset($data['image']);
} else {
$imageData = array();
}
/*
store-field
*/
if(!isset($data['stores'])) {
$data['stores'] = array();
}
$model->addData($data);
if (!$this->dataProcessor->validate($data)) {
$this->_redirect('*/*/edit', ['conventionalformgridstorefilter_id' => $model->getId(), '_current' => true]);
return;
}
try {
$imageHelper = $this->_objectManager->get('Folio3\ConventionalFormGridStoreFilter\Helper\Data');
if (isset($imageData['delete']) && $model->getImage()) {
$imageHelper->removeImage($model->getImage());
$model->setImage(null);
}
$imageFile = $imageHelper->uploadImage('image');
//print_r($imageFile);
if ($imageFile) {
$model->setImage('ConventionalFormGridStoreFilter/'.$imageFile);
}
$model->save();
$this->messageManager->addSuccess(__('The Data has been saved.'));
$this->_objectManager->get('Magento\Backend\Model\Session')->setFormData(false);
if ($this->getRequest()->getParam('back')) {
$this->_redirect('*/*/edit', ['conventionalformgridstorefilter_id' => $model->getId(), '_current' => true]);
return;
}
$this->_redirect('*/*/');
return;
} catch (\Magento\Framework\Model\Exception $e) {
$this->messageManager->addError($e->getMessage());
} catch (\RuntimeException $e) {
$this->messageManager->addError($e->getMessage());
} catch (\Exception $e) {
$this->messageManager->addException($e, __('Something went wrong while saving the data.'));
}
$this->_getSession()->setFormData($data);
$this->_redirect('*/*/edit', ['conventionalformgridstorefilter_id' => $this->getRequest()->getParam('conventionalformgridstorefilter_id')]);
return;
}
$this->_redirect('*/*/');
}
Note:
Rendering of store-field with CRUD operation is completed.
GRID work requires to edit following file(s).
Note:
The method “filterStoreCondition” will be used for filtering collection by store.
The addStoreData() will join store table with the main table collection.
app/code/Folo3/ConventionalFormGridStoreFilter/Block/Adminhtml/Lowstock/Grid.php
$this->addColumn(
'store_id',
[
'header' => __('Store View'),
'index' => 'stores',
'type' => 'store',
'store_all' => true,
'store_view' => true,
'sortable' => false,
'filter_condition_callback' => [$this, '_filterStoreCondition'],
'renderer' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Store::class,
]
);
/**
/**
* Prepare collection
*
* @return \Magento\Backend\Block\Widget\Grid
*/
protected function _prepareCollection()
{
$collection = $this->_collectionFactory->create();
/* @var $collection \Folio3\ConventionalFormGridStoreFilter\Model\ResourceModel\ConventionalFormGridStoreFilter\Collection */
$collection->addStoreData();
$this->setCollection($collection);
return parent::_prepareCollection();
}
* Filter store condition
*
* @param \Magento\Framework\Data\Collection $collection
* @param \Magento\Framework\DataObject $column
* @return void
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
protected function _filterStoreCondition($collection, \Magento\Framework\DataObject $column)
{
if (!($value = $column->getFilter()->getValue())) {
return;
}
$this->getCollection()->addStoreFilter($value);
}
Insert the filtering logic by editing the following file:
app/code/Folo3/ConventionalFormGridStoreFilter/Model/ResourceModel/ConventionalFormGridStoreFilter/Collection.php
namespace Folio3\ConventionalFormGridStoreFilter\Model\ResourceModel\ConventionalFormGridStoreFilter;
class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
{
/**
* main table
*
* @var string
*/
protected $_conventionalformgridstorefilterTable = null;
/**
* store table
*
* @var string
*/
protected $_conventionalformgridstorefilterStoreTable = null;
/**
* Add store data flag
* @var bool
*/
protected $_addStoreDataFlag = false;
/**
* @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory
* @param \Psr\Log\LoggerInterface $logger
* @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
* @param \Magento\Framework\Event\ManagerInterface $eventManager
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
* @param mixed $connection
* @param \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource
*/
public function __construct(
\Magento\Framework\Data\Collection\EntityFactory $entityFactory,
\Psr\Log\LoggerInterface $logger,
\Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
\Magento\Framework\Event\ManagerInterface $eventManager,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
\Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
) {
$this->_storeManager = $storeManager;
parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $connection, $resource);
}
/**
* Resource initialization
*
* @return void
*/
protected function _construct()
{
$this->_init('Folio3\ConventionalFormGridStoreFilter\Model\ConventionalFormGridStoreFilter', 'Folio3\ConventionalFormGridStoreFilter\Model\ResourceModel\ConventionalFormGridStoreFilter');
}
/**
* Join fields to entity
*
* @return $this
*/
protected function _joinFields()
{
$conventionalformgridstorefilterStoreTable = $this->getConventionalformgridstorefilterStoreTable();
$this->getSelect()->join(
['rdt' => $conventionalformgridstorefilterStoreTable],
'main_table.conventionalformgridstorefilter_id = rdt.conventionalformgridstorefilter_id',
['rdt.store_id']
);
return $this;
}
/**
* Add store filter
*
* @param int|int[] $storeId
* @return $this
*/
public function addStoreFilter($storeId)
{
$inCond = $this->getConnection()->prepareSqlCondition('store.store_id', ['in' => $storeId]);
$this->getSelect()->join(
['store' => $this->getConventionalformgridstorefilterStoreTable()],
'main_table.conventionalformgridstorefilter_id=store.conventionalformgridstorefilter_id',
[]
);
$this->getSelect()->where($inCond);
return $this;
}
/**
* Add store data
*
* @return void
*/
protected function _addStoreData()
{
$connection = $this->getConnection();
$conventionalformgridstorefilterIds = $this->getColumnValues('conventionalformgridstorefilter_id');
$storesToConventionalformgridstorefilter = [];
if (count($conventionalformgridstorefilterIds) > 0) {
$conventionalformgridstorefilterIdCondition = $this->_getConditionSql('conventionalformgridstorefilter_id', ['in' => $conventionalformgridstorefilterIds]);
$storeIdCondition = $this->_getConditionSql('store_id', ['gt' => 0]);
$select = $connection->select()->from(
$this->getConventionalformgridstorefilterStoreTable()
)->where(
$conventionalformgridstorefilterIdCondition
)->where(
$storeIdCondition
);
$result = $connection->fetchAll($select);
foreach ($result as $row) {
if (!isset($storesToConventionalformgridstorefilter[$row['conventionalformgridstorefilter_id']])) {
$storesToConventionalformgridstorefilter[$row['conventionalformgridstorefilter_id']] = [];
}
$storesToConventionalformgridstorefilter[$row['conventionalformgridstorefilter_id']][] = $row['store_id'];
}
}
foreach ($this as $item) {
if (isset($storesToConventionalformgridstorefilter[$item->getConventionalformgridstorefilterId()])) {
$item->setData('stores', $storesToConventionalformgridstorefilter[$item->getConventionalformgridstorefilterId()]);
} else {
$item->setData('stores', []);
}
}
}
/**
* Get conventionalformgridstorefilter table
*
* @return string
*/
protected function getConventionalformgridstorefilterTable()
{
if ($this->_conventionalformgridstorefilterTable === null) {
$this->_conventionalformgridstorefilterTable = $this->getTable('folio3_conventionalformgridstorefilter');
}
return $this->_conventionalformgridstorefilterTable;
}
/**
* Get conventionalformgridstorefilter store table
*
* @return string
*/
protected function getConventionalformgridstorefilterStoreTable()
{
if ($this->_conventionalformgridstorefilterStoreTable === null) {
$this->_conventionalformgridstorefilterStoreTable = $this->getTable('folio3_conventionalformgridstorefilter_store');
}
return $this->_conventionalformgridstorefilterStoreTable;
}
/**
* Add stores data
*
* @return $this
*/
public function addStoreData()
{
$this->_addStoreDataFlag = true;
return $this;
}
/**
* Redeclare parent method for store filters applying
*
* @return $this
*/
protected function _beforeLoad()
{
parent::_beforeLoad();
return $this;
}
/**
* Action after load
*
* @return $this
*/
protected function _afterLoad()
{
parent::_afterLoad();
if ($this->_addStoreDataFlag) {
$this->_addStoreData();
}
return $this;
}
}
Please feel free to comment or reach out if you have any questions. If you need any help with customizing your Magento 2 web store, please get in touch with us.
USA408 365 4638
1301 Shoreway Road, Suite 160,
Belmont, CA 94002
Whether you are a large enterprise looking to augment your teams with experts resources or an SME looking to scale your business or a startup looking to build something.
We are your digital growth partner.
Tel:
+1 (408) 412-3813
Support:
+1 (408) 512 1812
COMMENTS ()
Tweet