Commit 59b81248 by lmf

临时删除模块

parent ac30d321
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
/**
* Copyright © Aitoc. All rights reserved.
*/
namespace Aitoc\Core\Api;
interface ColumnInterface
{
const AITOC_NOTIFICATION_FIELD = 'aitoc_notification';
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Block;
use Magento\Framework\Data\Form\Element\AbstractElement;
class InstalledExtensions extends \Magento\Config\Block\System\Config\Form\Fieldset
{
const AITOC_UPDATE_EXTENSION_VERSION_LINK = 'https://www.aitoc.com/customer/account/login/';
const AITOC_PRODUCT_LINK_DEFAULT = 'https://www.aitoc.com/magento-2-extensions.html';
const AITOC_SUPPROT_LINK = 'https://www.aitoc.com/get-support.html';
/**
* @var \Magento\Framework\Module\ModuleListInterface
*/
protected $_moduleList;
/**
* @var \Magento\Framework\View\LayoutFactory
*/
protected $_layoutFactory;
/**
* @var \Aitoc\Core\Helper\Extensions
*/
private $extensionsHelper;
public function __construct(
\Magento\Backend\Block\Context $context,
\Magento\Backend\Model\Auth\Session $authSession,
\Magento\Framework\View\Helper\Js $jsHelper,
\Magento\Framework\Module\ModuleListInterface $moduleList,
\Magento\Framework\View\LayoutFactory $layoutFactory,
\Aitoc\Core\Helper\Extensions $extensionsHelper,
array $data = []
) {
parent::__construct($context, $authSession, $jsHelper, $data);
$this->_moduleList = $moduleList;
$this->_layoutFactory = $layoutFactory;
$this->extensionsHelper = $extensionsHelper;
$this->_scopeConfig = $context->getScopeConfig();
}
/**
* Render fieldset html
*
* @param AbstractElement $element
* @return string
*/
public function render(AbstractElement $element)
{
$html = $this->_getHeaderHtml($element);
$modules = $this->extensionsHelper->getAitocExtensions(true);
if ($modules) {
foreach ($modules as $ext) {
$html .= $this->getRenderExtensionLine($ext);
}
}
$html .= $this->_getFooterHtml($element);
return $html;
}
/**
* Return footer html for fieldset
* Add extra tooltip comments to elements
*
* @param AbstractElement $element
* @return string
*/
protected function _getFooterHtml($element)
{
$html = '</tbody></table>';
$html .= $this->addCommentToHtml();
foreach ($element->getElements() as $field) {
if ($field->getTooltip()) {
$html .= sprintf(
'<div id="row_%s_comment" class="system-tooltip-box" style="display:none;">%s</div>',
$field->getId(),
$field->getTooltip()
);
}
}
$html .= '</fieldset>' . $this->_getExtraJs($element);
if ($element->getIsNested()) {
$html .= '</td></tr>';
} else {
$html .= '</div>';
}
return $html;
}
/**
* @param $fieldset
* @param $moduleCode
* @return string
*/
private function getRenderExtensionLine($extName)
{
$extensionsEnabled = $this->extensionsHelper->isModuleEnabled($extName);
$resultHtml = '';
$extInfo = $this->extensionsHelper->getExtInfo($extName);
$packageData = [];
$versionOld = false;
$productUrl = self::AITOC_UPDATE_EXTENSION_VERSION_LINK;
if (!is_array($extInfo) ||
!array_key_exists('version', $extInfo) ||
!array_key_exists('description', $extInfo) ||
!array_key_exists('name', $extInfo)
) {
return '';
}
$allExtensionsData = $this->extensionsHelper->getAllExtensions();
if (isset($allExtensionsData[$extInfo['name']])) {
$packageData = $allExtensionsData[$extInfo['name']];
if ($packageData && isset($packageData['version'])) {
$versionOld = $this->extensionsHelper
->compareExtensionComposerVersions($packageData['version'], $extInfo['version']);
if (isset($packageData['product_url']) && $packageData['product_url']) {
$productUrl = $packageData['product_url'];
}
}
}
$resultHtml .= '<tr id="aitoc_core_' . strtolower($extName) . '"><td class="label"><label for="aitoc_core_' .
strtolower($extName) . '"><span><a href="' . $productUrl . '" target="_blank">'
. str_replace('extension', '', str_replace('by Aitoc', '', $extInfo['description']))
. '</a> (' . ($extensionsEnabled ? __('Enabled') : __('Disabled')) . ')</span></label></td>';
$resultHtml .= '<td class="value">'
. $extInfo['version'] . ' '
. '<b>' .
($versionOld ?
__("(New version %1 is available in your account: ", $packageData['version'])
. '<a class="aitoc-button-get-new-version" href="'
. self::AITOC_UPDATE_EXTENSION_VERSION_LINK .
'" target="_blank">' . __('Get Update') . '</a> )' : '' )
. '</b></td>';
return $resultHtml . '</tr>';
}
/**
* @param $html
* @return string
*/
private function addCommentToHtml()
{
$html = '<div class="comment aitoc-support">';
$html .= 'Have any issues with <b>Aitoc extensions</b>?' .
' Please <a href="' . self::AITOC_SUPPROT_LINK
. '" class="aitoc-get-support-button" target="_blank">Contact Support</a>';
return $html . '</div>';
}
/**
* @return \Magento\Framework\View\Element\BlockInterface
*/
protected function _getFieldRenderer()
{
if (empty($this->_fieldRenderer)) {
$layout = $this->_layoutFactory->create();
$this->_fieldRenderer = $layout->createBlock(
\Magento\Config\Block\System\Config\Form\Field::class
);
}
return $this->_fieldRenderer;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Block;
/**
* Class Shopfeed
* @package Aitoc\Core\Block
*/
class Shopfeed extends \Magento\Config\Block\System\Config\Form\Fieldset
{
/**
* Render text
*
* @param \Magento\Framework\Data\Form\Element\AbstractElement $element
* @return string
* @throws \Magento\Framework\Exception\LocalizedException
*/
public function render(\Magento\Framework\Data\Form\Element\AbstractElement $element)
{
$html = $this->_getHeaderHtml($element);
$html .= $this->_getFooterHtml($element);
return $html;
}
/**
* Return element html
*
* @param \Magento\Framework\Data\Form\Element\AbstractElement $element
* @return string
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
protected function _getElementHtml(\Magento\Framework\Data\Form\Element\AbstractElement $element)
{
return $this->_toHtml();
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Block\System\Config\Form\Field;
use Magento\Framework\Data\Form\Element\AbstractElement;
use Magento\Framework\Stdlib\DateTime\DateTimeFormatterInterface;
/**
* Backend system config datetime field renderer
*/
class Notification extends \Magento\Config\Block\System\Config\Form\Field
{
/**
* @var DateTimeFormatterInterface
*/
protected $dateTimeFormatter;
/**
* @param \Magento\Backend\Block\Template\Context $context
* @param DateTimeFormatterInterface $dateTimeFormatter
* @param array $data
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
DateTimeFormatterInterface $dateTimeFormatter,
array $data = []
) {
parent::__construct($context, $data);
$this->dateTimeFormatter = $dateTimeFormatter;
}
/**
* @param AbstractElement $element
* @return string
*/
protected function _getElementHtml(AbstractElement $element)
{
$element->setValue($this->_cache->load(\Aitoc\Core\Model\Feed::AITOC_CACHE_NAME));
$format = $this->_localeDate->getDateTimeFormat(
\IntlDateFormatter::MEDIUM
);
return $this->dateTimeFormatter->formatObject($this->_localeDate->date(intval($element->getValue())), $format);
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Components\Model\ResourceModel;
use Magento\Framework\Api\ExtensibleDataInterface;
use Magento\Framework\Api\Search\AggregationInterface;
use Magento\Framework\Api\Search\DocumentInterface;
use Magento\Framework\Api\SearchCriteriaInterface;
trait GridCollectionTrait
{
/**
* @var AggregationInterface
*/
private $aggregations;
/**
* Retrieve all ids for collection
* Backward compatibility with EAV collection
*
* @param int $limit
* @param int $offset
* @return array
*/
public function getAllIds($limit = null, $offset = null)
{
return $this->getConnection()->fetchCol($this->_getAllIdsSelect($limit, $offset), $this->_bindParams);
}
/**
* @return AggregationInterface
*/
public function getAggregations()
{
return $this->aggregations;
}
/**
* @param AggregationInterface $aggregations
* @return $this
*/
public function setAggregations($aggregations)
{
$this->aggregations = $aggregations;
}
/**
* Get search criteria.
*
* @return SearchCriteriaInterface|null
*/
public function getSearchCriteria()
{
return null;
}
/**
* Set search criteria.
*
* @param SearchCriteriaInterface $searchCriteria
* @return $this
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function setSearchCriteria(SearchCriteriaInterface $searchCriteria = null)
{
return $this;
}
/**
* Get total count.
*
* @return int
*/
public function getTotalCount()
{
return $this->getSize();
}
/**
* Set total count.
*
* @param int $totalCount
* @return $this
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function setTotalCount($totalCount)
{
return $this;
}
/**
* Set items list.
*
* @param ExtensibleDataInterface[] $items
* @return $this
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function setItems(array $items = null)
{
return $this;
}
/**
* @return DocumentInterface[]
*/
public function getItems()
{
return $this;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Components\Model\ResourceModel;
use Magento\Framework\Model\AbstractModel;
use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
abstract class LinkedFieldResource extends AbstractDb
{
/**
* @var array
*/
protected $linkedFields = [];
/**
* Order is important. Key is required. For example:
* ["store_labels" => ["aitoc_shipping_carrier_labels", "label", "store_id"]
*
* @return array
*/
protected function getLinkedFields()
{
return $this->linkedFields;
}
/**
* @inheritDoc
*/
protected function _afterSave(AbstractModel $object)
{
parent::_afterSave($object);
foreach (array_keys($this->getLinkedFields()) as $linkedField) {
$this->updateLinkedField($object, $linkedField);
}
return $this;
}
/**
* @param AbstractModel $object
*/
public function loadAllLinkedData(AbstractModel $object)
{
foreach (array_keys($this->getLinkedFields()) as $linkedField) {
$this->loadLinkedValue($object, $linkedField);
}
}
/**
* @param AbstractModel $object
* @param string $linkedField
* @return array
* @throws \Magento\Framework\Exception\LocalizedException
*/
protected function loadLinkedValue(AbstractModel $object, $linkedField)
{
list($linkedTable, $valueField, $keyField) = array_values($this->linkedFields[$linkedField]);
$fetchingValues = [$valueField];
if ($keyField) {
array_unshift($fetchingValues, $keyField);
}
$select = $this->getConnection()->select()
->from($this->getTable($linkedTable), $fetchingValues)
->where($this->getIdFieldName() . ' = :id');
if ($keyField) {
$linkedData = $this->getConnection()->fetchPairs($select, [':id' => $object->getId()]);
} else {
$linkedData = $this->getConnection()->fetchCol($select, [':id' => $object->getId()]);
}
$object->setData($linkedField, $linkedData);
}
/**
* @param AbstractModel $object
* @param string $linkedField
* @return $this
* @throws \Magento\Framework\Exception\LocalizedException
*/
private function updateLinkedField(AbstractModel $object, $linkedField)
{
list($linkedTable, $valueField, $keyField) = array_values($this->linkedFields[$linkedField]);
$idField = $this->getIdFieldName();
$linkedTable = $this->getTable($linkedTable);
$connection = $this->getConnection();
if ($object->hasData($linkedField)) {
$connection->delete($linkedTable, $connection->quoteInto("$idField = ?", $object->getId()));
}
$data = [];
foreach ((array)$object->getData($linkedField) as $key => $value) {
if ($value !== null) {
$new = [
$idField => $object->getId(),
$valueField => $value,
];
if (!empty($keyField)) {
$new[$keyField] = $key;
}
$data[] = $new;
}
}
if ($data) {
$connection->insertMultiple($this->getTable($linkedTable), $data);
}
return $this;
}
}
\ No newline at end of file
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Components\Model\Source;
use Magento\Customer\Api\GroupRepositoryInterface;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Framework\Convert\DataObject;
class CustomerGroupsOptions implements \Magento\Framework\Data\OptionSourceInterface
{
/**
* @var GroupRepositoryInterface
*/
private $groupRepository;
/**
* @var SearchCriteriaBuilder
*/
private $criteriaBuilder;
/**
* @var DataObject
*/
private $dataObjectConverter;
public function __construct(
GroupRepositoryInterface $groupRepository,
SearchCriteriaBuilder $criteriaBuilder,
DataObject $dataObjectConverter
) {
$this->groupRepository = $groupRepository;
$this->criteriaBuilder = $criteriaBuilder;
$this->dataObjectConverter = $dataObjectConverter;
}
/**
* @return array
*/
public function toOptionArray()
{
$customerGroups = $this->groupRepository->getList($this->criteriaBuilder->create())->getItems();
return $this->dataObjectConverter->toOptionArray($customerGroups, 'id', 'code');
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Components\Model\Source;
use Magento\Framework\Data\OptionSourceInterface;
use Magento\Store\Model\System\Store;
class StoreOptions implements OptionSourceInterface
{
/**
* @var Store
*/
private $store;
/**
* @param Store $store
*/
public function __construct(Store $store)
{
$this->store = $store;
}
/**
* @return array
*/
public function toOptionArray()
{
return $this->store->getStoreValuesForForm(false, true);
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Components\Model\Source;
use Magento\Store\Model\System\Store;
use Magento\Framework\Data\OptionSourceInterface;
class WebsitesOptions implements OptionSourceInterface
{
/**
* @var Store
*/
protected $store;
public function __construct(Store $store)
{
$this->store = $store;
}
/**
* @inheritDoc
*/
public function toOptionArray()
{
return $this->store->getWebsiteValuesForForm();
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Components\Model\Source;
/**
* includes "All Websites" option
*/
class WebsitesOptionsAll extends WebsitesOptions
{
/**
* @inheritDoc
*/
public function toOptionArray()
{
$options = $this->store->getWebsiteValuesForForm(false, true);
foreach ($options as &$option) {
if ($option['value'] === 0) {
$option['label'] = __('All Websites');
break;
}
}
return $options;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Components\Model\Source;
/**
* doesn't contain "-- Please Select--" option
*/
class WebsitesOptionsMultiselect extends WebsitesOptions
{
/**
* @inheritDoc
*/
public function toOptionArray()
{
return $this->store->getWebsiteValuesForForm(true);
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Components\Model\Source;
/**
* includes "All Websites" option
* doesn't contain "-- Please Select--" option
*/
class WebsitesOptionsMultiselectAll extends WebsitesOptions
{
/**
* @inheritDoc
*/
public function toOptionArray()
{
$options = $this->store->getWebsiteValuesForForm(true, true);
foreach ($options as &$option) {
if ($option['value'] === 0) {
$option['label'] = __('All Websites');
break;
}
}
return $options;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Components\Ui\Component\Listing\Column;
use Magento\Customer\Api\GroupRepositoryInterface;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Framework\Convert\DataObject;
use Magento\Ui\Component\Listing\Columns\Column;
use Magento\Framework\View\Element\UiComponent\ContextInterface;
use Magento\Framework\View\Element\UiComponentFactory;
class CustomerGroups extends Column
{
/**
* @var array
*/
private $customerGroups;
/**
* @var DataObject
*/
private $objectConverter;
public function __construct(
ContextInterface $context,
UiComponentFactory $uiComponentFactory,
GroupRepositoryInterface $groupRepository,
SearchCriteriaBuilder $searchCriteriaBuilder,
DataObject $objectConverter,
array $components = [],
array $data = []
) {
parent::__construct($context, $uiComponentFactory, $components, $data);
$this->objectConverter = $objectConverter;
$this->customerGroups = $groupRepository->getList($searchCriteriaBuilder->create())->getItems();
}
/**
* @inheritDoc
*/
public function prepareDataSource(array $dataSource)
{
$groups = $this->objectConverter->toOptionHash($this->customerGroups, 'id', 'code');
if (isset($dataSource['data']['items'])) {
$fieldName = $this->getData('name');
foreach ($dataSource['data']['items'] as & $item) {
$groupNames = [];
foreach ($item[$fieldName] as $groupId) {
if (!isset($groups[$groupId])) {
continue;
}
$groupNames[] = $groups[$groupId];
}
$item[$fieldName] = implode(', ', $groupNames);
}
}
return $dataSource;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Components\Ui\Component\Listing\Column;
use Magento\Framework\Pricing\PriceCurrencyInterface;
use Magento\Framework\View\Element\UiComponent\ContextInterface;
use Magento\Framework\View\Element\UiComponentFactory;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Ui\Component\Listing\Columns\Column;
class Price extends Column
{
/**
* @var PriceCurrencyInterface
*/
protected $priceFormatter;
/**
* @var StoreManagerInterface
*/
private $storeManager;
public function __construct(
ContextInterface $context,
UiComponentFactory $uiComponentFactory,
PriceCurrencyInterface $priceFormatter,
StoreManagerInterface $storeManager,
array $components = [],
array $data = []
) {
parent::__construct($context, $uiComponentFactory, $components, $data);
$this->priceFormatter = $priceFormatter;
$this->storeManager = $storeManager;
}
/**
* Prepare Data Source
*
* @param array $dataSource
*
* @return array
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function prepareDataSource(array $dataSource)
{
if (isset($dataSource['data']['items'])) {
$currencyCode = $this->storeManager->getStore()->getBaseCurrency()->getCurrencySymbol();
foreach ($dataSource['data']['items'] as &$item) {
if ($item[$this->getData('name')] !== null) {
$item[$this->getData('name')] = $this->priceFormatter->format(
$item[$this->getData('name')],
false,
\Magento\Framework\Pricing\PriceCurrencyInterface::DEFAULT_PRECISION,
null,
$currencyCode
);
}
}
}
return $dataSource;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Components\Ui\Component\Listing\Column;
use Magento\Framework\View\Element\UiComponent\ContextInterface;
use Magento\Framework\View\Element\UiComponentFactory;
use Magento\Ui\Component\Listing\Columns\Column;
use Magento\Store\Model\StoreManagerInterface;
class Websites extends Column
{
/**
* @var StoreManagerInterface
*/
private $storeManager;
public function __construct(
ContextInterface $context,
UiComponentFactory $uiComponentFactory,
StoreManagerInterface $storeManager,
array $components = [],
array $data = []
) {
parent::__construct($context, $uiComponentFactory, $components, $data);
$this->storeManager = $storeManager;
}
/**
* @inheritDoc
*/
public function prepareDataSource(array $dataSource)
{
$websiteNames = [0 => __('All Websites')];
foreach ($this->getData('options') as $website) {
$websiteNames[$website->getWebsiteId()] = $website->getName();
}
if (isset($dataSource['data']['items'])) {
$fieldName = $this->getData('name');
foreach ($dataSource['data']['items'] as & $item) {
$websites = [];
foreach ($item[$fieldName] as $websiteId) {
if (!isset($websiteNames[$websiteId])) {
continue;
}
$websites[] = $websiteNames[$websiteId];
if ($websiteId == 0) {
break;
}
}
$item[$fieldName] = implode(', ', $websites);
}
}
return $dataSource;
}
/**
* @inheritDoc
*/
public function prepare()
{
parent::prepare();
if ($this->storeManager->isSingleStoreMode()) {
$this->_data['config']['componentDisabled'] = true;
}
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Components\Ui\DataProvider;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Api\AttributeValueFactory;
/**
* Helping to use a Model in a Grid Collection
* @see \Magento\Framework\View\Element\UiComponent\DataProvider\Document
*/
trait DocumentTrait
{
/**
* Get an attribute value.
*
* @param string $attributeCode
* @return \Magento\Framework\Api\AttributeInterface|null
*/
public function getCustomAttribute($attributeCode)
{
$attributeValueFactory = ObjectManager::getInstance()->get(AttributeValueFactory::class);
/** @var \Magento\Framework\Api\AttributeInterface $attributeValue */
$attributeValue = $attributeValueFactory->create();
$attributeValue->setAttributeCode($attributeCode);
$attributeValue->setValue($this->getData($attributeCode));
return $attributeValue;
}
/**
* Set an attribute value for a given attribute code
*
* @param string $attributeCode
* @param mixed $attributeValue
* @return $this
*/
public function setCustomAttribute($attributeCode, $attributeValue)
{
$this->setData($attributeCode, $attributeValue);
return $this;
}
/**
* Retrieve custom attributes values.
*
* @return \Magento\Framework\Api\AttributeInterface[]|null
*/
public function getCustomAttributes()
{
$output = [];
$attributeValueFactory = ObjectManager::getInstance()->get(AttributeValueFactory::class);
foreach ($this->getData() as $key => $value) {
$attribute = $attributeValueFactory->create();
$output[] = $attribute->setAttributeCode($key)->setValue($value);
}
return $output;
}
/**
* Set array of custom attributes
*
* @param \Magento\Framework\Api\AttributeInterface[] $attributes
* @return $this
* @throws \LogicException
*/
public function setCustomAttributes(array $attributes)
{
/** @var \Magento\Framework\Api\AttributeInterface $attribute */
foreach ($attributes as $attribute) {
$this->setData(
$attribute->getAttributeCode(),
$attribute->getValue()
);
}
return $this;
}
}
\ No newline at end of file
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Components\Ui\DataProvider\Form\Modifier;
use Magento\Framework\Stdlib\ArrayManager;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Ui\DataProvider\Modifier\ModifierInterface;
class Price implements ModifierInterface
{
/**
* @var StoreManagerInterface
*/
private $storeManager;
/**
* @var ArrayManager
*/
private $arrayManager;
/**
* @var string
*/
private $fieldset;
/**
* @var array
*/
private $priceFields;
public function __construct(
StoreManagerInterface $storeManager,
ArrayManager $arrayManager,
$fieldset = 'general',
$priceFields = []
) {
$this->storeManager = $storeManager;
$this->arrayManager = $arrayManager;
$this->fieldset = $fieldset;
$this->priceFields = $priceFields;
}
/**
* @inheritDoc
*/
public function modifyData(array $data)
{
return $data;
}
/**
* @inheritDoc
*/
public function modifyMeta(array $meta)
{
return $this->preparePriceFields($meta);
}
/**
* @param $meta
* @return array
*/
protected function preparePriceFields($meta)
{
$symbol = $this->storeManager->getStore()->getBaseCurrency()->getCurrencySymbol();
foreach ($this->priceFields as $priceField) {
$pricePath = $this->fieldset . '/children/' . $priceField . '/arguments/data/config/';
$meta = $this->arrayManager->set($pricePath . 'addbefore', $meta, $symbol);
// $meta = $this->arrayManager->set($pricePath . 'validation', $meta, ['validate-zero-or-greater' => true]);
// $meta = $this->arrayManager->set($pricePath . 'additionalClasses', $meta, ['admin__field-small' => true]);
}
return $meta;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Components\Ui\DataProvider\Form\Modifier;
use Magento\Framework\Stdlib\ArrayManager;
use Magento\Store\Api\StoreRepositoryInterface;
use Magento\Ui\Component\Form\Element\DataType\Text;
use Magento\Ui\Component\Form\Element\Input;
use Magento\Ui\Component\Form\Field;
use Magento\Ui\DataProvider\Modifier\ModifierInterface;
class StoreViews implements ModifierInterface
{
/**
* @var StoreRepositoryInterface
*/
private $storeRepository;
/**
* @var ArrayManager
*/
private $arrayManager;
/**
* @var string
*/
private $fieldset;
/**
* @var string
*/
private $field;
public function __construct(
StoreRepositoryInterface $storeRepository,
ArrayManager $arrayManager,
$field = 'store_labels',
$fieldset = null
) {
$this->storeRepository = $storeRepository;
$this->arrayManager = $arrayManager;
$this->fieldset = $fieldset ?: $field;
$this->field = $field;
}
/**
* @inheritDoc
*/
public function modifyData(array $data)
{
if (!empty($data[$this->field])) {
foreach ($data[$this->field] as $id => $label) {
$data[$this->field . '[' . $id . ']'] = $label;
}
}
return $data;
}
/**
* @inheritDoc
*/
public function modifyMeta(array $meta)
{
$labelConfigs = [];
foreach ($this->storeRepository->getList() as $store) {
$storeId = $store->getId();
if (!$storeId) {
continue;
}
$labelConfigs[$this->field . '[' . $storeId . ']'] = $this->arrayManager->set(
'arguments/data/config',
[],
[
'formElement' => Input::NAME,
'componentType' => Field::NAME,
'label' => $store->getName(),
'dataType' => Text::NAME,
'dataScope' => $this->field . '[' . $storeId . ']',
]
);
}
$meta[$this->fieldset]['children'] = $labelConfigs;
return $meta;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Helper;
use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Store\Model\ScopeInterface;
class Config extends AbstractHelper
{
const AITOC_CORE_XML_PATH_NOTIFICATIONS = 'aitoc_core/notifications/';
const AITOC_CORE_XML_PATH_EXTENSIONS = 'aitoc_core/extensions/';
const AITOC_CORE_XML_PATH_MENU = 'aitoc_core/menu/';
/**
* @var \Magento\Framework\HTTP\PhpEnvironment\RemoteAddress
*/
private $remoteAddress;
public function __construct(
\Magento\Framework\App\Helper\Context $context
) {
parent::__construct($context);
$this->remoteAddress = $context->getRemoteAddress();
}
/**
* @param $path
* @param int $storeId
* @return mixed
*/
public function getModuleConfig($path, $storeId = null)
{
return $this->scopeConfig->getValue(
$path,
ScopeInterface::SCOPE_STORE,
$storeId
);
}
/**
* @return string
*/
public function getCurrentIp()
{
return $this->remoteAddress->getRemoteAddress();
}
/**
* @return boolean
*/
public function getNotificationsEnable()
{
return (bool)$this->getModuleConfig(self::AITOC_CORE_XML_PATH_NOTIFICATIONS . 'notice_enable');
}
/**
* @return array
*/
public function getNotificationsType()
{
$data = $this->getModuleConfig(self::AITOC_CORE_XML_PATH_NOTIFICATIONS . 'notice_type');
return $data ? explode(',', $data) : [];
}
/**
* @return mixed
*/
public function getNotificationsFrequency()
{
return $this->getModuleConfig(self::AITOC_CORE_XML_PATH_NOTIFICATIONS . 'frequency');
}
/**
* @return mixed
*/
public function getMenuEnable()
{
return $this->getModuleConfig(self::AITOC_CORE_XML_PATH_MENU . 'menu_enable');
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Helper;
use Magento\Framework\App\Helper\AbstractHelper;
use SimpleXMLElement;
use Zend\Http\Client\Adapter\Curl as CurlClient;
use Zend\Http\Response as HttpResponse;
use Zend\Uri\Http as HttpUri;
use Magento\Framework\Json\DecoderInterface;
class Extensions extends AbstractHelper
{
const EXTENSIONS_PATH = 'aitoc_extensions';
const URL_EXTENSIONS = 'http://www.aitoc.com/shopfeed/index/extensiondata';
/**
* @var CurlClient
*/
protected $curlClient;
/**
* @var \Magento\Framework\App\CacheInterface
*/
protected $cache;
/**
* @var \Magento\Framework\Module\Dir\Reader
*/
private $moduleReader;
/**
* @var \Magento\Framework\Filesystem\Driver\File
*/
private $filesystem;
/**
* @var DecoderInterface
*/
private $jsonDecoder;
/**
* @var \Magento\Framework\Module\ModuleListInterface
*/
private $moduleList;
/**
* @var array
*/
private $aitocExtensions = [];
/**
* @var \Magento\Framework\App\ProductMetadataInterface
*/
private $productMetadata;
/**
* @var \Magento\Framework\Module\Manager
*/
private $moduleManager;
/**
* @var array
*/
private $moduleIgnoreList = ['Aitoc_Core', 'Aitoc_Tips'];
/**
* @var array
*/
private $aitocPrefixList = ['Aitoc_', 'AdjustWare_'];
/**
* @var array
*/
private $moduleDirs = ['Aitoc', 'AdjustWare'];
public function __construct(
\Magento\Framework\App\Helper\Context $context,
\Magento\Framework\App\CacheInterface $cache,
\Magento\Framework\Module\Dir\Reader $moduleReader,
\Magento\Framework\Filesystem\Driver\File $filesystem,
DecoderInterface $jsonDecoder,
\Magento\Framework\App\ProductMetadataInterface $productMetadata,
CurlClient $curl,
\Magento\Framework\Module\ModuleListInterface $moduleList
) {
parent::__construct($context);
$this->cache = $cache;
$this->curlClient = $curl;
$this->moduleReader = $moduleReader;
$this->filesystem = $filesystem;
$this->jsonDecoder = $jsonDecoder;
$this->productMetadata = $productMetadata;
$this->moduleList = $moduleList;
$this->moduleManager = $context->getModuleManager();
}
/**
* @return bool|mixed
*/
public function getAllExtensions()
{
$data = $this->cache->load(self::EXTENSIONS_PATH);
if (!$data) {
$extensionsData = $this->getExtensionsPackagesData();
$this->cache->save(json_encode($extensionsData), self::EXTENSIONS_PATH);
}
return json_decode($this->cache->load(self::EXTENSIONS_PATH), true);
}
/**
* @param $version1
* @param $version2
* @param string $operator
* @return mixed
*/
public function compareExtensionComposerVersions($version1, $version2, $operator = '>')
{
return version_compare($version1, $version2, $operator);
}
/**
* Save extensions data to magento cache
*/
protected function getExtensionsPackagesData()
{
$resultData = [];
$extensionsParsedJson = $this->getExtensionsData();
if ($extensionsParsedJson && is_array($extensionsParsedJson)) {
foreach ($extensionsParsedJson as $extName => $extData) {
if ($extName && $extData) {
$resultData[$extName] = $extData;
}
}
}
return $resultData;
}
/**
* Read data from xml file with curl
* @return bool|SimpleXMLElement
*/
protected function getExtensionsData()
{
$result = [];
try {
$extensionsData = file_get_contents(self::URL_EXTENSIONS);
if ($extensionsData && is_string($extensionsData)) {
$result = json_decode($extensionsData, true);
}
} catch (\Exception $e) {
return false;
}
return $result;
}
/**
* @param $extName
* @return array|mixed
* @throws \Magento\Framework\Exception\FileSystemException
*/
public function getExtInfo($extName)
{
$dir = $this->moduleReader->getModuleDir('', $extName);
if ($this->filesystem->isReadable($dir)) {
return $this->readExtComposerFile($dir);
}
return [];
}
/**
* @param $extDir
* @return array|mixed
* @throws \Magento\Framework\Exception\FileSystemException
*/
public function readExtComposerFile($extDir)
{
$file = $extDir . '/composer.json';
if ($this->filesystem->isExists($file)) {
$string = $this->filesystem->fileGetContents($file);
return json_decode($string, true);
}
return [];
}
/**
* @param bool $restrictedDelete
* @return array
*/
public function getAitocExtensions($restrictedDelete = false)
{
if (!$this->aitocExtensions) {
$modules = $this->moduleList->getNames();
$dispatchResult = new \Magento\Framework\DataObject($modules);
$modules = $dispatchResult->toArray();
foreach ($this->aitocPrefixList as $prefix) {
foreach ($modules as $item) {
if (strpos($item, $prefix) !== false) {
$this->aitocExtensions[] = $item;
}
}
}
}
if ($restrictedDelete) {
foreach ($this->moduleIgnoreList as $value) {
if (array_search($value, $this->aitocExtensions) !== false) {
unset($this->aitocExtensions[array_search($value, $this->aitocExtensions)]);
}
}
}
sort($this->aitocExtensions);
return $this->aitocExtensions;
}
/**
*
* @param string $moduleName Fully-qualified module name
* @return boolean
*/
public function isModuleEnabled($moduleName)
{
return $this->_moduleManager->isEnabled($moduleName);
}
/**
* @return string
*/
public function getMagentoEdition()
{
return $this->productMetadata->getEdition();
}
/**
* @return string
*/
public function getMagentoVersion()
{
return $this->productMetadata->getVersion();
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Helper;
use Magento\Framework\App\Helper\AbstractHelper;
use SimpleXMLElement;
use Zend\Http\Client\Adapter\Curl as CurlClient;
use Zend\Http\Response as HttpResponse;
use Zend\Uri\Http as HttpUri;
use Magento\Framework\Json\DecoderInterface;
class Notice extends AbstractHelper
{
/**
* @var CurlClient
*/
protected $curlClient;
/**
* @var \Magento\Framework\App\CacheInterface
*/
protected $cache;
/**
* @var \Magento\Framework\Module\Dir\Reader
*/
private $moduleReader;
/**
* @var \Magento\Framework\Filesystem\Driver\File
*/
private $filesystem;
/**
* @var DecoderInterface
*/
private $jsonDecoder;
/**
* @var Config
*/
private $config;
public function __construct(
\Magento\Framework\App\Helper\Context $context,
\Magento\Framework\App\CacheInterface $cache,
\Magento\Framework\Module\Dir\Reader $moduleReader,
\Magento\Framework\Filesystem\Driver\File $filesystem,
DecoderInterface $jsonDecoder,
CurlClient $curl,
\Aitoc\Core\Helper\Config $config
) {
parent::__construct($context);
$this->cache = $cache;
$this->curlClient = $curl;
$this->moduleReader = $moduleReader;
$this->filesystem = $filesystem;
$this->jsonDecoder = $jsonDecoder;
$this->config = $config;
}
/**
* @return array
*/
public function getNotificationTypes()
{
return $this->config->getNotificationsType();
}
/**
* @return bool
*/
public function isEnable()
{
return $this->config->getNotificationsEnable();
}
/**
* @return mixed
*/
public function getFrequency()
{
return $this->config->getNotificationsFrequency();
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Model\Config\Source;
class Frequency implements \Magento\Framework\Option\ArrayInterface
{
/**
* @return array
*/
public function toOptionArray()
{
$options = [
[
'value' => 1,
'label' => __('1 Day')
],
[
'value' => 5,
'label' => __('5 Days')
],
[
'value' => 10,
'label' => __('10 Days')
]
];
return $options;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Model\Config\Source;
class NoticeType implements \Magento\Framework\Option\ArrayInterface
{
const PROMO = 'PROMO';
const EXTENSION_UPDATE_CUSTOMER = 'EXTENSION_UPDATE_CUSTOMER';
const EXTENSION_UPDATE = 'EXTENSION_UPDATE';
const NEW_EXTENSION = 'NEW_EXTENSION';
const NEWS = 'NEWS';
const TIPS_TRICKS = 'TIPS_TRICKS';
public function toOptionArray()
{
$types = [
[
'value' => self::NEWS,
'label' => __('Common News')
],
[
'value' => self::PROMO,
'label' => __('Promotions/Discounts')
],
[
'value' => self::EXTENSION_UPDATE_CUSTOMER,
'label' => __('My Extensions Updates')
],
[
'value' => self::EXTENSION_UPDATE,
'label' => __('All Extensions Updates')
],
[
'value' => self::NEW_EXTENSION,
'label' => __('New Extensions')
],
[
'value' => self::TIPS_TRICKS,
'label' => __('Magento Tricks & Tips')
]
];
return $types;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Model;
use Magento\Framework\Config\ConfigOptionsListConstants;
use Magento\Framework\Notification\MessageInterface;
/**
* AdminNotification Feed model
*/
class Feed extends \Magento\AdminNotification\Model\Feed
{
const AITOC_CACHE_NAME = 'aitoc_notifications_lastcheck';
const XML_USE_HTTPS_PATH = 'system/adminnotification/use_https';
const XML_FEED_URL_PATH = 'www.aitoc.com/feedrss';
const XML_FREQUENCY_PATH = 'system/adminnotification/frequency';
const XML_LAST_UPDATE_PATH = 'system/adminnotification/last_update';
/**
* Feed url
*
* @var string
*/
protected $_feedUrl;
/**
* @var \Magento\Backend\App\ConfigInterface
*/
protected $_backendConfig;
/**
* @var \Magento\AdminNotification\Model\InboxFactory
*/
protected $_inboxFactory;
/**
* @var \Magento\Framework\HTTP\Adapter\CurlFactory
*
*/
protected $curlFactory;
/**
* Deployment configuration
*
* @var \Magento\Framework\App\DeploymentConfig
*/
protected $_deploymentConfig;
/**
* @var \Magento\Framework\App\ProductMetadataInterface
*/
protected $productMetadata;
/**
* @var \Magento\Framework\UrlInterface
*/
protected $urlBuilder;
/**
* @var \Aitoc\Core\Helper\Notice
*/
private $noticeHelper;
/**
* @var \Aitoc\Core\Helper\Extension
*/
private $extensionHelper;
/**
* @var \Magento\Framework\App\Config\Storage\WriterInterface
*/
private $configWriter;
/**
* @var \Magento\Backend\App\ConfigInterface
*/
private $config;
/**
* @var \Magento\Framework\App\Config\ReinitableConfigInterface
*/
private $reinitableConfig;
/**
* @param \Magento\Framework\Model\Context $context
* @param \Magento\Framework\Registry $registry
* @param \Magento\Backend\App\ConfigInterface $backendConfig
* @param InboxFactory $inboxFactory
* @param \Magento\Framework\HTTP\Adapter\CurlFactory $curlFactory
* @param \Magento\Framework\App\DeploymentConfig $deploymentConfig
* @param \Magento\Framework\App\ProductMetadataInterface $productMetadata
* @param \Magento\Framework\UrlInterface $urlBuilder
* @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
* @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
* @param array $data
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
\Magento\Framework\Model\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Backend\App\ConfigInterface $backendConfig,
\Magento\AdminNotification\Model\InboxFactory $inboxFactory,
\Magento\Framework\HTTP\Adapter\CurlFactory $curlFactory,
\Magento\Framework\App\DeploymentConfig $deploymentConfig,
\Magento\Framework\App\ProductMetadataInterface $productMetadata,
\Magento\Framework\UrlInterface $urlBuilder,
\Aitoc\Core\Helper\Notice $noticeHelper,
\Aitoc\Core\Helper\Extensions $extensionHelper,
\Magento\Backend\App\ConfigInterface $config,
\Magento\Framework\App\Config\ReinitableConfigInterface $reinitableConfig,
\Magento\Framework\App\Config\Storage\WriterInterface $configWriter,
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
array $data = []
) {
parent::__construct(
$context,
$registry,
$backendConfig,
$inboxFactory,
$curlFactory,
$deploymentConfig,
$productMetadata,
$urlBuilder,
$resource,
$resourceCollection,
$data
);
$this->noticeHelper = $noticeHelper;
$this->extensionHelper = $extensionHelper;
$this->config = $config;
$this->configWriter = $configWriter;
$this->reinitableConfig = $reinitableConfig;
}
/**
* Init model
*
* @return void
*/
protected function _construct()
{
}
/**
* Retrieve feed url
*
* @return string
*/
public function getFeedUrl()
{
$httpPath = $this->_backendConfig->isSetFlag(self::XML_USE_HTTPS_PATH) ? 'https://' : 'http://';
if ($this->_feedUrl === null) {
$this->_feedUrl = $httpPath . self::XML_FEED_URL_PATH;
}
return $this->_feedUrl;
}
/**
* Check feed for modification
*
* @return $this
*/
public function checkUpdate()
{
if ($this->getFrequency() + $this->getLastUpdate() > time()) {
return $this;
}
if (!$this->noticeHelper->isEnable()) {
return $this;
}
$feedData = [];
$feedXml = $this->getFeedData();
$installDate = $this->getFirstAitocRun();
if ($feedXml && $feedXml->channel && $feedXml->channel->item) {
foreach ($feedXml->channel->item as $item) {
$pubDate = strtotime((string)$item->pubDate);
$itemPublicationDate = strtotime((string)$item->pubDate);
if ($itemPublicationDate <= $installDate || !$this->isInteresting($item)) {
continue;
}
$feedData[] = [
'severity' => MessageInterface::SEVERITY_NOTICE,
'date_added' => date('Y-m-d H:i:s', $pubDate),
'title' => $this->escapeString($item->title),
'description' => $this->escapeString($item->description),
'url' => $this->escapeString($item->link),
'aitoc_notification' => 1
];
}
if ($feedData) {
$this->_inboxFactory->create()->parse(array_reverse($feedData));
}
}
$this->setLastUpdate();
return $this;
}
/**
* @return int|mixed
*/
private function getFirstAitocRun()
{
$coreConfigRunPath = 'aitoc_core/notifications/first_aitoc_run';
$result = $this->config->getValue($coreConfigRunPath);
if (!$result) {
$result = time();
$this->configWriter->save($coreConfigRunPath, $result);
$this->reinitableConfig->reinit();
}
return $result;
}
/**
* @param $item
* @return bool
*/
private function isInteresting($item)
{
$interests = $this->getTypes();
if (!$interests) {
return false;
}
if ($item->type != \Aitoc\Core\Model\Config\Source\NoticeType::EXTENSION_UPDATE
&& in_array((string)$item->type, $interests)
) {
return true;
}
if ($item->type == \Aitoc\Core\Model\Config\Source\NoticeType::EXTENSION_UPDATE
&& in_array(\Aitoc\Core\Model\Config\Source\NoticeType::EXTENSION_UPDATE_CUSTOMER, $interests)
&& !in_array(\Aitoc\Core\Model\Config\Source\NoticeType::EXTENSION_UPDATE, $interests)
) {
$extData = explode('-', (string)$item->extension);
if (!$extData) {
return false;
}
$extension = $extData[0];
if (array_key_exists(1, $extData)) {
$platform = $extData[1];
}
$isMagentoEE = $this->extensionHelper->getMagentoEdition() != 'Community';
if ($isMagentoEE && $platform == 'EE'
|| !$isMagentoEE && empty($platform)
) {
return $this->extensionHelper->isModuleEnabled($extension);
}
}
return false;
}
/**
* @return array
*/
private function getTypes()
{
return $this->noticeHelper->getNotificationTypes();
}
/**
* Retrieve Update Frequency
*
* @return int
*/
public function getFrequency()
{
return (int)$this->noticeHelper->getFrequency() * 60 * 60 * 24;
}
/**
* Retrieve Last update time
*
* @return int
*/
public function getLastUpdate()
{
return $this->_cacheManager->load(self::AITOC_CACHE_NAME);
}
/**
* Set last update time (now)
*
* @return $this
*/
public function setLastUpdate()
{
$this->_cacheManager->save(time(), self::AITOC_CACHE_NAME);
return $this;
}
/**
* Converts incoming data to string format and escapes special characters.
*
* @param \SimpleXMLElement $data
* @return string
*/
private function escapeString(\SimpleXMLElement $data)
{
return htmlspecialchars((string)$data);
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Model\Helpers;
class Date
{
/**
* @var \Magento\Framework\Stdlib\DateTime
*/
private $dateTime;
/**
* @var \Magento\Framework\Stdlib\DateTime\DateTime
*/
private $date;
/**
* @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface
*/
private $timezone;
public function __construct(
\Magento\Framework\Stdlib\DateTime $dateTime,
\Magento\Framework\Stdlib\DateTime\DateTime $date,
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
) {
$this->dateTime = $dateTime;
$this->date = $date;
$this->timezone = $timezone;
}
/**
* @param bool $includedTime
*
* @return null|string
*/
public function getCurrentDate($includedTime = true)
{
return $this->dateTime->formatDate($this->date->gmtTimestamp(), $includedTime);
}
/**
* @param $stringTime
* @param bool $includedTime
*
* @return null|string
*/
public function getDateFromString($stringTime, $includedTime = true)
{
return $this->dateTime->formatDate($this->dateTime->strToTime($stringTime), $includedTime);
}
/**
* @param $stringTime
*
* @return int
*/
public function getTimestampFromString($stringTime)
{
return $this->dateTime->strToTime($stringTime);
}
/**
* @param $days
* @param bool $seconds
*
* @return int|null|string
*/
public function getCurrentDateAfterDays($days, $seconds = false)
{
$timestamp = $this->date->gmtTimestamp() + ($days * 24 * 3600);
return $seconds ? $timestamp : $this->dateTime->formatDate($timestamp);
}
/**
* @param $days
* @param bool $seconds
*
* @return int|null|string
*/
public function getCurrentDateBeforeDays($days, $seconds = false)
{
$timestamp = $this->date->gmtTimestamp() - ($days * 24 * 3600);
return $seconds ? $timestamp : $this->dateTime->formatDate($timestamp);
}
/**
* @return int
*/
public function getTimestamp()
{
return $this->date->gmtTimestamp();
}
/**
* @return string
*/
public function getTimezoneDate()
{
return $this->timezone->formatDate(null, \IntlDateFormatter::SHORT, true);
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Model;
class Logger extends \Magento\Framework\Logger\Monolog { }
\ No newline at end of file
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Model;
/**
* Class Platform
* @package Aitoc\Core\Model
*/
class Platform
{
const PLATFORMFILE_SUFFIX = '.platform.xml';
const CACHE_CLEAR_VERSION = '2.21.0';
const DEFAULT_VAR_PATH = 'var';
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Observer;
use Magento\Framework\Event\ObserverInterface;
/**
* AdminNotification observer
*
*/
class PredispatchAdminActionControllerObserver implements ObserverInterface
{
/**
* @var \Magento\AdminNotification\Model\FeedFactory
*/
protected $_feedFactory;
/**
* @var \Magento\Backend\Model\Auth\Session
*/
protected $_backendAuthSession;
/**
* @param \Aitoc\Core\Model\FeedFactory $feedFactory
* @param \Magento\Backend\Model\Auth\Session $backendAuthSession
*/
public function __construct(
\Aitoc\Core\Model\FeedFactory $feedFactory,
\Magento\Backend\Model\Auth\Session $backendAuthSession
) {
$this->_feedFactory = $feedFactory;
$this->_backendAuthSession = $backendAuthSession;
}
/**
* Predispatch admin action controller
*
* @param \Magento\Framework\Event\Observer $observer
* @return void
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function execute(\Magento\Framework\Event\Observer $observer)
{
if ($this->_backendAuthSession->isLoggedIn()) {
$feedModel = $this->_feedFactory->create();
/* @var $feedModel \Magento\AdminNotification\Model\Feed */
$feedModel->checkUpdate();
}
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Plugin\BackendMenu;
use Magento\Backend\Model\Menu\Config;
use Magento\Backend\Model\Menu;
use Aitoc\Core\Helper\Extensions;
use Magento\Config\Model\Config\Structure;
use Magento\Framework\App\ProductMetadataInterface;
use Magento\Backend\Model\Menu\Item;
use Magento\Backend\Model\Menu\ItemFactory;
use Magento\Backend\Model\Menu\Filter\IteratorFactory;
use Aitoc\Core\Model\Logger;
use Aitoc\Core\Helper\Config as AitocConfig;
class Builder
{
/**
* @var Config
*/
private $config;
/**
* @var AitocConfig
*/
private $aitocConfig;
/**
* @var ProductMetadataInterface
*/
private $productMetadata;
/**
* @var Extensions
*/
private $extensionHelper;
/**
* @var Structure
*/
private $configStructure;
/**
* @var ItemFactory
*/
private $itemFactory;
/**
* @var IteratorFactory
*/
private $iteratorFactory;
/**
* @var Logger
*/
private $logger;
public function __construct(
Config $config,
AitocConfig $aitocConfig,
ProductMetadataInterface $productMetadata,
Extensions $extensionHelper,
Structure $configStructure,
ItemFactory $itemFactory,
IteratorFactory $iteratorFactory,
Logger $logger
) {
$this->config = $config;
$this->aitocConfig = $aitocConfig;
$this->productMetadata = $productMetadata;
$this->extensionHelper = $extensionHelper;
$this->configStructure = $configStructure;
$this->itemFactory = $itemFactory;
$this->iteratorFactory = $iteratorFactory;
$this->logger = $logger;
}
/**
* @param $subject
* @param Menu $menu
* @return Menu
*/
public function afterGetResult($subject, Menu $menu)
{
return $menu->get('Aitoc_Core::menu') ? $this->buildMenu($menu): $menu;
}
/**
* @param Menu $menu
* @return Menu
*/
private function buildMenu(Menu $menu)
{
$menuWithoutAitoc = $this->isRemoveAitocTab($menu);
if ($menuWithoutAitoc) {
return $menuWithoutAitoc;
}
try {
$configItems = $this->getItemsFromConfig();
$extensionData = [];
$aitocExtensions = $this->extensionHelper->getAitocExtensions(true);
foreach ($aitocExtensions as $extCode) {
if (!empty($configItems[$extCode]['label']) && $configItems[$extCode]['label']) {
$label = $configItems[$extCode]['label'];
} elseif ($extInfo = $this->extensionHelper->getExtInfo($extCode) && !empty($extInfo['description'])) {
$label = $extInfo['description'];
} else {
$label = explode('_', $extCode)[1];
}
$extensionData[$label] = $extCode;
}
$this->render($extensionData, $configItems, $menu);
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
}
return $menu;
}
/**
* @param array $extensionData
* @param array $configItems
* @param Menu $menu
* @throws \Exception
*/
private function render($extensionData, $configItems, Menu $menu)
{
$menuItems = $this->getMenuItems($this->config->getMenu());
foreach ($extensionData as $label => $extCode) {
$renderedItems = [];
if (!empty($menuItems[$extCode])) {
$renderedItems = array_merge($renderedItems, $this->getRenderedItemsByExtension($menuItems[$extCode], $menu));
}
if (!empty($configItems[$extCode]['id'])) {
$renderedItems[] = $this->renderItem(
$extCode . '_aitocMenu',
$extCode,
__('🔧 Configuration')->render(),
'Aitoc_Core::menu',
'adminhtml/system_config/edit/section/' . $configItems[$extCode]['id']
);
}
if ($renderedItems) {
$itemId = $extCode . 'aitocMenu';
/** @var Item $mainItem */
$mainItem = $this->itemFactory->create(['data' => [
'id' => $itemId,
'title' => $label,
'module' => $extCode,
'resource' => 'Aitoc_Core::menu'
]]);
$menu->add($mainItem, 'Aitoc_Core::menu', 1);
foreach ($renderedItems as $item) {
$menu->add($item, $itemId);
}
}
}
}
/**
* @param Menu $menu
* @return bool|Menu
*/
private function isRemoveAitocTab(Menu $menu)
{
if (!$this->aitocConfig->getMenuEnable()
|| version_compare($this->productMetadata->getVersion(), '2.2', '<')
) {
$menu->remove('Aitoc_Core::menu');
return $menu;
}
return false;
}
/**
* @param array $menuItems
* @param Menu $menu
* @return array
*/
private function getRenderedItemsByExtension($menuItems, Menu $menu)
{
$newItems = [];
foreach ($menuItems as $itemId) {
$item = $menu->get($itemId);
if ($item) {
$item = $item->toArray();
if (isset($item['id']) && isset($item['title']) && isset($item['resource']) && isset($item['action'])) {
$extension = empty($item['module']) ? explode('::', $item['resource'])[0] : $item['module'];
$newItems[] = $this->renderItem(
$item['id'] . '_aitocMenu',
$extension,
$item['title'],
$item['resource'],
$item['action']
);
}
}
}
return $newItems;
}
/**
* @param string $id
* @param string $extension
* @param string $title
* @param string $resource
* @param string $url
* @return Item|null
*/
private function renderItem($id, $extension, $title, $resource, $url)
{
try {
$item = $this->itemFactory->create(['data' => [
'id' => $id,
'module' => $extension,
'title' => $title,
'action' => $url,
'resource' => $resource
]]);
} catch (\Exception $e) {
$this->logger->warning($e->getMessage());
$item = null;
}
return $item;
}
/**
* @param Menu $menu
* @return array
*/
private function getMenuItems(Menu $menu)
{
$menuItems = [];
foreach ($this->generateMenuItems($menu) as $item) {
$name = explode('::', $item)[0];
if (!isset($menuItems[$name])) {
$menuItems[$name] = [];
}
$menuItems[$name][] = $item;
}
return $menuItems;
}
/**
* @param Menu $menu
* @return array
*/
private function generateMenuItems(Menu $menu)
{
$menuItems = [];
foreach ($this->iteratorFactory->create(['iterator' => $menu->getIterator()]) as $menuItem) {
/** @var Item $menuItem */
if ($this->validateMenuItem($menuItem)) {
$menuItems[] = $menuItem->getId();
}
if ($menuItem->hasChildren()) {
$menuItems = array_merge($menuItems, $this->generateMenuItems($menuItem->getChildren()));
}
}
return $menuItems;
}
/**
* @return array
*/
private function getItemsFromConfig()
{
$configItems = [];
foreach ($this->configStructure->getTabs() as $tab) {
if ($tab->getId() == 'aitoc_extensions') {
foreach ($tab->getChildren() as $item) {
$itemData = $item->getData('resource');
if (!empty($itemData['id']) && $itemData['id'] && !empty($itemData['resource'])) {
$name = explode('::', $itemData['resource'])[0];
$configItems[$name] = $itemData;
}
}
break;
}
}
return $configItems;
}
/**
* @param Item $menuItem
* @return bool
*/
private function validateMenuItem(Item $menuItem)
{
return $menuItem->getAction()
&& strpos($menuItem->getAction(), 'system_config') === false
&& strpos($menuItem->getId(), 'Aitoc') !== false
&& strpos($menuItem->getId(), 'Aitoc_Core') === false;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Plugin\BackendMenu;
use Magento\Backend\Model\Menu\Item as NativeItem;
class Item
{
/**
* @param NativeItem $subject
* @param $url
* @return string
*/
public function afterGetUrl(NativeItem $subject, $url)
{
$id = $subject->getId();
if ($id == 'Aitoc_Core::marketplace') {
return 'https://www.aitoc.com/magento-2-extensions.html?utm_source=extensions_promo&utm_medium=backend&utm_campaign=from_magento_2_menu';
} else {
return $url;
}
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Plugin\Notifications;
/**
* Class AitocNotificationLogoAdd
* @package Aitoc\Core\Plugin\Notifications
*/
class AitocNotificationLogoAdd
{
/**
* @param \Magento\AdminNotification\Block\Grid\Renderer\Notice $subject
* @param \Closure $proceed
* @param \Magento\Framework\DataObject $row
* @return mixed|string
*/
public function aroundRender(
\Magento\AdminNotification\Block\Grid\Renderer\Notice $subject,
\Closure $proceed,
\Magento\Framework\DataObject $row
) {
$result = $proceed($row);
if ($row->getData(\Aitoc\Core\Api\ColumnInterface::AITOC_NOTIFICATION_FIELD)) {
return '<div class="aitoc-grid-message"><div class="aitoc-notif-logo"></div>' . $result . '</div>';
} else {
return $result;
}
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Plugin\Notifications;
use Magento\AdminNotification\Block\ToolbarEntry as NativeToolbarEntry;
class AitocNotificationLogoAddInToolbar
{
/**
* @param NativeToolbarEntry $subject
* @param $html
* @return mixed
*/
public function afterToHtml(
NativeToolbarEntry $subject,
$html
) {
return $this->getReplacedLogoWithHtml($subject, $html);
}
/**
* @param NativeToolbarEntry $subject
* @return \Magento\AdminNotification\Model\ResourceModel\Inbox\Collection
*/
private function getAitocNotificationsCollection(NativeToolbarEntry $subject)
{
return $subject->getLatestUnreadNotifications()
->clear()
->addFieldToFilter(\Aitoc\Core\Api\ColumnInterface::AITOC_NOTIFICATION_FIELD, 1);
}
/**
* @param NativeToolbarEntry $subject
* @param $html
* @return mixed
*/
private function getReplacedLogoWithHtml(NativeToolbarEntry $subject, $html)
{
foreach ($this->getAitocNotificationsCollection($subject) as $item) {
$search = 'data-notification-id="' . $item->getId() . '"';
$html = str_replace($search, $search . ' data-aitcore-logo="1"', $html);
}
return $html;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
namespace Aitoc\Core\Plugin\Notifications;
class GridActions
{
const CONFIG_AITOC_CORE_SECTION_NAME = 'aitoc_core';
/**
* @var \Magento\Framework\UrlInterface
*/
private $urlBuilder;
/**
* GridActions constructor.
* @param \Magento\Framework\UrlInterface $urlBuilder
*/
public function __construct(
\Magento\Framework\UrlInterface $urlBuilder
) {
$this->urlBuilder = $urlBuilder;
}
/**
* @param NativeActions $subject
* @param \Closure $proceed
* @param \Magento\Framework\DataObject $row
* @return mixed|string
*/
public function aroundRender(
\Magento\AdminNotification\Block\Grid\Renderer\Actions $subject,
\Closure $proceed,
\Magento\Framework\DataObject $row
) {
$result = $proceed($row);
if ($row->getData(\Aitoc\Core\Api\ColumnInterface::AITOC_NOTIFICATION_FIELD)) {
$result .= sprintf(
'<a class="action" href="%s" title="%s">%s</a>',
$this->getDisableUrl(),
__('Disable Notifications'),
__('Disable Notifications')
);
}
return $result;
}
/**
* @return string
*/
private function getDisableUrl()
{
return $this->urlBuilder->getUrl('adminhtml/system_config/edit/'). 'section/'
. self::CONFIG_AITOC_CORE_SECTION_NAME;
}
}
<?php
namespace Aitoc\Core\Setup;
use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
class UpgradeSchema implements UpgradeSchemaInterface
{
const AITOC_NOTIFICATION_FIELD = 'aitoc_notification';
/**
* @param SchemaSetupInterface $setup
* @param ModuleContextInterface $context
*/
public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
{
$setup->startSetup();
if (version_compare($context->getVersion(), '1.0.1', '<')) {
$this->addAitocNotificationField($setup);
}
}
/**
* @param SchemaSetupInterface $setup
*/
private function addAitocNotificationField(SchemaSetupInterface $setup)
{
$setup->getConnection()->addColumn(
$setup->getTable('adminnotification_inbox'),
self::AITOC_NOTIFICATION_FIELD,
\Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
null,
['nullable' => false, 'default' => 0],
'Aitoc Notification'
);
}
}
{
"name": "aitoc/core",
"description": "Core extension by Aitoc",
"type": "magento2-module",
"version": "1.0.16",
"license": [
"Commercial"
],
"autoload": {
"files": [
"registration.php"
],
"psr-4": {
"Aitoc\\Core\\": ""
}
}
}
<?xml version="1.0"?>
<!--
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
-->
<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="Magento_Backend::stores">
<resource id="Magento_Backend::stores_settings">
<resource id="Magento_Config::config">
<resource id="Aitoc_Core::config"
title="Aitoc - General Information"
sortOrder="100" />
</resource>
</resource>
</resource>
<resource id="Aitoc_Core::menu" title="Aitoc Extensions" translate="title" sortOrder="101">
<resource id="Aitoc_Core::marketplace" title="Aitoc Marketplace" translate="title" sortOrder="1"/>
</resource>
</resource>
</resources>
</acl>
</config>
<?xml version="1.0"?>
<!--
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\AdminNotification\Block\ToolbarEntry">
<plugin name="Aitoc_Core::add-aitoc-logo-in-toolbar"
type="Aitoc\Core\Plugin\Notifications\AitocNotificationLogoAddInToolbar"/>
</type>
<type name="Magento\AdminNotification\Block\Grid\Renderer\Notice">
<plugin name="Aitoc_Core::add-aitoc-logo"
type="Aitoc\Core\Plugin\Notifications\AitocNotificationLogoAdd"/>
</type>
<type name="Magento\AdminNotification\Block\Grid\Renderer\Actions">
<plugin name="Aitoc_Core::add-disable-notifications"
type="Aitoc\Core\Plugin\Notifications\GridActions"/>
</type>
<type name="Magento\Backend\Model\Menu\Item">
<plugin name="Aitoc_Core:replaceMarketplaceUrl"
type="Aitoc\Core\Plugin\BackendMenu\Item" />
</type>
<type name="Magento\Backend\Model\Menu\Builder">
<plugin name="Aitoc_Core::aitocMenuBuilder" type="Aitoc\Core\Plugin\BackendMenu\Builder" />
</type>
</config>
<?xml version="1.0"?>
<!--
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="controller_action_predispatch">
<observer name="aitoc_adminnotification" instance="Aitoc\Core\Observer\PredispatchAdminActionControllerObserver" />
</event>
</config>
<?xml version="1.0"?>
<!--
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd">
<menu>
<add id="Aitoc_Core::menu" title="Aitoc" module="Aitoc_Core" translate="title" sortOrder="81" resource="Aitoc_Core::menu"/>
<add id="Aitoc_Core::common" title="Configuration &amp; Promo" translate="title" module="Aitoc_Core" sortOrder="1498" parent="Aitoc_Core::menu" resource="Aitoc_Core::menu"/>
</menu>
</config>
<?xml version="1.0"?>
<!--
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="admin">
<route id="aitcore" frontName="aitcore">
<module name="Aitoc_Core"/>
</route>
</router>
</config>
<?xml version="1.0"?>
<!--
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">
<system>
<tab id="aitoc_extensions" translate="label" sortOrder="999998" class="aitoc-tab">
<label>Aitoc Extensions</label>
</tab>
<section id="aitoc_core" translate="label" type="text" sortOrder="1" showInDefault="1" showInWebsite="0" showInStore="0">
<label><![CDATA[Information &amp; Marketplace]]></label>
<tab>aitoc_extensions</tab>
<resource>Aitoc_Core::config</resource>
<group id="menu" translate="label" type="text" sortOrder="15" showInDefault="1" showInWebsite="0" showInStore="0">
<label>Aitoc Menu</label>
<field id="menu_enable" translate="label comment" type="select" sortOrder="25" showInDefault="1" showInWebsite="0" showInStore="0">
<label>Enable Aitoc Menu</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
</field>
</group>
<group id="notifications" translate="label" type="text" sortOrder="20" showInDefault="1" showInWebsite="0" showInStore="0">
<label>Notifications</label>
<field id="notice_enable" translate="label comment" type="select" sortOrder="10" showInDefault="1" showInWebsite="0" showInStore="0">
<label>Enable Notifications</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<comment>Select Yes if you want get latest information about new or updated Aitoc extensions, discounts, atricles and etc.</comment>
</field>
<field id="notice_type" translate="label comment" type="multiselect" sortOrder="20" showInDefault="1" showInWebsite="0" showInStore="0">
<label>I'd like to be informed by Aitoc about:</label>
<source_model>Aitoc\Core\Model\Config\Source\NoticeType</source_model>
<comment>Select notice types that you want to receive notifications</comment>
<depends>
<field id="notice_enable">1</field>
</depends>
</field>
<field id="frequency" translate="label" type="select" sortOrder="30" showInDefault="1" showInWebsite="0" showInStore="0">
<label>Update Frequency</label>
<source_model>Aitoc\Core\Model\Config\Source\Frequency</source_model>
</field>
<field id="last_update" translate="label" type="label" sortOrder="40" showInDefault="1" showInWebsite="0" showInStore="0">
<label>Last Update</label>
<frontend_model>Aitoc\Core\Block\System\Config\Form\Field\Notification</frontend_model>
</field>
</group>
</section>
</system>
</config>
<?xml version="1.0"?>
<!--
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
<default>
<aitoc_core>
<notifications>
<notice_type>PROMO,EXTENSION_UPDATE_CUSTOMER,EXTENSION_UPDATE,NEW_EXTENSION,NEWS,TIPS_TRICKS</notice_type>
<notice_enable>1</notice_enable>
<frequency>1</frequency>
</notifications>
<menu>
<menu_enable>1</menu_enable>
</menu>
</aitoc_core>
</default>
</config>
<?xml version="1.0"?>
<!--
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
-->
<!--
~ Copyright © Aitoc. All rights reserved.
-->
<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
<table name="adminnotification_inbox" resource="default" engine="innodb">
<column xsi:type="smallint" name="aitoc_notification" unsigned="true" nullable="false" default="0" comment="Aitoc Notification"/>
</table>
</schema>
{
"adminnotification_inbox": {
"column": {
"aitoc_notification": true
}
}
}
\ No newline at end of file
<?xml version="1.0"?>
<!--
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<virtualType name="Aitoc\Core\Model\VirtualLoggerHandler" type="Magento\Framework\Logger\Handler\Base">
<arguments>
<argument name="fileName" xsi:type="string">/var/log/aitoc.log</argument>
</arguments>
</virtualType>
<type name="Aitoc\Core\Model\Logger">
<arguments>
<argument name="handlers" xsi:type="array">
<item name="system" xsi:type="object">Aitoc\Core\Model\VirtualLoggerHandler</item>
<item name="debug" xsi:type="object">Aitoc\Core\Model\VirtualLoggerHandler</item>
<item name="error" xsi:type="object">Aitoc\Core\Model\VirtualLoggerHandler</item>
<item name="critical" xsi:type="object">Aitoc\Core\Model\VirtualLoggerHandler</item>
</argument>
</arguments>
</type>
</config>
<?xml version="1.0"?>
<!--
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
<module name="Aitoc_Core" setup_version="1.0.5" />
</config>
Enabled,Enabled
Disabled,Disabled
"(New version %1 is available in your account: ","(New version %1 is available in your account: "
"Get Update","Get Update"
"1 Day","1 Day"
"5 Days","5 Days"
"10 Days","10 Days"
"Common News","Common News"
Promotions/Discounts,Promotions/Discounts
"My Extensions Updates","My Extensions Updates"
"All Extensions Updates","All Extensions Updates"
"New Extensions","New Extensions"
"Magento Tricks & Tips","Magento Tricks & Tips"
"Disable Notifications","Disable Notifications"
"<style>
.config-nav-block.aitoc-tab .title {
padding-top: 15px;
padding-bottom: 15px;
}
.config-nav-block.aitoc-tab strong:before {
background: no-repeat url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIzLjAuNCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MTIgNTEyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6IzBCQzdGRjt9Cgkuc3Qxe2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU+CjxnPgoJPGc+CgkJPHBhdGggZD0iTTI3MC4zLDMyNy44SDIxOWwyNS42LTYyLjRsLTQxLjEtMTAwbC0xMDcsMjYwLjJjLTIuNyw2LjYsMi4xLDEzLjgsOS4yLDEzLjhoNTMuOWM4LjEsMCwxNS40LTQuOSwxOC41LTEyLjRsMi44LTYuNwoJCQljNi4yLTE1LDIwLjgtMjQuOCwzNy0yNC44aDc2YzEuNCwwLDIuOCwwLjEsNC4yLDAuMkwyNzAuMywzMjcuOHoiLz4KCTwvZz4KPC9nPgo8cGF0aCBkPSJNMjI5LjgsMTM3LjdoNTMuOWM4LjEsMCwxNS40LDQuOSwxOC41LDEyLjRsMTEzLjIsMjc1LjRjMi43LDYuNi0yLjEsMTMuOC05LjIsMTMuOGgtNTMuOWMtOC4xLDAtMTUuNC00LjktMTguNS0xMi40CglMMjIwLjYsMTUxLjVDMjE3LjksMTQ1LDIyMi43LDEzNy43LDIyOS44LDEzNy43eiIvPgo8Y2lyY2xlIGN4PSIyNTYiIGN5PSI3Ny4zIiByPSIzMy4xIi8+Cjwvc3ZnPgo=');
background-size: 28px 28px;
width: 26px;
height: 30px;
content: '';
display: inline-block;
vertical-align: middle;
}
</style>
Aitoc Extensions","<style>
.config-nav-block.aitoc-tab .title {
padding-top: 15px;
padding-bottom: 15px;
}
.config-nav-block.aitoc-tab strong:before {
background: no-repeat url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIzLjAuNCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MTIgNTEyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6IzBCQzdGRjt9Cgkuc3Qxe2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU+CjxnPgoJPGc+CgkJPHBhdGggZD0iTTI3MC4zLDMyNy44SDIxOWwyNS42LTYyLjRsLTQxLjEtMTAwbC0xMDcsMjYwLjJjLTIuNyw2LjYsMi4xLDEzLjgsOS4yLDEzLjhoNTMuOWM4LjEsMCwxNS40LTQuOSwxOC41LTEyLjRsMi44LTYuNwoJCQljNi4yLTE1LDIwLjgtMjQuOCwzNy0yNC44aDc2YzEuNCwwLDIuOCwwLjEsNC4yLDAuMkwyNzAuMywzMjcuOHoiLz4KCTwvZz4KPC9nPgo8cGF0aCBkPSJNMjI5LjgsMTM3LjdoNTMuOWM4LjEsMCwxNS40LDQuOSwxOC41LDEyLjRsMTEzLjIsMjc1LjRjMi43LDYuNi0yLjEsMTMuOC05LjIsMTMuOGgtNTMuOWMtOC4xLDAtMTUuNC00LjktMTguNS0xMi40CglMMjIwLjYsMTUxLjVDMjE3LjksMTQ1LDIyMi43LDEzNy43LDIyOS44LDEzNy43eiIvPgo8Y2lyY2xlIGN4PSIyNTYiIGN5PSI3Ny4zIiByPSIzMy4xIi8+Cjwvc3ZnPgo=');
background-size: 28px 28px;
width: 26px;
height: 30px;
content: '';
display: inline-block;
vertical-align: middle;
}
</style>
Aitoc Extensions"
"Information &amp; Marketplace","Information &amp; Marketplace"
Notifications,Notifications
"Enable Notifications","Enable Notifications"
"Select Yes if you want get latest information about new or updated Aitoc extensions, discounts, atricles and etc.","Select Yes if you want get latest information about new or updated Aitoc extensions, discounts, atricles and etc."
"I'd like to be informed by Aitoc about:","I'd like to be informed by Aitoc about:"
"Select notice types that you want to receive notifications","Select notice types that you want to receive notifications"
"Update Frequency","Update Frequency"
"Last Update","Last Update"
"Installed Extensions","Installed Extensions"
"Aitoc Marketplace","Aitoc Marketplace"
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
/**
* Copyright © 2019 Aitoc. All rights reserved.
*/
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Aitoc_Core',
__DIR__
);
<?xml version="1.0"?>
<!--
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
-->
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<head>
<css src="Aitoc_Core::css/config.css"/>
</head>
</page>
<?xml version="1.0"?>
<!--
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Core
*/
-->
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<head>
<css src="Aitoc_Core::css/main.css"/>
</head>
</page>
.aitoc-button-get-new-version {
text-decoration: none;
border-bottom: 2px solid #0bc7ff;
color: #fff;
background-color: #0bc7ff;
border: 2px solid #0bc7ff;
padding: 5px;
height: 55px;
font-size: 16px;
font-weight: 600;
border-radius: 6px;
}
.aitoc-button-get-new-version:hover {
color: #fff;
text-decoration: unset;
}
.comment.aitoc-support {
font-size: 18px;
text-align: center;
margin-bottom: 2rem;
margin-top: 4rem;
}
.config-nav-block.aitoc-tab .title {
padding-top: 15px;
padding-bottom: 15px;
}
.config-nav-block.aitoc-tab strong:before {
background: no-repeat url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIzLjAuNCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MTIgNTEyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6IzBCQzdGRjt9Cgkuc3Qxe2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU+CjxnPgoJPGc+CgkJPHBhdGggZD0iTTI3MC4zLDMyNy44SDIxOWwyNS42LTYyLjRsLTQxLjEtMTAwbC0xMDcsMjYwLjJjLTIuNyw2LjYsMi4xLDEzLjgsOS4yLDEzLjhoNTMuOWM4LjEsMCwxNS40LTQuOSwxOC41LTEyLjRsMi44LTYuNwoJCQljNi4yLTE1LDIwLjgtMjQuOCwzNy0yNC44aDc2YzEuNCwwLDIuOCwwLjEsNC4yLDAuMkwyNzAuMywzMjcuOHoiLz4KCTwvZz4KPC9nPgo8cGF0aCBkPSJNMjI5LjgsMTM3LjdoNTMuOWM4LjEsMCwxNS40LDQuOSwxOC41LDEyLjRsMTEzLjIsMjc1LjRjMi43LDYuNi0yLjEsMTMuOC05LjIsMTMuOGgtNTMuOWMtOC4xLDAtMTUuNC00LjktMTguNS0xMi40CglMMjIwLjYsMTUxLjVDMjE3LjksMTQ1LDIyMi43LDEzNy43LDIyOS44LDEzNy43eiIvPgo8Y2lyY2xlIGN4PSIyNTYiIGN5PSI3Ny4zIiByPSIzMy4xIi8+Cjwvc3ZnPgo=');
background-size: 28px 28px;
width: 26px;
height: 30px;
content: '';
display: inline-block;
vertical-align: middle;
}
.aitoc-get-support-button {
width: 160px;
height: 40px;
border-radius: 16px;
background-color: #7ed321;
line-height: 38px;
font-size: 18px !important;
margin-left: 5px;
text-align: center;
display: inline-block !important;
color: #fff !important;
text-decoration: none;
vertical-align: middle;
font-weight: 600 !important;
}
.label.aitcore-legend {
margin: auto !important;
text-align: center !important;
font-size: 20px !important;
padding: 20px !important;
}
\ No newline at end of file
.aitoc-grid-message .aitoc-notif-logo {
margin-right: 15px;
height: 75px;
width: 60px;
float: left;
display: inline-block;
background: url(../images/logo-53x53.png) no-repeat;
background-position-y: 10px;
background-size: 53px;
border-right: 1px dashed gray;
}
.admin__action-dropdown-menu .notifications-entry[data-aitcore-logo="1"] {
padding-left: 37px;
background: url(../images/logo-30x30.png) no-repeat 5px 15px;
background-size: 30px;
}
div.aitoc-grid-message > div.ambase-grid-message {
padding-left: 0px;
min-height: 0px;
background: unset;
}
.config-nav-block.aitoc-tab .title {
padding-top: 15px;
padding-bottom: 15px;
}
.config-nav-block.aitoc-tab strong:before {
background: no-repeat url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIzLjAuNCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MTIgNTEyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6IzBCQzdGRjt9Cgkuc3Qxe2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU+CjxnPgoJPGc+CgkJPHBhdGggZD0iTTI3MC4zLDMyNy44SDIxOWwyNS42LTYyLjRsLTQxLjEtMTAwbC0xMDcsMjYwLjJjLTIuNyw2LjYsMi4xLDEzLjgsOS4yLDEzLjhoNTMuOWM4LjEsMCwxNS40LTQuOSwxOC41LTEyLjRsMi44LTYuNwoJCQljNi4yLTE1LDIwLjgtMjQuOCwzNy0yNC44aDc2YzEuNCwwLDIuOCwwLjEsNC4yLDAuMkwyNzAuMywzMjcuOHoiLz4KCTwvZz4KPC9nPgo8cGF0aCBkPSJNMjI5LjgsMTM3LjdoNTMuOWM4LjEsMCwxNS40LDQuOSwxOC41LDEyLjRsMTEzLjIsMjc1LjRjMi43LDYuNi0yLjEsMTMuOC05LjIsMTMuOGgtNTMuOWMtOC4xLDAtMTUuNC00LjktMTguNS0xMi40CglMMjIwLjYsMTUxLjVDMjE3LjksMTQ1LDIyMi43LDEzNy43LDIyOS44LDEzNy43eiIvPgo8Y2lyY2xlIGN4PSIyNTYiIGN5PSI3Ny4zIiByPSIzMy4xIi8+Cjwvc3ZnPgo=');
background-size: 28px 28px;
width: 26px;
height: 30px;
margin-left: -3px;
content: '';
display: inline-block;
vertical-align: middle;
}
.admin__menu [data-ui-id^="menu-aitoc-"] .submenu-group-title span:before,
.admin__menu [data-ui-id^="menu-magento-"] [data-ui-id^="menu-magento-"] [data-ui-id^="menu-aitoc-"] span:before {
background: url(../images/logo-30x30.png) no-repeat;
width: 27px;
height: 30px;
content: '';
display: inline-block;
margin-right: 6px;
vertical-align: top;
margin-top: -5px;
}
#menu-aitoc-core-menu span::before {
background: unset;
content: '';
width: 0;
height: 0;
margin-top: 0;
margin-right: 0;
}
#menu-aitoc-core-menu > a:before {
content: '' !important;
background: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiB3aWR0aD0iNTMiIGhlaWdodD0iNTMiPgoJPHN0eWxlPgoJCXRzcGFuIHsgd2hpdGUtc3BhY2U6cHJlIH0KCQkuc2hwMCB7IGZpbGw6ICNhYWE2YTAgfSAKCTwvc3R5bGU+Cgk8ZyA+CgkJPGcgPgoJCQk8cGF0aCBjbGFzcz0ic2hwMCIgZD0iTTI3MC4zLDMyNy44aC01MS4zbDI1LjYsLTYyLjRsLTQxLjEsLTEwMGwtMTA3LDI2MC4yYy0yLjcsNi42IDIuMSwxMy44IDkuMiwxMy44aDUzLjljOC4xLDAgMTUuNCwtNC45IDE4LjUsLTEyLjRsMi44LC02LjdjNi4yLC0xNSAyMC44LC0yNC44IDM3LC0yNC44aDc2YzEuNCwwIDIuOCwwLjEgNC4yLDAuMnoiIC8+CgkJPC9nPgoJPC9nPgoJPHBhdGggY2xhc3M9InNocDAiIGQ9Ik0yMjkuOCwxMzcuN2g1My45YzguMSwwIDE1LjQsNC45IDE4LjUsMTIuNGwxMTMuMiwyNzUuNGMyLjcsNi42IC0yLjEsMTMuOCAtOS4yLDEzLjhoLTUzLjljLTguMSwwIC0xNS40LC00LjkgLTE4LjUsLTEyLjRsLTExMy4yLC0yNzUuNGMtMi43LC02LjUgMi4xLC0xMy44IDkuMiwtMTMuOHoiIC8+Cgk8cGF0aCBjbGFzcz0ic2hwMCIgZD0iTTI4OS4xLDc3LjNjMCwtMTguMyAtMTQuOCwtMzMuMSAtMzMuMSwtMzMuMWMtMTguMywwIC0zMy4xLDE0LjggLTMzLjEsMzMuMWMwLDE4LjMgMTQuOCwzMy4xIDMzLjEsMzMuMWMxOC4zLDAgMzMuMSwtMTQuOCAzMy4xLC0zMy4xeiIgLz4KPC9zdmc+')
no-repeat center !important;;
background-size: contain !important;;
font-size: 3rem !important;;
height: 3.5rem !important;;
}
#menu-aitoc-core-menu > a:hover:before, #menu-aitoc-core-menu._show > a:before {
background: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiB3aWR0aD0iNTMiIGhlaWdodD0iNTMiPgoJPHN0eWxlPgoJCXRzcGFuIHsgd2hpdGUtc3BhY2U6cHJlIH0KCQkuc2hwMCB7IGZpbGw6ICNmZmZmZmYgfSAKCTwvc3R5bGU+Cgk8ZyA+CgkJPGcgPgoJCQk8cGF0aCBjbGFzcz0ic2hwMCIgZD0iTTI3MC4zLDMyNy44aC01MS4zbDI1LjYsLTYyLjRsLTQxLjEsLTEwMGwtMTA3LDI2MC4yYy0yLjcsNi42IDIuMSwxMy44IDkuMiwxMy44aDUzLjljOC4xLDAgMTUuNCwtNC45IDE4LjUsLTEyLjRsMi44LC02LjdjNi4yLC0xNSAyMC44LC0yNC44IDM3LC0yNC44aDc2YzEuNCwwIDIuOCwwLjEgNC4yLDAuMnoiIC8+CgkJPC9nPgoJPC9nPgoJPHBhdGggY2xhc3M9InNocDAiIGQ9Ik0yMjkuOCwxMzcuN2g1My45YzguMSwwIDE1LjQsNC45IDE4LjUsMTIuNGwxMTMuMiwyNzUuNGMyLjcsNi42IC0yLjEsMTMuOCAtOS4yLDEzLjhoLTUzLjljLTguMSwwIC0xNS40LC00LjkgLTE4LjUsLTEyLjRsLTExMy4yLC0yNzUuNGMtMi43LC02LjUgMi4xLC0xMy44IDkuMiwtMTMuOHoiIC8+Cgk8cGF0aCBjbGFzcz0ic2hwMCIgZD0iTTI4OS4xLDc3LjNjMCwtMTguMyAtMTQuOCwtMzMuMSAtMzMuMSwtMzMuMWMtMTguMywwIC0zMy4xLDE0LjggLTMzLjEsMzMuMWMwLDE4LjMgMTQuOCwzMy4xIDMzLjEsMzMuMWMxOC4zLDAgMzMuMSwtMTQuOCAzMy4xLC0zMy4xeiIgLz4KPC9zdmc+')
no-repeat center;
background-size: contain;
}
.admin__action-dropdown-menu .notifications-entry[data-aitcore-logo="1"]:not(.notifications-entry-last) {
padding-left: 37px;
background: url(../images/logo-30x30.png) no-repeat 5px 5px;
background-size: 30px;
}
.admin__action-dropdown-menu .notifications-entry:not(.notifications-entry-last) {
border-bottom: 1px dashed gray;
}
div.aitoc-grid-message span.grid-row-title {
font-weight: 600;
}
\ No newline at end of file
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Api\Data;
/**
* Interface LogInterface
* @package Aitoc\Smtp\Api\Data
*/
interface LogInterface
{
/**
* Constants
*/
const TABLE_NAME = 'aitoc_smtp_log';
const LOG_ID = 'log_id';
const CREATED_AT = 'created_at';
const SUBJECT = 'subject';
const EMAIL_BODY = 'email_body';
const SENDER_EMAIL = 'sender_email';
const RECIPIENT_EMAIL = 'recipient_email';
const CC = 'cc';
const BCC = 'bcc';
const STATUS = 'status';
const STATUS_MESSAGE = 'status_message';
/**
* @return int
*/
public function getLogId();
/**
* @param int $logId
* @return LogInterface
*/
public function setLogId($logId);
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Block\Adminhtml\Log;
use Aitoc\Smtp\Controller\RegistryConstants;
class Preview extends \Magento\Backend\Block\Widget
{
const LOG_PARAM_URL_KEY = 'log_id';
/**
* @var \Magento\Framework\Filter\Input\MaliciousCode
*/
protected $_maliciousCode;
/**
* @var \Aitoc\Smtp\Model\LogFactory
*/
private $logFactory;
/**
* @var \Aitoc\Smtp\Model\Config
*/
private $config;
/**
* @var string
*/
protected $profilerName = 'email_template_proccessing';
/**
* @param \Magento\Backend\Block\Template\Context $context
* @param \Magento\Framework\Filter\Input\MaliciousCode $maliciousCode
* @param \Magento\Email\Model\TemplateFactory $emailFactory
* @param array $data
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Framework\Filter\Input\MaliciousCode $maliciousCode,
\Aitoc\Smtp\Model\LogFactory $logFactory,
\Aitoc\Smtp\Model\Config $config,
array $data = []
) {
$this->logFactory = $logFactory;
$this->_maliciousCode = $maliciousCode;
$this->config = $config;
parent::__construct($context, $data);
}
/**
* @return mixed|string
* @throws \Exception
*/
protected function _toHtml()
{
$logModel = $this->getCurrentLog();
$string = $logModel->getEmailBody();
if ($this->config->isNewSender(RegistryConstants::VERSION_COMPARISON_NEW_MAIL)) {
$string = quoted_printable_decode($string);
}
if ($logModel->getId()) {
return '<iframe onload="resizeIframe(this)" srcdoc="'. $string . '" style="width: 100%; height: 100%"></iframe>';
} else {
throw new \Exception('Log with ID not found. Pleas try again');
}
return $logModel;
}
/**
* @return mixed
*/
public function getCurrentLog()
{
return $this->logFactory->create()->getLogById($this->getRequest()->getParam(self::LOG_PARAM_URL_KEY));
}
/**
* Get either default or any store view
*
* @return \Magento\Store\Model\Store|null
*/
protected function getAnyStoreView()
{
$store = $this->_storeManager->getDefaultStoreView();
if ($store) {
return $store;
}
foreach ($this->_storeManager->getStores() as $store) {
return $store;
}
return null;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Block\Adminhtml;
use Magento\Config\Block\System\Config\Form\Field;
use Magento\Framework\Data\Form\Element\AbstractElement;
class Provider extends Field
{
protected $_template = 'Aitoc_Smtp::config/provider.phtml';
/**
* @var \Aitoc\Smtp\Model\Providers
*/
private $providers;
/**
* @var \Magento\Framework\Json\EncoderInterface
*/
private $jsonEncoder;
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Aitoc\Smtp\Model\Providers $providers,
\Magento\Framework\Json\EncoderInterface $jsonEncoder,
array $data = []
) {
$this->providers = $providers;
$this->jsonEncoder = $jsonEncoder;
parent::__construct($context, $data);
}
/**
* @param AbstractElement $element
* @return string
* @throws \Magento\Framework\Exception\LocalizedException
*/
protected function _getElementHtml(AbstractElement $element)
{
/** @var \Magento\Backend\Block\Template $block */
$block = $this->_layout->createBlock(\Magento\Backend\Block\Template::class);
$block->setTemplate($this->_template)->setData('providers', $this->getProviderData());
$html = parent::_getElementHtml($element);
$html .= $block->toHtml();
return $html;
}
/**
* @return string
*/
public function getProviderData()
{
return $this->jsonEncoder->encode($this->providers->getAllProviders());
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Block\Adminhtml;
use Magento\Config\Block\System\Config\Form\Field;
use Magento\Framework\Data\Form\Element\AbstractElement;
class TestButton extends Field
{
const TEMPLATE_PATH = 'Aitoc_Smtp::config/button.phtml';
const CHECK_BUTTON_ID = 'aitoc_send_button';
/**
* @param AbstractElement $element
* @return string
* @throws \Magento\Framework\Exception\LocalizedException
*/
protected function _getElementHtml(AbstractElement $element)
{
/** @var \Magento\Backend\Block\Template $block */
$block = $this->_layout->createBlock(\Magento\Backend\Block\Template::class);
$button = $this->getLayout()->createBlock(
\Magento\Backend\Block\Widget\Button::class
)->setData([
'id' => self::CHECK_BUTTON_ID,
'label' => __('Send Test Email'),
'class' => 'primary'
]);
$block
->setTemplate(self::TEMPLATE_PATH)
->setData('send_button', $button->toHtml())
->setData('ajax_url', $this->getAjaxUrl())
->setData('button_id', self::CHECK_BUTTON_ID);
return $block->toHtml();
}
/**
* Render scope label
*
* @param \Magento\Framework\Data\Form\Element\AbstractElement $element
* @return string
*/
protected function _renderScopeLabel(\Magento\Framework\Data\Form\Element\AbstractElement $element)
{
return '';
}
/**
* @return string
*/
private function getAjaxUrl()
{
return $this->getUrl('aitoc_smtp/smtp/test', ['_current' => true]);
}
/**
* @return string
*/
public function getCheckButtonId()
{
return self::CHECK_BUTTON_ID;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Controller\Adminhtml;
use Magento\Backend\App\Action;
use Aitoc\Smtp\Controller\RegistryConstants;
abstract class Log extends Action
{
const DEFAULT_ERROR_MESSAGE = 'Something went wrong. See the error log.';
/** @var \Magento\Framework\View\Result\PageFactory */
protected $resultPageFactory;
/** @var \Magento\Framework\Registry */
protected $registry;
/** @var \Aitoc\ShippingRules\Model\RuleFactory */
protected $ruleFactory;
const ADMIN_RESOURCE = 'Aitoc_Smtp::log';
/**
* Rule constructor.
*
* @param Action\Context $context
* @param \Aitoc\ShippingRules\Model\RuleFactory $ruleFactory
* @param \Magento\Framework\Registry $registry
* @param \Magento\Framework\View\Result\PageFactory $resultPageFactory
*/
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Aitoc\Smtp\Model\LogFactory $ruleFactory,
\Magento\Framework\Registry $registry,
\Magento\Framework\View\Result\PageFactory $resultPageFactory
) {
$this->ruleFactory = $ruleFactory;
$this->registry = $registry;
$this->resultPageFactory = $resultPageFactory;
parent::__construct($context);
}
/**
* @return \Magento\Backend\Model\View\Result\Page
*/
protected function initPage()
{
/** @var \Magento\Backend\Model\View\Result\Page $resultPage */
$resultPage = $this->resultPageFactory->create();
$resultPage->setActiveMenu('Aitoc_Smtp::log');
$resultPage->addBreadcrumb(__('Reports'), __('Reports'));
return $resultPage;
}
/**
* @param bool $requireId
* @return \Aitoc\Smtp\Model\Log|\Magento\Framework\App\ResponseInterface
*/
protected function getRule($requireId = false)
{
$ruleId = $this->getRequest()->getParam(RegistryConstants::RULE_PARAM_URL_KEY);
if ($requireId && !$ruleId) {
$this->messageManager->addErrorMessage(__('Log doesn\'t exist.'));
return $this->redirectIndex();
}
$model = $this->ruleFactory->create();
if ($ruleId) {
$model->load($ruleId);
}
if ($ruleId && !$model->getId()) {
$this->messageManager->addErrorMessage(__('Log doesn\'t exist.'));
return $this->redirectIndex();
}
$this->registry->register(RegistryConstants::CURRENT_RULE, $model);
return $model;
}
/**
* @return \Magento\Framework\App\ResponseInterface
*/
protected function redirectIndex()
{
return $this->_redirect('*/*/');
}
/**
* @return bool
*/
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Aitoc_Smtp::log');
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Controller\Adminhtml\Log;
use Aitoc\Smtp\Model\ResourceModel\Log\CollectionFactory;
use Magento\Backend\App\Action\Context;
use Magento\Framework\Controller\ResultFactory;
class Clear extends \Magento\Backend\App\Action
{
/**
* @var CollectionFactory
*/
protected $collectionFactory;
/**
* @param Context $context
* @param CollectionFactory $collectionFactory
*/
public function __construct(
Context $context,
CollectionFactory $collectionFactory
) {
$this->collectionFactory = $collectionFactory;
parent::__construct($context);
}
/**
* @return \Magento\Backend\Model\View\Result\Redirect
*/
public function execute()
{
$collection = $this->collectionFactory->create();
$items = $collection->getItems();
$count = count($items);
if ($items) {
foreach ($items as $item) {
$item->delete();
}
}
$this->messageManager->addSuccess(__('A total of %1 email(s) have been deleted.', $count));
return $this->resultFactory->create(ResultFactory::TYPE_REDIRECT)->setPath('aitoc_smtp/*/index');
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Controller\Adminhtml\Log;
class Delete extends \Aitoc\Smtp\Controller\Adminhtml\Log
{
/**
* {@inheritdoc}
*/
public function execute()
{
if ($data = $this->getRequest()->getParams()) {
$rule = $this->getRule();
try {
if ($rule->getId()) {
$rule->delete();
$this->messageManager->addSuccessMessage(
__('Email Log has been successfully deleted')
);
} else {
$this->messageManager->addErrorMessage(__('Unable to find the rule'));
}
} catch (\Magento\Framework\Exception\LocalizedException $e) {
$this->messageManager->addErrorMessage($e->getMessage());
} catch (\Exception $e) {
$this->messageManager->addErrorMessage(__(self::DEFAULT_ERROR_MESSAGE));
}
}
return $this->_redirect($this->_redirect->getRefererUrl());
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Controller\Adminhtml\Log;
class Index extends \Aitoc\Smtp\Controller\Adminhtml\Log
{
/**
*
* @return \Magento\Backend\Model\View\Result\Page
*/
public function execute()
{
$resultPage = $this->initPage();
$resultPage->getConfig()->getTitle()->prepend(__('Emails Log'));
return $resultPage;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Controller\Adminhtml\Log;
use Aitoc\Smtp\Model\ResourceModel\Log\CollectionFactory;
use Magento\Backend\App\Action\Context;
use Magento\Framework\Controller\ResultFactory;
use Magento\Ui\Component\MassAction\Filter;
class MassDelete extends \Magento\Backend\App\Action
{
/**
* Massactions filter
*
* @var Filter
*/
protected $filter;
/**
* @var CollectionFactory
*/
protected $collectionFactory;
/**
* @param Context $context
* @param Filter $filter
* @param CollectionFactory $collectionFactory
*/
public function __construct(
Context $context,
Filter $filter,
CollectionFactory $collectionFactory
) {
$this->filter = $filter;
$this->collectionFactory = $collectionFactory;
parent::__construct($context);
}
/**
* @return \Magento\Backend\Model\View\Result\Redirect
*/
public function execute()
{
$collection = $this->filter->getCollection($this->collectionFactory->create());
$collectionSize = $collection->getSize();
foreach ($collection as $item) {
$item->delete();
}
$this->messageManager->addSuccess(__('A total of %1 email(s) have been deleted.', $collectionSize));
return $this->resultFactory->create(ResultFactory::TYPE_REDIRECT)->setPath('aitoc_smtp/*/index');
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Controller\Adminhtml\Log;
use Aitoc\Smtp\Model\ResourceModel\Log\CollectionFactory;
use Magento\Backend\App\Action\Context;
use Magento\Framework\Controller\ResultFactory;
use Magento\Ui\Component\MassAction\Filter;
use Aitoc\Smtp\Model\Sender;
use Magento\Framework\Registry;
use Aitoc\Smtp\Controller\RegistryConstants;
class MassResend extends \Magento\Backend\App\Action
{
/**
* Massactions filter
*
* @var Filter
*/
protected $filter;
/**
* @var CollectionFactory
*/
protected $collectionFactory;
/**
* @var Sender
*/
private $sender;
/**
* @var Registry
*/
private $registry;
/**
* @param Context $context
* @param Filter $filter
* @param CollectionFactory $collectionFactory
*/
public function __construct(
Context $context,
Filter $filter,
Sender $sender,
Registry $registry,
CollectionFactory $collectionFactory
)
{
$this->filter = $filter;
$this->registry = $registry;
$this->sender = $sender;
$this->collectionFactory = $collectionFactory;
parent::__construct($context);
}
/**
* @return \Magento\Backend\Model\View\Result\Redirect
*/
public function execute()
{
$collection = $this->filter->getCollection($this->collectionFactory->create());
$resCount = 0;
if ($collection->getSize()) {
$this->registry->register(RegistryConstants::CURRENT_RULE, true);
}
foreach ($collection as $item) {
if ($this->sender->sendByLogId($item->getLogId())) {
$resCount += 1;
}
}
$this->messageManager->addSuccess(__('A total of %1 email(s) have been sent.', $resCount));
return $this->resultFactory->create(ResultFactory::TYPE_REDIRECT)->setPath('aitoc_smtp/*/index');
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Controller\Adminhtml\Log;
/**
* View a rendered template.
*/
class Preview extends \Aitoc\Smtp\Controller\Adminhtml\Log
{
/**
* Preview Newsletter template
*
* @return void|$this
*/
public function execute()
{
try {
$this->_view->loadLayout();
$this->_view->getPage()->getConfig()->getTitle()->prepend(__('Email Preview'));
$this->_view->renderLayout();
} catch (\Exception $e) {
$this->messageManager->addErrorMessage(
__('An error occurred. The email template can not be opened for preview.')
);
$this->_redirect('*/*/');
}
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Controller\Adminhtml\Log;
use Aitoc\Smtp\Controller\RegistryConstants;
class Resend extends \Aitoc\Smtp\Controller\Adminhtml\Log
{
/**
* @var \Aitoc\Smtp\Model\Sender
*/
private $sender;
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Aitoc\Smtp\Model\LogFactory $ruleFactory,
\Magento\Framework\Registry $registry,
\Magento\Framework\View\Result\PageFactory $resultPageFactory,
\Aitoc\Smtp\Model\Sender $sender
) {
parent::__construct($context, $ruleFactory, $registry, $resultPageFactory);
$this->sender = $sender;
}
/**
* {@inheritdoc}
*/
public function execute()
{
$logId = $this->getRequest()->getParam(RegistryConstants::RULE_PARAM_URL_KEY);
$log = $this->getRule();
if ($logId) {
try {
if ($this->sender->sendByLogId($logId)) {
$this->messageManager->addSuccessMessage(__('Email successfully was send.'));
} else {
$this->messageManager->addErrorMessage(__('Something went wrong.'));
}
} catch (\Magento\Framework\Exception\LocalizedException $e) {
$this->messageManager->addErrorMessage($e->getMessage());
} catch (\Exception $e) {
$this->messageManager->addErrorMessage(__(self::DEFAULT_ERROR_MESSAGE));
}
} else {
$this->messageManager->addErrorMessage(__('Unable to find the rule'));
}
return $this->_redirect($this->_redirect->getRefererUrl());
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Controller\Adminhtml\Smtp;
use Exception;
use Magento\Backend\App\Action;
use Magento\Backend\App\Action\Context;
use Magento\Email\Model\Template\SenderResolver;
use Magento\Framework\App\ResponseInterface;
use Magento\Framework\Controller\ResultInterface;
use Magento\Framework\Exception\LocalizedException;
use Psr\Log\LoggerInterface;
use Aitoc\Smtp\Controller\RegistryConstants;
class Test extends Action
{
/**
* Authorization level of a basic admin session
*
* @see _isAllowed()
*/
const ADMIN_RESOURCE = 'Aitoc_Smtp::main';
const TEST_EMAIL_TO_FIELD_NAME = 'test_email_to';
/**
* @var LoggerInterface
*/
private $logger;
/**
* @var TransportBuilder
*/
private $_transportBuilder;
/**
* @var SenderResolver
*/
private $senderResolver;
/**
* @var \Magento\Framework\Json\EncoderInterface
*/
private $jsonEncoder;
/**
* @var Factory
*/
private $configFactory;
/**
* @var \Aitoc\Smtp\Model\Config
*/
private $config;
/**
* @var \Magento\Framework\Mail\TransportInterfaceFactory
*/
private $transportInterfaceFactory;
public function __construct(
Context $context,
LoggerInterface $logger,
SenderResolver $senderResolver,
\Magento\Framework\Json\EncoderInterface $jsonEncoder,
\Magento\Config\Model\Config\Factory $configFactory,
\Aitoc\Smtp\Model\Config $config,
\Magento\Framework\Mail\TransportInterfaceFactory $transportInterfaceFactory
) {
$this->logger = $logger;
$this->transportInterfaceFactory = $transportInterfaceFactory;
$this->senderResolver = $senderResolver;
$this->jsonEncoder = $jsonEncoder;
$this->configFactory = $configFactory;
$this->config = $config;
parent::__construct($context);
}
/**
* @return ResponseInterface|ResultInterface
* @throws LocalizedException
*/
public function execute()
{
$data = $this->getRequest()->getParams();
try {
if ($data && isset($data[self::TEST_EMAIL_TO_FIELD_NAME])) {
$config = $this->config->convertFromPostToSmtpParams($this->removeUnusedFields($data));
$config[RegistryConstants::IS_TEST_FIELD_ARRAY] = true;
unset($config[self::TEST_EMAIL_TO_FIELD_NAME]);
$transport = $this->transportInterfaceFactory->create($config);
$transport->sendMessage();
$result = [
'status' => true,
'content' => __('Message is successfully send!')
];
} else {
$result = [
'status' => false,
'content' => __('Error. Something went wrong. Please, try again.')
];
}
} catch (LocalizedException $exception) {
$result = [
'status' => false,
'content' => $exception->getMessage()
];
} catch (\Exception $exception) {
$result = [
'status' => false,
'content' => $exception->getMessage()
];
}
return $this->getResponse()->representJson($this->jsonEncoder->encode($result));
}
/**
* @param $data
* @return mixed
*/
private function removeUnusedFields($data)
{
$fields = ['key', 'section', 'isAjax', 'form_key'];
foreach ($fields as $field) {
if (isset($data[$field]) && $data[$field]) {
unset($data[$field]);
}
}
return $data;
}
/**
* @return bool
*/
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Aitoc_Smtp::main');
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Controller;
class RegistryConstants
{
const RULE_PARAM_URL_KEY = 'log_id';
const CURRENT_RULE = 'aitoc_current_smtp_log';
const IS_TEST_FIELD_ARRAY = 'is_test';
const VERSION_COMPARISON_OLD_MAIL = '2.2.8';
const VERSION_COMPARISON_NEW_MAIL = '2.3.3';
const RESEND_EMAIL_TEMPLATE_ID = 'aitsmtp_resend_template';
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Cron;
use Exception;
use Aitoc\Core\Model\Helpers\Date;
use Aitoc\Smtp\Model\Config;
use Aitoc\Smtp\Model\ResourceModel\Log\CollectionFactory;
use Psr\Log\LoggerInterface;
class Clear
{
/**
* @var LoggerInterface
*/
private $logger;
/**
* @var Config
*/
private $config;
/**
* @var CollectionFactory
*/
private $collectionFactory;
/**
* @var Date
*/
private $date;
public function __construct(
LoggerInterface $logger,
CollectionFactory $collectionFactory,
Date $date,
Config $config
) {
$this->logger = $logger;
$this->date = $date;
$this->collectionFactory = $collectionFactory;
$this->config = $config;
}
/**
* @return $this
*/
public function execute()
{
if (!$this->config->enabled()) {
return $this;
}
$cleanDays = $this->config->cleanLogDays();
if ($cleanDays) {
$logCollection = $this->collectionFactory->create()
->addFieldToFilter('created_at', [
'lteq' => $this->date->getCurrentDateBeforeDays($cleanDays)
]);
foreach ($logCollection as $log) {
try {
$log->delete();
} catch (Exception $e) {
$this->logger->critical($e);
}
}
}
return $this;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Model\Config\Options;
use Magento\Framework\Option\ArrayInterface;
class Auth implements ArrayInterface
{
const AUTH_NONE = 0;
const AUTH_LOGIN = 1;
const AUTH_MD = 2;
const AUTH_LOGIN_VALUE = 'login';
const AUTH_MD_VALUE = 'md';
/**
* @return array
*/
public function toOptionArray()
{
return [
[
'value' => self::AUTH_NONE,
'label' => __('Not Required')
],
[
'value' => self::AUTH_LOGIN,
'label' => __('Login/Password')
],
[
'value' => self::AUTH_MD,
'label' => __('CRAM-MD5')
]
];
}
/**
* @param $id
* @return string
*/
public function getOptionById($id)
{
$value = '';
switch ($id) {
case 1:
$value = self::AUTH_LOGIN_VALUE;
break;
case 2:
$value = self::AUTH_MD_VALUE;
break;
}
return $value;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Model\Config\Options;
use Magento\Framework\Option\ArrayInterface;
class Protocol implements ArrayInterface
{
const PROTOCOL_NONE = 0;
const PROTOCOL_SSL = 1;
const PROTOCOL_TLS = 2;
const PROTOCOL_SSL_VALUE = 'ssl';
const PROTOCOL_TLS_VALUE = 'tls';
/**
* @return array
*/
public function toOptionArray()
{
return [
[
'value' => self::PROTOCOL_NONE,
'label' => __('None')
],
[
'value' => self::PROTOCOL_SSL,
'label' => __('SSL')
],
[
'value' => self::PROTOCOL_TLS,
'label' => __('TLS')
]
];
}
/**
* @param $id
* @return string
*/
public function getOptionById($id)
{
$value = '';
switch ($id) {
case 1:
$value = self::PROTOCOL_SSL_VALUE;
break;
case 2:
$value = self::PROTOCOL_TLS_VALUE;
break;
}
return $value;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Model\Config\Options;
use Magento\Framework\Option\ArrayInterface;
class Provider implements ArrayInterface
{
/**
* @var \Aitoc\Smtp\Model\Providers
*/
private $providers;
public function __construct(
\Aitoc\Smtp\Model\Providers $providers
) {
$this->providers = $providers;
}
public function toOptionArray()
{
$result = [];
$result[] = [
'value' => 'none',
'label' => 'None'
];
foreach ($this->providers->getAllProviders() as $key => $providerData) {
$result[] = [
'value' => $key,
'label' => $providerData['label']
];
}
return $result;
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Model\Config\Options;
use Magento\Framework\Option\ArrayInterface;
class Status implements ArrayInterface
{
const STATUS_SUCCESS = 0;
const STATUS_FAILED = 1;
const STATUS_BLOCKED = 2;
/**
* @return array
*/
public function toOptionArray()
{
return [
[
'value' => self::STATUS_SUCCESS,
'label' => __('Success')
],
[
'value' => self::STATUS_FAILED,
'label' => __('Failed')
],
[
'value' => self::STATUS_BLOCKED,
'label' => __('Blocked')
]
];
}
/**
* @param $status
* @return mixed|string
*/
public function getLabelByStatus($status) {
foreach ($this->toOptionArray() as $item) {
if ($item['value'] == $status) {
return $item['label'];
}
}
return '';
}
}
<?php
/**
* @author Aitoc Team
* @copyright Copyright (c) 2022 Aitoc (https://www.aitoc.com)
* @package Aitoc_Smtp
*/
namespace Aitoc\Smtp\Model\Framework\Mail;
use Magento\Framework\Exception\MailException;
use Magento\Framework\Phrase;
use Zend\Mail\Message as ZendMessage;
use Zend\Mail\Address;
use Zend\Mail\Transport\Smtp;
use Magento\Framework\Mail\MessageInterface;
use Magento\Email\Model\Template\SenderResolver;
use Aitoc\Smtp\Model\Config;
use Zend\Mail\Transport\SmtpOptions;
use Aitoc\Smtp\Model\Resolver\From;
use Aitoc\Smtp\Model\LogFactory;
use Aitoc\Smtp\Model\Config\Options\Status;
use Magento\Framework\Registry;
use Aitoc\Smtp\Controller\RegistryConstants;
use Zend_Mail_Transport_Smtp;
class Transport implements \Magento\Framework\Mail\TransportInterface
{
const DEFAULT_LOCAL_CLIENT_HOSTNAME = 'localhost';
const TEST_MESSAGE_SUBJECT = 'Aitoc SMTP Test';
const TEST_MESSAGE_BODY =
"Now, your store uses an Aitoc SMTP. Please, hit ‘Save Config’ to use this connection.";
/**
* @var Sendmail
*/
private $zendTransport;
/**
* @var MessageInterface
*/
private $message;
/**
* @var array
*/
private $config;
/**
* @var Config
*/
private $aitConfig;
/**
* @var SenderResolver
*/
private $senderResolver;
/**
* @var From
*/
private $fromResolver;
/**
* @var LogFactory
*/
private $logFactory;
/**
* @var Registry
*/
private $registry;
public function __construct(
$message,
SenderResolver $senderResolver,
Config $aitConfig,
From $from,
LogFactory $logFactory,
Registry $registry,
array $config = []
) {
$this->config = $config;
$this->aitConfig = $aitConfig;
$this->senderResolver = $senderResolver;
$this->fromResolver = $from;
$this->logFactory = $logFactory;
$this->registry = $registry;
if ($this->aitConfig->isNewSender(RegistryConstants::VERSION_COMPARISON_OLD_MAIL)) {
$this->zendTransport = new Smtp($this->prepareOptions($config));
} else {
$this->zendTransport = new Zend_Mail_Transport_Smtp($config['host'], $config);
}
$this->message = $message;
$this->setFrom();
}
/**
* @return $this
*/
public function setFrom()
{
$fromData = $this->fromResolver->getFrom();
$message = ZendMessage::fromString($this->message->getRawMessage());
if ($fromData) {
if (($message instanceof ZendMessage && !$message->getFrom()->count())
|| ((is_array($message->getHeaders()) && !array_key_exists("From", $message->getHeaders())))
) {
$this->message->setFrom($this->aitConfig->getNewAddress($fromData));
}
}
return $this;
}
/**
* @param $config
* @return SmtpOptions
*/
private function prepareOptions($config)
{
if (!isset($config['name']) || !$config['name']) {
$config['name'] = self::DEFAULT_LOCAL_CLIENT_HOSTNAME;
}
$options = new SmtpOptions([
'name' => isset($config['name']) ? $config['name'] : '',
'host' => isset($config['host']) ? $config['host'] : '',
'port' => isset($config['port']) ? $config['port'] : 465,
]);
$connectionConfig = [];
if (isset($config['auth']) && $config['auth'] != '') {
$options->setConnectionClass($config['auth']);
$connectionConfig = [
'username' => isset($config['username']) ? $config['username'] : '',
'password' => isset($config['password']) ? $config['password'] : ''
];
}
if (isset($config['ssl']) && $config['ssl']) {
$connectionConfig['ssl'] = $config['ssl'];
}
if (!empty($connectionConfig)) {
$options->setConnectionConfig($connectionConfig);
}
return $options;
}
/**
* @inheritdoc
*/
public function sendMessage()
{
$logDisabled = $this->registry->registry(RegistryConstants::CURRENT_RULE) ? true : false;
try {
$this->message = $this->aitConfig->prepareMessageToSend($this->getMessage());
if ($this->aitConfig->isNewSender(RegistryConstants::VERSION_COMPARISON_OLD_MAIL)) {
$message = ZendMessage::fromString($this->message->getRawMessage())->setEncoding('utf-8');
} else {
$message = $this->message;
}
if ($this->aitConfig->isBlockedDelivery()) {
$modifiedRecipient = $this->modifyTo();
if (!$modifiedRecipient) {
$errorData = [
'status' => Status::STATUS_BLOCKED,
'status_message' => 'Debug mode'
];
if (!$logDisabled) {
$this->getLoger()->log($message, $errorData);
return;
}
}
$message = $modifiedRecipient;
}
$this->zendTransport->send($message);
if (!$logDisabled) {
$this->getLoger()->log($message);
}
} catch (\Exception $e) {
$errorData = [
'status' => Status::STATUS_FAILED,
'status_message' => $e->getMessage()
];
if (!$logDisabled) {
$this->getLoger()->log($message, $errorData);
}
throw new MailException(new Phrase($e->getMessage()), $e);
}
}
/**
* @return \Aitoc\Smtp\Model\Log
*/
private function getLoger()
{
return $this->logFactory->create();
}
/**
* @return bool|ZendMessage
*/
public function modifyTo()
{
if ($this->aitConfig->isNewSender(RegistryConstants::VERSION_COMPARISON_OLD_MAIL)) {
$message = ZendMessage::fromString($this->message->getRawMessage())->setEncoding('utf-8');
} else {
$message = $this->message;
}
$toEmails = $message->getTo();
$newEmails = [];
if ($toEmails) {
foreach ($toEmails as $email) {
$name = '';
if ($email instanceof Address) {
$name = $email->getName();
$email = $email->getEmail();
}
if ($this->aitConfig->needToBlockEmail($email)) {
continue;
}
$newEmails[] = [
'email' => $email,
'name' => $name
];
}
}
if (!$newEmails) {
return false;
}
$addressList = $this->aitConfig->getAddressList($newEmails);
$message->setTo($addressList);
return $message;
}
/**
* @param $to
* @return bool
* @throws MailException
*/
public function testSend($to)
{
try {
$result = false;
$this->message = $this->aitConfig->prepareMessageToSend($this->getMessage(), true);
$this->message
->addTo($to)
->setSubject(self::TEST_MESSAGE_SUBJECT)
->setBodyText(__(self::TEST_MESSAGE_BODY));
if ($this->aitConfig->isNewSender(RegistryConstants::VERSION_COMPARISON_OLD_MAIL)) {
$message = ZendMessage::fromString($this->message->getRawMessage())->setEncoding('utf-8');
} else {
$message = $this->message;
}
$this->zendTransport->send($message);
return $result;
} catch (\Exception $e) {
throw new MailException(new Phrase($e->getMessage()), $e);
}
}
/**
* @inheritdoc
*/
public function getMessage()
{
return $this->message;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment