Файл: mg-core/lib/actioner.php
Строк: 1263
<?php
/**
* Класс Actioner - предназначен для обработки административных действий,
* совершаемых из панели управления сайтом, таких как добавление и удалени товаров,
* категорий, и др. сущностей.
*
* Методы класса являются контролерами между AJAX запросами и логикой моделей движка, возвращают в конечном результате строку в JSON формате.
*
* @author Авдеев Марк <mark-avdeev@mail.ru>
* @package moguta.cms
* @subpackage Libraries
*/
class Actioner {
/**
* @var string сообщение об успешнон результате выполнения операции.
*/
public $messageSucces;
/**
* @var string сообщение о неудачном результате выполнения операции.
*/
public $messageError;
/**
* @var mixed массив с данными возвращаемый в ответ на AJAX запрос.
*/
public $data = array();
/**
* @var mixed язык локали движка.
*/
public $lang = array();
/**
* @var string префикс таблиц в базе сайта.
*/
public $prefix;
/**
* Конструктор инициализирует поля клааса.
* @param boolean $lang - массив дополняющий локаль движка. Используется для работы плагинов.
*/
public function __construct($lang = false) {
$this->messageSucces = 'Succes';
$this->messageError = 'Error';
$langMerge = array();
if (!empty($lang)) {
$langMerge = $lang;
}// если $lang не пустой, значит он передан для работы в наследнике данного класса, например для обработки аяксовых запросов плагина
include('mg-admin/locales/'.MG::getSetting('languageLocale').'.php');
$lang = array_merge($lang, $langMerge);
$this->lang = $lang;
$this->prefix = PREFIX;
}
/**
* Запускает один из методов данного класса.
* @param type $action - название метода который нужно вызвать.
*/
public function runAction($action) {
unset($_POST['mguniqueurl']);
unset($_POST['mguniquetype']);
//отсекаем все что после знака ?
$action = preg_replace("/?.*/s", "", $action);
$this->jsonResponse($this->$action());
exit;
}
/**
* Добавляет продукт в базу.
* @return boolean
*/
public function addProduct() {
$model = new Models_Product;
$this->data = $model->addProduct($_POST);
$this->messageSucces = $this->lang['ACT_CREAT_PROD'].' "'.$_POST['name'].'"';
$this->messageError = $this->lang['ACT_NOT_CREAT_PROD'];
return true;
}
/**
* Клонирует продукт.
* @return boolean
*/
public function cloneProduct() {
$model = new Models_Product;
$this->data = $model->cloneProduct($_POST['id']);
$this->messageSucces = $this->lang['ACT_CLONE_PROD'];
$this->messageError = $this->lang['ACT_NOT_CLONE_PROD'];
return true;
}
/**
* Активирует плагин.
* @return boolean
*/
public function activatePlugin() {
$this->messageSucces = $this->lang['ACTIVE_PLUG'].' "'.$_POST['pluginTitle'].'"';
$pluginFolder = $_POST['pluginFolder'];
$res = DB::query("
SELECT *
FROM `".PREFIX."plugins`
WHERE folderName = '%s'
", $pluginFolder);
if (!DB::numRows($res)) {
$result = DB::query("
INSERT INTO `".PREFIX."plugins`
VALUES ('%s', '1')"
, $pluginFolder);
MG::createActivationHook($pluginFolder);
$this->data['havePage'] = PM::isHookInReg($pluginFolder);
return true;
}
if ($result = DB::query("
UPDATE `".PREFIX."plugins`
SET active = '1'
WHERE `folderName` = '%s'
", $pluginFolder
)) {
MG::createActivationHook($pluginFolder);
$this->data['havePage'] = PM::isHookInReg($pluginFolder);
$this->data['newInformer'] = MG::createInformerPanel();
return true;
}
return false;
}
/**
* Деактивирует плагин.
* @return boolean
*/
public function deactivatePlugin() {
$this->messageSucces = $this->lang['ACT_NOT_ACTIVE_PLUG'].' "'.$_POST['pluginTitle'].'"';
$pluginFolder = $_POST['pluginFolder'];
$res = DB::query("
SELECT *
FROM `".PREFIX."plugins`
WHERE folderName = '%s'
", $pluginFolder);
if (DB::numRows($res)) {
DB::query("
UPDATE `".PREFIX."plugins`
SET active = '0'
WHERE `folderName` = '%s'
", $pluginFolder
);
MG::createDeactivationHook($pluginFolder);
return true;
}
return false;
}
/**
* Удаляет инсталятор.
* @return void
*/
public function delInstal() {
$installDir = SITE_DIR.URL::getCutPath().'/install/';
$this->removeDir($installDir);
MG::redirect('');
}
/**
* Удаляет папку со всем ее содержимым.
* @param string $path путь к удаляемой папке.
* @return void
*/
public function removeDir($path) {
if (file_exists($path) && is_dir($path)) {
$dirHandle = opendir($path);
while (false !== ($file = readdir($dirHandle))) {
if ($file != '.' && $file != '..') {// Исключаем папки с назварием '.' и '..'
$tmpPath = $path.'/'.$file;
chmod($tmpPath, 0777);
if (is_dir($tmpPath)) { // Если папка.
$this->removeDir($tmpPath);
} else {
if (file_exists($tmpPath)) {
// Удаляем файл.
unlink($tmpPath);
}
}
}
}
closedir($dirHandle);
// Удаляем текущую папку.
if (file_exists($path)) {
rmdir($path);
return true;
}
}
}
/**
* Добавляет картинку для использования в визуальном редакторе.
* @return boolean
*/
public function upload() {
new Upload();
}
/**
* Подключает elfinder.
* @return boolean
*/
public function elfinder() {
include('mg-core/script/elfinder/php/connector.php');
}
/**
* Добавляет водяной знак.
* @return boolean
*/
public function updateWaterMark() {
$uploader = new Upload(false);
$tempData = $uploader->addImage(false, true);
$this->data = array('img' => $tempData['actualImageName']);
if ($tempData['status'] == 'success') {
$this->messageSucces = $tempData['msg'];
return true;
} else {
$this->messageError = $tempData['msg'];
return false;
}
}
/**
* Обрабатывает запрос на установку плагина.
* @return boolean
*/
public function addNewPlugin() {
if (isset($_POST) && 'POST' == $_SERVER['REQUEST_METHOD']) {
$file_array = $_FILES['addPlugin'];
$downloadResult = PM::downloadPlugin($file_array);
if ($downloadResult['data']) {
$this->messageSucces = $downloadResult['msg'];
PM::extractPluginZip($downloadResult['data']);
return true;
} else {
$this->messageError = $downloadResult['msg'];
}
}
return false;
}
/**
* Обрабатывает запрос на установку шаблона.
* @return boolean
*/
public function addNewTemplate() {
if (isset($_POST) && 'POST' == $_SERVER['REQUEST_METHOD']) {
$file_array = $_FILES['addTempl'];
//имя шаблона
$name = $file_array['name'];
//его размер
$size = $file_array['size'];
//временная папка архива плагина
$path = 'mg-templates/';
//поддерживаемые форматы
$validFormats = array('zip');
$lang = MG::get('lang');
if (strlen($name)) {
$fullName = explode('.', $name);
$ext = array_pop($fullName);
$name = implode('.', $fullName);
if (in_array($ext, $validFormats)) {
if ($size < (1024 * 1024 * 10)) {
$actualName = $name.'.'.$ext;
$tmp = $file_array['tmp_name'];
if (move_uploaded_file($tmp, $path.$actualName)) {
$data = $path.$actualName;
$msg = $this->lang['TEMPL_UPLOAD'];
} else {
$msg = $this->lang['TEMPL_UPLOAD_ERR'];
}
} else {
$msg = $this->lang['TEMPL_UPLOAD_ERR2'];
}
} else {
$msg = $this->lang['TEMPL_UPLOAD_ERR3'];
}
} else {
$msg = $this->lang['TEMPL_UPLOAD_ERR4'];
}
if ($data) {
$this->messageSucces = $msg;
if (file_exists($data)) {
$zip = new ZipArchive;
$res = $zip->open($data, ZIPARCHIVE::CREATE);
if ($res === TRUE) {
$zip->extractTo($path);
$zip->close();
unlink($data);
return true;
}
}
$this->messageError = 'Не удалось распаковать шаблон!';
return false;
} else {
$this->messageError = $msg;
}
}
return false;
}
/**
* Обрабатывает запрос на удаление плагина.
* @return boolean
*/
public function deletePlugin() {
$this->messageSucces = $this->lang['ACT_PLUGIN_DEL'].$_POST['id'];
$this->messageError = $this->lang['ACT_PLUGIN_DEL_ERR'];
// удаление картинки с сервера.
$documentroot = str_replace('mg-core/lib', '', dirname(__FILE__));
if (PM::deletePlagin($_POST['id']) && $this->removeDir($documentroot.'mg-plugins/'.$_POST['id']
)
) {
return true;
}
return false;
}
/**
* Добавляет картинку товара.
* @return boolean
*/
public function addImage() {
$uploader = new Upload(false);
$tempData = $uploader->addImage(true);
$this->data = array('img' => $tempData['actualImageName']);
if ($tempData['status'] == 'success') {
$this->messageSucces = $tempData['msg'];
return true;
} else {
$this->messageError = $tempData['msg'];
return false;
}
}
/**
* Добавляет картинку без водяного знака.
* @return boolean
*/
public function addImageNoWaterMark() {
$uploader = new Upload(false);
$_POST['noWaterMark'] = true;
$tempData = $uploader->addImage(true);
$this->data = array('img' => $tempData['actualImageName']);
$documentroot = str_replace('mg-core'.DIRECTORY_SEPARATOR.'lib', '', dirname(__FILE__));
if ($tempData['status'] == 'success') {
$this->messageSucces = $tempData['msg'];
if($_GET['oldimage']!='undefined'){
if(file_exists($documentroot.'uploads'.DIRECTORY_SEPARATOR.$_GET['oldimage'])){
// если старая картинка используется только в одном варианте, то она будет удалена
$res = DB::query('SELECT image FROM '.PREFIX.'product_variant WHERE image = '.DB::quote($_GET['oldimage']));
if(DB::numRows($res)===1){
unlink($documentroot.'uploads'.DIRECTORY_SEPARATOR.$_GET['oldimage']);
}
}
}
return true;
} else {
$this->messageError = $tempData['msg'];
return false;
}
}
/**
* Удаляет категорию.
* @return type
*/
public function deleteCategory() {
$this->messageSucces = $this->lang['ACT_DEL_CAT'];
$this->messageError = $this->lang['ACT_NOT_DEL_CAT'];
return MG::get('category')->delCategory($_POST['id']);
}
/**
* Удаляет страницу.
* @return type
*/
public function deletePage() {
$this->messageSucces = $this->lang['ACT_DEL_PAGE'];
$this->messageError = $this->lang['ACT_NOT_DEL_PAGE'];
return MG::get('pages')->delPage($_POST['id']);
}
/**
* Удаляет пользователя.
* @return type
*/
public function deleteUser() {
$this->messageSucces = $this->lang['ACT_DEL_USER'];
$this->messageError = $this->lang['ACT_NOT_DEL_USER'];
return USER::delete($_POST['id']);
}
/**
* Удаляет товар.
* @return type
*/
public function deleteProduct() {
$this->messageSucces = $this->lang['ACT_DEL_PROD'];
$this->messageError = $this->lang['ACT_NOT_DEL_PROD'];
$model = new Models_Product;
return $model->deleteProduct($_POST['id']);
}
/**
* Удаляет заказ.
* @return type
*/
public function deleteOrder() {
$this->messageSucces = $this->lang['ACT_DEL_ORDER'];
$this->messageError = $this->lang['ACT_NOT_DEL_ORDER'];
$model = new Models_Order;
$this->data = array('count' => $model->getNewOrdersCount());
return $model->deleteOrder($_POST['id']);
}
/**
* Удаляет пользовательскую характеристику товара.
* @return type
*/
public function deleteUserProperty() {
$this->messageSucces = $this->lang['ACT_DEL_PROP'];
$this->messageError = $this->lang['ACT_NOT_DEL_PROP'];
$result = false;
if (DB::query('
DELETE
FROM `'.PREFIX.'property`
WHERE id = %d', $_POST['id']) &&
DB::query('
DELETE
FROM `'.PREFIX.'product_user_property`
WHERE property_id = %d', $_POST['id'])
) {
$result = true;
}
return $result;
}
/**
* Удаляет категорию.
* @return boolean
*/
public function editCategory() {
$this->messageSucces = $this->lang['ACT_EDIT_CAT'].' "'.$_POST['title'].'"';
$this->messageError = $this->lang['ACT_NOT_EDIT_CAT'];
$id = $_POST['id'];
unset($_POST['id']);
// Если назначаемая категория, является тойже.
if ($_POST['parent'] == $id) {
$this->messageError = $this->lang['ACT_ERR_EDIT_CAT'];
return false;
}
$childsCaterory = MG::get('category')->getCategoryList($id);
// Если есть вложенные, и одна из них назначена родительской.
if (!empty($childsCaterory)) {
foreach ($childsCaterory as $cateroryId) {
if ($_POST['parent'] == $cateroryId) {
$this->messageError = $this->lang['ACT_ERR_EDIT_CAT'];
return false;
}
}
}
if ($_POST['parent'] == $id) {
$this->messageError = $this->lang['ACT_ERR_EDIT_CAT'];
return false;
}
return MG::get('category')->editCategory($id, $_POST);
}
/**
* Сохраняет курс валют
* @return boolean
*/
public function saveCurrency() {
$this->messageSucces = $this->lang['ACT_SAVE_CURR'];
$this->messageError = $this->lang['ACT_NOT_SAVE_CURR'];
foreach ($_POST['data'] as $currency) {
$currencyShopRate[$currency['iso']] = $currency['rate'];
$currencyShopShort[$currency['iso']] = $currency['short'];
}
MG::setOption(array('option' => 'currencyRate', 'value' => addslashes(serialize($currencyShopRate))));
MG::setOption(array('option' => 'currencyShort', 'value' => addslashes(serialize($currencyShopShort))));
$product = new Models_Product();
$product->updatePriceCourse(MG::getSetting('currencyShopIso'));
return true;
}
/** Применяет скидку/наценку ко всем вложенным подкатегориям
*/
public function applyRateToSubCategory() {
MG::get('category')->applyRateToSubCategory($_POST['id']);
return true;
}
/**
* Отменяет скидку и наценку для выбраной категории
* @return boolean
*/
public function clearCategoryRate() {
$this->messageSucces = $this->lang['ACT_CLEAR_CAT_RATE'];
MG::get('category')->clearCategoryRate($_POST['id']);
return true;
}
/**
* Сохраняет и обновляет параметры товара.
* @return type
*/
public function saveProduct() {
$this->messageSucces = $this->lang['ACT_SAVE_PROD'];
$this->messageError = $this->lang['ACT_NOT_SAVE_PROD'];
//Перед сохранением удалим все помеченные картинки продукта физически с диска.
$images = explode("|", $_POST['image_url']);
$model = new Models_Product;
if (!is_numeric($_POST['count'])) {
$_POST['count'] = "-1";
}
// исключаем дублированные артикулы в строке связаных товаров
if(!empty($_POST['related'])){
$_POST['related'] = implode(',',array_unique(explode(',', $_POST['related'])));
}
if(!empty($_POST['userProperty'])){
foreach($_POST['userProperty'] as $k=>$v){
$_POST['userProperty'][$k] = htmlspecialchars_decode($v);
}
}
//Обновление
if (!empty($_POST['id'])) {
$_POST['updateFromModal'] = true; // флаг, чтобы отличить откуда было обновление товара
$model->updateProduct($_POST);
$_POST['image_url'] = $images[0];
$_POST['currency'] = MG::getSetting('currency');
$_POST['recommend'] = $_POST['recommend'];
$tempProd = $model->getProduct($_POST['id']);
$_POST['category_url'] = $tempProd['category_url'];
$_POST['product_url'] = $tempProd['product_url'];
$this->data = $_POST;
} else { // добавление
unset($_POST['delete_image']);
$this->data = $model->addProduct($_POST);
$this->data['image_url'] = $images[0];
$this->data['currency'] = MG::getSetting('currency');
$this->data['recommend'] = $_POST['recommend'];
}
return true;
}
/**
* Обновляет параметры товара (быстрый вариант).
* @return type
*/
public function fastSaveProduct() {
$this->messageSucces = $this->lang['ACT_SAVE_PROD'];
$this->messageError = $this->lang['ACT_NOT_SAVE_PROD'];
$model = new Models_Product;
$variant = $_POST['variant'];
unset($_POST['variant']);
$arr = array(
$_POST['field'] => $_POST['value']
);
// Обновление.
if ($variant) {
return $model->fastUpdateProductVariant($_POST['id'], $arr, $_POST['product_id']);
} else {
return $model->fastUpdateProduct($_POST['id'], $arr);
}
}
/**
* Перезаписывает новым значением, любое поле в любой таблице, в зависимости от входящих параметров.
*/
public function fastSaveContent() {
if (!DB::query('
UPDATE `'.DB::quote($_POST['table'], true).'`
SET `'.DB::quote($_POST['field'], true).'` = '.DB::quote($_POST['content']).'
WHERE id = '.DB::quote($_POST['id'], true))) {
return false;
}
return true;
}
/**
* Устанавливает флаг для вывода продукта в блоке рекомендуемых товаров.
* @return type
*/
public function recomendProduct() {
$this->messageError = 'Доступно только в полной версии Moguta.CMS';
return false;
}
/**
* Устанавливает флаг активности продукта
* @return type
*/
public function visibleProduct() {
$this->messageSucces = $this->lang['ACT_V_PROD'];
$this->messageError = $this->lang['ACT_UNV_PROD'];
$model = new Models_Product;
// Обновление.
if (!empty($_POST['id'])) {
$model->updateProduct($_POST);
}
if ($_POST['activity']) {
return true;
}
return false;
}
/**
* Устанавливает флаг активности пользовательской характеристики
* @return type
*/
public function visibleProperty() {
$this->messageSucces = $this->lang['ACT_V_PROP'];
$this->messageError = $this->lang['ACT_UNV_PROP'];
// Обновление.
if (!empty($_POST['id'])) {
DB::query("
UPDATE `".PREFIX."property`
SET `activity`= ".DB::quote($_POST['activity'])."
WHERE `id` = ".DB::quote($_POST['id'], true)
);
}
if ($_POST['activity']) {
return true;
}
return false;
}
/**
* Устанавливает флаг для вывода продукта в блоке новых товаров.
* @return type
*/
public function newProduct() {
$this->messageSucces = $this->lang['ACT_PRINT_NEW'];
$this->messageError = $this->lang['ACT_NOT_PRINT_NEW'];
$model = new Models_Product;
// Обновление.
if (!empty($_POST['id'])) {
$model->updateProduct($_POST);
}
if ($_POST['new']) {
return true;
}
return false;
}
/**
* Устанавливает флаг для выбранной страницы, чтобы выводить ее в главном меню.
* @return type
*/
public function printMainMenu() {
$this->messageSucces = $this->lang['ADD_IN_MENU'];
$this->messageError = $this->lang['NOT_ADD_IN_MENU'];
// Обновление.
if (!empty($_POST['id'])) {
MG::get('pages')->updatePage($_POST);
}
if ($_POST['print_in_menu']) {
return true;
}
return false;
}
/**
* Печать заказа.
*/
public function printOrder() {
$this->messageSucces = $this->lang['ACT_PRINT_ORD'];
$model = new Models_Order;
$this->data = array('html' => $model->printOrder($_POST['id']));
return true;
}
/**
* Получает данные по промокоду.
*/
public function getPromoCode() {
$this->messageSucces = 'Промокод применен';
// Заменить на получение скидки.
$codes = array();
// Запрос для проверки , существуют ли промокоды.
$result = DB::query('SHOW TABLES');
while ($row = DB::fetchArray($result)) {
if (PREFIX.'promo-code' == $row[0]) {
$res = DB::query('SELECT code, percent FROM `'.PREFIX.'promo-code` WHERE invisible = 1');
while ($code = DB::fetchAssoc($res)) {
$codes[$code['code']] = $code['percent'];
}
};
}
$percent = $codes[$_POST['promocode']];
$this->data = array('percent' => $percent, 'codes' => array('DEFAULT-DISCONT', 'DEFAULT-DISCONT2'));
return true;
}
/**
* Получает данные по вводимому email в форме заказа.
* @return boolean
*/
public function getUserEmail() {
$emails = array('mark-avdeev@mail.ru', 'mark-avdeev2@mail.ru');
$this->data = $emails;
return true;
}
/**
* Сохраняет и обновляет параметры заказа.
* @return type
*/
public function saveOrder() {
$this->messageSucces = $this->lang['ACT_SAVE_ORD'];
$this->messageError = $this->lang['ACT_SAVE_ORDER'];
// Cобираем воедино все параметры от юр. лица если они были переданы, для записи в информацию о заказе.
$_POST['yur_info'] = '';
if (!empty($_POST['inn'])) {
$_POST['yur_info'] = array(
'email' => $_POST['orderEmail'],
'name' => $_POST['orderBuyer'],
'address' => $_POST['orderAddress'],
'phone' => $_POST['orderPhone'],
'inn' => $_POST['inn'],
'kpp' => $_POST['kpp'],
'nameyur' => $_POST['nameyur'],
'adress' => $_POST['adress'],
'bank' => $_POST['bank'],
'bik' => $_POST['bik'],
'ks' => $_POST['ks'],
'rs' => $_POST['rs'],
);
}
$model = new Models_Order;
// Обновление.
if (!empty($_POST['id'])) {
unset($_POST['inn']);
unset($_POST['kpp']);
unset($_POST['nameyur']);
unset($_POST['adress']);
unset($_POST['bank']);
unset($_POST['bik']);
unset($_POST['ks']);
unset($_POST['rs']);
unset($_POST['ogrn']);
if (!empty($_POST['yur_info'])) {
$_POST['yur_info'] = addslashes(serialize($_POST['yur_info']));
}
foreach($_POST['order_content'] as &$item){
foreach($item as &$v){
$v = rawurldecode($v);
}
}
$_POST['order_content'] = addslashes(serialize($_POST['order_content']));
$model->updateOrder($_POST);
} else {
return false;
}
$_POST['count'] = $model->getNewOrdersCount();
$_POST['date'] = MG::dateConvert(date('d.m.Y H:i'));
$this->data = $_POST;
return true;
}
/**
* Сохраняет и обновляет параметры категории.
* @return type
*/
public function saveCategory() {
$this->messageSucces = $this->lang['ACT_SAVE_CAT'];
$this->messageError = $this->lang['ACT_NOT_SAVE_CAT'];
$_POST['image_url'] = $_POST['image_url']?str_replace(SITE, '', $_POST['image_url']):'';
$_POST['parent_url'] = MG::get('category')->getParentUrl($_POST['parent']);
// Обновление.
if (!empty($_POST['id'])) {
if (MG::get('category')->updateCategory($_POST)) {
$this->data = $_POST;
} else {
return false;
}
} else { // добавление
$this->data = MG::get('category')->addCategory($_POST);
}
return true;
}
/**
* Сохраняет и обновляет параметры страницы.
* @return type
*/
public function savePage() {
$this->messageSucces = $this->lang['ACT_SAVE_PAGE'];
$this->messageError = $this->lang['ACT_NOT_SAVE_PAGE'];
$_POST['parent_url'] = MG::get('pages')->getParentUrl($_POST['parent']);
// Обновление.
if (!empty($_POST['id'])) {
if (MG::get('pages')->updatePage($_POST)) {
$this->data = $_POST;
} else {
return false;
}
} else { // добавление
$this->data = MG::get('pages')->addPage($_POST);
}
return true;
}
/**
* Делает страницу невидимой в меню.
* @return type
*/
public function invisiblePage() {
$this->messageError = $this->lang['ACT_NOT_SAVE_PAGE'];
if ($_POST['invisible'] === "1") {
$this->messageSucces = $this->lang['ACT_UNV_PAGE'];
} else {
$this->messageSucces = $this->lang['ACT_V_PAGE'];
}
// Обновление.
if (!empty($_POST['id']) && isset($_POST['invisible'])) {
MG::get('pages')->updatePage($_POST);
} else {
return false;
}
return true;
}
/**
* Делает категорию невидимой в меню.
* @return type
*/
public function invisibleCat() {
$this->messageError = $this->lang['ACT_NOT_SAVE_CAT'];
if ($_POST['invisible'] === "1") {
$this->messageSucces = $this->lang['ACT_UNV_CAT'];
} else {
$this->messageSucces = $this->lang['ACT_V_CAT'];
}
// Обновление.
if (!empty($_POST['id']) && isset($_POST['invisible'])) {
MG::get('category')->updateCategory($_POST);
} else {
return false;
}
return true;
}
/**
* Делает все категории видимыми в меню.
* @return type
*/
public function refreshVisibleCat() {
MG::get('category')->refreshVisibleCat();
$this->messageSucces = $this->lang['ACT_PINT_IN_MENU'];
return true;
}
/**
* Делает все страницы видимыми в меню.
* @return type
*/
public function refreshVisiblePage() {
MG::get('pages')->refreshVisiblePage();
$this->messageSucces = $this->lang['ACT_PINT_IN_MENU'];
return true;
}
/**
* Сохраняет и обновляет параметры пользователя.
* @return type
*/
public function saveUser() {
$this->messageSucces = $this->lang['ACT_SAVE_USER'];
$this->messageError = $this->lang['ACT_NOT_SAVE_USER'];
// Обновление.
if (!empty($_POST['id'])) {
// если пароль не передан значит не обновляем его
if (empty($_POST['pass'])) {
unset($_POST['pass']);
} else {
$_POST['pass'] = crypt($_POST['pass']);
}
//вычисляем надо ли перезаписать данные текущего пользователя после обновления
//(только в том случае если из админки меняется запись текущего пользователя)
$authRewrite = $_POST['id'] != User::getThis()->id ? true : false;
// если происходит попытка создания нового администратора от лица модератора, то вывести ошибку
if($_POST['role']=='1'){
if(!USER::AccessOnly('1')){
return false;
}
}
if (User::update($_POST['id'], $_POST, $authRewrite)) {
$this->data = $_POST;
} else {
return false;
}
} else { // добавление
if($_POST['role']=='1'){
if(!USER::AccessOnly('1')){
return false;
}
}
try {
$_POST['id'] = User::add($_POST);
} catch (Exception $exc) {
$this->messageError = $this->lang['ACT_ERR_SAVE_USER'];
return false;
}
//отправка письма с информацией о регистрации
$siteName = MG::getSetting('sitename');
$userEmail = $_POST['email'];
$message = '
Здравствуйте!<br>
Вы получили данное письмо так как на сайте '.$siteName.' зарегистрирован новый пользователь с логином '.$userEmail.'.<br>
Отвечать на данное сообщение не нужно.';
$emailData = array(
'nameFrom' => $siteName,
'emailFrom' => MG::getSetting('noReplyEmail'),
'nameTo' => 'Пользователю сайта '.$siteName,
'emailTo' => $userEmail,
'subject' => 'Активация пользователя на сайте '.$siteName,
'body' => $message,
'html' => true
);
Mailer::sendMimeMail($emailData);
$_POST['date_add'] = date('d.m.Y H:i');
$this->data = $_POST;
}
return true;
}
/**
* Изменяет настройки.
* @return boolean
*/
public function editSettings() {
$this->messageSucces = $this->lang['ACT_SAVE_SETNG'];
if (!empty($_POST['options'])) {
// если произошла смена валюты магазина, то пересчитываем курсы
$currencyShopIso = MG::getSetting('currencyShopIso');
if($_POST['options']['currencyShopIso']!=MG::getSetting('currencyShopIso')){
$currencyRate = MG::getSetting('currencyRate');
$currencyShort = MG::getSetting('currencyShort');
$product = new Models_Product();
$product->updatePriceCourse($_POST['options']['currencyShopIso']);
// $currencyRate[$currencyShopIso] = 1/$currencyRate[$_POST['options']['currencyShopIso']];
$rate = $currencyRate[$_POST['options']['currencyShopIso']];
$currencyRate[$_POST['options']['currencyShopIso']] = 1;
foreach ($currencyRate as $iso => $value) {
if($iso!=$_POST['options']['currencyShopIso']){
if(!empty($rate)){
$currencyRate[$iso] = $value / $rate;
}
}
}
MG::setOption(array('option' => 'currencyRate', 'value' => addslashes(serialize($currencyRate))));
// echo $_POST['options']['currencyShopIso'];
}
foreach ($_POST['options'] as $option => $value) {
if (!DB::query("UPDATE `".PREFIX."setting` SET `value`=".DB::quote($value)." WHERE `option`=".DB::quote($option)."")) {
return false;
}
}
return true;
}
}
/**
* Получает параметры редактируемого продукта.
*/
public function getProductData() {
$this->messageError = $this->lang['ACT_NOT_GET_POD'];
$model = new Models_Product;
$product = $model->getProduct($_POST['id']);
$product['title'] = htmlspecialchars_decode($product['title']);
if (empty($product)) {
return false;
}
$this->data = $product;
// Получаем весь набор пользовательских характеристик.
$res = DB::query("SELECT * FROM `".PREFIX."property`");
while ($userFields = DB::fetchAssoc($res)) {
$this->data['allProperty'][] = $userFields;
}
$variants = $model->getVariants($_POST['id']);
foreach ($variants as $variant) {
$this->data['variants'][] = $variant;
}
$stringRelated = ' null';
$sortRelated = array();
foreach (explode(',',$product['related']) as $item) {
$stringRelated .= ','.DB::quote($item);
if(!empty($item)){
$sortRelated[$item] = $item;
}
}
$stringRelated = substr($stringRelated, 1);
//$productsRelated = $model->getProductByUserFilter(' id IN ('.($product['related']?$product['related']:'0').')');
$res = DB::query('
SELECT CONCAT(c.parent_url,c.url) as category_url,
p.url as product_url, p.id, p.image_url,p.price,p.title,p.code
FROM `'.PREFIX.'product` p
LEFT JOIN `'.PREFIX.'category` c
ON c.id = p.cat_id
WHERE p.code IN ('.$stringRelated.')');
while ($row = DB::fetchAssoc($res)) {
$img = explode('|',$row['image_url']);
$row['image_url'] = $img[0];
$sortRelated[$row['code']] = $row;
}
$productsRelated = array();
//сортируем связанные товары в том порядке, в котором они идут в строке артикулов
if(!empty($sortRelated)){
foreach ($sortRelated as $item) {
if(is_array($item)){
$productsRelated[] = $item;
}
}
}
$this->data['relatedArr'] = $productsRelated;
$_POST['produtcId'] = $_POST['id'];
$_POST['categoryId'] = $product['cat_id'];
$tempDataResult = $this->data;
$this->data = null;
$this->getProdDataWithCat();
$tempDataResult['prodData'] = $this->data;
$this->data = $tempDataResult;
//$this->data['prodData'] = $this->getProdDataWithCat();
return true;
}
/**
* Получает параметры для категории продуктов.
*/
public function getProdDataWithCat() {
$this->data['allProperty'] = array();
$this->data['thisUserFields'] = array();
// Получаем заданные ранее пользовательские характеристики для редактируемого товара.
$res = DB::query("
SELECT pup.property_id, pup.value, pup.product_margin, pup.type_view, prop.*
FROM `".PREFIX."product_user_property` as pup
LEFT JOIN `".PREFIX."property` as prop ON pup.property_id = prop.id
WHERE pup.`product_id` = ".DB::quote($_POST['produtcId']));
while ($userFields = DB::fetchAssoc($res)) {
$this->data['thisUserFields'][] = $userFields;
}
// Получаем набор пользовательских характеристик предназначенных для выбраной категории.
$res = DB::query("
SELECT *
FROM `".PREFIX."category_user_property` as сup
LEFT JOIN `".PREFIX."property` as prop ON сup.property_id = prop.id
WHERE сup.`category_id` = ".DB::quote($_POST['categoryId']));
$alreadyProp = array();
while ($userFields = DB::fetchAssoc($res)) {
$this->data['allProperty'][] = $userFields;
$alreadyProp[$userFields['property_id']] = true;
}
// Получаем набор пользовательских характеристик.
// Предназначенных для всех категорий и приплюсовываем его к уже имеющимя характеристикам выбраной категории.
$res = DB::query("SELECT * FROM `".PREFIX."property` WHERE all_category = 1");
while ($userFields = DB::fetchAssoc($res)) {
if (empty($alreadyProp[$userFields['id']])) {
$this->data['allProperty'][] = $userFields;
$alreadyProp[$userFields['id']];
}
}
return true;
}
/**
* Получает пользовательские поля для добавления нового продукта.
*/
public function getUserProperty() {
$res = DB::query("SELECT * FROM `".PREFIX."property` ORDER BY sort DESC");
while ($userFields = DB::fetchAssoc($res)) {
$this->data['allProperty'][] = $userFields;
}
return true;
}
/**
* Получает привязку пользовательского свойства к набору категорий.
*/
public function getConnectionCat() {
$id = $_POST['id'];
$categoryIds = array();
// Получчаем список выбраных категорий дл данной характеристики.
$res = DB::query("
SELECT category_id
FROM `".PREFIX."category_user_property` as сup
WHERE сup.`property_id` = %s", $id);
while ($row = DB::fetchAssoc($res)) {
$categoryIds[] = $row['category_id'];
}
$this->data['selectedCatIds'] = implode(',', $categoryIds);
$listCategories = MG::get('category')->getCategoryTitleList(0);
$arrayCategories = MG::get('category')->getHierarchyCategory(0);
$html = MG::get('category')->getTitleCategory($arrayCategories, 0);
$this->data['optionHtml'] = $html;
return true;
}
/**
* Добавляет новую характеристику.
*/
public function addUserProperty() {
$this->messageSucces = $this->lang['ACT_ADD_POP'];
$res = DB::query("
INSERT INTO `".PREFIX."property`
VALUES ('','-','string','-','','1','1','')"
);
if ($id = DB::insertId()) {
DB::query("
UPDATE `".PREFIX."property`
SET `sort`=`id` WHERE `id` = ".DB::quote($id)
);
$this->data['allProperty'] = array(
'id' => $id,
'name' => '-',
'type' => 'string',
'data' => '-',
'default' => '',
'activity' => '1',
'sort' => $id,
);
}
return true;
}
/**
* Сохраняет пользовательские настройки для товаров.
*/
public function saveUserProperty() {
$this->messageSucces = $this->lang['ACT_EDIT_POP'];
$id = $_POST['id'];
$array = $_POST;
if (!empty($id)) {
unset($array['id']);
if($array['type'] == 'string'){
$array['data'] = htmlspecialchars_decode($array['data']);
$array['default'] = htmlspecialchars_decode($array['default']);
}
if (DB::query('
UPDATE `'.PREFIX.'property`
SET '.DB::buildPartQuery($array).'
WHERE id ='.DB::quote($id))) {
$result = true;
}
}
return true;
}
/**
* Сохраняет привязку выбранных категорий для характеристики.
*/
public function saveUserPropWithCat() {
$this->messageSucces = $this->lang['ACT_EDIT_POP'];
$category = explode("|", $_POST['category']);
$propId = $_POST['id'];
// удалаляем все привязки характеристики к категориям сделанные ранее
DB::query('
DELETE FROM `'.PREFIX.'category_user_property`
WHERE property_id = '.DB::quote($propId) );
foreach ($category as $cat_id) {
DB::query("
INSERT INTO `".PREFIX."category_user_property`
VALUES ('%s', '%s')"
, $cat_id, $propId);
}
$allCategory = empty($_POST['category']) ? 1 : 0;
// Обновлем флаг , использовать во всех категориях.
DB::query('
UPDATE `'.PREFIX.'property`
SET all_category = '.$allCategory.'
WHERE id = '.DB::quote($propId));
return true;
}
/**
* Получает параметры редактируемого пользователя.
*/
public function getUserData() {
$this->messageError = $this->lang['ACT_GET_USER'];
;
$this->data = USER::getUserById($_POST['id']);
return false;
}
/**
* Получает параметры категории.
*/
public function getCategoryData() {
$this->messageError = $this->lang['ACT_NOT_GET_CAT'];
$result = DB::query("
SELECT * FROM `".PREFIX."category`
WHERE `id` =".DB::quote($_POST['id'])
);
if ($response = DB::fetchAssoc($result)) {
$this->data = $response;
return true;
} else {
return false;
}
return false;
}
/**
* Получает параметры редактируемой страницы.
*/
public function getPageData() {
$this->messageError = $this->lang['ACT_SAVE_SETNG'];
$result = DB::query("
SELECT * FROM `".PREFIX."page`
WHERE `id` =".DB::quote($_POST['id'])
);
if ($response = DB::fetchAssoc($result)) {
$this->data = $response;
return true;
} else {
return false;
}
return false;
}
/**
* Устанавливает порядок сортировки. Меняет местами две категории.
*/
public function changeSortCat() {
$switchId = $_POST['switchId'];
$sequence = explode(',', $_POST['sequence']);
if (!empty($sequence)) {
foreach ($sequence as $item) {
MG::get('category')->changeSortCat($switchId, $item);
}
} else {
$this->messageError = $this->lang['ACT_NOT_GET_CAT'];
return false;
}
$this->messageSucces = $this->lang['ACT_SWITH_CAT'];
return true;
}
/**
* Устанавливает порядок сортировки. Меняет местами две страницы.
*/
public function changeSortPage() {
$switchId = $_POST['switchId'];
$sequence = explode(',', $_POST['sequence']);
if (!empty($sequence)) {
foreach ($sequence as $item) {
//MG::get('category')->changeSortCat($switchId, $item);
MG::get('pages')->changeSortPage($switchId, $item);
}
} else {
$this->messageError = $this->lang['ACT_NOT_GET_PAGE'];
return false;
}
$this->messageSucces = $this->lang['ACT_SWITH_PAGE'];
return true;
}
/**
* Устанавливает порядок сортировки. Меняет местами две записи
*/
public function changeSortRow() {
$switchId = $_POST['switchId'];
$tablename = $_POST['tablename'];
$sequence = explode(',', $_POST['sequence']);
if (!empty($sequence)) {
foreach ($sequence as $item) {
MG::changeRowsTable($tablename, $switchId, $item);
}
} else {
return false;
}
$this->messageSucces = $this->lang['ACT_SWITH'];
return true;
}
/**
* Возвращает ответ в формате JSON.
* @param boolean $flag - если отработаный метод что-то вернул, то ответ считается успешным ждущей его фунции.
* @return boolean
*/
public function jsonResponse($flag) {
if ($flag === null) {
return false;
}
if ($flag) {
$this->jsonResponseSucces($this->messageSucces);
} else {
$this->jsonResponseError($this->messageError);
}
}
/**
* Возвращает положительный ответ с сервера.
* @param string $message
*/
public function jsonResponseSucces($message) {
$result = array(
'data' => $this->data,
'msg' => $message,
'status' => 'success');
echo json_encode($result);
}
/**
* Возвращает отрицательный ответ с сервера.
* @param string $message
*/
public function jsonResponseError($message) {
$result = array(
'data' => $this->data,
'msg' => $message,
'status' => 'error');
echo json_encode($result);
}
/**
* Проверяет актуальность текущей версии системы.
* @return void возвращает в AJAX сообщение о результате операции.
*/
public function checkUpdata() {
$msg = Updata::checkUpdata();
if ($this->lang['ACT_THIS_LAST_VER'] == $msg['msg']) {
$status = 'alert';
} else {
$status = 'success';
}
$response = array(
'msg' => $msg['msg'],
'status' => $status,
);
echo json_encode($response);
exit;
}
/**
* Обновленяет верcию CMS.
*
* @return void возвращает в AJAX сообщение о результате операции.
*/
public function updata() {
$version = $_POST['version'];
if (Updata::updataSystem($version)) {
$msg = $this->lang['ACT_UPDATE_VER'];
$status = 'success';
} else {
$msg = $this->lang['ACT_ERR_UPDATE_VER'];
$status = 'error';
}
$response = array(
'msg' => $msg,
'status' => $status,
);
echo json_encode($response);
}
/**
* Отключает публичную часть сайта. Обычно требуется для внесения изменений администратором.
* @return bool
*/
public function downTime() {
$downtime = MG::getOption('downtime');
if ('Y' == $downtime) {
$activ = 'N';
} else {
$activ = 'Y';
}
$res = DB::query('
UPDATE `'.PREFIX.'setting`
SET `value` = "'.$activ.'"
WHERE `option` = "downtime"
');
if ($res) {
return true;
};
}
/**
* Функцию отправляет на сервер обновления информацию о системе и в случае одобрения скачивает архив с обновлением.
* @return void возвращает в AJAX сообщение загруженную в систему версию.
*/
public function preDownload() {
$this->messageSucces = $this->lang['ACT_UPLOAD_ZIP']." ".$_POST['version'];
$this->messageError = $this->lang['ACT_NOT_UPLOAD_ZIP'];
$result = Updata::preDownload($_POST['version']);
if ($result['status'] == 'error') {
$this->messageError = $result['msg'];
return false;
}
return true;
}
/**
* Установливает загруженный ранее архив с обновлением.
* @return void возвращает в AJAX сообщение о результате операции.
*/
public function postDownload() {
$this->messageSucces = $this->lang['ACT_UPDATE_TRUE'].$_POST['version'];
$this->messageError = $this->lang['ACT_NOT_UPDATE_TRUE'];
$version = $_POST['version'];
if (Updata::extractZip($version.'-m.zip')) {
$this->messageSucces = $this->lang['ACT_UPDATE_VER'];
return true;
} else {
$this->messageError = $this->lang['ACT_ERR_UPDATE_VER'];
return false;
}
return false;
}
/**
* Устанавливает цветовую тему для меню в административном разделе
* @return boolean
*/
public function setTheme() {
if ($_POST['color']) {
MG::setOption(array('option' => 'themeColor', 'value' => $_POST['color']));
MG::setOption(array('option' => 'themeBackground', 'value' => $_POST['background']));
}
return true;
}
/**
* Устанавливает язык в административном разделе.
* @return boolean
*/
public function changeLanguage() {
if ($_POST['language']) {
MG::setOption(array('option' => 'languageLocale', 'value' => $_POST['language']));
}
return true;
}
/**
* Устанавливает количество отображаемых записей в разделе товаров
* @return boolean
*/
public function setCountPrintRowsProduct() {
$count = 20;
if (is_numeric($_POST['count']) && !empty($_POST['count'])) {
$count = $_POST['count'];
}
MG::setOption(array('option' => 'countPrintRowsProduct', 'value' => $count));
return true;
}
/**
* Устанавливает количество отображаемых записей в разделе страницы
* @return boolean
*/
public function setCountPrintRowsPage() {
$count = 20;
if (is_numeric($_POST['count']) && !empty($_POST['count'])) {
$count = $_POST['count'];
}
MG::setOption(array('option' => 'countPrintRowsPage', 'value' => $count));
return true;
}
/**
* Устанавливает количество отображаемых записей в разделе пользователей
* @return boolean
*/
public function setCountPrintRowsOrder() {
$count = 20;
if (is_numeric($_POST['count']) && !empty($_POST['count'])) {
$count = $_POST['count'];
}
MG::setOption(array('option' => 'countPrintRowsOrder', 'value' => $count));
return true;
}
/**
* Устанавливает количество отображаемых записей в разделе заказов
* @return boolean
*/
public function setCountPrintRowsUser() {
$count = 20;
if (is_numeric($_POST['count']) && !empty($_POST['count'])) {
$count = $_POST['count'];
}
MG::setOption(array('option' => 'countPrintRowsUser', 'value' => $count));
return true;
}
/**
* Возвращает список найденых продуктов по ключевому слову
* @return boolean
*/
public function searchProduct() {
$this->messageSucces = $this->lang['SEACRH_PRODUCT'];
$model = new Models_Catalog;
$arr = $model->getListProductByKeyWord($_POST['keyword'], true, false, true);
if(!empty($arr)){
$product = new Models_Product;
foreach ($arr['catalogItems'] as $key => $item) {
if ($item['variant_exist']) {
$variants = $product->getVariants($item['id']);
foreach ($variants as $var) {
$arr['catalogItems'][$key]['variants'][] = $var;
}
}
}
}else{
$arr['catalogItems'] = array();
}
$this->data = $arr['catalogItems'];
return true;
}
/**
* Устанавливает локаль для плагина, используется в JS плагинов
* @return boolean
*/
public function seLocalesToPlug() {
$this->data = PM::plugLocales($_POST['pluginName']);
return true;
}
/**
* Сохранение способа доставки
*/
public function saveDeliveryMethod() {
$this->messageSucces = $this->lang['ACT_SUCCESS'];
$this->messageError = $this->lang['ACT_ERROR'];
$status = $_POST['status'];
$deliveryName = $_POST['deliveryName'];
$deliveryCost = $_POST['deliveryCost'];
$deliveryId = $_POST['deliveryId'];
$free = 0;
$paymentMethod = $_POST['paymentMethod'];
$paymentArray = json_decode($paymentMethod, true);
$deliveryDescription = $_POST['deliveryDescription'];
$deliveryActivity = $_POST['deliveryActivity'];
switch ($status) {
case 'createDelivery':
$sql = "
INSERT INTO `".PREFIX."delivery` (`name`,`cost`, `description`, `activity`,`free`)
VALUES (
'".$deliveryName."', '".$deliveryCost."', '".$deliveryDescription."', '".$deliveryActivity."', '".$free."'
);
";
$result = DB::query($sql);
if ($deliveryId = DB::insertId()) {
$status = 'success';
$msg = $this->lang['ACT_SUCCESS'];
} else {
$status = 'error';
$msg = $this->lang['ACT_ERROR'];
}
foreach ($paymentArray as $paymentId => $compare) {
$sql = "
INSERT INTO `".PREFIX."delivery_payment_compare`
(`compare`,`payment_id`, `delivery_id`)
VALUES (
'".$compare."', '".$paymentId."', '".$deliveryId."'
);
";
$result = DB::query($sql);
}
break;
case 'editDelivery':
$sql = "
UPDATE `".PREFIX."delivery`
SET `name` = '".$deliveryName."',
`cost` = '".$deliveryCost."',
`description` = '".$deliveryDescription."',
`activity` = '".$deliveryActivity."',
`free` = '".$free."'
WHERE id = ".$deliveryId;
$result = DB::query($sql);
foreach ($paymentArray as $paymentId => $compare) {
$result = DB::query("
SELECT *
FROM `".PREFIX."delivery_payment_compare`
WHERE `payment_id` = ".$paymentId."
AND `delivery_id` = ".$deliveryId);
if (!DB::numRows($object)) {
$sql = "
INSERT INTO `".PREFIX."delivery_payment_compare`
(`compare`,`payment_id`, `delivery_id`)
VALUES (
'".$compare."', '".$paymentId."', '".$deliveryId."'
);
";
$result = DB::query($sql);
} else {
$sql = "
UPDATE `".PREFIX."delivery_payment_compare`
SET `compare` = '".$compare."'
WHERE `payment_id` = ".$paymentId."
AND `delivery_id` = ".$deliveryId;
$result = DB::query($sql);
}
}
if ($result) {
$status = 'success';
$msg = $this->lang['ACT_SUCCESS'];
} else {
$status = 'error';
$msg = $this->lang['ACT_ERROR'];
}
}
$response = array(
'data' => array(
'id' => $deliveryId,
),
'status' => $status,
'msg' => $msg,
);
echo json_encode($response);
}
/**
* Удаляет способ доставки.
* @return boolean
*/
public function deleteDeliveryMethod() {
$this->messageSucces = $this->lang['ACT_SUCCESS'];
$this->messageError = $this->lang['ACT_ERROR'];
$res1 = DB::query('DELETE FROM `'.PREFIX.'delivery` WHERE `id`= '.$_POST['id']);
$res2 = DB::query('DELETE FROM `'.PREFIX.'delivery_payment_compare` WHERE `delivery_id`= '.$_POST['id']);
if ($res1 && $res2) {
return true;
}
return false;
}
/**
* Сохраняет способ оплаты.
*/
public function savePaymentMethod() {
$paymentParam = str_replace("'", "'", $_POST['paymentParam']);
$deliveryMethod = $_POST['deliveryMethod'];
$deliveryArray = json_decode($deliveryMethod, true);
$paymentActivity = $_POST['paymentActivity'];
$paymentId = $_POST['paymentId'];
if (is_array($deliveryArray)) {
foreach ($deliveryArray as $deliveryId => $compare) {
$sql = "
UPDATE `".PREFIX."delivery_payment_compare`
SET `compare` = '".$compare."'
WHERE `payment_id` = ".$paymentId."
AND `delivery_id` = ".$deliveryId;
$result = DB::query($sql);
}
}
$sql = "
UPDATE `".PREFIX."payment`
SET `name` = ".DB::quote($_POST['name']).",
`paramArray` = '".$paymentParam."',
`activity` = ".DB::quote($paymentActivity)."
WHERE id = ".$paymentId;
$result = DB::query($sql);
if ($result) {
$status = 'success';
$msg = $this->lang['ACT_SUCCESS'];
} else {
$status = 'error';
$msg = $this->lang['ACT_ERROR'];
}
$sql = "
SELECT *
FROM `".PREFIX."payment`
WHERE id = ".$paymentId;
$result = DB::query($sql);
if ($row = DB::fetchAssoc($result)) {
$paymentParam = $row['paramArray'];
}
$response = array(
'status' => $status,
'msg' => $msg,
'data' => array('paymentParam' => $paymentParam)
);
echo json_encode($response);
}
/**
* Обновляет способов оплаты и доставки при переходе по вкладкам в админке.
*/
public function getMethodArray() {
$mOrder = new Models_Order;
$deliveryArray = $mOrder->getDeliveryMethod();
$response['data']['deliveryArray'] = $deliveryArray;
$paymentArray = array();
$i = 1;
while ($payment = $mOrder->getPaymentMethod($i)) {
$paymentArray[$i] = $payment;
$i++;
}
$response['data']['paymentArray'] = $paymentArray;
echo json_encode($response);
}
/**
* Проверяет наличие подключенного модуля xmlwriter и библиотеки libxml.
*/
public function existXmlwriter() {
$this->messageSucces = 'Начата генерация файла';
$this->messageError = 'Отсутствует необходимое PHP расширение xmlwriter или модуль libxml';
if (LIBXML_VERSION && extension_loaded('xmlwriter')) {
return true;
} else {
return false;
}
}
/**
* Осуществляет импорт данных в таблицы продуктов и категорий.
*/
public function importFromCsv() {
$this->messageSucces = 'Импорт выполнен';
$this->messageError = 'Ошибка';
$importer = new Import();
$importer->ImportFromCSV();
return true;
}
/**
* Получает файл шаблона.
*/
public function getTemplateFile() {
$this->messageError = $this->lang['NOT_FILE_TPL'];
if (file_exists(PATH_TEMPLATE.$_POST['path']) && is_writable(PATH_TEMPLATE.$_POST['path'])) {
$this->data['filecontent'] = file_get_contents(PATH_TEMPLATE.$_POST['path']);
return true;
} else {
$this->data['filecontent'] = "CHMOD = ".substr(sprintf('%o', fileperms(PATH_TEMPLATE.$_POST['path'])), -4);
return true;
}
return false;
}
/**
* Сохраняет файл шаблона.
*/
public function saveTemplateFile() {
$this->messageError = 'Доступно только в полной версии Moguta.CMS';
return false;
}
/**
* Очищает кеш проверки версий и проверяет наличие новой.
*/
public function clearLastUpdate() {
if (!$checkLibs = MG::libExists()) {
MG::setOption('timeLastUpdata', '');
$newVer = Updata::checkUpdata(true);
if (!$newVer) {
$this->messageError = "Пока нет новых версий";
return false;
}
$this->messageSucces = "Доступна новая версия ".$newVer['lastVersion'];
return true;
} else {
$this->messageError = "Невозможно проверить наличие версий. Библиотека CURL отключена";
return false;
}
}
/**
* Получает список продуктов при вводе в поле поиска товара при создании заказа через админку.
*/
public function getSearchData() {
$keyword = URL::getQueryParametr('search');
if (!empty($keyword)) {
$catalog = new Models_Catalog;
$product = new Models_Product;
$currencyRate = MG::getSetting('currencyRate');
$currencyShort = MG::getSetting('currencyShort');
$currencyShopIso = MG::getSetting('currencyShopIso');
$items = $catalog->getListProductByKeyWord($keyword, true, true, true);
// viewData($items);
$blockedProp = $product->noPrintProperty();
foreach ($items['catalogItems'] as $key => $item) {
$propertyFormData = $product->createPropertyForm($param = array(
'id' => $item['id'],
'maxCount' => 999,
'productUserFields' => $item['thisUserFields'],
'action' => "/catalog",
'method' => "POST",
'ajax' => true,
'blockedProp' => $blockedProp,
'noneAmount' => true,
'titleBtn' => "<span>".$this->lang['EDIT_ORDER_14']."</span>",
'blockVariants' => $product->getBlockVariants($item['id']),
'classForButton' => 'addToCart buy-product buy custom-btn',
'printCompareButton' => false,
));
$items['catalogItems'][$key]['price'] = str_replace(",",".", $items['catalogItems'][$key]['price']);
// $items['catalogItems'][$key]['price'] += $propertyFormData['marginPrice'];
// $items['catalogItems'][$key]['currency_iso'] = $items['catalogItems'][$key]['currency_iso']? $items['catalogItems'][$key]['currency_iso']:$currencyShopIso;
// $items['catalogItems'][$key]['price'] *= $currencyRate[$items['catalogItems'][$key]['currency_iso']];
// $items['currency'] = $currencyShort[$items['catalogItems'][$key]['currency_iso']];
$items['catalogItems'][$key]['propertyForm'] = $propertyFormData['html'];
}
}
$searchData = array(
'status' => 'success',
'item' => array(
'keyword' => $keyword,
'count' => $items['numRows'],
'items' => $items,
),
'currency' => MG::getSetting('currency')
);
echo json_encode($searchData);
exit;
}
/**
* Возвращает случайный продукт из ассортимента.
* @return boolean
*/
public function getRandomProd(){
$res = DB::query('
SELECT id
FROM '.PREFIX.'product
WHERE 1=1
ORDER BY RAND() LIMIT 1' );
if($row = DB::fetchAssoc($res)){
$product = new Models_Product();
$prod = $product->getProduct($row['id']);
}else{
return false;
}
$this->data['product'] = $prod;
return true;
}
/**
* Возвращает список заказов для вывода статистики по заданному периоду.
* @return boolean
*/
public function getOrderPeriodStat() {
$model = new Models_Order;
$this->data = $model->getStatisticPeriod($_POST['from_date_stat'], $_POST['to_date_stat']);
return true;
}
/**
* Возвращает список заказов для вывода статистики.
* @return boolean
*/
public function getOrderStat() {
$model = new Models_Order;
$this->data = $model->getOrderStat();
return true;
}
/**
* Выполняет операцию над отмеченными заказами в админке.
* @return boolean
*/
public function operationOrder() {
$model = new Models_Order;
$operation = $_POST['operation'];
if (empty($_POST['orders_id'])) {
$this->messageError = 'Необходимо отметить заказы!';
return false;
}
if ($operation == 'delete') {
$result = $model->deleteOrder(true, $_POST['orders_id']);
} elseif (strpos($operation, 'status_id') === 0 && !empty($_POST['orders_id'])) {
foreach ($_POST['orders_id'] as $orderId) {
$result = $model->updateOrder(array('id' => $orderId, 'status_id' => substr($operation, -1, 1)));
}
}
$this->data = array('count' => $model->getNewOrdersCount());
return $result;
}
/**
* Выполняет операцию над отмеченными характеристиками в админке.
* @return boolean
*/
public function operationProperty() {
$operation = $_POST['operation'];
if (empty($_POST['property_id'])) {
$this->messageError = 'Необходимо отметить характеристики!';
return false;
}
if ($operation == 'delete') {
foreach ($_POST['property_id'] as $propertyId) {
$_POST['id'] = $propertyId;
$this->deleteUserProperty();
}
} elseif(strpos($operation, 'activity') === 0 && !empty($_POST['property_id'])) {
foreach ($_POST['property_id'] as $propertyId) {
$_POST['id'] = $propertyId;
$_POST['activity'] = substr($operation, -1, 1);
$this->visibleProperty();
}
}
return true;
}
/**
* Выполняет операцию над отмеченными товарами в админке.
* @return boolean
*/
public function operationProduct() {
$productModel = new Models_Product();
$operation = $_POST['operation'];
if (empty($_POST['products_id'])) {
$this->messageError = 'Необходимо отметить товары!';
return false;
}
if ($operation == 'delete') {
foreach ($_POST['products_id'] as $productId) {
$productModel->deleteProduct($productId);
}
} elseif(strpos($operation, 'activity') === 0 && !empty($_POST['products_id'])) {
foreach ($_POST['products_id'] as $product) {
$productModel->updateProduct(array('id' => $product, 'activity'=>substr($operation, -1, 1)));
}
} elseif(strpos($operation, 'recommend') === 0 && !empty($_POST['products_id'])) {
foreach ($_POST['products_id'] as $product) {
$productModel->updateProduct(array('id' => $product, 'recommend'=>substr($operation, -1, 1)));
}
}elseif(strpos($operation, 'new') === 0 && !empty($_POST['products_id'])) {
foreach ($_POST['products_id'] as $product) {
$productModel->updateProduct(array('id' => $product, 'new'=>substr($operation, -1, 1)));
}
}elseif(strpos($operation, 'clone') === 0 && !empty($_POST['products_id'])) {
foreach ($_POST['products_id'] as $product) {
$productModel->cloneProduct($product);
}
}elseif(strpos($operation, 'delete') === 0 && !empty($_POST['products_id'])) {
foreach ($_POST['products_id'] as $product) {
$productModel->deleteProduct($product);
}
} elseif (strpos($operation, 'changecur') === 0 && !empty($_POST['products_id'])) {
foreach ($_POST['products_id'] as $product) {
$part = explode('_', $operation);
$iso = $part[1];
$productModel->convertToIso($iso,$_POST['products_id']);
$this->data['clearfilter'] = true;
//$result = $model->updateOrder(array('id' => $orderId, 'status_id' => substr($operation, -1, 1)));
}
}
return true;
}
/**
* Получает параметры заказа
*/
public function getOrderData() {
$model = new Models_Order();
$orderData = $model->getOrder(" id = ".DB::quote($_POST['id']));
$orderData = $orderData[$_POST['id']];
$orderData['yur_info'] = unserialize(stripslashes($orderData['yur_info']));
$orderData['order_content'] = unserialize(stripslashes($orderData['order_content']));
if (!empty($orderData['order_content'])) {
$product = new Models_Product();
foreach($orderData['order_content'] as &$item){
foreach($item as &$v){
$v = rawurldecode($v);
}
}
foreach ($orderData['order_content'] as &$items) {
$res = $product->getProduct($items['id']);
$items['image_url'] = $res['image_url'];
$items['property'] = htmlspecialchars_decode(str_replace('&', '&', $items['property']));
$response['discount'] = $items['discount'];
}
}
//заменить на получение скидки
$codes = array();
$percent = 0;
// Запрос для проверки , существуют ли промокоды.
$result = DB::query('SHOW TABLES');
while ($row = DB::fetchArray($result)) {
if (PREFIX.'promo-code' == $row[0]) {
$res = DB::query('SELECT code, percent FROM `'.PREFIX.'promo-code` WHERE invisible = 1');
while ($code = DB::fetchAssoc($res)) {
$codes[] = $code['code'];
if ($code['code'] == $orderData['order_content'][0]['coupon']) {
$percent = $code['percent'];
}
}
};
}
$response['order'] = $orderData;
$response['order']['discontPercent'] = $percent;
$response['order']['promoCodes'] = $codes;
$deliveryArray = $model->getDeliveryMethod();
$response['deliveryArray'] = $deliveryArray;
$paymentArray = array();
$i = 1;
while ($payment = $model->getPaymentMethod($i)) {
$paymentArray[$i] = $payment;
$i++;
}
$response['paymentArray'] = $paymentArray;
$this->data = $response;
return true;
}
/**
* Устанавливает флаг редактирования сайта.
* @return boolean
*/
public function setSiteEdit() {
Storage::clear();
MG::setOption(array('option' => 'enabledSiteEditor', 'value' => $_POST['enabled']));
return true;
}
/**
* Очишает таблицу с кэшем объектов
* @return boolean
*/
public function clearСache() {
DB::query('TRUNCATE TABLE `'.PREFIX.'cache`');
return true;
}
/**
* Возвращает список найденых продуктов по ключевому слову.
* @return boolean
*/
public function uploadCsvToImport() {
$uploader = new Upload(false);
$tempData = $uploader->addImportCatalogCSV();
$this->data = array('img' => $tempData['actualImageName']);
if ($tempData['status'] == 'success') {
$this->messageSucces = $tempData['msg'];
return true;
} else {
$this->messageError = $tempData['msg'];
return false;
}
}
/**
* Импортирует данные из файла importCatalog.csv.
* @return boolean
*/
public function startImport() {
$this->messageSucces = "Процесс запущен";
$this->messageError = "Неудалось начать импорт";
$import = new Import();
if (empty($_POST['rowId'])) {
unset($_SESSION['stopProcessImportCsv']);
}
if ($_POST['delCatalog'] !== null) {
if ($_POST['delCatalog'] === "true") {
DB::query('TRUNCATE TABLE `'.PREFIX.'cache`');
if($_POST['rowId'] == 0){
DB::query('TRUNCATE TABLE `'.PREFIX.'product_variant`');
DB::query('TRUNCATE TABLE `'.PREFIX.'product`');
DB::query('TRUNCATE TABLE `'.PREFIX.'product_user_property`');
DB::query('TRUNCATE TABLE `'.PREFIX.'category`');
DB::query('TRUNCATE TABLE `'.PREFIX.'category_user_property`');
}
}
}
$this->data = $import->startUpload($_POST['rowId']);
return true;
}
/**
* Останавливает процесс импорта каталога из файла importCatalog.csv.
* @return boolean
*/
public function canselImport() {
$this->messageSucces = "Процесс прерван пользователем";
$this->messageError = "Неудалось отменить импорт";
$import = new Import();
$import->stopProcess();
return true;
}
/**
* Сохраняет реквизиты в настройках заказа.
* @return boolean
*/
public function savePropertyOrder() {
$this->messageSucces = "Настройки сохранены";
$this->messageError = "Неудалось сохранить настройки";
$propertyOrder = serialize($_POST);
$propertyOrder = addslashes($propertyOrder);
MG::setOption(array('option' => 'propertyOrder', 'value' => $propertyOrder));
return true;
}
}