_status = $status; $this->_coreRegistry = $coreRegistry; parent::__construct($context, $backendHelper, $data); } /** * Set grid params * * @return void */ protected function _construct() { parent::_construct(); $this->setId('related_posts_section'); $this->setDefaultSort('post_id'); $this->setUseAjax(true); if ($this->getPost() && $this->getPost()->getId()) { $this->setDefaultFilter(['in_posts' => 1]); } if ($this->isReadonly()) { $this->setFilterVisibility(false); } } /** * Retrieve currently edited post model * * @return array|null */ public function getPost() { return $this->_coreRegistry->registry('current_model'); } /** * Add filter * * @param Column $column * @return $this */ protected function _addColumnFilterToCollection($column) { // Set custom filter for in post flag if ($column->getId() == 'in_posts') { $postIds = $this->_getSelectedPosts(); if (empty($postIds)) { $postIds = 0; } if ($column->getFilter()->getValue()) { $this->getCollection()->addFieldToFilter('post_id', ['in' => $postIds]); } else { if ($postIds) { $this->getCollection()->addFieldToFilter('post_id', ['nin' => $postIds]); } } } else { parent::_addColumnFilterToCollection($column); } return $this; } /** * Prepare collection * * @return Extended */ protected function _prepareCollection() { $post = $this->getPost(); $collection = $post->getCollection() ->addFieldToFilter('post_id', array('neq' => $post->getId())); $this->setCollection($collection); return parent::_prepareCollection(); } /** * Checks when this block is readonly * * @return bool */ public function isReadonly() { return false; } /** * Add columns to grid * * @return $this */ protected function _prepareColumns() { if (!$this->isReadonly()) { $this->addColumn( 'in_posts', [ 'type' => 'checkbox', 'name' => 'in_posts', 'values' => $this->_getSelectedPosts(), 'align' => 'center', 'index' => 'post_id', 'header_css_class' => 'col-select', 'column_css_class' => 'col-select' ] ); } $this->addColumn( 'post_id', [ 'header' => __('ID'), 'sortable' => true, 'index' => 'post_id', 'header_css_class' => 'col-id', 'column_css_class' => 'col-id' ] ); $this->addColumn( 'title', [ 'header' => __('Title'), 'index' => 'title', 'header_css_class' => 'col-name', 'column_css_class' => 'col-name' ] ); $this->addColumn( 'identifier', [ 'header' => __('URL Key'), 'index' => 'identifier', 'header_css_class' => 'col-name', 'column_css_class' => 'col-name' ] ); /** * Check is single store mode */ if (!$this->_storeManager->isSingleStoreMode()) { $this->addColumn( 'store_id', [ 'header' => __('Store View'), 'index' => 'store_id', 'type' => 'store', 'store_all' => true, 'store_view' => true, 'sortable' => false, ] ); } $this->addColumn( 'is_active', [ 'header' => __('Status'), 'index' => 'is_active', 'type' => 'options', 'options' => $this->_status->getOptionArray(), 'header_css_class' => 'col-status', 'column_css_class' => 'col-status', 'frame_callback' => array( $this->getLayout()->createBlock('Magefan\Blog\Block\Adminhtml\Grid\Column\Statuses'), 'decorateStatus' ), ] ); $this->addColumn( 'position', [ 'header' => __('Position'), 'name' => 'position', 'type' => 'number', 'validate_class' => 'validate-number', 'index' => 'position', 'editable' => true, 'edit_only' => false, 'sortable' => false, 'filter' => false, 'header_css_class' => 'col-position', 'column_css_class' => 'col-position' ] ); return parent::_prepareColumns(); } /** * Rerieve grid URL * * @return string */ public function getGridUrl() { return $this->getData( 'grid_url' ) ? $this->getData( 'grid_url' ) : $this->getUrl( 'blog/post/relatedPostsGrid', ['_current' => true] ); } /** * Retrieve selected related posts * * @return array */ protected function _getSelectedPosts() { $posts = $this->getPostsRelated(); if (!is_array($posts)) { $posts = array_keys($this->getSelectedRelatedPosts()); } return $posts; } /** * Retrieve related posts * * @return array */ public function getSelectedRelatedPosts() { $posts = []; foreach ($this->_coreRegistry->registry('current_model')->getRelatedPosts() as $post) { $posts[$post->getId()] = ['position' => $post->getPosition()]; } return $posts; } public function getTabLabel() { return __('Related Posts'); } /** * Prepare title for tab * * @return \Magento\Framework\Phrase */ public function getTabTitle() { return __('Related Posts'); } /** * Returns status flag about this tab can be shown or not * * @return bool */ public function canShowTab() { return true; } /** * Returns status flag about this tab hidden or not * * @return bool */ public function isHidden() { return false; } }