Skip to content
Snippets Groups Projects
Unverified Commit 6686e206 authored by Vadim Justus's avatar Vadim Justus Committed by GitHub
Browse files

Merge pull request #27 from deiserh/9-added_backend_apply_button

Added backend reset button resolve #9
parents 46529f8f 755bd5ef
No related branches found
No related tags found
No related merge requests found
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Firegento\ContentProvisioning\Block\Adminhtml\Block\Edit;
use Firegento\ContentProvisioning\Model\Query\HasDefaultBlockConfiguration;
use Magento\Backend\Block\Widget\Context;
use Magento\Cms\Api\BlockRepositoryInterface;
use Magento\Cms\Block\Adminhtml\Block\Edit\GenericButton;
use Magento\Framework\View\Element\UiComponent\Control\ButtonProviderInterface;
use Magento\Ui\Component\Control\Container;
class SaveButton extends GenericButton implements ButtonProviderInterface
{
/**
* @var HasDefaultBlockConfiguration
*/
private $hasDefaultConfiguration;
/**
* SaveButton constructor.
*
* @param Context $context
* @param BlockRepositoryInterface $blockRepository
* @param HasDefaultBlockConfiguration $hasDefaultConfiguration
*/
public function __construct(
Context $context,
BlockRepositoryInterface $blockRepository,
HasDefaultBlockConfiguration $hasDefaultConfiguration
) {
parent::__construct($context, $blockRepository);
$this->hasDefaultConfiguration = $hasDefaultConfiguration;
}
/**
* @return array
*/
public function getButtonData()
{
return [
'label' => __('Save'),
'class' => 'save primary',
'data_attribute' => [
'mage-init' => [
'buttonAdapter' => [
'actions' => [
[
'targetName' => 'cms_block_form.cms_block_form',
'actionName' => 'save',
'params' => [
true,
[
'back' => 'continue'
]
]
]
]
]
]
],
'class_name' => Container::SPLIT_BUTTON,
'options' => $this->getOptions(),
];
}
/**
* Retrieve options
*
* @return array
*/
private function getOptions()
{
$options = [
[
'label' => __('Save & Duplicate'),
'id_hard' => 'save_and_duplicate',
'data_attribute' => [
'mage-init' => [
'buttonAdapter' => [
'actions' => [
[
'targetName' => 'cms_block_form.cms_block_form',
'actionName' => 'save',
'params' => [
true,
[
'back' => 'duplicate'
]
]
]
]
]
]
]
],
[
'id_hard' => 'save_and_close',
'label' => __('Save & Close'),
'data_attribute' => [
'mage-init' => [
'buttonAdapter' => [
'actions' => [
[
'targetName' => 'cms_block_form.cms_block_form',
'actionName' => 'save',
'params' => [
true,
[
'back' => 'close'
]
]
]
]
]
]
]
]
];
if ($this->hasDefaultConfiguration->get((int)$this->getBlockId())) {
$options = array_merge($options, [[
'is_hard' => 'apply_default',
'label' => __('Reset to Default & Save'),
'data_attribute' => [
'mage-init' => [
'buttonAdapter' => [
'actions' => [
[
'targetName' => 'cms_block_form.cms_block_form',
'actionName' => 'save',
'params' => [
true,
[
'back' => 'applyDefault'
]
]
]
]
]
]
]]]);
}
return $options;
}
}
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Firegento\ContentProvisioning\Block\Adminhtml\Page\Edit;
use Firegento\ContentProvisioning\Model\Query\HasDefaultPageConfiguration;
use Magento\Backend\Block\Widget\Context;
use Magento\Cms\Api\PageRepositoryInterface;
use Magento\Cms\Block\Adminhtml\Page\Edit\GenericButton;
use Magento\Framework\View\Element\UiComponent\Control\ButtonProviderInterface;
use Magento\Ui\Component\Control\Container;
class SaveButton extends GenericButton implements ButtonProviderInterface
{
/**
* @var HasDefaultPageConfiguration
*/
private $hasDefaultConfiguration;
/**
* SaveButton constructor.
*
* @param Context $context
* @param PageRepositoryInterface $pageRepository
* @param HasDefaultPageConfiguration $hasDefaultConfiguration
*/
public function __construct(
Context $context,
PageRepositoryInterface $pageRepository,
HasDefaultPageConfiguration $hasDefaultConfiguration
) {
parent::__construct($context, $pageRepository);
$this->hasDefaultConfiguration = $hasDefaultConfiguration;
}
/**
* @return array
*/
public function getButtonData()
{
return [
'label' => __('Save'),
'class' => 'save primary',
'data_attribute' => [
'mage-init' => [
'buttonAdapter' => [
'actions' => [
[
'targetName' => 'cms_page_form.cms_page_form',
'actionName' => 'save',
'params' => [
true,
[
'back' => 'continue'
]
]
]
]
]
]
],
'class_name' => Container::SPLIT_BUTTON,
'options' => $this->getOptions(),
];
}
/**
* Retrieve options
*
* @return array
*/
private function getOptions()
{
$options = [
[
'label' => __('Save & Duplicate'),
'id_hard' => 'save_and_duplicate',
'data_attribute' => [
'mage-init' => [
'buttonAdapter' => [
'actions' => [
[
'targetName' => 'cms_page_form.cms_page_form',
'actionName' => 'save',
'params' => [
true,
[
'back' => 'duplicate'
]
]
]
]
]
]
]
],
[
'id_hard' => 'save_and_close',
'label' => __('Save & Close'),
'data_attribute' => [
'mage-init' => [
'buttonAdapter' => [
'actions' => [
[
'targetName' => 'cms_page_form.cms_page_form',
'actionName' => 'save',
'params' => [
true,
[
'back' => 'close'
]
]
]
]
]
]
]
]
];
if ($this->hasDefaultConfiguration->get((int)$this->getPageId())) {
$options = array_merge($options, [[
'is_hard' => 'apply_default',
'label' => __('Reset to Default & Save'),
'data_attribute' => [
'mage-init' => [
'buttonAdapter' => [
'actions' => [
[
'targetName' => 'cms_page_form.cms_page_form',
'actionName' => 'save',
'params' => [
true,
[
'back' => 'applyDefault'
]
]
]
]
]
]
]]]);
}
return $options;
}
}
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Firegento\ContentProvisioning\Controller\Adminhtml\Block;
use Firegento\ContentProvisioning\Model\Command\ApplyBlockEntry;
use Firegento\ContentProvisioning\Model\Query\GetBlockEntryByBlock;
use Magento\Framework\App\Action\HttpPostActionInterface;
use Magento\Backend\App\Action\Context;
use Magento\Cms\Api\BlockRepositoryInterface;
use Magento\Cms\Model\Block;
use Magento\Cms\Model\BlockFactory;
use Magento\Framework\App\Request\DataPersistorInterface;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Registry;
/**
* Save CMS block action.
*/
class Save extends \Magento\Cms\Controller\Adminhtml\Block implements HttpPostActionInterface
{
/**
* @var DataPersistorInterface
*/
protected $dataPersistor;
/**
* @var BlockFactory
*/
private $blockFactory;
/**
* @var BlockRepositoryInterface
*/
private $blockRepository;
/**
* @var GetBlockEntryByBlock
*/
private $getBlockEntryByBlock;
/**
* @var ApplyBlockEntry
*/
private $applyBlockEntry;
/**
* @param Context $context
* @param Registry $coreRegistry
* @param DataPersistorInterface $dataPersistor
* @param BlockFactory|null $blockFactory
* @param BlockRepositoryInterface|null $blockRepository
*/
public function __construct(
Context $context,
Registry $coreRegistry,
DataPersistorInterface $dataPersistor,
GetBlockEntryByBlock $getBlockEntryByBlock,
ApplyBlockEntry $applyBlockEntry,
BlockFactory $blockFactory = null,
BlockRepositoryInterface $blockRepository = null
) {
$this->dataPersistor = $dataPersistor;
$this->blockFactory = $blockFactory
?: \Magento\Framework\App\ObjectManager::getInstance()->get(BlockFactory::class);
$this->blockRepository = $blockRepository
?: \Magento\Framework\App\ObjectManager::getInstance()->get(BlockRepositoryInterface::class);
parent::__construct($context, $coreRegistry);
$this->getBlockEntryByBlock = $getBlockEntryByBlock;
$this->applyBlockEntry = $applyBlockEntry;
}
/**
* Save action
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @return \Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
/** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
$resultRedirect = $this->resultRedirectFactory->create();
$data = $this->getRequest()->getPostValue();
if ($data) {
if (isset($data['is_active']) && $data['is_active'] === 'true') {
$data['is_active'] = Block::STATUS_ENABLED;
}
if (empty($data['block_id'])) {
$data['block_id'] = null;
}
/** @var \Magento\Cms\Model\Block $model */
$model = $this->blockFactory->create();
$id = $this->getRequest()->getParam('block_id');
if ($id) {
try {
$model = $this->blockRepository->getById($id);
} catch (LocalizedException $e) {
$this->messageManager->addErrorMessage(__('This block no longer exists.'));
return $resultRedirect->setPath('*/*/');
}
}
$model->setData($data);
try {
$this->blockRepository->save($model);
$this->messageManager->addSuccessMessage(__('You saved the block.'));
$this->dataPersistor->clear('cms_block');
return $this->processBlockReturn($model, $data, $resultRedirect);
} catch (LocalizedException $e) {
$this->messageManager->addErrorMessage($e->getMessage());
} catch (\Exception $e) {
$this->messageManager->addExceptionMessage($e, __('Something went wrong while saving the block.'));
}
$this->dataPersistor->set('cms_block', $data);
return $resultRedirect->setPath('*/*/edit', ['block_id' => $id]);
}
return $resultRedirect->setPath('*/*/');
}
/**
* Process and set the block return
*
* @param \Magento\Cms\Model\Block $model
* @param array $data
* @param \Magento\Framework\Controller\ResultInterface $resultRedirect
*
* @return \Magento\Framework\Controller\ResultInterface
* @throws LocalizedException
*/
private function processBlockReturn($model, $data, $resultRedirect)
{
$redirect = $data['back'] ?? 'close';
if ($redirect ==='continue') {
$resultRedirect->setPath('*/*/edit', ['block_id' => $model->getId()]);
} else if ($redirect === 'close') {
$resultRedirect->setPath('*/*/');
} else if ($redirect === 'duplicate') {
$duplicateModel = $this->blockFactory->create(['data' => $data]);
$duplicateModel->setId(null);
$duplicateModel->setIdentifier($data['identifier'] . '-' . uniqid());
$duplicateModel->setIsActive(Block::STATUS_DISABLED);
$this->blockRepository->save($duplicateModel);
$id = $duplicateModel->getId();
$this->messageManager->addSuccessMessage(__('You duplicated the block.'));
$this->dataPersistor->set('cms_block', $data);
$resultRedirect->setPath('*/*/edit', ['block_id' => $id]);
} else if ($redirect === 'applyDefault') {
$block = $this->getBlockEntryByBlock->execute($model);
$this->applyBlockEntry->execute($block);
$resultRedirect->setPath('*/*/edit', ['block_id' => $model->getId()]);
}
return $resultRedirect;
}
}
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Firegento\ContentProvisioning\Controller\Adminhtml\Page;
use Firegento\ContentProvisioning\Model\Command\ApplyPageEntry;
use Firegento\ContentProvisioning\Model\Query\GetPageEntryByPage;
use Magento\Framework\App\Action\HttpPostActionInterface;
use Magento\Backend\App\Action;
use Magento\Cms\Model\Page;
use Magento\Framework\App\Request\DataPersistorInterface;
use Magento\Framework\Exception\LocalizedException;
use Magento\Cms\Controller\Adminhtml\Page\PostDataProcessor;
/**
* Save CMS page action.
*/
class Save extends \Magento\Backend\App\Action implements HttpPostActionInterface
{
/**
* Authorization level of a basic admin session
*
* @see _isAllowed()
*/
const ADMIN_RESOURCE = 'Magento_Cms::save';
/**
* @var PostDataProcessor
*/
protected $dataProcessor;
/**
* @var DataPersistorInterface
*/
protected $dataPersistor;
/**
* @var \Magento\Cms\Model\PageFactory
*/
private $pageFactory;
/**
* @var \Magento\Cms\Api\PageRepositoryInterface
*/
private $pageRepository;
/**
* @var GetPageEntryByPage
*/
private $getPageEntryByPage;
/**
* @var ApplyPageEntry
*/
private $applyPageEntry;
/**
* @param Action\Context $context
* @param PostDataProcessor $dataProcessor
* @param DataPersistorInterface $dataPersistor
* @param \Magento\Cms\Model\PageFactory|null $pageFactory
* @param \Magento\Cms\Api\PageRepositoryInterface|null $pageRepository
*/
public function __construct(
Action\Context $context,
PostDataProcessor $dataProcessor,
DataPersistorInterface $dataPersistor,
GetPageEntryByPage $getPageEntryByPage,
ApplyPageEntry $applyPageEntry,
\Magento\Cms\Model\PageFactory $pageFactory = null,
\Magento\Cms\Api\PageRepositoryInterface $pageRepository = null
) {
$this->dataProcessor = $dataProcessor;
$this->dataPersistor = $dataPersistor;
$this->pageFactory = $pageFactory
?: \Magento\Framework\App\ObjectManager::getInstance()->get(\Magento\Cms\Model\PageFactory::class);
$this->pageRepository = $pageRepository
?: \Magento\Framework\App\ObjectManager::getInstance()
->get(\Magento\Cms\Api\PageRepositoryInterface::class);
parent::__construct($context);
$this->getPageEntryByPage = $getPageEntryByPage;
$this->applyPageEntry = $applyPageEntry;
}
/**
* Save action
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @return \Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
$data = $this->getRequest()->getPostValue();
/** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
$resultRedirect = $this->resultRedirectFactory->create();
if ($data) {
$data = $this->dataProcessor->filter($data);
if (isset($data['is_active']) && $data['is_active'] === 'true') {
$data['is_active'] = Page::STATUS_ENABLED;
}
if (empty($data['page_id'])) {
$data['page_id'] = null;
}
/** @var \Magento\Cms\Model\Page $model */
$model = $this->pageFactory->create();
$id = $this->getRequest()->getParam('page_id');
if ($id) {
try {
$model = $this->pageRepository->getById($id);
} catch (LocalizedException $e) {
$this->messageManager->addErrorMessage(__('This page no longer exists.'));
return $resultRedirect->setPath('*/*/');
}
}
$model->setData($data);
$this->_eventManager->dispatch(
'cms_page_prepare_save',
['page' => $model, 'request' => $this->getRequest()]
);
if (!$this->dataProcessor->validate($data)) {
return $resultRedirect->setPath('*/*/edit', ['page_id' => $model->getId(), '_current' => true]);
}
try {
$this->pageRepository->save($model);
$this->messageManager->addSuccessMessage(__('You saved the page.'));
return $this->processResultRedirect($model, $resultRedirect, $data);
} catch (LocalizedException $e) {
$this->messageManager->addExceptionMessage($e->getPrevious() ?: $e);
} catch (\Exception $e) {
$this->messageManager->addExceptionMessage($e, __('Something went wrong while saving the page.'));
}
$this->dataPersistor->set('cms_page', $data);
return $resultRedirect->setPath('*/*/edit', ['page_id' => $this->getRequest()->getParam('page_id')]);
}
return $resultRedirect->setPath('*/*/');
}
/**
* Process result redirect
*
* @param \Magento\Cms\Api\Data\PageInterface $model
* @param \Magento\Backend\Model\View\Result\Redirect $resultRedirect
* @param array $data
* @return \Magento\Backend\Model\View\Result\Redirect
* @throws LocalizedException
*/
private function processResultRedirect($model, $resultRedirect, $data)
{
if ($this->getRequest()->getParam('back', false) === 'duplicate') {
$newPage = $this->pageFactory->create(['data' => $data]);
$newPage->setId(null);
$identifier = $model->getIdentifier() . '-' . uniqid();
$newPage->setIdentifier($identifier);
$newPage->setIsActive(false);
$this->pageRepository->save($newPage);
$this->messageManager->addSuccessMessage(__('You duplicated the page.'));
return $resultRedirect->setPath(
'*/*/edit',
[
'page_id' => $newPage->getId(),
'_current' => true
]
);
} else if ($this->getRequest()->getParam('back', false) === 'applyDefault') {
$block = $this->getPageEntryByPage->execute($model);
$this->applyPageEntry->execute($block);
return $resultRedirect->setPath('*/*/edit', ['page_id' => $model->getId()]);
}
$this->dataPersistor->clear('cms_page');
if ($this->getRequest()->getParam('back')) {
return $resultRedirect->setPath('*/*/edit', ['page_id' => $model->getId(), '_current' => true]);
}
return $resultRedirect->setPath('*/*/');
}
}
<?php
declare(strict_types=1);
namespace Firegento\ContentProvisioning\Model\Query;
use Magento\Cms\Api\BlockRepositoryInterface;
use Magento\Framework\Exception\LocalizedException;
class HasDefaultBlockConfiguration
{
/**
* @var BlockRepositoryInterface
*/
private $blockRepository;
/**
* @var GetBlockEntryByBlock
*/
private $getBlockEntryByBlock;
/**
* @param BlockRepositoryInterface $pageRepository
* @param GetBlockEntryByBlock $getPageEntryByPage
*/
public function __construct(
BlockRepositoryInterface $pageRepository,
GetBlockEntryByBlock $getPageEntryByPage
) {
$this->blockRepository = $pageRepository;
$this->getBlockEntryByBlock = $getPageEntryByPage;
}
/**
* @param int $entityId
* @return bool
*/
public function get(int $entityId): bool
{
try {
$block = $this->blockRepository->getById($entityId);
$entry = $this->getBlockEntryByBlock->execute($block);
return $entry ? true : false;
} catch (LocalizedException $noSuchEntityException) {
return false;
}
}
}
<?php
declare(strict_types=1);
namespace Firegento\ContentProvisioning\Model\Query;
use Magento\Cms\Api\PageRepositoryInterface;
use Magento\Framework\Exception\LocalizedException;
class HasDefaultPageConfiguration
{
/**
* @var PageRepositoryInterface
*/
private $pageRepository;
/**
* @var GetPageEntryByPage
*/
private $getPageEntryByPage;
/**
* @param PageRepositoryInterface $pageRepository
* @param GetPageEntryByPage $getPageEntryByPage
*/
public function __construct(
PageRepositoryInterface $pageRepository,
GetPageEntryByPage $getPageEntryByPage
) {
$this->pageRepository = $pageRepository;
$this->getPageEntryByPage = $getPageEntryByPage;
}
/**
* @param int $entityId
* @return bool
*/
public function get(int $entityId): bool
{
try {
$page = $this->pageRepository->getById($entityId);
$entry = $this->getPageEntryByPage->execute($page);
return $entry ? true : false;
} catch (LocalizedException $noSuchEntityException) {
return false;
}
}
}
<?xml version="1.0"?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="admin">
<route id="cms" frontName="cms">
<module name="Firegento_ContentProvisioning" before="Magento_Cms" />
</route>
</router>
</config>
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd"> <form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<settings>
<buttons>
<button name="save" class="Firegento\ContentProvisioning\Block\Adminhtml\Block\Edit\SaveButton"/>
</buttons>
</settings>
<htmlContent name="content_provisioning_hint" sortOrder="1"> <htmlContent name="content_provisioning_hint" sortOrder="1">
<block name="content_provisioning_hint" <block name="content_provisioning_hint"
template="Firegento_ContentProvisioning::maintained_content_warning.phtml" template="Firegento_ContentProvisioning::maintained_content_warning.phtml"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd"> <form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<settings>
<buttons>
<button name="save" class="Firegento\ContentProvisioning\Block\Adminhtml\Page\Edit\SaveButton"/>
</buttons>
</settings>
<htmlContent name="content_provisioning_hint" sortOrder="1"> <htmlContent name="content_provisioning_hint" sortOrder="1">
<block name="content_provisioning_hint" <block name="content_provisioning_hint"
template="Firegento_ContentProvisioning::maintained_content_warning.phtml" template="Firegento_ContentProvisioning::maintained_content_warning.phtml"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment