Files
b2b.redline.com.pl/modules/newsletterpro/controllers/NewsletterProTemplateController.php
2025-06-24 14:14:35 +02:00

469 lines
16 KiB
PHP

<?php
/**
* Since 2013 Ovidiu Cimpean.
*
* Ovidiu Cimpean - Newsletter Pro © All rights reserved.
*
* DISCLAIMER
*
* Do not edit, modify or copy this file.
* If you wish to customize it, contact us at addons4prestashop@gmail.com.
*
* @author Ovidiu Cimpean <addons4prestashop@gmail.com>
* @copyright Since 2013 Ovidiu Cimpean
* @license Do not edit, modify or copy this file
*
* @version Release: 4
*/
class NewsletterProTemplateController extends NewsletterProController
{
public function newInstance()
{
return new self();
}
public function initContent()
{
return parent::initContent();
}
public function postProcess()
{
parent::postProcess();
$action = 'submit_template_controller';
if (Tools::isSubmit($action)) {
@ini_set('max_execution_time', '2880');
ob_clean();
ob_end_clean();
if (Tools::getValue('token') != $this->token) {
$this->display('Invalid Token!');
}
switch (Tools::getValue($action)) {
case 'getNewsletterTemplates':
$this->display($this->getNewsletterTemplates(), true);
break;
case 'deleteTemplate':
$this->display($this->deleteTemplate($_POST), true);
break;
case 'saveNewsletterPageTitle':
$title = Tools::getValue('saveNewsletterPageTitle');
$id_lang = (int) Tools::getValue('id_lang');
$this->display($this->saveNewsletterPageTitle($title, $id_lang));
break;
case 'saveNewsletterTemplate':
$name = Tools::getValue('name');
$content = Tools::getValue('content');
$css = Tools::getValue('css');
$css_global = Tools::getValue('css_global');
$this->display($this->saveNewsletterTemplate($name, $content, $css, $css_global), true);
break;
case 'saveAsNewsletterTemplate':
$name = Tools::getValue('name');
$content = Tools::getValue('content');
$css = Tools::getValue('css');
$css_global = Tools::getValue('css_global');
$this->display($this->saveAsNewsletterTemplate($name, $content, $css, $css_global), true);
break;
case 'renderTemplate':
$name = Tools::getValue('name');
$id_lang = (int) Tools::getValue('id_lang');
$this->display($this->renderTemplate($name, $id_lang), true);
break;
case 'viewTemplate':
$name = Tools::getValue('name');
$id_lang = (int) Tools::getValue('id_lang');
exit($this->viewTemplate($name, $id_lang));
break;
case 'changeTemplate':
$name = Tools::getValue('name');
$this->display($this->changeTemplate($name));
break;
case 'inputImportHTML':
if (isset($_FILES['inputImportHTML'])) {
$this->display($this->importHTML($_FILES['inputImportHTML']), true);
}
break;
}
}
}
/**
* Get newsletter templates.
*
* @return json
*/
public function getNewsletterTemplates($json_encode = true)
{
$list = [];
$path = $this->module->dir_location.'mail_templates/newsletter/';
$result = NewsletterProTools::getDirectoryIterator($path, '/^[a-zA-Z0-9_-]+$/');
$attachments = NewsletterProAttachment::getTemplatesName();
$default_lang = new Language((int) pqnp_config('PS_LANG_DEFAULT'));
$id = 1;
$i = 0;
foreach ($result as $file) {
if ($file->isDir()) {
$name = pathinfo($file->getFilename(), PATHINFO_FILENAME);
$filename = $name.'.html';
$default_template = $file->getPathName().'/'.$default_lang->iso_code.'/'.$filename;
$default_template_iso = $file->getPathName().'/'.$default_lang->iso_code;
// copy from the en files
if (!file_exists($default_template)) {
$en_template = $file->getPathName().'/en/'.$filename;
if (file_exists($en_template)) {
$newsletter_dir = $this->module->tpl_location.'newsletter/';
$np_index = $newsletter_dir.'index.php';
if (!file_exists($default_template_iso)) {
if (@mkdir($default_template_iso, 0777)) {
if (file_exists($np_index)) {
@copy($np_index, $default_template_iso.'/index.php');
}
@copy($en_template, $default_template);
}
}
}
}
// add the template to the list
if (file_exists($default_template) && is_file($default_template)) {
$list[$i]['id'] = $id;
$list[$i]['name'] = Tools::ucfirst(str_replace('_', ' ', $name));
$list[$i]['filename'] = $filename;
$list[$i]['path'] = $file->getPathName();
$list[$i]['date'] = date($this->context->language->date_format_full, $file->getMTime());
$list[$i]['mtime'] = $file->getMTime();
$list[$i]['filemtime'] = filemtime($default_template);
$list[$i]['selected'] = false;
$list[$i]['attachments'] = [];
if (in_array($filename, $attachments)) {
$attachment = NewsletterProAttachment::newInstanceByTemplateName($filename);
if ($attachment) {
$list[$i]['attachments'] = $attachment->files();
}
}
if ($list[$i]['filename'] == pqnp_config('NEWSLETTER_TEMPLATE')) {
$list[$i]['selected'] = true;
}
++$id;
++$i;
}
}
}
usort($list, [$this, 'sortByMTime']);
if ($json_encode) {
return NewsletterProAjaxResponse::jsonEncode($list);
}
return $list;
}
private static function sortByMTime($a, $b)
{
return (int) $a['filemtime'] < (int) $b['filemtime'];
}
/**
* Delete template.
*
* @param array $data
*
* @return json
*/
public function deleteTemplate($data)
{
try {
$module = NewsletterPro::getInstance();
$name = $data['filename'];
$path = $data['path'];
if ((int) pqnp_ini_config('demo_mode')) {
$demo_return = NewsletterProDemoMode::deleteTemplate($name);
if ($demo_return) {
return NewsletterProDemoMode::deleteTemplate($name);
}
}
if (!file_exists($path)) {
throw new Exception($module->l('File not exists!'));
}
$template = NewsletterProTemplate::newFile($name)->load();
$template->delete();
} catch (Exception $e) {
$this->response->addError($e->getMessage());
}
return $this->response->display();
}
/**
* Save the newsletter template page title.
*
* @param string $title
*
* @return bool
*/
public function saveNewsletterPageTitle($title, $id_lang)
{
try {
$template_name = pqnp_config('NEWSLETTER_TEMPLATE');
if ('default.html' == $template_name) {
throw new Exception($this->l('Save a copy of the default template to change the title.'));
}
$template = NewsletterProTemplate::newFile($template_name)->load($id_lang);
$template->changeTitle([$id_lang => $title]);
$template->save();
} catch (Exception $e) {
$this->response->addError($e->getMessage());
}
return $this->response->display();
}
public function saveNewsletterTemplate($template_name, $content, $css, $css_global)
{
try {
if ('default.html' === $template_name) {
throw new Exception(sprintf($this->l('The default template cannot be overridden. You can only create a copy of this template.'), $template_name));
}
$template = NewsletterProTemplate::newFile($template_name)->load();
$template->setContent($content);
$template->css = $css;
$template->save();
$template->saveGlobalCSS($css_global);
$this->response->set('message', $this->l('Template saved successfully.'));
$this->response->set('html', $template->html());
} catch (Exception $e) {
$this->response->addError($e->getMessage());
}
return $this->response->display();
}
public function saveAsNewsletterTemplate($template_name, $content, $css, $css_global)
{
try {
$template_name = preg_replace('/\s+/i', '_', $template_name);
$message = NewsletterPro::getInstance()->verifyName($template_name);
if (true !== $message) {
throw new Exception($message);
}
$template_name = $template_name.'.html';
if ('default.html' === $template_name) {
throw new Exception(sprintf($this->l('The default template cannot be overridden. You can only create a copy of this template.'), $template_name));
}
if (NewsletterProTemplate::templateExists($template_name)) {
throw new Exception(sprintf($this->l('The template name "%s" already exists.'), $template_name));
}
$content_build = NewsletterProTemplate::buildContent($content);
$template = NewsletterProTemplate::newString([$template_name, $content_build])->load();
$template->css = $css;
$template->save();
$template->saveGlobalCSS($css_global);
pqnp_config('NEWSLETTER_TEMPLATE', $template->name);
$this->response->set('template_name', $template->name);
$this->response->set('message', $this->l('Template saved successfully.'));
} catch (Exception $e) {
$this->response->addError($e->getMessage());
}
return $this->response->display();
}
public function viewTemplate($template_name, $id_lang)
{
try {
$template = NewsletterProTemplate::newFile($template_name, [null, NewsletterProTemplateUser::USER_TYPE_EMPLOYEE])->load($id_lang);
return $template->render(NewsletterProTemplateContent::CONTENT_HTML);
} catch (Exception $e) {
return $e->getMessage();
}
}
public function renderTemplate($template_name, $id_lang)
{
try {
$this->response->set('render', $this->viewTemplate($template_name, $id_lang));
} catch (Exception $e) {
$this->response->addError($e->getMessage());
}
return $this->response->display();
}
public function changeTemplate($template_name)
{
try {
$template = NewsletterProTemplate::newFile($template_name, [null, NewsletterProTemplateUser::USER_TYPE_EMPLOYEE])->load();
$this->response->set('html', $template->htmlInvert());
$this->response->set('headers', $template->content->getHeaders());
pqnp_config('NEWSLETTER_TEMPLATE', $template_name);
} catch (Exception $e) {
$this->response->addError($e->getMessage());
}
return $this->response->display();
}
public function exportHTML($use_render = false)
{
$template = NewsletterProTemplate::newFile(pqnp_config('NEWSLETTER_TEMPLATE'), [null, NewsletterProTemplateUser::USER_TYPE_EMPLOYEE])->load();
$template->export($use_render);
}
public function importHTML($file)
{
try {
$module = NewsletterPro::getInstance();
$validate = $module->verifyFileErros($file);
if (true !== $validate) {
throw new Exception($validate);
}
$name = NewsletterProTemplate::formatName($file['name']);
$filename = pathinfo($name, PATHINFO_FILENAME);
$tmp_name = $file['tmp_name'];
$extension = pathinfo($name, PATHINFO_EXTENSION);
if (!preg_match('/html|htm|zip/i', $extension)) {
throw new Exception(sprintf($module->l('Only the file extension "%s" are allowed.'), 'html, htm, zip'));
}
$validate_name = $module->verifyName($filename);
if (true !== $validate_name) {
throw new Exception($validate_name);
}
$template_path = 'mail_templates/newsletter/';
$path = $module->dir_location.$template_path;
if (!file_exists($path)) {
throw new Exception(sprintf($module->l('The file "%s" does not exists.'), $path));
}
$full_path = $path.$filename;
$full_path = NewsletterProTools::getFileNameIncrement($full_path);
$name = pathinfo($full_path, PATHINFO_BASENAME);
if ('zip' == $extension) {
$languages = Language::getLanguages(false);
$languages_iso = [];
foreach ($languages as $language) {
$languages_iso[$language['iso_code']] = $language;
}
$content = [];
$zip = new ZipArchive();
if (true === $zip->open($tmp_name)) {
$zip_name = pathinfo($tmp_name, PATHINFO_FILENAME);
for ($i = 0; $i < $zip->numFiles; ++$i) {
$file = $zip->getNameIndex($i);
if (preg_match('/.html$/', $file)) {
if (preg_match('/^\w+/', $file, $match)) {
$iso_code = $match[0];
if (isset($languages_iso[$iso_code])) {
$file_stream = $zip->getStream($file);
if (!$file_stream) {
throw new Exception(sprintf($module->l('Cannot read the content of the .zip file "%s".'), $file));
}
$html = '';
while (!feof($file_stream)) {
$html .= fread($file_stream, 2);
}
$content[$languages_iso[$iso_code]['id_lang']] = $html;
}
}
}
}
$zip->close();
} else {
throw new Exception(sprintf($module->l('Cannot open the file "%s". Please check the CHMOD permissions.'), $tmp_name));
}
if (empty($content)) {
throw new Exception('This .zip file is not compatible for import.');
}
$id_default_lang = pqnp_config('PS_LANG_DEFAULT');
if (!isset($content[$id_default_lang])) {
$content[$id_default_lang] = $content[key($content)];
}
$template = NewsletterProTemplate::newString([$name.'.html', $content])->load();
$template->save();
} else {
$content = Tools::file_get_contents($tmp_name);
if (false === $content) {
throw new Exception(sprintf($module->l('Cannot get the content of the file "%s". Please check the CHMOD permissions.'), $tmp_name));
}
$template = NewsletterProTemplate::newString([$name.'.html', $content])->load();
$template->save();
}
$this->response->set('name', $name.'.html');
} catch (Exception $e) {
$this->response->addError($e->getMessage());
}
return $this->response->display();
}
}