Files
taome/modules/ps_mbo/ps_mbo.php
2020-10-07 10:37:15 +02:00

412 lines
12 KiB
PHP

<?php
/**
* 2007-2020 PrestaShop and Contributors
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2020 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
if (!defined('_PS_VERSION_')) {
exit;
}
$autoloadPath = __DIR__ . '/vendor/autoload.php';
if (file_exists($autoloadPath)) {
require_once $autoloadPath;
}
use PrestaShop\Module\Mbo\Tab\TabCollectionProvider;
use PrestaShop\PrestaShop\Adapter\SymfonyContainer;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class ps_mbo extends Module
{
const TABS_WITH_RECOMMENDED_MODULES_BUTTON = [
'AdminProducts',
'AdminCategories',
'AdminTracking',
'AdminAttributesGroups',
'AdminFeatures',
'AdminManufacturers',
'AdminSuppliers',
'AdminTags',
'AdminOrders',
'AdminInvoices',
'AdminReturn',
'AdminDeliverySlip',
'AdminSlip',
'AdminStatuses',
'AdminOrderMessage',
'AdminCustomers',
'AdminAddresses',
'AdminGroups',
'AdminCarts',
'AdminCustomerThreads',
'AdminContacts',
'AdminCartRules',
'AdminSpecificPriceRule',
'AdminShipping',
'AdminLocalization',
'AdminZones',
'AdminCountries',
'AdminCurrencies',
'AdminTaxes',
'AdminTaxRulesGroup',
'AdminTranslations',
'AdminPreferences',
'AdminOrderPreferences',
'AdminPPreferences',
'AdminCustomerPreferences',
'AdminThemes',
'AdminMeta',
'AdminCmsContent',
'AdminImages',
'AdminSearchConf',
'AdminGeolocation',
'AdminInformation',
'AdminPerformance',
'AdminEmails',
'AdminImport',
'AdminBackup',
'AdminRequestSql',
'AdminLogs',
'AdminAdminPreferences',
'AdminStats',
'AdminSearchEngines',
'AdminReferrers',
];
const TABS_WITH_RECOMMENDED_MODULES_AFTER_CONTENT = [
'AdminMarketing',
'AdminPayment',
'AdminCarriers',
];
const ADMIN_CONTROLLERS = [
'AdminPsMboModule' => [
'name' => 'Module catalog',
'visible' => true,
'class_name' => 'AdminPsMboModule',
'parent_class_name' => 'AdminParentModulesCatalog',
'core_reference' => 'AdminModulesCatalog',
],
'AdminPsMboAddons' => [
'name' => 'Module selection',
'visible' => true,
'class_name' => 'AdminPsMboAddons',
'parent_class_name' => 'AdminParentModulesCatalog',
'core_reference' => 'AdminAddonsCatalog',
],
'AdminPsMboRecommended' => [
'name' => 'Module recommended',
'visible' => true,
'class_name' => 'AdminPsMboRecommended',
],
'AdminPsMboTheme' => [
'name' => 'Theme catalog',
'visible' => true,
'class_name' => 'AdminPsMboTheme',
'parent_class_name' => 'AdminParentThemes',
'core_reference' => 'AdminThemesCatalog',
],
];
const HOOKS = [
'actionAdminControllerSetMedia',
'displayDashboardTop',
];
/**
* @var ContainerInterface
*/
protected $container;
/**
* Constructor.
*/
public function __construct()
{
$this->name = 'ps_mbo';
$this->version = '2.0.1';
$this->author = 'PrestaShop';
$this->tab = 'administration';
$this->module_key = '6cad5414354fbef755c7df4ef1ab74eb';
$this->need_instance = 0;
$this->ps_versions_compliancy = [
'min' => '1.7.5.0',
'max' => _PS_VERSION_,
];
parent::__construct();
$this->displayName = $this->l('PrestaShop Marketplace in your Back Office');
$this->description = $this->l('Discover the best PrestaShop modules to optimize your online store.');
}
/**
* Install Module.
*
* @return bool
*/
public function install()
{
return parent::install()
&& $this->registerHook(static::HOOKS)
&& $this->installTabs();
}
/**
* Install all Tabs.
*
* @return bool
*/
public function installTabs()
{
foreach (static::ADMIN_CONTROLLERS as $adminTab) {
if (false === $this->installTab($adminTab)) {
return false;
}
}
return true;
}
/**
* Install Tab.
* Used in upgrade script.
*
* @param array $tabData
*
* @return bool
*/
public function installTab(array $tabData)
{
$position = 0;
$tabNameByLangId = array_fill_keys(
Language::getIDs(false),
$tabData['name']
);
if (isset($tabData['core_reference'])) {
$tabCoreId = Tab::getIdFromClassName($tabData['core_reference']);
if ($tabCoreId !== false) {
$tabCore = new Tab($tabCoreId);
$tabNameByLangId = $tabCore->name;
$position = $tabCore->position;
$tabCore->active = false;
$tabCore->save();
}
}
$tab = new Tab();
$tab->module = $this->name;
$tab->class_name = $tabData['class_name'];
$tab->position = (int) $position;
$tab->id_parent = empty($tabData['parent_class_name']) ? -1 : Tab::getIdFromClassName($tabData['parent_class_name']);
$tab->name = $tabNameByLangId;
if (false === (bool) $tab->add()) {
return false;
}
if (Validate::isLoadedObject($tab)) {
// Updating the id_parent will override the position, that's why we save 2 times
$tab->position = (int) $position;
$tab->save();
}
return true;
}
/**
* Uninstall Module.
*
* @return bool
*/
public function uninstall()
{
return parent::uninstall()
&& $this->uninstallTabs();
}
/**
* Uninstall all Tabs.
*
* @return bool
*/
public function uninstallTabs()
{
foreach (static::ADMIN_CONTROLLERS as $adminTab) {
if (false === $this->uninstallTab($adminTab)) {
return false;
}
}
return true;
}
/**
* Uninstall Tab.
* Can be used in upgrade script.
*
* @param array $tabData
*
* @return bool
*/
public function uninstallTab(array $tabData)
{
$tabId = Tab::getIdFromClassName($tabData['class_name']);
$tab = new Tab($tabId);
if (false === Validate::isLoadedObject($tab)) {
return false;
}
if (false === (bool) $tab->delete()) {
return false;
}
if (isset($tabData['core_reference'])) {
$tabCoreId = Tab::getIdFromClassName($tabData['core_reference']);
$tabCore = new Tab($tabCoreId);
if (Validate::isLoadedObject($tabCore)) {
$tabCore->active = true;
}
if (false === (bool) $tabCore->save()) {
return false;
}
}
return true;
}
/**
* Hook actionAdminControllerSetMedia.
*/
public function hookActionAdminControllerSetMedia()
{
// has to be loaded in header to prevent flash of content
$this->context->controller->addJs($this->getPathUri() . 'views/js/recommended-modules.js?v=' . $this->version);
if ($this->shouldAttachRecommendedModulesButton()
|| $this->shouldAttachRecommendedModulesAfterContent()
) {
$this->context->controller->addCSS($this->getPathUri() . 'views/css/recommended-modules.css');
$this->context->controller->addJs(
rtrim(__PS_BASE_URI__, '/')
. str_ireplace(
_PS_CORE_DIR_,
'',
_PS_BO_ALL_THEMES_DIR_
)
. 'default/js/bundle/module/module_card.js?v='
. _PS_VERSION_
);
}
}
/**
* Hook displayDashboardTop.
* Includes content just below the toolbar.
*
* @return string
*/
public function hookDisplayDashboardTop()
{
/** @var UrlGeneratorInterface $router */
$router = $this->get('router');
try {
$recommendedModulesUrl = $router->generate(
'admin_mbo_recommended_modules',
[
'tabClassName' => Tools::getValue('controller'),
]
);
} catch (Exception $exception) {
// Avoid fatal errors on ServiceNotFoundException
return '';
}
$this->smarty->assign([
'shouldAttachRecommendedModulesAfterContent' => $this->shouldAttachRecommendedModulesAfterContent(),
'shouldAttachRecommendedModulesButton' => $this->shouldAttachRecommendedModulesButton(),
'shouldUseLegacyTheme' => $this->isAdminLegacyContext(),
'recommendedModulesTitleTranslated' => $this->trans('Recommended Modules and Services'),
'recommendedModulesCloseTranslated' => $this->trans('Close', [], 'Admin.Actions'),
'recommendedModulesUrl' => $recommendedModulesUrl,
]);
return $this->fetch('module:ps_mbo/views/templates/hook/recommended-modules.tpl');
}
/**
* Indicates if the recommended modules should be attached after content in this page
*
* @return bool
*/
private function shouldAttachRecommendedModulesAfterContent()
{
// AdminLogin should not call TabCollectionProvider
if (Validate::isLoadedObject($this->context->employee)) {
/** @var TabCollectionProvider $tabCollectionProvider */
$tabCollectionProvider = $this->get('mbo.tab.collection.provider');
if ($tabCollectionProvider->isTabCollectionCached()) {
return $tabCollectionProvider->getTabCollection()->getTab(Tools::getValue('controller'))->shouldDisplayAfterContent()
|| 'AdminCarriers' === Tools::getValue('controller');
}
}
return in_array(Tools::getValue('controller'), static::TABS_WITH_RECOMMENDED_MODULES_AFTER_CONTENT, true);
}
/**
* Indicates if the recommended modules button should be attached in this page
*
* @return bool
*/
private function shouldAttachRecommendedModulesButton()
{
// AdminLogin should not call TabCollectionProvider
if (Validate::isLoadedObject($this->context->employee)) {
/** @var TabCollectionProvider $tabCollectionProvider */
$tabCollectionProvider = $this->get('mbo.tab.collection.provider');
if ($tabCollectionProvider->isTabCollectionCached()) {
return $tabCollectionProvider->getTabCollection()->getTab(Tools::getValue('controller'))->shouldDisplayButton()
&& 'AdminCarriers' !== Tools::getValue('controller');
}
}
return in_array(Tools::getValue('controller'), static::TABS_WITH_RECOMMENDED_MODULES_BUTTON, true);
}
/**
* Override of native function to always retrieve Symfony container instead of legacy admin container on legacy context.
*
* {@inheritdoc}
*/
public function get($serviceName)
{
if (null === $this->container) {
$this->container = SymfonyContainer::getInstance();
}
return $this->container->get($serviceName);
}
}