Files
drmaterac.pl/modules/creativeelements/controllers/admin/AdminCEEditorController.php
2025-07-13 11:19:53 +02:00

379 lines
15 KiB
PHP

<?php
/**
* Creative Elements - live Theme & Page Builder
*
* @author WebshopWorks
* @copyright 2019-2022 WebshopWorks.com
* @license One domain support license
*/
defined('_PS_VERSION_') or die;
class AdminCEEditorController extends ModuleAdminController
{
public $name = 'AdminCEEditor';
public $display_header = false;
public $content_only = true;
/** @var CE\UId */
protected $uid;
public function initShopContext()
{
require_once _PS_MODULE_DIR_ . 'creativeelements/classes/wrappers/UId.php';
Tools::getIsset('uid') && $this->uid = CE\UId::parse(Tools::getValue('uid'));
if (!empty($this->uid->id_shop) && $this->uid->id_type > CE\UId::TEMPLATE && Shop::getContext() > 1) {
${'_POST'}['setShopContext'] = 's-' . $this->uid->id_shop;
}
parent::initShopContext();
}
public function init()
{
if (isset($this->context->cookie->last_activity)) {
if ($this->context->cookie->last_activity + 900 < time()) {
$this->context->employee->logout();
} else {
$this->context->cookie->last_activity = time();
}
}
if (!isset($this->context->employee) || !$this->context->employee->isLoggedBack()) {
if (isset($this->context->employee)) {
$this->context->employee->logout();
}
Tools::redirectAdmin($this->context->link->getAdminLink('AdminLogin') . '&redirect=' . $this->controller_name);
}
$this->initProcess();
}
public function initCursedPage()
{
if ($this->ajax) {
CE\wp_send_json_error('token_expired');
}
parent::initCursedPage();
}
public function initProcess()
{
header('Cache-Control: no-store, no-cache');
$this->ajax = Tools::getIsset('ajax');
$this->action = Tools::getValue('action', '');
$this->tabAccess = Profile::getProfileAccess($this->context->employee->id_profile, $this->id);
if (Shop::isFeatureActive() && $this->uid && !$this->ajax) {
$domain = Tools::getShopProtocol() === 'http://' ? 'domain' : 'domain_ssl';
if ($this->context->shop->$domain != $_SERVER['HTTP_HOST'] && $this->viewAccess()) {
CE\update_post_meta(0, 'cookie', $this->context->cookie->getAll());
$id_shop = $this->uid->id_shop ?: $this->uid->getDefaultShopId();
Tools::redirectAdmin(
$this->context->link->getModuleLink('creativeelements', 'preview', [
'id_employee' => $this->context->employee->id,
'adtoken' => Tools::getAdminTokenLite('AdminCEEditor'),
'redirect' => urlencode($_SERVER['REQUEST_URI']),
], true, $this->uid->id_lang, $id_shop)
);
}
}
CE\Plugin::instance();
}
public function postProcess()
{
$process = 'process' . Tools::toCamelCase($this->action, true);
if ($this->ajax) {
method_exists($this, "ajax$process") && $this->{"ajax$process"}();
if ('elementor_ajax' === $this->action) {
CE\add_action('elementor/ajax/register_actions', [$this, 'registerAjaxActions']);
}
CE\do_action('wp_ajax_' . $this->action);
} elseif ($this->action && method_exists($this, $process)) {
// Call process
return $this->$process();
}
return false;
}
public function initContent()
{
$this->viewAccess() or die(CE\Helper::transError('You do not have permission to view this.'));
empty($this->uid) && Tools::redirectAdmin($this->context->link->getAdminLink('AdminCEContent'));
CE\add_action('elementor/editor/before_enqueue_scripts', [$this, 'beforeEnqueueScripts']);
CE\Plugin::instance()->editor->init();
}
public function beforeEnqueueScripts()
{
$suffix = _PS_MODE_DEV_ ? '' : '.min';
// Enqueue CE assets
CE\wp_enqueue_style('ce-editor', _CE_ASSETS_URL_ . 'css/editor-ce.css', [], _CE_VERSION_);
CE\wp_register_script('ce-editor', _CE_ASSETS_URL_ . 'js/editor-ce.js', [], _CE_VERSION_, true);
CE\wp_localize_script('ce-editor', 'baseDir', __PS_BASE_URI__);
CE\wp_enqueue_script('ce-editor');
// Enqueue TinyMCE assets
CE\wp_enqueue_style('material-icons', _CE_ASSETS_URL_ . 'lib/material-icons/material-icons.css', [], '1.012');
CE\wp_enqueue_style('tinymce-theme', _CE_ASSETS_URL_ . "lib/tinymce/ps-theme{$suffix}.css", [], _CE_VERSION_);
CE\wp_register_script('tinymce', _PS_JS_DIR_ . 'tiny_mce/tinymce.min.js', ['jquery'], false, true);
CE\wp_register_script('tinymce-inc', _CE_ASSETS_URL_ . 'lib/tinymce/tinymce.inc.js', ['tinymce'], _CE_VERSION_, true);
CE\wp_localize_script('tinymce', 'baseAdminDir', __PS_BASE_URI__ . basename(_PS_ADMIN_DIR_) . '/');
CE\wp_localize_script('tinymce', 'iso_user', CE\get_locale());
CE\wp_enqueue_script('tinymce-inc');
}
public function processBackToPsEditor()
{
if (CE\current_user_can('edit', $this->uid)) {
CE\Plugin::instance()->db->setIsElementorPage($this->uid, false);
}
Tools::redirectAdmin($_SERVER['HTTP_REFERER']);
}
public function processAddFooterProduct()
{
if (!$this->uid->id || $this->uid->id_type != CE\UId::PRODUCT) {
Tools::redirectAdmin($_SERVER['HTTP_REFERER']);
}
$content = new CEContent();
$content->hook = 'displayFooterProduct';
$content->id_product = $this->uid->id;
$content->active = true;
$content->title = [];
$content->content = [];
foreach (Language::getLanguages(false) as $lang) {
$content->title[$lang['id_lang']] = 'Product Footer #' . $this->uid->id;
}
$content->save();
$uid = new CE\UId($content->id, CE\UId::CONTENT, $this->uid->id_lang, $this->uid->id_shop);
Tools::redirectAdmin(
$this->context->link->getAdminLink('AdminCEEditor') . "&uid=$uid&footerProduct={$content->id_product}"
);
}
public function processAddMaintenance()
{
if (!$uid = Tools::getValue('uid')) {
Tools::redirectAdmin($_SERVER['HTTP_REFERER']);
}
$content = new CEContent();
$content->hook = 'displayMaintenance';
$content->active = true;
$content->title = [];
$content->content = [];
foreach (Language::getLanguages(false) as $lang) {
$id_lang = $lang['id_lang'];
$content->title[$id_lang] = 'Maintenance';
$content->content[$id_lang] = (string) Configuration::get('PS_MAINTENANCE_TEXT', $id_lang);
}
$content->save();
$id_lang = Tools::substr($uid, -4, 2);
$id_shop = Tools::substr($uid, -2);
$uid = new CE\UId($content->id, CE\UId::CONTENT, $id_lang, $id_shop);
Tools::redirectAdmin($this->context->link->getAdminLink('AdminCEEditor') . "&uid=$uid");
}
public function ajaxProcessHeartbeat()
{
$response = [];
$data = isset(${'_POST'}['data']) ? (array) ${'_POST'}['data'] : [];
$screen_id = Tools::getValue('screen_id', 'front');
empty($data) or $response = CE\apply_filters('heartbeat_received', $response, $data, $screen_id);
$response = CE\apply_filters('heartbeat_send', $response, $screen_id);
CE\do_action('heartbeat_tick', $response, $screen_id);
$response['server_time'] = time();
CE\wp_send_json($response);
}
public function ajaxProcessAutocompleteLink()
{
$context = Context::getContext();
$db = Db::getInstance();
$ps = _DB_PREFIX_;
$search = $db->escape(Tools::getValue('search'));
$id_lang = (int) $context->language->id;
$id_shop = (int) $context->shop->id;
$limit = 10;
$rows = $db->executeS("(
SELECT m.`id_meta` AS `ID`, ml.`title`, m.`page` AS `permalink`, 'Page' AS `info` FROM `{$ps}meta` AS m
LEFT JOIN `{$ps}meta_lang` AS ml ON m.`id_meta` = ml.`id_meta`
WHERE ml.`id_lang` = $id_lang AND ml.`id_shop` = $id_shop AND ml.`title` LIKE '%$search%' LIMIT $limit
) UNION (
SELECT `id_cms` AS `ID`, `meta_title` AS `title`, `link_rewrite` AS `permalink`, 'CMS' AS `info` FROM `{$ps}cms_lang`
WHERE `id_lang` = $id_lang AND `id_shop` = $id_shop AND `meta_title` LIKE '%$search%' LIMIT $limit
) UNION (
SELECT `id_cms_category` AS `ID`, `name` AS `title`, `link_rewrite` AS `permalink`, 'CMS Category' AS `info` FROM `{$ps}cms_category_lang`
WHERE `id_lang` = $id_lang AND `id_shop` = $id_shop AND `name` LIKE '%$search%' LIMIT $limit
) UNION (
SELECT `id_product` AS `ID`, `name` AS `title`, '' AS `permalink`, 'Product' AS `info` FROM `{$ps}product_lang`
WHERE `id_lang` = $id_lang AND `id_shop` = $id_shop AND `name` LIKE '%$search%' LIMIT $limit
) UNION (
SELECT `id_category` AS `ID`, `name` AS `title`, `link_rewrite` AS `permalink`, 'Category' AS `info` FROM `{$ps}category_lang`
WHERE `id_lang` = $id_lang AND `id_shop` = $id_shop AND `name` LIKE '%$search%' LIMIT $limit
) UNION (
SELECT `id_manufacturer` AS `ID`, `name` AS `title`, '' AS `permalink`, 'Brand' AS `info` FROM `{$ps}manufacturer`
WHERE `active` = 1 AND `name` LIKE '%$search%' LIMIT $limit
) UNION (
SELECT `id_supplier` AS `ID`, `name` AS `title`, '' AS `permalink`, 'Supplier' AS `info` FROM `{$ps}supplier`
WHERE `active` = 1 AND `name` LIKE '%$search%' LIMIT $limit
)");
if ($rows) {
foreach ($rows as &$row) {
switch ($row['info']) {
case 'CMS':
$row['permalink'] = $context->link->getCMSLink($row['ID'], $row['permalink'], null, $id_lang, $id_shop);
break;
case 'CMS Category':
$row['permalink'] = $context->link->getCMSCategoryLink($row['ID'], $row['permalink'], $id_lang, $id_shop);
break;
case 'Product':
$product = new Product($row['ID'], false, $id_lang, $id_shop);
$row['permalink'] = $context->link->getProductLink($product);
break;
case 'Category':
$row['permalink'] = $context->link->getCategoryLink($row['ID'], $row['permalink'], $id_lang, null, $id_shop);
break;
case 'Brand':
$row['permalink'] = $context->link->getManufacturerLink($row['ID'], Tools::link_rewrite($row['title']), $id_lang, $id_shop);
break;
case 'Supplier':
$row['permalink'] = $context->link->getSupplierLink($row['ID'], Tools::link_rewrite($row['title']), $id_lang, $id_shop);
break;
default:
$row['permalink'] = $context->link->getPageLink($row['permalink'], null, $id_lang, null, false, $id_shop);
break;
}
$row['info'] = CE\__($row['info']);
}
}
die(json_encode($rows));
}
public function registerAjaxActions($ajax_manager)
{
$ajax_manager->registerAjaxAction('get_language_content', [$this, 'ajaxGetLanguageContent']);
$ajax_manager->registerAjaxAction('get_products_by_id', [$this, 'ajaxGetProductsById']);
CE\add_filter('elementor/api/get_templates/body_args', [$this, 'filterApiGetTemplateArgs']);
CE\add_filter('elementor/api/get_templates/content', [$this, 'filterApiGetTemplateContent']);
CE\add_action('elementor/document/after_save', [$this, 'onAfterSaveDocument']);
}
public function ajaxGetLanguageContent($request)
{
$data = null;
if (!empty($request['uid']) && $data = CE\get_post_meta($request['uid'], '_elementor_data', true)) {
CE\Plugin::$instance->db->iterateData($data, function ($element) {
$element['id'] = CE\Utils::generateRandomString();
return $element;
});
}
return is_array($data) ? $data : [];
}
public function ajaxGetProductsById($request)
{
if (empty($request['ids'])) {
return [];
}
$context = Context::getContext();
$results = [];
$ids = implode(',', array_map('intval', $request['ids']));
$items = Db::getInstance()->executeS('
SELECT p.`id_product`, pl.`link_rewrite`, p.`reference`, pl.`name`, image_shop.`id_image` id_image FROM `' . _DB_PREFIX_ . 'product` p
' . Shop::addSqlAssociation('product', 'p') . '
LEFT JOIN `' . _DB_PREFIX_ . 'product_lang` pl ON (pl.id_product = p.id_product AND pl.id_lang = ' . (int) $context->language->id . Shop::addSqlRestrictionOnLang('pl') . ')
LEFT JOIN `' . _DB_PREFIX_ . 'image_shop` image_shop
ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop=' . (int) $context->shop->id . ')
LEFT JOIN `' . _DB_PREFIX_ . 'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = ' . (int) $context->language->id . ')
WHERE p.id_product IN (' . $ids . ') GROUP BY p.id_product
');
if ($items) {
$protocol = Tools::getShopProtocol();
$image_size = ImageType::getFormattedName('home');
foreach ($items as &$item) {
$results[] = [
'id' => $item['id_product'],
'name' => $item['name'] . (!empty($item['reference']) ? ' (ref: ' . $item['reference'] . ')' : ''),
'ref' => (!empty($item['reference']) ? $item['reference'] : ''),
'image' => str_replace('http://', $protocol, $context->link->getImageLink($item['link_rewrite'], $item['id_image'], $image_size)),
];
}
}
return $results;
}
public function filterApiGetTemplateArgs($body_args)
{
$id_shop = Configuration::getGlobalValue('PS_SHOP_DEFAULT');
$license_key = Configuration::getGlobalValue('CE_LICENSE');
if ($license_key) {
$body_args['license'] = $license_key;
$body_args['domain'] = Tools::getShopProtocol() === 'http://'
? ShopUrl::getMainShopDomain($id_shop)
: ShopUrl::getMainShopDomainSSL($id_shop)
;
}
return $body_args;
}
public function filterApiGetTemplateContent($content)
{
if (isset($content['error'])) {
if (isset($content['code']) && 419 == $content['code']) {
Configuration::updateGlobalValue('CE_LICENSE', '');
}
CE\wp_send_json_error($content['error']);
}
return $content;
}
public function onAfterSaveDocument($document)
{
// Set edit mode to builder only at save
CE\Plugin::$instance->db->setIsElementorPage($document->getPost()->uid);
}
}