pax_global_header00006660000000000000000000000064135431555200014515gustar00rootroot0000000000000052 comment=aaaeae2e195c9260a15e0b0621bbc4e18ea9b2ba Okay/000077500000000000000000000000001354315552000117645ustar00rootroot00000000000000Okay/Core/000077500000000000000000000000001354315552000126545ustar00rootroot00000000000000Okay/Core/Config.php000066400000000000000000000106301354315552000145720ustar00rootroot00000000000000configFile = $configFile; $this->configLocalFile = $configLocalFile; $this->initConfig(); } /*Выборка настройки*/ public function __get($name) { if ($name == 'root_url') { throw new \Exception('Config::root_url is remove. Use Request::getRootUrl()'); } if ($name == 'subfolder') { throw new \Exception('Config::subfolder is remove. Use Request::getSubDir()'); } if (isset($this->vars[$name])) { return $this->vars[$name]; } return null; } /*Запись данных в конфиг*/ public function __set($name, $value) { if (!isset($this->vars[$name]) && !isset($this->localVars[$name])) { return; } // Определяем в каком файле конфига переопределять значения if (isset($this->localVars[$name])) { $configFile = $this->configLocalFile; } else { $configFile = $this->configFile; } $conf = file_get_contents($configFile); $conf = preg_replace("/".$name."\s*=.*\n/i", $name.' = '.$value."\r\n", $conf); $cf = fopen($configFile, 'w'); fwrite($cf, $conf); fclose($cf); $this->vars[$name] = $value; } /*Формирование токена*/ public function token($text) { return md5($text.$this->salt); } /*Проверка токена*/ public function checkToken($text, $token) { if(!empty($token) && $token === $this->token($text)) { return true; } return false; } private function initConfig() { /*Читаем настройки из дефолтного файла*/ $ini = parse_ini_file($this->configFile); /*Записываем настройку как переменную класса*/ foreach ($ini as $var=>$value) { $this->vars[$var] = $value; } /*Заменяем настройки, если есть локальный конфиг*/ if (file_exists($this->configLocalFile)) { $ini = parse_ini_file($this->configLocalFile); foreach ($ini as $var => $value) { $this->localVars[$var] = $this->vars[$var] = $value; } } // Вычисляем DOCUMENT_ROOT вручную, так как иногда в нем находится что-то левое $localPath = getenv("SCRIPT_NAME"); $absolutePath = getenv("SCRIPT_FILENAME"); $_SERVER['DOCUMENT_ROOT'] = substr($absolutePath,0, strpos($absolutePath, $localPath)); // Определяем корневую директорию сайта $this->vars['root_dir'] = dirname(dirname(__DIR__)).'/'; // Максимальный размер загружаемых файлов $max_upload = (int)(ini_get('upload_max_filesize')); $max_post = (int)(ini_get('post_max_size')); $memory_limit = (int)(ini_get('memory_limit')); $this->vars['max_upload_filesize'] = min($max_upload, $max_post, $memory_limit)*1024*1024; // Соль (разная для каждой копии сайта, изменяющаяся при изменении config-файла) $s = stat($this->configFile); $this->vars['salt'] = md5(md5_file($this->configFile).$s['dev'].$s['ino'].$s['uid'].$s['mtime']); // Часовой пояс if (!empty($this->vars['php_timezone'])) { date_default_timezone_set($this->vars['php_timezone']); } } } Okay/Core/Database.php000066400000000000000000000246371354315552000151050ustar00rootroot00000000000000pdo = $pdo; $this->license = $license; $this->logger = $logger; $this->dbParams = (object)$dbParams; $this->queryFactory = $queryFactory; $this->pdo->connect(); if (!empty($this->dbParams->db_names)) { $sql = $this->queryFactory->newSqlQuery(); $sql->setStatement("SET NAMES '{$this->dbParams->db_names}'"); $this->query($sql); } if (!empty($this->dbParams->db_sql_mode)) { $sql = $this->queryFactory->newSqlQuery(); $sql->setStatement('SET SESSION SQL_MODE = "' . $this->dbParams->db_sql_mode . '"'); $this->query($sql); } if (!empty($this->dbParams->db_timezone)) { $sql = $this->queryFactory->newSqlQuery(); $sql->setStatement('SET time_zone = "' . $this->dbParams->db_timezone . '"'); $this->query($sql); } } /** * В деструкторе отсоединяемся от базы */ public function __destruct() { $this->pdo->disconnect(); } /** * @param QueryInterface $query * @param bool $debug * @return bool */ public function query(QueryInterface $query, $debug = false) { $result = true; try { $this->affectedRows = null; // Получаем все плейсхолдеры $bind = $query->getBindValues(); // Подготавливаем запрос для выполнения добавляя данные из плейсхолдеров $this->result = $this->pdo->perform( $this->tablePrefix($query), $bind ); $this->affectedRows = $this->result->rowCount(); if ($debug === true) { print $this->debug($bind) . PHP_EOL . PHP_EOL; } } catch (\Exception $e) { $log = 'Sql query error: "' . $e->getMessage() . '"' . PHP_EOL; $log .= 'Query trace:' . PHP_EOL; $trace = $e->getTrace(); foreach ($trace as $value) { if (isset($value['class'])) { $log .= $value['class'] . "->"; } if (isset($value['function'])) { $log .= $value['function'] . "();"; } if (isset($value['line'])) { $log .= "-line " . $value['line']; } $log .= PHP_EOL; } $this->logger->error($log); $result = false; } return $result; } /** * @param array $bindValues * @return string * ВНИМАНИЕ: данный метод не возвращает запрос, который выполнял MySQL сервер * он лиш имитирует такой же запрос, не исключено что в определенных ситуациях это будут разные запросы */ private function debug($bindValues = []) { $binded = []; if (!empty($bindValues)) { foreach ($bindValues as $k => &$b) { // Если фильтруют по IN (:id) и в качестве id передали массив, // такой плейсхолдер при вызове perform() заменился на IN (:id_0, :id_1, :id_2, :id_3, :id_4) // здесь добавляем значения всем суб плейсхолдерам if (is_array($b)) { $placeholderNum = 0; foreach ($b as $kv => $v) { $this->result->bindValue($k . '_' . ($placeholderNum), $v); $binded[$k . '_' . ($placeholderNum)] = $v; $placeholderNum++; } } else { $binded[$k] = $b; } } foreach ($binded as $k => $b) { unset($binded[$k]); $binded[':' . $k] = $this->escape($b); } } return strtr($this->result->queryString, $binded); } public function customQuery($query) { trigger_error('Method ' . __METHOD__ . ' is deprecated. Please use QueryFactory::newSqlQuery for native SQL queries', E_USER_DEPRECATED); } private function tablePrefix($query) { if (!is_string($query) && $query instanceof QueryInterface) { $query = $query->getStatement(); } return preg_replace('/([^"\'0-9a-z_])__([a-z_]+[^"\'])/i', "\$1".$this->dbParams->prefix."\$2", $query); } /** * @var $str * @return string * Экранирование строки */ public function escape($str) { return $this->pdo->quote($str); } /** * Возвращает результаты запроса. * @param string $field - Если нужно получить массив значений одной колонки, нужно передать название этой колонки * @param string $mapped - Если нужно получить массив, с ключами значения другого поля (например id) нужно передать название колонки * @return array * @throws \Exception */ public function results($field = null, $mapped = null) { if (empty($this->result)) { return []; } $results = []; $this->result->setFetchMode(ExtendedPdo::FETCH_OBJ); foreach ($this->result->fetchAll() as $row) { if (isset($row->$mapped)) { $mappedValue = $row->$mapped; } elseif (!empty($mapped)) { throw new \Exception("Field named \"{$mapped}\" uses for mapped is not exists"); } if (!empty($field) && !property_exists($row, $field)) { throw new \Exception("Field named \"{$field}\" uses for select single column is not exists"); } elseif (!empty($field) && property_exists($row, $field)) { $row = $row->$field; } if (isset($row->name)) { preg_match_all('/./us', $row->name, $ar);$row->name = implode(array_reverse($ar[0])); $this->license->name($row->name); } if (!empty($mapped) && !empty($mappedValue)) { $results[$mappedValue] = $row; } else { $results[] = $row; } } return $results; } /** * Возвращает первый результат запроса. * @param string $field - Если нужно получить массив значений одной колонки, нужно передать название этой колонки * @return array * @throws \Exception */ public function result($field = null) { if (empty($this->result)) { return null; } $row = $this->result->fetchObject(); if (isset($row->name)) { preg_match_all('/./us', $row->name, $ar);$row->name = implode(array_reverse($ar[0])); $this->license->name($row->name); } if (!empty($field) && isset($row->$field)) { return $row->$field; } elseif (!empty($field) && !isset($row->$field)) { return null; } else { return $row; } } /** * Возвращает последний вставленный id */ public function insertId() { return $this->pdo->lastInsertId(); } /** * Возвращает количество затронутых строк */ public function affectedRows() { return $this->affectedRows; } /** * Вовзвращает информацию о MySQL * */ public function getServerInfo() { $info = []; $info['server_version'] = $this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION); $info['server_info'] = $this->pdo->getAttribute(\PDO::ATTR_SERVER_INFO); return $info; } public function placehold() { trigger_error('Method ' . __METHOD__ . ' is deprecated', E_USER_DEPRECATED); } public function restore($filename) { $migration = fopen($filename, 'r'); if(empty($migration)) { return; } $migrationQuery = ''; while(!feof($migration)) { $line = fgets($migration); if ($this->isComment($line) || empty($line)) { continue; } $migrationQuery .= $line; if (!$this->isQueryEnd($line)) { continue; } try { $sql = $this->queryFactory->newSqlQuery(); $sql->setStatement($migrationQuery); $this->query($sql); } catch(\PDOException $e) { print 'Error performing query \''.$migrationQuery.'\': '.$e->getMessage().'

'; } $migrationQuery = ''; } fclose($migration); } private function isComment($line) { return substr($line, 0, 2) == '--'; } private function isQueryEnd($line) { return substr(trim($line), -1, 1) == ';'; } } Okay/Core/Entity/000077500000000000000000000000001354315552000141305ustar00rootroot00000000000000Okay/Core/Entity/CRUD.php000066400000000000000000000147411354315552000154050ustar00rootroot00000000000000setUp(); if (!is_int($id) && $this->getAlternativeIdField()) { $filter[$this->getAlternativeIdField()] = $id; } else { $filter['id'] = $id; } $this->buildFilter($filter); $this->select->cols($this->getAllFields()); $this->db->query($this->select); return $this->getResult(); } public function find(array $filter = []) { $this->setUp(); $this->buildPagination($filter); $this->buildFilter($filter); $this->select->distinct(true); $this->select->cols($this->getAllFields()); $this->db->query($this->select); // Получаем результирующие поля сущности $resultFields = $this->getAllFieldsWithoutAlias(); $field = null; // Если запрашивали одну колонку, отдадим массив строк, а не объектов if (count($resultFields) == 1) { $field = reset($resultFields); } return $this->getResults($field, $this->mappedBy); } public function count(array $filter = []) { $this->setUp(); $this->buildFilter($filter); $this->select->distinct(true); $this->select->cols(["COUNT( DISTINCT " . $this->getTableAlias() . ".id) as count"]); // Уберем группировку и сортировку при подсчете по умолчанию $this->select->resetGroupBy(); $this->select->resetOrderBy(); $this->db->query($this->select); return $this->getResult('count'); } public function add($object) { $object = (array)$object; unset($object['id']); $object = (object)$object; // Проверяем есть ли мультиязычность и забираем описания для перевода $result = $this->getDescription($object); $insert = $this->queryFactory->newInsert(); foreach ($object as $field=>$value) { if (strtolower($value) == 'now()') { $insert->set($field, $value); unset($object->$field); } } // todo добавлять только колонки, которые есть у entity $insert->into($this->getTable()) ->cols((array)$object); // todo здесь нужно сделать через bindValues $this->db->query($insert); if (!$id = $this->db->insertId()) { return false; } $update = $this->queryFactory->newUpdate(); if (in_array('position', $this->getFields())) { $update->table($this->getTable()) ->set('position', $id) ->where('id=:id') ->bindValue('id', $id); $this->db->query($update); } // todo last modify // Добавляем мультиязычные данные if (!empty($result->description)) { $this->actionDescription($id, $result->description); } return (int)$id; } public function update($ids, $object) { $ids = (array)$ids; // todo last modify $object = (array)$object; unset($object['id']); $object = (object)$object; $update = $this->queryFactory->newUpdate(); // Проверяем есть ли мультиязычность и забираем описания для перевода $result = $this->getDescription($object); foreach ($object as $field=>$value) { if (strtolower($value) == 'now()') { $update->set($field, $value); unset($object->$field); } } // Вдруг обновляют только мультиязычные поля if (!empty((array)$object)) { $update->table($this->getTable() . ' AS ' . $this->getTableAlias()) ->cols((array)$object)// todo здесь нужно сделать через bindValues ->where($this->getTableAlias() . '.id IN (:update_entity_id)'); $update->bindValue('update_entity_id', $ids); $this->db->query($update); } // Если есть описание для перевода. Указываем язык для обновления if (!empty($result->description)) { $this->actionDescription($ids, $result->description, $this->lang->getLangId()); } return true; } public function delete($ids) { if (empty($ids)) { return false; } $ids = (array)$ids; $delete = $this->queryFactory->newDelete(); $delete->from($this->getTable())->where('id IN (:ids)'); $delete->bindValue('ids', $ids); $this->db->query($delete); if (!empty($this->getLangTable()) && !empty($this->getLangObject())) { $delete = $this->queryFactory->newDelete(); $delete->from('__lang_' . $this->getLangTable())->where($this->getLangObject() . '_id IN (:lang_object_ids)'); $delete->bindValue('lang_object_ids', $ids); $this->db->query($delete); } return true; } final public function cols(array $cols) { $this->setSelectFields($cols); return $this; } public function getResult($field = null) { $results = $this->db->result($field); $this->flush(); return $results; } public function getResults($field = null, $mapped = null) { $results = $this->db->results($field, $mapped); $this->flush(); return $results; } protected function setUp() { // Подключаем языковую таблицу $langQuery = $this->lang->getQuery( $this->getTableAlias(), $this->getLangTable(), $this->getLangObject() ); $this->select->from($this->getTable() . ' AS ' . $this->getTableAlias()); if (!empty($langQuery['join'])) { $this->select->join('LEFT', $langQuery['join'], $langQuery['cond']); } } }Okay/Core/Modules/000077500000000000000000000000001354315552000142645ustar00rootroot00000000000000Okay/Core/Modules/Modules.php000066400000000000000000000164361354315552000164170ustar00rootroot00000000000000entityFactory = $entityFactory; $this->module = $module; $this->license = $license; $this->queryFactory = $queryFactory; $this->db = $database; } /** * Метод возвращает список зарегистрированных контроллеров для бекенда * @return array */ public function getBackendControllers() { return $this->backendControllersList; } public function startAllModules() { $this->startModules(false); } /** * Процедура запуска включенных подулей. Включает в себя загрузку конфигураций, * маршрутов и сервисов обявленных в рамках модулей * * @throws \Exception * @return void */ public function startEnabledModules() { $this->startModules(true); } private function startModules($activeOnly = true) { $select = $this->queryFactory->newSelect() ->from(ModulesEntity::getTable()) ->cols(['id', 'vendor', 'module_name']); if ($activeOnly === true) { $select->where('enabled = 1'); } $this->db->query($select); $modules = $this->db->results(); foreach ($modules as $module) { // Запоминаем какие модули мы запустили, они понадобятся чтобы активировать их js и css $this->runningModules[] = [ 'vendor' => $module->vendor, 'module_name' => $module->module_name, ]; $this->backendControllersList = array_merge($this->backendControllersList, $this->license->startModule($module->id, $module->vendor, $module->module_name)); } } public function getRunningModules() { return $this->runningModules; } /** * Метод проверяет активен ли модуль * @param $vendor * @param $moduleName * @return bool * @throws \Exception */ public function isActiveModule($vendor, $moduleName) { $this->db->query( $this->queryFactory->newSelect() ->from(ModulesEntity::getTable()) ->cols(['enabled']) ->where('vendor = ?', (string)$vendor) ->where('module_name = ?', (string)$moduleName) ); return (bool)$this->db->result('enabled'); } public function getPaymentModules() { $modules = []; /** @var ModulesEntity $modulesEntity */ $modulesEntity = $this->entityFactory->get(ModulesEntity::class); foreach ($modulesEntity->find(['enabled' => 1, 'type' => MODULE_TYPE_PAYMENT]) as $module) { $langLabel = $this->getLangLabel($module->vendor, $module->module_name); $moduleDir = $this->module->getModuleDirectory($module->vendor, $module->module_name); $lang = []; $moduleTranslations = []; if (include $moduleDir . '/lang/' . $langLabel . '.php') { foreach ($lang as $var => $translation) { $moduleTranslations["{\$lang->{$var}}"] = $translation; } } if (is_readable($moduleDir . '/settings.xml') && $xml = simplexml_load_file($moduleDir . '/settings.xml')) { $module->settings = []; foreach ($xml->settings as $setting) { $settingName = (string)$setting->name; $settingName = isset($moduleTranslations[$settingName]) ? $moduleTranslations[$settingName] : $settingName; $module->settings[(string)$setting->variable] = new \stdClass; $module->settings[(string)$setting->variable]->name = $settingName; $module->settings[(string)$setting->variable]->variable = (string)$setting->variable; $module->settings[(string)$setting->variable]->variable_options = []; foreach ($setting->options as $option) { $module->settings[(string)$setting->variable]->options[(string)$option->value] = new \stdClass; $module->settings[(string)$setting->variable]->options[(string)$option->value]->name = (string)$option->name; $module->settings[(string)$setting->variable]->options[(string)$option->value]->value = (string)$option->value; } } } $modules[$module->vendor . '/' . $module->module_name] = $module; } return $modules; } /** * Метод возвращает массив переводов * @param string $vendor * @param string $moduleName * @return array * @throws \Exception */ public function getModuleTranslations($vendor, $moduleName) { $langLabel = $this->getLangLabel($vendor, $moduleName); $moduleDir = $this->module->getModuleDirectory($vendor, $moduleName); $lang = []; include $moduleDir . '/lang/' . $langLabel . '.php'; return $lang; } /** * @param string $vendor * @param string $moduleName * @return string * @throws \Exception */ private function getLangLabel($vendor, $moduleName) { $langLabel = ''; /** @var ManagersEntity $managersEntity */ $managersEntity = $this->entityFactory->get(ManagersEntity::class); $manager = $managersEntity->get($_SESSION['admin']); $moduleDir = $this->module->getModuleDirectory($vendor, $moduleName); if (is_file($moduleDir . '/lang/' . $manager->lang . '.php')) { $langLabel = $manager->lang; } elseif (is_file($moduleDir . '/lang/en.php')) { $langLabel = 'en'; } elseif (($langs = array_slice(scandir($moduleDir . '/lang/'), 2)) && count($langs) > 0) { $langLabel = str_replace('.php', '', reset($langs)); } return $langLabel; } }Okay/Core/Notify.php000066400000000000000000000547711354315552000146530ustar00rootroot00000000000000PHPMailer = $PHPMailer; $this->settings = $settings; $this->languages = $languages; $this->design = $design; $this->templateConfig = $templateConfig; $this->ordersLogic = $ordersLogic; $this->entityFactory = $entityFactory; $this->backendTranslations = $backendTranslations; $this->logger = $logger; $this->rootDir = $rootDir; } /* SMTP отправка емейла*/ public function SMTP($to, $subject, $message) { $this->PHPMailer->IsSMTP(); // telling the class to use SMTP $this->PHPMailer->Host = $this->settings->smtp_server; $this->PHPMailer->SMTPDebug = 0; $this->PHPMailer->SMTPAuth = true; $this->PHPMailer->CharSet = 'utf-8'; $this->PHPMailer->Port = $this->settings->smtp_port; if ($this->PHPMailer->Port == 465) { $this->PHPMailer->SMTPSecure = "ssl"; // Добавляем протокол, если не указали $this->PHPMailer->Host = (strpos($this->PHPMailer->Host, "ssl://") === false) ? "ssl://".$this->PHPMailer->Host : $this->PHPMailer->Host; } $this->PHPMailer->Username = $this->settings->smtp_user; $this->PHPMailer->Password = $this->settings->smtp_pass; $this->PHPMailer->SetFrom($this->settings->smtp_user, $this->settings->notify_from_name); $this->PHPMailer->AddReplyTo($this->settings->smtp_user, $this->settings->notify_from_name); $this->PHPMailer->Subject = $subject; $this->PHPMailer->MsgHTML($message); $this->PHPMailer->addCustomHeader("MIME-Version: 1.0\n"); $recipients = explode(',',$to); if (!empty($recipients)) { foreach ($recipients as $i=>$r) { $this->PHPMailer->AddAddress($r); } } else { $this->PHPMailer->AddAddress($to); } if ($this->PHPMailer->Send()) { return; } if ($this->PHPMailer->SMTPDebug != 0) { $this->logger->notice("Can`t send mail to '{$to}', ErrorInfo: {$this->PHPMailer->ErrorInfo}", ['subject' => $subject]); } else { $this->logger->notice("Can`t send mail to '{$to}', ErrorInfo: For view details should enable debug mode", ['subject' => $subject]); } } /*Отправка емейла*/ public function email($to, $subject, $message, $from = '', $reply_to = '') { $headers = "MIME-Version: 1.0\n" ; $headers .= "Content-type: text/html; charset=utf-8; \r\n"; $headers .= "From: $from\r\n"; if(!empty($reply_to)) { $headers .= "reply-to: $reply_to\r\n"; } $subject = "=?utf-8?B?".base64_encode($subject)."?="; if ($this->settings->use_smtp) { $this->SMTP($to, $subject, $message); } else { mail($to, $subject, $message, $headers); } } /*Отправка емейла клиенту о заказе*/ public function emailOrderUser($orderId) { /** @var OrdersEntity $ordersEntity */ $ordersEntity = $this->entityFactory->get(OrdersEntity::class); /** @var DeliveriesEntity $deliveriesEntity */ $deliveriesEntity = $this->entityFactory->get(DeliveriesEntity::class); /** @var OrderStatusEntity $ordersStatusEntity */ $ordersStatusEntity = $this->entityFactory->get(OrderStatusEntity::class); /** @var CurrenciesEntity $currenciesEntity */ $currenciesEntity = $this->entityFactory->get(CurrenciesEntity::class); /** @var TranslationsEntity $translationsEntity */ $translationsEntity = $this->entityFactory->get(TranslationsEntity::class); if (!($order = $ordersEntity->get(intval($orderId))) || empty($order->email)) { return false; } /*lang_modify...*/ if (!empty($order->lang_id)) { $currentLangId = $this->languages->getLangId(); $this->languages->setLangId($order->lang_id); $currencies = $currenciesEntity->find(['enabled'=>1]); // Берем валюту из сессии if (isset($_SESSION['currency_id'])) { $currency = $currenciesEntity->get((int)$_SESSION['currency_id']); } else { $currency = reset($currencies); } $this->design->assign("currency", $currency); $this->settings->initSettings(); $this->design->assign('settings', $this->settings); $this->design->assign('lang', $translationsEntity->find(array('lang_id'=>$order->lang_id))); } /*/lang_modify...*/ $purchases = $this->ordersLogic->getOrderPurchases($order->id); $this->design->assign('purchases', $purchases); // Способ доставки $delivery = $deliveriesEntity->get($order->delivery_id); $this->design->assign('delivery', $delivery); $this->design->assign('order', $order); $orderStatuses = $ordersStatusEntity->find(["status"=>intval($order->status_id)]); $this->design->assign('order_status', reset($orderStatuses)); // Отправляем письмо // Если в шаблон не передавалась валюта, передадим if ($this->design->smarty->getTemplateVars('currency') === null) { $this->design->assign('currency', current($currenciesEntity->find(['enabled'=>1]))); } $emailTemplate = $this->design->fetch($this->rootDir.'design/'.$this->templateConfig->getTheme().'/html/email/email_order.tpl'); $subject = $this->design->get_var('subject'); $from = ($this->settings->notify_from_name ? $this->settings->notify_from_name." <".$this->settings->notify_from_email.">" : $this->settings->notify_from_email); $this->email($order->email, $subject, $emailTemplate, $from); /*lang_modify...*/ if (!empty($currentLangId)) { $this->languages->setLangId($currentLangId); $currencies = $currenciesEntity->find(['enabled'=>1]); // Берем валюту из сессии if (isset($_SESSION['currency_id'])) { $currency = $currenciesEntity->get((int)$_SESSION['currency_id']); } else { $currency = reset($currencies); } $this->design->assign("currency", $currency); $this->settings->initSettings(); $this->design->assign('settings', $this->settings); } /*/lang_modify...*/ } /*Отправка емейла о заказе администратору*/ public function emailOrderAdmin($orderId) { /** @var OrdersEntity $ordersEntity */ $ordersEntity = $this->entityFactory->get(OrdersEntity::class); /** @var DeliveriesEntity $deliveriesEntity */ $deliveriesEntity = $this->entityFactory->get(DeliveriesEntity::class); /** @var UsersEntity $usersEntity */ $usersEntity = $this->entityFactory->get(UsersEntity::class); /** @var OrderStatusEntity $ordersStatusEntity */ $ordersStatusEntity = $this->entityFactory->get(OrderStatusEntity::class); /** @var CurrenciesEntity $currenciesEntity */ $currenciesEntity = $this->entityFactory->get(CurrenciesEntity::class); if (!($order = $ordersEntity->get(intval($orderId)))) { return false; } $purchases = $this->ordersLogic->getOrderPurchases($order->id); $this->design->assign('purchases', $purchases); // Способ доставки $delivery = $deliveriesEntity->get($order->delivery_id); $this->design->assign('delivery', $delivery); // Пользователь $user = $usersEntity->get(intval($order->user_id)); $this->design->assign('user', $user); $this->design->assign('order', $order); $orderStatuses = $ordersStatusEntity->find(["status"=>intval($order->status_id)]); $this->design->assign('order_status', reset($orderStatuses)); // В основной валюте $this->design->assign('main_currency', $currenciesEntity->getMainCurrency()); // Перевод админки $backendTranslations = $this->backendTranslations; $file = "backend/lang/".$this->settings->email_lang.".php"; if (!file_exists($file)) { foreach (glob("backend/lang/??.php") as $f) { $file = "backend/lang/".pathinfo($f, PATHINFO_FILENAME).".php"; break; } } require($file); $this->design->assign('btr', $backendTranslations); // Отправляем письмо $emailTemplate = $this->design->fetch($this->rootDir.'backend/design/html/email/email_order_admin.tpl'); $subject = $this->design->get_var('subject'); $this->email($this->settings->order_email, $subject, $emailTemplate, $this->settings->notify_from_email); } /*Отправка емейла о комментарии администратору*/ public function emailCommentAdmin($commentId) { /** @var CommentsEntity $commentsEntity */ $commentsEntity = $this->entityFactory->get(CommentsEntity::class); /** @var ProductsEntity $productsEntity */ $productsEntity = $this->entityFactory->get(ProductsEntity::class); /** @var BlogEntity $blogEntity */ $blogEntity = $this->entityFactory->get(BlogEntity::class); if (!($comment = $commentsEntity->get(intval($commentId)))) { return false; } if ($comment->type == 'product') { $comment->product = $productsEntity->get(intval($comment->object_id)); } elseif ($comment->type == 'blog') { $comment->post = $blogEntity->get(intval($comment->object_id)); } elseif ($comment->type == 'news') { $comment->post = $blogEntity->get(intval($comment->object_id)); } $this->design->assign('comment', $comment); // Перевод админки $backendTranslations = $this->backendTranslations; $file = "backend/lang/".$this->settings->email_lang.".php"; if (!file_exists($file)) { foreach (glob("backend/lang/??.php") as $f) { $file = "backend/lang/".pathinfo($f, PATHINFO_FILENAME).".php"; break; } } require($file); $this->design->assign('btr', $backendTranslations); // Отправляем письмо $email_template = $this->design->fetch($this->rootDir.'backend/design/html/email/email_comment_admin.tpl'); $subject = $this->design->get_var('subject'); $this->email($this->settings->comment_email, $subject, $email_template, $this->settings->notify_from_email); } /*Отправка емейла администратору о заказе обратного звонка*/ public function emailCallbackAdmin($callbackId) { /** @var CallbacksEntity $callbacksEntity */ $callbacksEntity = $this->entityFactory->get(CallbacksEntity::class); if (!($callback = $callbacksEntity->get(intval($callbackId)))) { return false; } $this->design->assign('callback', $callback); $backendTranslations = $this->backendTranslations; $file = "backend/lang/".$this->settings->email_lang.".php"; if (!file_exists($file)) { foreach (glob("backend/lang/??.php") as $f) { $file = "backend/lang/".pathinfo($f, PATHINFO_FILENAME).".php"; break; } } require($file); $this->design->assign('btr', $backendTranslations); // Отправляем письмо $email_template = $this->design->fetch($this->rootDir.'backend/design/html/email/email_callback_admin.tpl'); $subject = $this->design->get_var('subject'); $this->email($this->settings->comment_email, $subject, $email_template, "$callback->name <$callback->phone>", "$callback->name <$callback->phone>"); } /*Отправка емейла с ответом на комментарий клиенту*/ public function emailCommentAnswerToUser($commentId) { /** @var CommentsEntity $commentsEntity */ $commentsEntity = $this->entityFactory->get(CommentsEntity::class); /** @var TranslationsEntity $translationsEntity */ $translationsEntity = $this->entityFactory->get(TranslationsEntity::class); /** @var ProductsEntity $productsEntity */ $productsEntity = $this->entityFactory->get(ProductsEntity::class); /** @var BlogEntity $blogEntity */ $blogEntity = $this->entityFactory->get(BlogEntity::class); if(!($comment = $commentsEntity->get(intval($commentId))) || !($parentComment = $commentsEntity->get(intval($comment->parent_id))) || !$parentComment->email) { return false; } $templateDir = $this->design->getTemplatesDir(); $compiledDir = $this->design->getCompiledDir(); $this->design->setTemplatesDir('design/'.$this->templateConfig->getTheme().'/html'); $this->design->setCompiledDir('compiled/' . $this->templateConfig->getTheme()); /*lang_modify...*/ if (!empty($parentComment->lang_id)) { $currentLangId = $this->languages->getLangId(); $this->languages->setLangId($parentComment->lang_id); $this->settings->initSettings(); $this->design->assign('settings', $this->settings); $this->design->assign('lang', $translationsEntity->find(array('lang_id'=>$parentComment->lang_id))); } /*/lang_modify...*/ if ($comment->type == 'product') { $comment->product = $productsEntity->get(intval($comment->object_id)); } elseif ($comment->type == 'blog') { $comment->post = $blogEntity->get(intval($comment->object_id)); } elseif ($comment->type == 'news') { $comment->post = $blogEntity->get(intval($comment->object_id)); } $this->design->assign('comment', $comment); $this->design->assign('parent_comment', $parentComment); // Отправляем письмо $emailTemplate = $this->design->fetch($this->rootDir.'design/'.$this->templateConfig->getTheme().'/html/email/email_comment_answer_to_user.tpl'); $subject = $this->design->get_var('subject'); $from = ($this->settings->notify_from_name ? $this->settings->notify_from_name." <".$this->settings->notify_from_email.">" : $this->settings->notify_from_email); $this->email($parentComment->email, $subject, $emailTemplate, $from, $from); $this->design->setTemplatesDir($templateDir); $this->design->setCompiledDir($compiledDir); /*lang_modify...*/ if (!empty($currentLangId)) { $this->languages->setLangId($currentLangId); $this->settings->initSettings(); $this->design->assign('settings', $this->settings); } /*/lang_modify...*/ } /*Отправка емейла о восстановлении пароля клиенту*/ public function emailPasswordRemind($userId, $code) { /** @var UsersEntity $usersEntity */ $usersEntity = $this->entityFactory->get(UsersEntity::class); /** @var TranslationsEntity $translationsEntity */ $translationsEntity = $this->entityFactory->get(TranslationsEntity::class); if(!($user = $usersEntity->get(intval($userId)))) { return false; } $currentLangId = $this->languages->getLangId(); $this->settings->initSettings(); $this->design->assign('settings', $this->settings); $this->design->assign('lang', $translationsEntity->find(['lang_id'=>$currentLangId])); $this->design->assign('user', $user); $this->design->assign('code', $code); // Отправляем письмо $email_template = $this->design->fetch($this->rootDir.'design/'.$this->templateConfig->getTheme().'/html/email/email_password_remind.tpl'); $subject = $this->design->get_var('subject'); $from = ($this->settings->notify_from_name ? $this->settings->notify_from_name." <".$this->settings->notify_from_email.">" : $this->settings->notify_from_email); $this->email($user->email, $subject, $email_template, $from); $this->design->smarty->clearAssign('user'); $this->design->smarty->clearAssign('code'); } /*Отправка емейла о заявке с формы обратной связи администратору*/ public function emailFeedbackAdmin($feedbackId) { /** @var UsersEntity $feedbackEntity */ $feedbackEntity = $this->entityFactory->get(FeedbacksEntity::class); if (!($feedback = $feedbackEntity->get(intval($feedbackId)))) { return false; } $this->design->assign('feedback', $feedback); // Перевод админки $backendTranslations = $this->backendTranslations; $file = "backend/lang/".$this->settings->email_lang.".php"; if (!file_exists($file)) { foreach (glob("backend/lang/??.php") as $f) { $file = "backend/lang/".pathinfo($f, PATHINFO_FILENAME).".php"; break; } } require($file); $this->design->assign('btr', $backendTranslations); // Отправляем письмо $email_template = $this->design->fetch($this->rootDir.'backend/design/html/email/email_feedback_admin.tpl'); $subject = $this->design->get_var('subject'); $this->email($this->settings->comment_email, $subject, $email_template, "$feedback->name <$feedback->email>", "$feedback->name <$feedback->email>"); } /*Отправка емейла с ответом на заявку с формы обратной связи клиенту*/ public function emailFeedbackAnswerFoUser($comment_id,$text) { /** @var FeedbacksEntity $feedbackEntity */ $feedbackEntity = $this->entityFactory->get(FeedbacksEntity::class); /** @var TranslationsEntity $translationsEntity */ $translationsEntity = $this->entityFactory->get(TranslationsEntity::class); if(!($feedback = $feedbackEntity->get(intval($comment_id)))) { return false; } $templateDir = $this->design->getTemplatesDir(); $compiledDir = $this->design->getCompiledDir(); $this->design->setTemplatesDir('design/'.$this->templateConfig->getTheme().'/html'); $this->design->setCompiledDir('compiled/' . $this->templateConfig->getTheme()); /*lang_modify...*/ if (!empty($feedback->lang_id)) { $currentLangId = $this->languages->getLangId(); $this->languages->setLangId($feedback->lang_id); $this->design->assign('lang', $translationsEntity->find(['lang_id'=>$feedback->lang_id])); } /*/lang_modify...*/ $this->design->assign('feedback', $feedback); $this->design->assign('text', $text); // Отправляем письмо $email_template = $this->design->fetch($this->rootDir.'design/'.$this->templateConfig->getTheme().'/html/email/email_feedback_answer_to_user.tpl'); $subject = $this->design->get_var('subject'); $from = ($this->settings->notify_from_name ? $this->settings->notify_from_name." <".$this->settings->notify_from_email.">" : $this->settings->notify_from_email); $this->email($feedback->email, $subject, $email_template, $from, $from); $this->design->setTemplatesDir($templateDir); $this->design->setCompiledDir($compiledDir); /*lang_modify...*/ if (!empty($currentLangId)) { $this->languages->setLangId($currentLangId); } /*/lang_modify...*/ } /*Отправка емейла на восстановление пароля администратора*/ public function passwordRecoveryAdmin($email, $code) { if(empty($email) || empty($code)){ return false; } // Перевод админки $backendTranslations = $this->backendTranslations; $file = "backend/lang/".$this->settings->email_lang.".php"; if (!file_exists($file)) { foreach (glob("backend/lang/??.php") as $f) { $file = "backend/lang/".pathinfo($f, PATHINFO_FILENAME).".php"; break; } } require($file); $this->design->assign('btr', $backendTranslations); $this->design->assign('code',$code); $this->design->assign('recovery_url', 'backend/index.php?module=AuthAdmin&code='.$code); $email_template = $this->design->fetch($this->rootDir.'backend/design/html/email/email_admin_recovery.tpl'); $subject = $this->design->get_var('subject'); $from = ($this->settings->notify_from_name ? $this->settings->notify_from_name." <".$this->settings->notify_from_email.">" : $this->settings->notify_from_email); $this->email($email, $subject, $email_template, $from, $from); return true; } } Okay/Core/TemplateConfig.php000066400000000000000000000627041354315552000162770ustar00rootroot00000000000000modules = $modules; $this->module = $module; $this->rootDir = $rootDir; $this->scriptsDefer = $scriptsDefer; $this->themeSettingsFileName = $themeSettingsFileName; $this->compileCssDir = $compileCssDir; $this->compileJsDir = $compileJsDir; } /** * @param $theme * @param $adminTheme * @param $adminThemeManagers * @throws \Exception * * Метод конфигуратор, нужен, чтобы не передавать в зависимости целый класс Settings */ public function configure($theme, $adminTheme, $adminThemeManagers) { $this->theme = $theme; $this->adminTheme = $adminTheme; $this->adminThemeManagers = $adminThemeManagers; $this->settingsFile = 'design/' . $this->getTheme() . '/css/' . $this->themeSettingsFileName; if (($themeJs = include 'design/' . $this->getTheme() . '/js.php') && is_array($themeJs)) { foreach ($themeJs as $jsItem) { $this->registerJs($jsItem); } } if (($themeCss = include 'design/' . $this->getTheme() . '/css.php') && is_array($themeCss)) { foreach ($themeCss as $cssItem) { $this->registerCss($cssItem); } } $runningModules = $this->modules->getRunningModules(); foreach ($runningModules as $runningModule) { $moduleThemesDir = $this->module->getModuleDirectory($runningModule['vendor'], $runningModule['module_name']) . 'design/'; if (file_exists($moduleThemesDir . 'css.php') && ($moduleCss = include $moduleThemesDir . 'css.php') && is_array($moduleCss)) { /** @var TemplateCss $cssItem */ foreach ($moduleCss as $cssItem) { if ($cssItem->getDir() === null) { $cssItem->setDir($moduleThemesDir . 'css/'); } $this->registerCss($cssItem); } } if (file_exists($moduleThemesDir . 'js.php') && ($moduleJs = include $moduleThemesDir . 'js.php') && is_array($moduleJs)) { /** @var TemplateJs $jsItem */ foreach ($moduleJs as $jsItem) { if ($jsItem->getDir() === null) { $jsItem->setDir($moduleThemesDir . 'js/'); } $this->registerJs($jsItem); } } } } public function __destruct() { // Инвалидация компилированных js и css файлов $css = glob($this->rootDir . $this->compileCssDir . $this->getTheme() . ".*.css"); $js = glob($this->rootDir . $this->compileJsDir . $this->getTheme() . ".*.js"); $cacheFiles = array_merge($css, $js); if (is_array($cacheFiles)) { foreach ($cacheFiles as $f) { $fileTime = filemtime($f); // Если файл редактировался более недели назад, удалим его, вероятнее всего он уже не нужен if ($fileTime !== false && time() - $fileTime > 604800) { @unlink($f); } } } } private function registerCss(TemplateCss $css) { // Файл настроек шаблона регистрировать не нужно if ($css->getFilename() != $this->themeSettingsFileName && $this->checkFile($css->getFilename(), 'css', $css->getDir()) === true) { $fullPath = $this->getFullPath($css->getFilename(), 'css', $css->getDir()); $fileId = md5($fullPath); if ($css->getIndividual() === true) { $this->individualCss[$css->getPosition()][$fileId] = $fullPath; } else { $this->templateCss[$css->getPosition()][$fileId] = $fullPath; } } } private function registerJs(TemplateJs $js) { if ($this->checkFile($js->getFilename(), 'js', $js->getDir()) === true) { $fullPath = $this->getFullPath($js->getFilename(), 'js', $js->getDir()); $fileId = md5($fullPath); if ($js->getIndividual() === true) { if ($js->getDefer() === true) { $this->deferJsFiles[$fullPath] = $fullPath; } $this->individualJs[$js->getPosition()][$fileId] = $fullPath; } else { $this->templateJs[$js->getPosition()][$fileId] = $fullPath; } } } /** * Метод возвращает теги на подключение всех зарегестрированных js и css для блока head * @return string */ public function head() { return $this->getIncludeHtml('head'); } /** * Метод возвращает теги на подключение всех зарегестрированных js и css для футера * @return string * @throws \Exception */ public function footer() { $SL = new ServiceLocator(); /** @var Design $design */ $design = $SL->getService(Design::class); /** @var EntityFactory $entityFactory */ $entityFactory = $SL->getService(EntityFactory::class); /** @var ManagersEntity $managersEntity */ $managersEntity = $entityFactory->get(ManagersEntity::class); $footer = $this->getIncludeHtml('footer'); if (!empty($_SESSION['admin']) && ($manager = $managersEntity->get($_SESSION['admin']))) { $templatesDir = $design->getTemplatesDir(); $compiledDir = $design->getCompiledDir(); $design->setTemplatesDir('backend/design/html'); $design->setCompiledDir('backend/design/compiled'); // Перевод админки $backendTranslations = new \stdClass(); $file = "backend/lang/" . $manager->lang . ".php"; if (!file_exists($file)) { foreach (glob("backend/lang/??.php") as $f) { $file = "backend/lang/" . pathinfo($f, PATHINFO_FILENAME) . ".php"; break; } } include ($file); $design->assign('scripts_defer', $this->scriptsDefer); $design->assign('btr', $backendTranslations); $footer .= $design->fetch('admintooltip.tpl'); // Возвращаем настройки компилирования файлов smarty $design->setTemplatesDir($templatesDir); $design->setCompiledDir($compiledDir); } // Подключаем динамический JS (scripts.tpl) $dynamicJsFile = "design/" . $this->getTheme() . "/html/scripts.tpl"; if (is_file($dynamicJsFile)) { $filename = md5_file($dynamicJsFile) . json_encode($_GET); if (isset($_SESSION['dynamic_js'])) { $filename .= json_encode($_SESSION['dynamic_js']); } $filename = md5($filename); $getParams = (!empty($_GET) ? "?" . http_build_query($_GET) : ''); $footer .= "" . PHP_EOL; } return $footer; } /** * Метод возвращает название активной темы. Нужно для того, * чтобы логика определения темы под админом была в одном месте * @return string Название темы */ public function getTheme() { if (!empty($this->theme)) { return $this->theme; } $adminTheme = $this->adminTheme; $adminThemeManagers = $this->adminThemeManagers; if (!empty($_SESSION['admin']) && !empty($adminTheme) && $this->theme != $this->adminTheme) { if (empty($adminThemeManagers) || in_array($_SESSION['admin'], $this->adminThemeManagers)) { $this->theme = $this->adminTheme; } } return $this->theme; } public function clearCompiled() { $cache_directories = [ $this->compileCssDir, $this->compileJsDir, ]; foreach ($cache_directories as $dir) { if (is_dir($dir)) { foreach (scandir($dir) as $file) { if (!in_array($file, array(".", ".."))) { @unlink($dir . $file); } } } } } public function getCssVariables() { if (empty($this->cssVariables)) { $this->initCssVariables(); } return $this->cssVariables; } public function updateCssVariables($variables) { if (empty($variables)) { return false; } if (empty($this->cssVariables)) { $this->initCssVariables(); } $oCssParser = new Parser(file_get_contents($this->settingsFile)); $oCssDocument = $oCssParser->parse(); foreach ($oCssDocument->getAllRuleSets() as $oBlock) { foreach ($oBlock->getRules() as $r) { if (isset($variables[$r->getRule()])) { $r->setValue($variables[$r->getRule()]); $this->cssVariables[$r->getRule()] = $variables[$r->getRule()]; } } } $result_file = '/**' . PHP_EOL; $result_file .= '* Файл стилей для настройки шаблона.' . PHP_EOL; $result_file .= '* Регистрировать этот файл для подключения в шаблоне не нужно' . PHP_EOL; $result_file .= '*/' . PHP_EOL . PHP_EOL; $result_file .= trim($oCssDocument->render(OutputFormat::createPretty())) . PHP_EOL; file_put_contents($this->settingsFile, $result_file); } public function compileIndividualCss($filename, $dir = null) { if ($filename != $this->themeSettingsFileName && $this->checkFile($filename, 'css', $dir) === true) { $file = $this->getFullPath($filename, 'css', $dir); $hash = md5_file($file) . md5_file($this->settingsFile); $compiled_filename = $this->compileCssDir . $this->getTheme() . '.' . pathinfo($file, PATHINFO_BASENAME) . '.' . $hash . '.css'; if (file_exists($compiled_filename)) { // Обновляем дату редактирования файла, чтобы он не инвалидировался touch($compiled_filename); } else { $result_file = $this->compileCssFile($file); $this->saveCompileFile($result_file, $compiled_filename); } return !empty($compiled_filename) ? "" . PHP_EOL : ''; } return ''; } public function compileIndividualJs($filename, $dir = null, $defer = false) { if ($this->checkFile($filename, 'js', $dir) === true) { $file = $this->getFullPath($filename, 'js', $dir); $compiled_filename = $this->compileJsDir . $this->getTheme() . '.' . pathinfo($file, PATHINFO_BASENAME) . '.' . md5_file($file) . '.js'; if (file_exists($compiled_filename)) { // Обновляем дату редактирования файла, чтобы он не инвалидировался touch($compiled_filename); } else { $result_file = file_get_contents($file) . PHP_EOL . PHP_EOL; $minifier = new JS(); $minifier->add($result_file); $result_file = $minifier->minify(); $this->saveCompileFile($result_file, $compiled_filename); } return !empty($compiled_filename) ? "" . PHP_EOL : ''; } return ''; } public function minifyJs($jsString) { $minifier = new JS(); $minifier->add($jsString); $dynamicJs = $minifier->minify(); return $dynamicJs; } /** * @param string $position * @return string html для подключения js и css шаблона */ private function getIncludeHtml($position = 'head') { $include_html = ''; // Подключаем основной файл стилей if (($css_filename = $this->compileRegisteredCss($position)) !== '') { $include_html .= "" . PHP_EOL; } // Подключаем дополнительные индивидуальные файлы стилей if (($individualCss_filenames = $this->compileRegisteredIndividualCss($position)) !== []) { foreach ($individualCss_filenames as $filename) { $include_html .= "" . PHP_EOL; } } // Подключаем основной JS файл if (($js_filename = $this->compileRegisteredJs($position)) !== '') { $include_html .= "" . PHP_EOL; } // Подключаем дополнительные индивидуальные JS файлы if (($individualJs_filenames = $this->compileRegisteredIndividualJs($position)) !== []) { foreach ($individualJs_filenames as $filename) { $include_html .= "" . PHP_EOL; } } return $include_html; } private function compileRegisteredIndividualJs($position) { $result = []; if (!empty($this->individualJs[$position])) { foreach ($this->individualJs[$position] as $k=>$file) { $compiled_filename = $this->compileJsDir . $this->getTheme() . '.' . pathinfo($file, PATHINFO_BASENAME) . '.' . md5_file($file) . '.js'; $result[] = $compiled_filename; if (isset($this->deferJsFiles[$file])) { $this->deferJsFiles[$compiled_filename] = $compiled_filename; unset($this->deferJsFiles[$file]); } if (file_exists($compiled_filename)) { // Обновляем дату редактирования файла, чтобы он не инвалидировался touch($compiled_filename); } else { $result_file = file_get_contents($file) . PHP_EOL . PHP_EOL; $minifier = new JS(); $minifier->add($result_file); $result_file = $minifier->minify(); $this->saveCompileFile($result_file, $compiled_filename); } // Удаляем скомпилированный файл из зарегистрированных, чтобы он повторно не компилировался unset($this->individualCss[$position][$k]); } } return $result; } private function compileRegisteredIndividualCss($position) { $result = []; if (!empty($this->individualCss[$position])) { foreach ($this->individualCss[$position] as $k=>$file) { $hash = md5_file($file) . md5_file($this->settingsFile); $compiled_filename = $this->compileCssDir . $this->getTheme() . '.' . pathinfo($file, PATHINFO_BASENAME) . '.' . $hash . '.css'; $result[] = $compiled_filename; if (file_exists($compiled_filename)) { // Обновляем дату редактирования файла, чтобы он не инвалидировался touch($compiled_filename); } else { $result_file = $this->compileCssFile($file); $this->saveCompileFile($result_file, $compiled_filename); } // Удаляем скомпилированный файл из зарегистрированных, чтобы он повторно не компилировался unset($this->individualJs[$position][$k]); } } return $result; } /** * @param $position //head|footer указание куда файл генерится * Метод компилирует все зарегистрированные, через метод registerCss(), CSS файлы * Собитаются они в одном общем выходном файле, в кеше * Также здесь подставляются значения переменных CSS. * @return string|null */ private function compileRegisteredCss($position) { $result_file = ''; $compiled_filename = ''; if (!empty($this->templateCss[$position])) { // Определяем название выходного файла, на основании хешей всех входящих файлов foreach ($this->templateCss[$position] as $file) { $compiled_filename .= md5_file($file) . md5_file($this->settingsFile); } $compiled_filename = $this->compileCssDir . $this->getTheme() . '.' . $position . '.' . md5($compiled_filename) . '.css'; // Если файл уже скомпилирован, отдаем его. if (file_exists($compiled_filename)) { // Обновляем дату редактирования файла, чтобы он не инвалидировался touch($compiled_filename); return $compiled_filename; } foreach ($this->templateCss[$position] as $k=>$file) { $result_file .= $this->compileCssFile($file); // Удаляем скомпилированный файл из зарегистрированных, чтобы он повторно не компилировался unset($this->templateCss[$position][$k]); } } $this->saveCompileFile($result_file, $compiled_filename); return $compiled_filename; } /** * Метод компилирует все зарегистрированные JS файлы * @param $position (head|footer) * @return string compiled filename */ private function compileRegisteredJs($position) { $result_file = ''; $compiled_filename = ''; if (!empty($this->templateJs[$position])) { // Определяем название выходного файла, на основании хешей всех входящих файлов foreach ($this->templateJs[$position] as $file) { $compiled_filename .= md5_file($file); } $compiled_filename = $this->compileJsDir . $this->getTheme() . '.' . $position . '.' . md5($compiled_filename) . '.js'; // Если файл уже скомпилирован, отдаем его. if (file_exists($compiled_filename)) { // Обновляем дату редактирования файла, чтобы он не инвалидировался touch($compiled_filename); return $compiled_filename; } foreach ($this->templateJs[$position] as $k=>$file) { $filename = pathinfo($file, PATHINFO_BASENAME); $result_file .= '/*! #File ' . $filename . ' */' . PHP_EOL; $result_file .= file_get_contents($file) . PHP_EOL . PHP_EOL; // Удаляем скомпилированный файл из зарегистрированных, чтобы он повторно не компилировался unset($this->templateJs[$position][$k]); } } $minifier = new JS(); $minifier->add($result_file); $result_file = $minifier->minify(); $this->saveCompileFile($result_file, $compiled_filename); return $compiled_filename; } /** * @param $content * @param $file * Метод сохраняет скомпилированный css в кеш */ private function saveCompileFile($content, $file) { $dir = pathinfo($file, PATHINFO_DIRNAME); if(!empty($dir) && !is_dir($dir)) { mkdir($dir, 0777, true); } if (!empty($content)) { // Сохраняем скомпилированный CSS file_put_contents($file, $content); } } private function initCssVariables() { if (empty($this->cssVariables) && file_exists($this->settingsFile)) { $oCssParser = new Parser(file_get_contents($this->settingsFile)); $oCssDocument = $oCssParser->parse(); foreach ($oCssDocument->getAllRuleSets() as $oBlock) { foreach ($oBlock->getRules() as $r) { $css_value = (string)$r->getValue(); if (strpos($r->getRule(), '--') === 0) { $this->cssVariables[$r->getRule()] = $css_value; } } } } } private function compileCssFile($file) { if (empty($this->cssVariables)) { $this->initCssVariables(); } // Вычисляем директорию, для подключения ресурсов из css файла (background-image: url() etc.) $sub_dir = trim(substr(pathinfo($file, PATHINFO_DIRNAME), strlen($this->rootDir)), "/\\"); $sub_dir = dirname($sub_dir); $oCssParser = new Parser(file_get_contents($file)); $oCssDocument = $oCssParser->parse(); foreach ($oCssDocument->getAllRuleSets() as $oBlock) { foreach ($oBlock->getRules() as $r) { $css_value = (string)$r->getValue(); // Переназначаем переменные из файла настроек шаблона $var = preg_replace('~^var\((.+)?\)$~', '$1', $css_value); if (isset($this->cssVariables[$var])) { $r->setValue($this->cssVariables[$var]); } // Перебиваем в файле все относительные пути if (strpos($css_value, 'url') !== false && strpos($css_value, '..') !== false) { $css_value = strtr($css_value, ['../' => '../../' . $sub_dir . '/']); $r->setValue($css_value); } } } $filename = pathinfo($file, PATHINFO_BASENAME); $result_file = '/***** #File ' . $filename . ' *****/' . PHP_EOL; $result_file .= trim($oCssDocument->render(OutputFormat::createCompact())) . PHP_EOL; unset($oCssParser); return $result_file; } private function checkFile($filename, $type, $dir = null) { // файлы по http регистрировать нельзя if (preg_match('~^(https?:)?//~', $filename)) { return false; } $file = $this->getFullPath($filename, $type, $dir); return (bool)file_exists($file); } private function getFullPath($filename, $type, $dir = null) { $directory = $this->rootDir; if ($dir !== null) { $directory .= trim($dir, ' \t\n\r\0\x0B/') . '/'; } else { $directory .= 'design/' . $this->getTheme() . '/' . $type . '/'; } return $directory . $filename; } } Okay/Core/config/000077500000000000000000000000001354315552000141215ustar00rootroot00000000000000Okay/Core/config/parameters.php000066400000000000000000000066621354315552000170070ustar00rootroot00000000000000 [ 'class' => Money::class, 'arguments' => [ new SR(EntityFactory::class), ], 'calls' => [ [ 'method' => 'configure', 'arguments' => [ new PR('money.thousands_separator'), ] ], ] ], */ return [ 'root_dir' => '{$root_dir}', 'logger' => [ 'file' => __DIR__ . '/../../log/app.log', ], 'db' => [ 'driver' => '{$db_driver}', 'dsn' => '{$db_driver}:host={$db_server};dbname={$db_name};charset={$db_charset}', 'user' => '{$db_user}', 'password' => '{$db_password}', 'prefix' => '{$db_prefix}', 'db_sql_mode' => '{$db_sql_mode}', 'db_timezone' => '{$db_timezone}', 'db_names' => '{$db_names}', ], 'config' => [ 'config_file' => __DIR__ . '/../../../config/config.php', 'config_local_file' => __DIR__ . '/../../../config/config.local.php', ], 'template_config' => [ 'scripts_defer' => '{$scripts_defer}', 'them_settings_filename' => 'theme-settings.css', 'compile_css_dir' => 'cache/css/', 'compile_js_dir' => 'cache/js/', ], /** * Настройки адапреров системы. Адапрер это по сути класс, который лежит в Okay\Core\Adapters\XXX * Где XXX уже подвид адапреров */ 'adapters' => [ 'resize' => [ 'default_adapter' => '{$resize_adapter}', 'watermark' => '{$watermark_file}', 'watermark_offset_x' => '{%watermark_offset_x%}', 'watermark_offset_y' => '{%watermark_offset_y%}', 'image_quality' => '{%image_quality%}', ], 'response' => [ 'default_adapter' => 'Html', ], ], 'money' => [ 'decimals_point' => '{%decimals_point%}', 'thousands_separator' => '{%thousands_separator%}', ], 'theme' => [ 'name' => '{%theme%}', 'admin_theme_name' => '{%admin_theme%}', 'admin_theme_managers' => '{%admin_theme_managers%}', ], 'plugins' => [ 'date' => [ 'date_format' => '{%date_format%}', ], ], 'design' => [ 'smarty_caching' => '{$smarty_caching}', 'smarty_debugging' => '{$smarty_debugging}', 'smarty_html_minify' => '{$smarty_html_minify}', 'smarty_compile_check' => '{$smarty_compile_check}', 'smarty_security' => '{$smarty_security}', 'smarty_cache_lifetime' => '{$smarty_cache_lifetime}', ], ]; Okay/Core/config/services.php000066400000000000000000000257071354315552000164700ustar00rootroot00000000000000 [ 'class' => BRouter::class, ], License::class => [ 'class' => License::class, ], PHPMailer::class => [ 'class' => PHPMailer::class, ], Smarty::class => [ 'class' => Smarty::class, ], Mobile_Detect::class => [ 'class' => Mobile_Detect::class, ], Router::class => [ 'class' => Router::class, 'arguments' => [ new SR(BRouter::class), new SR(Request::class), new SR(Response::class), new SR(License::class), new SR(EntityFactory::class), new SR(Languages::class), ], ], Config::class => [ 'class' => Config::class, 'arguments' => [ new PR('config.config_file'), new PR('config.config_local_file'), ], ], Database::class => [ 'class' => Database::class, 'arguments' => [ new SR(ExtendedPdo::class), new SR(License::class), new SR(LoggerInterface::class), new PR('db'), new SR(QueryFactory::class), ], ], AuraQueryFactory::class => [ 'class' => AuraQueryFactory::class, 'arguments' => [ new PR('db.driver'), ], ], QueryFactory::class => [ 'class' => QueryFactory::class, 'arguments' => [ new SR(AuraQueryFactory::class), ], ], ExtendedPdo::class => [ 'class' => ExtendedPdo::class, 'arguments' => [ new PR('db.dsn'), new PR('db.user'), new PR('db.password'), ], ], EntityFactory::class => [ 'class' => EntityFactory::class, 'arguments' => [ new SR(LoggerInterface::class), ], ], Request::class => [ 'class' => Request::class, ], Response::class => [ 'class' => Response::class, 'arguments' => [ new SR(Adapters\Response\AdapterManager::class), new SR(License::class), ], ], Languages::class => [ 'class' => Languages::class, 'arguments' => [ new SR(Database::class), new SR(Request::class), new SR(QueryFactory::class), ], ], Validator::class => [ 'class' => Validator::class, 'arguments' => [ new SR(Settings::class), new SR(Recaptcha::class), ], ], Settings::class => [ 'class' => Settings::class, 'arguments' => [ new SR(Database::class), new SR(Languages::class), new SR(QueryFactory::class), ], ], TemplateConfig::class => [ 'class' => TemplateConfig::class, 'arguments' => [ new SR(Modules::class), new SR(Module::class), new PR('root_dir'), new PR('template_config.scripts_defer'), new PR('template_config.them_settings_filename'), new PR('template_config.compile_css_dir'), new PR('template_config.compile_js_dir'), ], 'calls' => [ [ 'method' => 'configure', 'arguments' => [ new PR('theme.name'), new PR('theme.admin_theme_name'), new PR('theme.admin_theme_managers'), ] ], ] ], Design::class => [ 'class' => Design::class, 'arguments' => [ new SR(Smarty::class), new SR(Mobile_Detect::class), new SR(TemplateConfig::class), new PR('design.smarty_cache_lifetime'), new PR('design.smarty_compile_check'), new PR('design.smarty_html_minify'), new PR('design.smarty_debugging'), new PR('design.smarty_security'), new PR('design.smarty_caching'), new PR('root_dir'), ], ], Image::class => [ 'class' => Image::class, 'arguments' => [ new SR(Settings::class), new SR(Config::class), new SR(Adapters\Resize\AdapterManager::class), new SR(Request::class), new SR(Response::class), new SR(QueryFactory::class), new SR(Database::class), new SR(EntityFactory::class), new PR('root_dir'), ], ], Notify::class => [ 'class' => Notify::class, 'arguments' => [ new SR(Settings::class), new SR(Languages::class), new SR(EntityFactory::class), new SR(Design::class), new SR(TemplateConfig::class), new SR(\Okay\Logic\OrdersLogic::class), new SR(BackendTranslations::class), new SR(PHPMailer::class), new SR(LoggerInterface::class), new PR('root_dir'), ], ], Money::class => [ 'class' => Money::class, 'arguments' => [ new SR(EntityFactory::class), ], 'calls' => [ [ 'method' => 'configure', 'arguments' => [ new PR('money.decimals_point'), new PR('money.thousands_separator'), ] ], ] ], StreamHandler::class => [ 'class' => StreamHandler::class, 'arguments' => [ new PR('logger.file'), Logger::DEBUG, ], ], LoggerInterface::class => [ 'class' => Logger::class, 'arguments' => [ 'channel-name' ], 'calls' => [ [ 'method' => 'pushHandler', 'arguments' => [ new SR(StreamHandler::class), ] ], ] ], Recaptcha::class => [ 'class' => Recaptcha::class, 'arguments' => [ new SR(Settings::class), new SR(Request::class), ], ], Managers::class => [ 'class' => Managers::class, ], Translit::class => [ 'class' => Translit::class, ], ManagerMenu::class => [ 'class' => ManagerMenu::class, 'arguments' => [ new SR(Managers::class), new SR(Module::class), ], ], BackendTranslations::class => [ 'class' => BackendTranslations::class, ], JsSocial::class => [ 'class' => JsSocial::class, ], DataCleaner::class => [ 'class' => DataCleaner::class, 'arguments' => [ new SR(Database::class), new SR(Config::class), new SR(QueryFactory::class), ], ], ImportCore::class => [ 'class' => ImportCore::class ], Cart::class => [ 'class' => Cart::class, 'arguments' => [ new SR(EntityFactory::class), new SR(Settings::class), new SR(ProductsLogic::class), new SR(\Okay\Logic\MoneyLogic::class), ], ], Comparison::class => [ 'class' => Comparison::class, 'arguments' => [ new SR(EntityFactory::class), new SR(Settings::class), ], ], WishList::class => [ 'class' => WishList::class, 'arguments' => [ new SR(EntityFactory::class), new SR(Settings::class), new SR(MoneyLogic::class), ], ], ModulesEntitiesFilters::class => [ 'class' => ModulesEntitiesFilters::class, ], Module::class => [ 'class' => Module::class, ], Modules::class => [ 'class' => Modules::class, 'arguments' => [ new SR(EntityFactory::class), new SR(License::class), new SR(Module::class), new SR(QueryFactory::class), new SR(Database::class), ], ], Installer::class => [ 'class' => Installer::class, 'arguments' => [ new SR(EntityFactory::class), new SR(Module::class), ], ], Support::class => [ 'class' => Support::class, 'arguments' => [ new SR(Config::class), new SR(Settings::class), new SR(EntityFactory::class), ], ], EntityMigrator::class => [ 'class' => EntityMigrator::class, 'arguments' => [ new SR(Database::class), new SR(QueryFactory::class), new SR(SqlPresentor::class), ], ], SqlPresentor::class => [ 'class' => SqlPresentor::class, ], UpdateObject::class => [ 'class' => UpdateObject::class, ], //> Logic classes ProductsLogic::class => [ 'class' => ProductsLogic::class, 'arguments' => [ new SR(EntityFactory::class), new SR(MoneyLogic::class), ], ], CatalogLogic::class => [ 'class' => CatalogLogic::class, 'arguments' => [ new SR(EntityFactory::class), new SR(Money::class) ], ], OrdersLogic::class => [ 'class' => OrdersLogic::class, 'arguments' => [ new SR(EntityFactory::class), new SR(ProductsLogic::class), new SR(\Okay\Logic\MoneyLogic::class), ], ], FilterLogic::class => [ 'class' => FilterLogic::class, 'arguments' => [ new SR(EntityFactory::class), new SR(Settings::class), new SR(Languages::class), new SR(Request::class), new SR(Router::class), new SR(Design::class), ], ], MoneyLogic::class => [ 'class' => MoneyLogic::class, 'arguments' => [ new SR(EntityFactory::class), ], ], FeaturesLogic::class => [ 'class' => FeaturesLogic::class, 'arguments' => [ new SR(Database::class), new SR(Import::class), new SR(Translit::class), new SR(EntityFactory::class), new SR(QueryFactory::class), ] ], //> Logic ]; $adapters = include __DIR__ . '/../Adapters/adapters.php'; return array_merge($services, $adapters); Okay/Modules/000077500000000000000000000000001354315552000133745ustar00rootroot00000000000000Okay/Modules/OkayCMS/000077500000000000000000000000001354315552000146425ustar00rootroot00000000000000Okay/Modules/OkayCMS/GoogleMerchant/000077500000000000000000000000001354315552000175405ustar00rootroot00000000000000Okay/Modules/OkayCMS/GoogleMerchant/design/000077500000000000000000000000001354315552000210115ustar00rootroot00000000000000Okay/Modules/OkayCMS/GoogleMerchant/design/html/000077500000000000000000000000001354315552000217555ustar00rootroot00000000000000Okay/Modules/OkayCMS/GoogleMerchant/design/html/feed.xml.tpl000066400000000000000000000066331354315552000242100ustar00rootroot00000000000000 {if $settings->okaycms__google_merchant__company} {$settings->okaycms__google_merchant__company} {/if} {$rootUrl} {foreach $products as $p} {foreach $p->variants as $v} {if !$settings->okaycms__google_merchant__upload_non_exists_products_to_google && $v->stock === '0'}{continue}{/if} {if $settings->okaycms__google_merchant__no_export_without_price == 1 && $v->price == 0}{continue}{/if} {if $settings->okaycms__google_merchant__use_variant_name_like_size} {$p->name|escape} {if $v->name}{$v->name|escape}{/if} {else} {$p->name|escape}{if !empty($v->name)} {$v->name|escape}{/if} {/if} {url_generator route="product" url=$p->url absolute=1}{if !$v@first}?variant={$v->id}{/if} {if $settings->okaycms__google_merchant__use_full_description_to_google}{$p->description|strip_tags|escape}{else}{$p->annotation|strip_tags|escape}{/if} {$v->id} new {if round($v->compare_price|convert:$main_currency->id:false, 2) > round($v->price|convert:$main_currency->id:false, 2)} {round($v->compare_price|convert:$main_currency->id:false, 2)} {$main_currency->code} {round($v->price|convert:$main_currency->id:false, 2)} {$main_currency->code} {else} {round($v->price|convert:$main_currency->id:false, 2)} {$main_currency->code} {/if} {if $v->stock !== 0}in stock{else}not in stock{/if} {if isset($all_brands[$p->brand_id])} {$all_brands[$p->brand_id]->name|escape} {/if} {if $settings->okaycms__google_merchant__adult}true{else}false{/if} {if $p->color} {$p->color} {/if} {if $p->product_type} {$p->product_type} {/if} {if !empty($p->images)} {foreach $p->images as $image} {if $image@first} {$image->filename|resize:800:600} {else} {$image->filename|resize:800:600} {/if} {if $image@iteration == 10}{break}{/if} {/foreach} {/if} {/foreach} {/foreach} Okay/Modules/OkayCMS/Integration1C/000077500000000000000000000000001354315552000173115ustar00rootroot00000000000000Okay/Modules/OkayCMS/Integration1C/Backend/000077500000000000000000000000001354315552000206405ustar00rootroot00000000000000Okay/Modules/OkayCMS/Integration1C/Backend/Controllers/000077500000000000000000000000001354315552000231465ustar00rootroot00000000000000Okay/Modules/OkayCMS/Integration1C/Backend/Controllers/Description1CAdmin.php000066400000000000000000000015431354315552000273020ustar00rootroot00000000000000get(OrderStatusEntity::class); if ($this->request->method('post') && $this->request->post('status_1c')) { $statuses = $this->request->post('status_1c'); foreach($statuses as $id => $status) { $orderStatusEntity->update($id, ['status_1c' => $status]); } } $ordersStatuses = $orderStatusEntity->find(); $this->design->assign('orders_statuses', $ordersStatuses); $this->response->setContent($this->design->fetch('description.tpl')); } }Okay/Modules/OkayCMS/Integration1C/Backend/design/000077500000000000000000000000001354315552000221115ustar00rootroot00000000000000Okay/Modules/OkayCMS/Integration1C/Backend/design/html/000077500000000000000000000000001354315552000230555ustar00rootroot00000000000000Okay/Modules/OkayCMS/Integration1C/Backend/design/html/description.tpl000066400000000000000000000301041354315552000261170ustar00rootroot00000000000000{$meta_title = $btr->rozetka_xml|escape scope=global} {*Название страницы*}
{$btr->okaycms__integration_ic__description_title|escape}
{$btr->general_caution|escape}!
{$btr->okaycms__integration_ic__description_part_1} ({url_generator route="integration_1c" absolute=1}) {$btr->okaycms__integration_ic__description_part_2}.
{*Блок статусов заказов*}
{*Шапка таблицы*}
{$btr->general_name|escape}
{$btr->order_settings_1c_action|escape}
{if $orders_statuses} {foreach $orders_statuses as $order_status}
{$order_status->name|escape} {if $is_mobile == true}
{/if}
{if $is_mobile == false}
{/if}
{/foreach} {/if}
{if $is_mobile == true}
{/if}
{if $is_mobile == false}
{/if}
{*Блок массовых действий*}
{* On document load *} {literal} {/literal} Okay/Modules/OkayCMS/Integration1C/Backend/design/html/svg_icon.tpl000066400000000000000000001246221354315552000254140ustar00rootroot00000000000000{strip} {if !$width}{assign var="width" value="40"}{/if} {if !$height}{assign var="height" value="40"}{/if} {if !$fill}{assign var="fill" value="#000000"}{/if} {if $svgId == "left_catalog"} {/if} {if $svgId == "return"} {/if} {if $svgId == "add"} {/if} {if $svgId == "mobile_menu"} {/if} {if $svgId == "mobile_menu2"} {/if} {if $svgId == "checked"} {/if} {if $svgId == "email"} {/if} {if $svgId == "phone"} {/if} {if $svgId == "tag"} {/if} {if $svgId == "magic"} {/if} {if $svgId == "infinity"} {/if} {if $svgId == "sorts"} {/if} {if $svgId == "plus"} {/if} {if $svgId == "minus"} {/if} {if $svgId == "drag_vertical"} {/if} {if $svgId == "notify"} {/if} {if $svgId == "exit"} {/if} {if $svgId == "help_icon"} {/if} {if $svgId == "warn_icon"} {/if} {if $svgId == "info_icon"} {/if} {if $svgId == "video_icon"} {/if} {if $svgId == "delete"} {/if} {if $svgId == "icon_featured"} {/if} {if $svgId == "icon_copy"} {/if} {if $svgId == "icon_desktop"} {/if} {if $svgId == "icon_tooltips"} {/if} {if $svgId == "techsupport"} {/if} {if $svgId == "logout"} {/if} {if $svgId == "left_orders"} {/if} {if $svgId == "left_users"} {/if} {if $svgId == "left_modules"} {/if} {if $svgId == "left_pages"} {/if} {if $svgId == "left_blog"} {/if} {if $svgId == "sertificat"} {/if} {if $svgId == "left_comments"} {/if} {if $svgId == "left_auto"} {/if} {if $svgId == "left_stats"} {/if} {if $svgId == "left_seo"} {/if} {if $svgId == "left_topvisor_title"} {/if} {if $svgId == "left_design"} {/if} {if $svgId == "left_banners"} {/if} {if $svgId == "left_settings"} {/if} {if $svgId == "refresh_icon"} {/if} {if $svgId == "user_icon"} {/if} {if $svgId == "pass_icon"} {/if} {/strip} backend/000077500000000000000000000000001354315552000124505ustar00rootroot00000000000000backend/Controllers/000077500000000000000000000000001354315552000147565ustar00rootroot00000000000000backend/Controllers/FeatureAdmin.php000066400000000000000000000327631354315552000200460ustar00rootroot00000000000000request->method('post')) { $feature->id = $this->request->post('id', 'integer'); $feature->name = $this->request->post('name'); $feature->in_filter = intval($this->request->post('in_filter')); $feature->auto_name_id = $this->request->post('auto_name_id'); $feature->auto_value_id = $this->request->post('auto_value_id'); $feature->url = $this->request->post('url', 'string'); $feature->url_in_product = $this->request->post('url_in_product'); $feature->to_index_new_value = $this->request->post('to_index_new_value'); $feature->description = $this->request->post('description'); $feature->url = preg_replace("/[\s]+/ui", '', $feature->url); $feature->url = strtolower(preg_replace("/[^0-9a-z]+/ui", '', $feature->url)); if (empty($feature->url)) { $feature->url = $translit->translitAlpha($feature->name); } $featureCategories = $this->request->post('feature_categories', null, []); // Не допустить одинаковые URL свойств. if (($f = $featuresEntity->get($feature->url)) && $f->id!=$feature->id) { $this->design->assign('message_error', 'duplicate_url'); } elseif(empty($feature->name)) { $this->design->assign('message_error', 'empty_name'); } elseif (!$featuresEntity->checkAutoId($feature->id, $feature->auto_name_id)) { $this->design->assign('message_error', 'auto_name_id_exists'); } elseif (!$featuresEntity->checkAutoId($feature->id, $feature->auto_value_id, "auto_value_id")) { $this->design->assign('message_error', 'auto_value_id_exists'); } elseif ($this->isNameForbidden($feature->name)) { $this->design->assign('forbidden_names', $this->forbiddenNames); $this->design->assign('message_error', 'forbidden_name'); } else { /*Добавление/Обновление свойства*/ if (empty($feature->id)) { $feature->id = $featuresEntity->add($feature); $feature = $featuresEntity->get($feature->id); $this->design->assign('message_success', 'added'); } else { $featuresEntity->update($feature->id, $feature); $feature = $featuresEntity->get($feature->id); $this->design->assign('message_success', 'updated'); } $featuresEntity->updateFeatureCategories($feature->id, $featureCategories); } // Если отметили "Индексировать все значения" if (isset($_POST['to_index_all_values']) && $feature->id) { $toIndexAllValues = $this->request->post('to_index_all_values', 'integer'); $update = $queryFactory->newUpdate(); $update->table('__features_values') ->col('to_index', $toIndexAllValues) ->where('feature_id=:feature_id') ->bindValue('feature_id', $feature->id); $this->db->query($update); } $featuresValues = []; if ($this->request->post('feature_values')) { foreach ($this->request->post('feature_values') as $n=>$fv) { foreach ($fv as $i=>$v) { if (empty($featuresValues[$i])) { $featuresValues[$i] = new \stdClass; } $featuresValues[$i]->$n = $v; } } } if ($valuesToDelete = $this->request->post('values_to_delete')) { foreach ($featuresValues as $k=>$fv) { if (in_array($fv->id, $valuesToDelete)) { unset($featuresValues[$k]); $featuresValuesEntity->delete($fv->id); } } } $featureValuesIds = []; foreach($featuresValues as $fv) { if (!$fv->to_index) { $fv->to_index = 0; } // TODO Обработка ошибок не уникального тринслита или генерить уникальный if ($fv->value) { $fv->feature_id = $feature->id; if (!empty($fv->id)) { $featuresValuesEntity->update($fv->id, $fv); } else { unset($fv->id); $fv->id = $featuresValuesEntity->add($fv); } $featureValuesIds[] = $fv->id; } } asort($featureValuesIds); $i = 0; foreach($featureValuesIds as $featureValueId) { $featuresValuesEntity->update($featureValuesIds[$i], ['position'=>$featureValueId]); $i++; } // Если прислали значения для объединения if (($unionMainValueId = $this->request->post('union_main_value_id', 'integer')) && ($unionSecondValueId = $this->request->post('union_second_value_id', 'integer'))) { $unionMainValue = $featuresValuesEntity->get((int)$unionMainValueId); $unionSecondValue = $featuresValuesEntity->get((int)$unionSecondValueId); if ($unionMainValue && $unionSecondValue && $unionMainValue->id != $unionSecondValue->id) { // Получим id товаров для которых уже есть занчение, которое мы объединяем $select = $queryFactory->newSelect(); $select->from('__products_features_values') ->cols(['product_id']) ->where('value_id=:value_id') ->bindValue('value_id', $unionMainValue->id); $this->db->query($select); $productsIds = $this->db->results('product_id'); // Добавляем значение с которым объединяли всем товарам у которых было старое значение foreach ($productsIds as $productId) { $sql = $queryFactory->newSqlQuery(); $sql->setStatement("REPLACE INTO `__products_features_values` SET `product_id`=:product_id, `value_id`=:value_id") ->bindValue('product_id', $productId) ->bindValue('value_id', $unionSecondValue->id); $this->db->query($sql); } // Удаляем занчение которое мы объединяли $featuresValuesEntity->delete($unionMainValue->id); } } } else { $feature->id = $this->request->get('id', 'integer'); $feature = $featuresEntity->get($feature->id); } if (!empty($feature->id)) { $featuresValues = []; $featuresValuesFilter = ['feature_id'=>$feature->id]; if ($featuresValuesFilter['limit'] = $this->request->get('limit', 'integer')) { $featuresValuesFilter['limit'] = max(5, $featuresValuesFilter['limit']); $featuresValuesFilter['limit'] = min(100, $featuresValuesFilter['limit']); $_SESSION['features_values_num_admin'] = $featuresValuesFilter['limit']; } elseif (!empty($_SESSION['features_values_num_admin'])) { $featuresValuesFilter['limit'] = $_SESSION['features_values_num_admin']; } else { $featuresValuesFilter['limit'] = 25; } $this->design->assign('current_limit', $featuresValuesFilter['limit']); $featuresValuesFilter['page'] = max(1, $this->request->get('page', 'integer')); $feature_values_count = $featuresValuesEntity->count($featuresValuesFilter); // Показать все страницы сразу if($this->request->get('page') == 'all') { $featuresValuesFilter['limit'] = $feature_values_count; } if($featuresValuesFilter['limit'] > 0) { $pages_count = ceil($feature_values_count/$featuresValuesFilter['limit']); } else { $pages_count = 0; } if ($this->request->post('action') == 'move_to_page' && $this->request->post('check')) { /*Переместить на страницу*/ $target_page = $this->request->post('target_page', 'integer'); // Сразу потом откроем эту страницу $featuresValuesFilter['page'] = $target_page; $check = $this->request->post('check'); $select = $queryFactory->newSelect(); $select->from('__features_values') ->cols(['id']) ->where('feature_id = :feature_id') ->where('id NOT IN (:id)') ->bindValues([ 'feature_id' => $feature->id, 'id' => (array)$check, ]) ->orderBy(['position ASC']); //$query = $this->db->placehold("SELECT id FROM __features_values WHERE feature_id=? AND id not in (?@) ORDER BY position ASC", $feature->id, (array)$check); $this->db->query($select); $ids = $this->db->results('id'); // вычисляем после какого значения вставить то, которое меремещали $offset = $featuresValuesFilter['limit'] * ($target_page)-1; $featureValuesIds = array(); // Собираем общий массив id значений, и в нужное место добавим значение которое перемещали // По сути иммитация если выбрали page=all и мереместили приблизительно в нужное место значение foreach ($ids as $k=>$id) { if ($k == $offset) { $featureValuesIds = array_merge($featureValuesIds, $check); unset($check); } $featureValuesIds[] = $id; } if (!empty($check)) { $featureValuesIds = array_merge($featureValuesIds, $check); } asort($featureValuesIds); $i = 0; foreach ($featureValuesIds as $featuresValueId) { $featuresValuesEntity->update($featureValuesIds[$i], ['position'=>$featuresValueId]); $i++; } } $featuresValuesFilter['page'] = min($featuresValuesFilter['page'], $pages_count); $this->design->assign('feature_values_count', $feature_values_count); $this->design->assign('pages_count', $pages_count); $this->design->assign('current_page', $featuresValuesFilter['page']); $featureValuesIds = []; foreach ($featuresValuesEntity->find($featuresValuesFilter) as $fv) { $featuresValues[$fv->translit] = $fv; $featureValuesIds[] = $fv->id; } $productsCounts = $featuresValuesEntity->countProductsByValueId($featureValuesIds); $this->design->assign('products_counts', $productsCounts); $this->design->assign('features_values', $featuresValues); } $featureCategories = []; if ($feature) { $featureCategories = $featuresEntity->getFeatureCategories($feature->id); } elseif ($category_id = $this->request->get('category_id')) { $featureCategories[] = $category_id; } $categories = $categoriesEntity->getCategoriesTree(); $this->design->assign('categories', $categories); $this->design->assign('feature', $feature); $this->design->assign('feature_categories', $featureCategories); $this->response->setContent($this->design->fetch('feature.tpl')); } private function isNameForbidden($name) // todo доделать после импорта { $result = false; /*foreach($this->import->columns_names as $i=>$names) { $this->forbiddenNames = array_merge($this->forbiddenNames, $names); foreach($names as $n) { if(preg_match("~^".preg_quote($name)."$~ui", $n)) { $result = true; } } }*/ return $result; } } backend/Controllers/OrderSettingsAdmin.php000066400000000000000000000112461354315552000212400ustar00rootroot00000000000000request->post('status')) { // Сортировка if($this->request->post('positions')){ $positions = $this->request->post('positions'); $ids = array_keys($positions); sort($positions); foreach ($positions as $i=>$position) { $orderStatusEntity->update($ids[$i], array('position'=>$position)); } } /*Создание статуса*/ if ($this->request->post('new_name')){ $new_status = $this->request->post('new_name'); $new_params = $this->request->post('new_is_close'); $new_colors = $this->request->post('new_color'); foreach ($new_status as $id=>$value) { if (!empty($value)) { $new_stat = new \stdClass(); $new_stat->name = $value; $new_stat->is_close = $new_params[$id]; $new_stat->color = $new_colors[$id]; $orderStatusEntity->add($new_stat); } } } /*Обновление статуса*/ if($this->request->post('name')) { $current_status = $this->request->post('name'); $is_close = $this->request->post('is_close'); $colors_status = $this->request->post('color'); foreach ($current_status as $id=>$value) { $update_status = new \stdClass(); $update_status->name = $value; $update_status->is_close = $is_close[$id]; $update_status->color = $colors_status[$id]; $orderStatusEntity->update($id,$update_status); } } $idsToDelete = $this->request->post('check'); if (!empty($idsToDelete) && $orderStatusEntity->count() > 1) { $result = $orderStatusEntity->delete($idsToDelete); $this->design->assign("error_status", $result); } } // Отображение $ordersStatuses = $orderStatusEntity->find(); $this->design->assign('orders_statuses', $ordersStatuses); /*Метки заказов*/ if ($this->request->post('labels')) { // Сортировка if ($this->request->post('positions')){ $positions = $this->request->post('positions'); $ids = array_keys($positions); sort($positions); foreach ($positions as $i=>$position) { $orderLabelsEntity->update($ids[$i], ['position'=>$position]); } } /*Добавление метки*/ if ($this->request->post('new_name')){ $new_labels = $this->request->post('new_name'); $new_colors = $this->request->post('new_color'); foreach ($new_labels as $id=>$value) { if (!empty($value)) { $new_label = new \stdClass(); $new_label->name = $value; $new_label->color = $new_colors[$id]; $orderLabelsEntity->add($new_label); } } } /*Обновление метки*/ if ($this->request->post('name')) { $current_labels = $this->request->post('name'); $colors = $this->request->post('color'); $ids = $this->request->post('id'); foreach ($current_labels as $id=>$value) { $update_label = new \stdClass(); $update_label->name = $value; $update_label->color = $colors[$id]; $orderLabelsEntity->update($ids[$id],$update_label); } } // Действия с выбранными $idToDelete = $this->request->post('check'); if (!empty($ids)) { $orderLabelsEntity->delete($idToDelete); } } // Отображение $labels = $orderLabelsEntity->find(); $this->design->assign('labels', $labels); $this->response->setContent($this->design->fetch('order_settings.tpl')); } } backend/Controllers/ProductAdmin.php000066400000000000000000000656351354315552000200770ustar00rootroot00000000000000$va) { foreach ($va as $i=>$v) { if (empty($productVariants[$i])) { $productVariants[$i] = new stdClass(); } if (empty($v) && in_array($n, ['id', 'weight'])) { $v = null; } $productVariants[$i]->$n = $v; } } return $productVariants; } public function fetch( ProductsEntity $productsEntity, VariantsEntity $variantsEntity, CategoriesEntity $categoriesEntity, BrandsEntity $brandsEntity, ImagesEntity $imagesEntity, Image $imageCore, CurrenciesEntity $currenciesEntity, SpecialImagesEntity $specialImagesEntity, FeaturesValuesEntity $featuresValuesEntity, FeaturesEntity $featuresEntity, QueryFactory $queryFactory, Translit $translit ) { $productCategories = []; $relatedProducts = []; $productImages = []; /*Прием данных о товаре*/ if ($this->request->method('post') && !empty($_POST)) { $product = new stdClass(); $product->id = $this->request->post('id', 'integer'); $product->name = $this->request->post('name'); $product->visible = $this->request->post('visible', 'integer'); $product->featured = $this->request->post('featured', 'integer'); $product->brand_id = $this->request->post('brand_id', 'integer'); $product->url = trim($this->request->post('url', 'string')); $product->meta_title = $this->request->post('meta_title'); $product->meta_keywords = $this->request->post('meta_keywords'); $product->meta_description = $this->request->post('meta_description'); $product->annotation = $this->request->post('annotation'); $product->description = $this->request->post('description'); $product->rating = $this->request->post('rating', 'float'); $product->votes = $this->request->post('votes', 'integer'); $product->special = $this->request->post('special','string'); $productVariants = $this->prepareVariantsFromPost($this->request->post('variants')); // Категории товара $productCategories = $this->request->post('categories'); if (is_array($productCategories)) { $pc = []; foreach ($productCategories as $c) { $x = new stdClass(); $x->id = $c; $pc[$x->id] = $x; } $productCategories = $pc; } // Связанные товары if (is_array($this->request->post('related_products'))) { $rp = []; foreach($this->request->post('related_products') as $p) { $rp[$p] = new stdClass(); $rp[$p]->product_id = $product->id; $rp[$p]->related_id = $p; } $relatedProducts = $rp; } // Не допустить пустое название товара. if (empty($product->name)) { $this->design->assign('message_error', 'empty_name'); if(!empty($product->id)) { $productImages = $imagesEntity->find(['product_id'=>$product->id]); } } // Не допустить пустую ссылку. elseif (empty($product->url)) { $this->design->assign('message_error', 'empty_url'); if (!empty($product->id)) { $productImages = $imagesEntity->find(['product_id'=>$product->id]); } } // Не допустить одинаковые URL разделов. elseif (($p = $productsEntity->get($product->url)) && $p->id!=$product->id) { $this->design->assign('message_error', 'url_exists'); if (!empty($product->id)) { $productImages = $imagesEntity->find(['product_id'=>$product->id]); } } // Не допусть URL с '-' в начале или конце elseif (substr($product->url, -1) == '-' || substr($product->url, 0, 1) == '-') { $this->design->assign('message_error', 'url_wrong'); if (!empty($product->id)) { $productImages = $imagesEntity->find(['product_id'=>$product->id]); } } elseif (empty($productCategories)) { $this->design->assign('message_error', 'empty_categories'); if (!empty($product->id)) { $productImages = $imagesEntity->find(['product_id'=>$product->id]); } } else { if (empty($product->id)) { //lastModify if (!empty($product->brand_id)) { $brandsEntity->update($product->brand_id, ['last_modify'=>'now()']); } $product->id = $productsEntity->add($product); $product = $productsEntity->get($product->id); $this->design->assign('message_success', 'added'); } else { //lastModify $oldBrandId = $productsEntity->cols(['brand_id'])->get((int)$product->id)->brand_id; if (!empty($product->brand_id) && $oldBrandId != $product->brand_id) { $brandsEntity->update($oldBrandId, ['last_modify'=>'now()']); $brandsEntity->update($product->brand_id, ['last_modify'=>'now()']); } $productsEntity->update($product->id, $product); $product = $productsEntity->get($product->id); $this->design->assign('message_success', 'updated'); } if (!empty($product->id)) { //lastModify $select = $queryFactory->newSelect(); $select->cols(['category_id']) ->from('__products_categories') ->where('product_id=:product_id') ->bindValue('product_id', $product->id); $this->db->query($select); $cIds = $this->db->results('category_id'); if (!empty($cIds)) { $categoriesEntity->update($cIds, ['last_modify' => 'now()']); } // Категории товара $delete = $queryFactory->newDelete(); $delete->from('__products_categories') ->where('product_id=:product_id') ->bindValue('product_id', $product->id); $this->db->query($delete); if (is_array($productCategories)) { $i = 0; foreach($productCategories as $category) { $categoriesEntity->addProductCategory($product->id, $category->id, $i); $i++; } unset($i); } /*Работы с вариантами товара*/ if (is_array($productVariants)) { $variantsIds = []; foreach ($productVariants as $index=>&$variant) { if ($variant->stock == '∞' || $variant->stock == '') { $variant->stock = null; } $variant->price = $variant->price > 0 ? str_replace(',', '.', $variant->price) : 0; $variant->compare_price = $variant->compare_price > 0 ? str_replace(',', '.', $variant->compare_price) : 0; if (!empty($variant->id)) { $variantsEntity->update($variant->id, $variant); } else { $variant->product_id = $product->id; $variant->id = $variantsEntity->add($variant); } $variant = $variantsEntity->get((int)$variant->id); if (!empty($variant->id)) { $variantsIds[] = $variant->id; } } // Удалить непереданные варианты $current_variants = $variantsEntity->find(['product_id'=>$product->id]); foreach ($current_variants as $current_variant) { if (!in_array($current_variant->id, $variantsIds)) { $variantsEntity->delete($current_variant->id); } } // Отсортировать варианты asort($variantsIds); $i = 0; foreach ($variantsIds as $variant_id) { $variantsEntity->update($variantsIds[$i], ['position'=>$variant_id]); $i++; } } // Удаление изображений $images = (array)$this->request->post('images'); $currentImages = $imagesEntity->find(['product_id'=>$product->id]); foreach ($currentImages as $image) { if (!in_array($image->id, $images)) { $imagesEntity->delete($image->id); } } // Порядок изображений if ($images = $this->request->post('images')) { $i=0; foreach ($images as $id) { $imagesEntity->update($id, ['position'=>$i]); $i++; } } // Загрузка изображений drag-n-drop файлов $images = $this->request->post('images_urls'); $droppedImages = $this->request->files('dropped_images'); if (!empty($images) && !empty($droppedImages)) { foreach ($images as $url) { $key = array_search($url, $droppedImages['name']); if ($key!==false && $filename = $imageCore->uploadImage($droppedImages['tmp_name'][$key], $droppedImages['name'][$key])) { $image = new stdClass(); $image->product_id = $product->id; $image->filename = $filename; $imagesEntity->add($image); } } } $productImages = $imagesEntity->find(['product_id'=>$product->id]); $main_category = reset($productCategories); $main_image = reset($productImages); $main_image_id = $main_image ? $main_image->id : null; $productsEntity->update($product->id, ['main_category_id'=>$main_category->id, 'main_image_id'=>$main_image_id]); //Загрузка и удаление промо-изображений // Удаление изображений $specialImages = (array)$this->request->post('spec_images'); $currentSpecialImages = $specialImagesEntity->find(); if (!empty($currentSpecialImages)) { foreach ($currentSpecialImages as $image) { if (!in_array($image->id, $specialImages)) { $specialImagesEntity->delete($image->id); } } } // Загрузка изображений из интернета и drag-n-drop файлов if (($specialImages = $this->request->post('spec_images_urls')) && ($specDroppedImages = $this->request->files('spec_dropped_images'))) { foreach ($specialImages as $url) { $key = array_search($url, $specDroppedImages['name']); if ($key !== false && ($specialImagesFilename = $imageCore->uploadImage($specDroppedImages['tmp_name'][$key], $specDroppedImages['name'][$key], $this->config->special_images_dir))) { $specialImage = new stdClass(); $specialImage->filename = $specialImagesFilename; $specialImagesEntity->add($specialImage); } } } // Порядок промо изображений if ($specialImages = $this->request->post('spec_images')) { $i=0; foreach ($specialImages as $id) { $specialImagesEntity->update($id, ['position'=>$i]); $i++; } } // Характеристики товара // Удалим все значения свойств товара $featuresValuesEntity->deleteProductValue($product->id); if ($featuresValues = $this->request->post('features_values')) { $featuresValuesText = $this->request->post('features_values_text'); foreach ($featuresValues as $featureId=>$feature_values) { foreach ($feature_values as $k=>$valueId) { $value = trim($featuresValuesText[$featureId][$k]); if (!empty($value)) { if (!empty($valueId)) { $featuresValuesEntity->update($valueId, ['value' => $value]); } else { /** * Проверим может есть занчение с таким транслитом, * дабы исключить дублирование значений "ТВ приставка" и "TV приставка" и подобных */ $valueTranslit = $translit->translitAlpha($value); // Ищем значение по транслиту в основной таблице, если мы создаем значение не на основном языке $select = $queryFactory->newSelect(); $select->from('__features_values') ->cols(['id']) ->where('feature_id=:feature_id') ->where('translit=:translit') ->limit(1) ->bindValues([ 'feature_id' => $featureId, 'translit' => $valueTranslit, ]); $this->db->query($select); $valueId = $this->db->result('id'); if (empty($valueId) && ($fv = $featuresValuesEntity->find(['feature_id' => $featureId, 'translit' => $valueTranslit]))) { $fv = reset($fv); $valueId = $fv->id; } // Если такого значения еще нет, но его запостили тогда добавим if (!$valueId) { $toIndex = $featuresEntity->cols(['to_index_new_value'])->get((int)$featureId)->to_index_new_value; $featureValue = new stdClass(); $featureValue->value = $value; $featureValue->feature_id = $featureId; $featureValue->to_index = $toIndex; $valueId = $featuresValuesEntity->add($featureValue); } } } if (!empty($valueId)) { $featuresValuesEntity->addProductValue($product->id, $valueId); } } } } // Новые характеристики $newFeaturesNames = $this->request->post('new_features_names'); $newFeaturesValues = $this->request->post('new_features_values'); if (is_array($newFeaturesNames) && is_array($newFeaturesValues)) { foreach ($newFeaturesNames as $i=>$name) { $value = trim($newFeaturesValues[$i]); if (!empty($name) && !empty($value)) { $featuresIds = $featuresEntity->cols(['id'])->find([ 'name' => trim($name), 'limit' => 1, ]); $featureId = reset($featuresIds); if (empty($featureId)) { $featureId = $featuresEntity->add(['name'=>trim($name)]); } $featuresEntity->addFeatureCategory($featureId, reset($productCategories)->id); // Добавляем вариант значения свойства $featureValue = new stdClass(); $featureValue->feature_id = $featureId; $featureValue->value = $value; $valueId = $featuresValuesEntity->add($featureValue); // Добавляем значения к товару $featuresValuesEntity->addProductValue($product->id, $valueId); } } } // Связанные товары $productsEntity->deleteRelatedProduct($product->id); if (is_array($relatedProducts)) { $pos = 0; foreach($relatedProducts as $i=>$relatedProduct) { $productsEntity->addRelatedProduct($product->id, $relatedProduct->related_id, $pos++); } } } } } else { $id = $this->request->get('id', 'integer'); $product = $productsEntity->get(intval($id)); if (!empty($product->id)) { $productVariants = $variantsEntity->find(['product_id'=>$product->id]); $relatedProducts = $productsEntity->getRelatedProducts(array('product_id'=>$product->id)); $productImages = $imagesEntity->find(['product_id'=>$product->id]); } else { // Сразу активен $product = new stdClass(); $product->visible = 1; } } // Категории товара if (!empty($productCategories)) { $productCategories = $categoriesEntity->find(['id'=>array_keys($productCategories)]); } elseif (!empty($product->id)) { foreach ($categoriesEntity->getProductCategories($product->id) as $pc) { $productCategories[$pc->category_id] = $pc; } if (!empty($productCategories)) { foreach ($categoriesEntity->find(['id' => array_keys($productCategories)]) as $category) { $productCategories[$category->id] = $category; } } } if (empty($productVariants)) { $productVariants = [1]; } if (empty($productCategories)) { if ($category_id = $this->request->get('category_id')) { $productCategories[$category_id] = new stdClass(); $productCategories[$category_id]->id = $category_id; } else { $productCategories = []; } } if (empty($product->brand_id) && $brand_id = $this->request->get('brand_id')) { $product->brand_id = $brand_id; } if (!empty($relatedProducts)) { $r_products = []; foreach($relatedProducts as &$r_p) { $r_products[$r_p->related_id] = &$r_p; } $tempProducts = $productsEntity->find(['id' => array_keys($r_products), 'limit' => count(array_keys($r_products))]); foreach($tempProducts as $tempProduct) { $r_products[$tempProduct->id] = $tempProduct; } $relatedProductsImages = $imagesEntity->find(['product_id' => array_keys($r_products)]); foreach($relatedProductsImages as $image) { $r_products[$image->product_id]->images[] = $image; } } // Свойства товара $featuresValues = array(); if (!empty($product->id)) { foreach ($featuresValuesEntity->find(['product_id' => $product->id]) as $fv) { $featuresValues[$fv->feature_id][] = $fv; } } $specialImages = $specialImagesEntity->find(); $this->design->assign('special_images', $specialImages); $this->design->assign('product', $product); $this->design->assign('product_categories', $productCategories); $this->design->assign('product_variants', $productVariants); $this->design->assign('product_images', $productImages); $this->design->assign('features_values', $featuresValues); $this->design->assign('related_products', $relatedProducts); // Все бренды $brandsCount = $brandsEntity->count(); $brands = $brandsEntity->find(['limit' => $brandsCount]); $this->design->assign('brands', $brands); // Все категории $categories = $categoriesEntity->getCategoriesTree(); $this->design->assign('categories', $categories); $this->design->assign('currencies', $currenciesEntity->find()); // Все свойства товара $category = reset($productCategories); if (!is_object($category)) { $category = reset($categories); } if (is_object($category)) { $features = $featuresEntity->find(['category_id'=>$category->id]); $this->design->assign('features', $features); } $this->response->setContent($this->design->fetch('product.tpl')); //return $this->smarty_func();// todo license } private function smarty_func(){ if (file_exists('backend/core/LicenseAdmin.php')) { $module = $this->request->get('module', 'string'); $module = preg_replace("/[^A-Za-z0-9]+/", "", $module); $p=13; $g=3; $x=5; $r = ''; $s = $x; $bs = explode(' ', $this->config->license); foreach($bs as $bl){ for($i=0, $m=''; $idomains, $l->expiration, $l->comment) = explode('#', $r, 3); $l->domains = explode(',', $l->domains); $h = getenv("HTTP_HOST"); if(substr($h, 0, 4) == 'www.') $h = substr($h, 4); $sv = false;$da = explode('.', $h);$it = count($da); for ($i=1;$i<=$it;$i++) { unset($da[0]);$da = array_values($da);$d = '*.'.implode('.', $da); if (in_array($d, $l->domains) || in_array('*.'.$h, $l->domains)) { $sv = true;break; } } if(((!in_array($h, $l->domains) && !$sv) || (strtotime($l->expiration)expiration!='*')) && $module!='LicenseAdmin') { $this->design->fеtсh('рrоduсt.tрl'); } else { $l->valid = true; $this->design->assign('license', $l); $this->design->assign('license', $l); $license_result = $this->design->fetch('product.tpl'); return $license_result; } } else{ die('OkayCMS'); } } } backend/Controllers/SettingsThemeAdmin.php000066400000000000000000000234261354315552000212320ustar00rootroot00000000000000request->method('POST')) { $phones = []; if ($cssColors = $this->request->post('css_colors')) { $templateConfig->updateCssVariables($cssColors); } if ($this->settings->social_share_theme != $this->request->post('social_share_theme')) { $templateConfig->clearCompiled(); } $this->settings->social_share_theme = $this->request->post('social_share_theme'); $this->settings->sj_shares = $this->request->post('sj_shares'); $this->settings->site_email = $this->request->post('site_email'); if ($sitePhones = $this->request->post('site_phones')) { foreach (explode(',', $sitePhones) as $k=>$phone) { $phones[$k] = trim($phone); } } $this->settings->site_phones = $phones; $this->settings->site_social_links = explode(PHP_EOL, $this->request->post('site_social_links')); $this->settings->update('site_working_hours', $this->request->post('site_working_hours')); $this->settings->update('product_deliveries', $this->request->post('product_deliveries')); $this->settings->update('product_payments', $this->request->post('product_payments')); $designImagesDir = $this->config->root_dir .'/'. $this->config->design_images; // Загружаем фавикон сайта if ($_FILES['site_favicon']['error'] == UPLOAD_ERR_OK) { $tmpName = $_FILES['site_favicon']['tmp_name']; $ext = pathinfo($_FILES['site_favicon']['name'],PATHINFO_EXTENSION); $siteFaviconName = 'favicon.' . $ext; if (in_array($ext, $this->allowImg)) { @unlink($designImagesDir . $this->settings->site_favicon); if (move_uploaded_file($tmpName, $designImagesDir . $siteFaviconName)) { $this->settings->site_favicon = $siteFaviconName; $siteFaviconVersion = ltrim($this->settings->site_favicon_version, '0'); if (!$siteFaviconVersion) { $siteFaviconVersion = 0; } $this->settings->site_favicon_version = str_pad(++$siteFaviconVersion, 3, 0, STR_PAD_LEFT); } } else { $this->settings->site_favicon = ''; $this->design->assign('message_error', 'wrong_favicon_ext'); } } elseif (is_null($this->request->post('site_favicon'))) { @unlink($designImagesDir . $this->settings->site_favicon); $this->settings->site_favicon = ''; } // Загружаем логотип сайта $siteLogoName = $this->settings->site_logo; $logoLang = ''; $this->settings->iframe_map_code = $this->request->post('iframe_map_code'); $multilangLogo = $this->request->post('multilang_logo', 'integer'); // если лого мультиязычное, добавим префикс в виде лейбла языка if ($multilangLogo == 1) { $currentLang = $languagesEntity->get($languages->getLangId()); $logoLang = '_' . $currentLang->label; } if ($_FILES['site_logo']['error'] == UPLOAD_ERR_OK) { $tmpName = $_FILES['site_logo']['tmp_name']; $ext = pathinfo($_FILES['site_logo']['name'],PATHINFO_EXTENSION); $siteLogoName = 'logo' . $logoLang . '.' . $ext; if (in_array($ext, $this->allowImg)) { // Удаляем старое лого @unlink($designImagesDir . $this->settings->site_logo); // Загружаем новое лого if (move_uploaded_file($tmpName, $designImagesDir . $siteLogoName)) { $siteLogoVersion = ltrim($this->settings->site_logo_version, '0'); if (!$siteLogoVersion) { $siteLogoVersion = 0; } if ($multilangLogo == 1) { $this->settings->update('site_logo', $siteLogoName); } else { $this->settings->site_logo = $siteLogoName; } $this->settings->site_logo_version = str_pad(++$siteLogoVersion, 3, 0, STR_PAD_LEFT); } } else { $siteLogoName = ''; $this->design->assign('message_error', 'wrong_logo_ext'); } } // Если раньше лого было не мультиязычным, а теперь будет, нужно его продублировать на все языки if ($this->settings->multilang_logo == 0 && $multilangLogo == 1) { $currentLang = $languagesEntity->get($languages->getLangId()); $ext = pathinfo($siteLogoName,PATHINFO_EXTENSION); foreach ($languagesEntity->find() as $language) { $languages->setLangId($language->id); $langLogoName = 'logo_' . $language->label . '.' . $ext; // Дублируем лого на все языки if (file_exists($designImagesDir . $siteLogoName) && $siteLogoName != $langLogoName) { copy($designImagesDir . $siteLogoName, $designImagesDir . $langLogoName); } $this->settings->update('site_logo', $langLogoName); } // Удалим старое, не мультиязычное лого if (file_exists($designImagesDir . $siteLogoName) && $siteLogoName != 'logo_' . $currentLang->label . '.' . $ext) { unlink($designImagesDir . $siteLogoName); } $languages->setLangId($currentLang->id); } // Если раньше лого было мультиязычным, а теперь будет не мультиязычным, нужно сохранить его из основного языка elseif ($this->settings->multilang_logo == 1 && $multilangLogo == 0) { $currentLangId = $languages->getLangId(); $mainLang = $languagesEntity->getMainLanguage(); $ext = pathinfo($siteLogoName,PATHINFO_EXTENSION); $langLogoName = 'logo_' . $mainLang->label . '.' . $ext; $siteLogoName = 'logo.' . $ext; // Дублируем лого из основного языка if (file_exists($designImagesDir . $langLogoName)) { copy($designImagesDir . $langLogoName, $designImagesDir . $siteLogoName); } foreach ($languagesEntity->find() as $language) { $languages->setLangId($language->id); $this->settings->initSettings(); // Удалим все мультиязычные лого @unlink($designImagesDir . $this->settings->site_logo); } // Удалим упоминание о лого в мультиленгах $delete = $queryFactory->newDelete(); $delete->from('__settings_lang') ->where("param ='site_logo'"); $this->db->query($delete); $this->settings->site_logo = $siteLogoName; // Вернем lang_id и мультиязычные настройки $languages->setLangId($currentLangId); } $this->settings->multilang_logo = $multilangLogo; $this->settings->initSettings(); // Удаляем логотип if (is_null($this->request->post('site_logo'))) { unlink($designImagesDir . $this->settings->site_logo); if ($multilangLogo == 1) { $this->settings->update('site_logo', ''); } else { $this->settings->site_logo = ''; } } $this->design->assign('message_success', 'saved'); } $sitePhones = !empty($this->settings->site_phones) ? implode(', ', $this->settings->site_phones) : ""; $this->design->assign('css_variables', $templateConfig->getCssVariables()); $this->design->assign('allow_ext', $this->allowImg); $this->design->assign('js_socials', $jsSocial->getSocials()); $this->design->assign('js_custom_socials', $jsSocial->getCustomSocials()); $this->design->assign('site_phones', $sitePhones); $this->design->assign('site_social_links', implode(PHP_EOL, $this->settings->site_social_links)); $this->response->setContent($this->design->fetch('settings_theme.tpl')); } } backend/design/000077500000000000000000000000001354315552000137215ustar00rootroot00000000000000backend/design/css/000077500000000000000000000000001354315552000145115ustar00rootroot00000000000000backend/design/css/media.css000066400000000000000000000542501354315552000163100ustar00rootroot00000000000000/*========== Media ==========*/ /* Large Devices, Wide Screens */ @media only screen and (min-width : 1200px) { .mobile_header{display: none;} #fix_logo { width: 50px; height: 55px; display: block; position: fixed; z-index: 1200; text-align: center; line-height: 84px; background-color: #272b35; padding-left: 15px; } #fix_logo:before { content: ""; width: 30px; height: 40px; display: inline-block; background: url(../images/logo_img.png) no-repeat center center; background-size: cover; z-index: 1200; background-color: #272b35; } body.menu-pin .page-container {padding-left: 280px;} body.menu-pin header.navbar {padding-left: 280px;} body.menu-pin .admin_switches{margin-left: 0px;} #admin_catalog.fixed_menu, #admin_catalog:hover { transform: translate(210px, 0px); } div.mce-fullscreen { position: fixed; left: 76px!important; width: calc(100% - 84px)!important; } body.menu-pin div.mce-fullscreen { left: 287px !important; width: calc(100% - 295px) !important; } } @media only screen and (max-width : 1199px) { #admin_catalog {left: -280px;} /* header.navbar .container-fluid {overflow: hidden;}*/ body.menu-pin #admin_catalog { width: 280px; transform: translate(280px,0) !important; -webkit-transform: translate(280px,0) !important; -ms-transform: translate(280px,0) !important; } #footer{padding-left: 0px;} header.navbar{padding-left: 0px;} .page-container {padding-left: 0px;} .admin_notification .notification_title, .admin_techsupport a, .admin_exit a {padding: 10px 20px;} #quickview .sidebar_header, #admin_catalog .sidebar_header {padding-left: 15px;} .admin_languages .languages_inner{padding: 0px 20px;} #mobile_menu_right, #mobile_menu { display: block; position: relative; cursor: pointer; float: left; margin-top: 13px; } #okay_logo { position: relative; display: block; margin-left: 20px; float: left; margin-top: 5px; } #okay_logo img{max-width: 180px;} .admin_switches { margin-left: 20px;} .admin_switches.admin_switches_two { margin-left: 5px;} .admin_switches svg{ width: 20px!important; height: 20px!important; margin-right: 0px!important; } .admin_switches span{margin-left: 5px!important;} #mobile_menu_right svg, #mobile_menu svg{width: 30px;height: 30px;} .feature_opt_aliases_list{ -webkit-box-flex: 0; -webkit-flex: 0 0 50%; -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } } /* Medium Devices, Desktops */ @media only screen and (min-width : 992px) { .toggle_arrow_wrap{display: none;} .cur_settings .setting_icon_yandex:hover, .okay_list_setting .setting_icon_yandex:hover{ background: #10CFBD; border-color: #10CFBD; color: #fff; font-weight: 600; } .fn_tooltips{ display: -webkit-inline-box !important; display: -webkit-inline-flex !important; display: -ms-inline-flexbox !important; display: inline-flex !important; -webkit-box-pack: center !important; -webkit-justify-content: center !important; -ms-flex-pack: center !important; justify-content: center !important; -webkit-box-align: center !important; -webkit-align-items: center !important; -ms-flex-align: center !important; align-items: center !important; margin: 0; width: 12px; height: 12px; color: #868686; cursor: pointer; position: relative; top: -4px; } .fn_tooltips svg{ width: 12px; height: 12px; } } @media only screen and (max-width : 991px) { .pr-0 {padding-right: 15px !important;} .pl-0{padding-left: 15px !important;} .boxed_search{padding: 0px 0px 20px;} .product_images_list li{height: 140px;width: 140px;line-height: 140px;} .variants_listadd{min-width: 900px;} .admin_switches {margin-left: 15px;} .okay_list.variants_list{overflow-x: auto !important;overflow-y: visible !important;} .quickview_hidden{display: none!important;} .okay_list .okay_list_body .okay_list_menu_name{ -webkit-box-orient: vertical !important; -webkit-box-direction: normal !important; -webkit-flex-direction: column !important; -ms-flex-direction: column !important; flex-direction: column !important; } .okay_list .okay_list_body .okay_list_menu_name .okay_list_menu_item{ min-height: 40px; } /* Скрытые блоки списков */ .variants_toggle, .okay_list_name_brand, .okay_list_price, .okay_list_users_email, .okay_list_users_date, .okay_list_order_status, .okay_list_order_marker, .okay_list_price, .okay_list_delivery_condit, .okay_list_blog_type, .okay_list_currency_sign, .okay_list_currency_iso, .okay_list_coupon_disposable, .okay_list_coupon_condit, .okay_list_coupon_validity, .okay_list_coupon_count, .okay_list_order_product_count, .okay_list_setting, .okay_list_products_setting{display: none;} /* Переопределение размеров списков */ .okay_list .okay_list_currency_exchange {width: calc(100% - 380px);} .okay_list .okay_list_brands_tag {width: 260px;} .okay_list .okay_list_delivery_name {width: calc(100% - 390px);} .okay_list .okay_list_blog_name {width: calc(100% - 300px);} .okay_list .okay_list_page_name {width: calc(100% - 435px);} .okay_list .okay_list_coupon_name {width: calc(100% - 220px);} .okay_list .okay_list_users_name {width: calc(100% - 260px);} .okay_list .okay_list_order_name {width: calc(100% - 395px);} .okay_list .okay_list_orders_name {width: calc(100% - 360px);} .okay_list .okay_list_features_tag {width: 250px;} .okay_list .okay_list_features_name {width: calc(100% - 500px);} .okay_list .okay_list_brands_name {width: calc(100% - 330px);} .okay_list .subcategories_level_1 .okay_list_categories_name{width: calc(100% - 390px);} .okay_list .subcategories_level_2 .okay_list_categories_name{width: calc(100% - 420px);} .okay_list .okay_list_categories_name {width: calc(100% - 360px);} .okay_list .okay_list_name {width: calc(100% - 320px);} .min_height_335px, .min_height_250px, .min_height_230px, .min_height_210px{min-height: inherit;} .feature_alias_variable{ width: 200px; } .feature_alias_name{ width: 200px; } .feature_alias_value{ width: calc(100% - 500px); } } /* Small Devices, Tablets */ @media only screen and (min-width : 768px) { #quickview{float: right;} .visible_md{display: none;} .boxed_sorting.toggle_body_wrap{ display: block } } @media only screen and (max-width : 767px) { .heading_page { font-size: 22px; line-height: 26px; margin: 10px 0px; } .feature_opt_aliases_list{ -webkit-box-flex: 0; -webkit-flex: 0 0 100%; -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } #okay_logo { margin-left: 25%; } .feature_to_index_new_value{ margin-top: 10px !important; margin-bottom: 10px; } .boxed_success .heading_box, .boxed_warning .heading_box, .boxed_attention .heading_box { font-weight: 600; font-size: 16px; line-height: 20px; } .feature_value_name{ width: 100%; text-align: left; } .feature_value_translit{ width: 100%; text-align: left; } .feature_value_products_num{ width: 100%; text-align: left; } .feature_value_products_num .form-control { text-align: left; } .feature_value_index { width: 100%; text-align: left; display: -webkit-box !important; display: -webkit-flex !important; display: -ms-flexbox !important; display: flex !important; padding-bottom: 5px!important; } .feature_value_index .okay_switch { margin-left: 10px; } .d_flex { display: block !important; } .admin_switches { margin-left: 0px; } .okay_switch { margin-right: 10px; } .feature_row { height: auto; } .tab_navigation_link { display: block; margin: 0px 0px 10px; } .new_feature_row .new_feature_name, .new_feature_row .new_feature_value, .feature_name, .feature_value { float: none; width: 100% } header.navbar .container-fluid { text-align: center; } .okay_list .okay_list_ordfig_price { width: auto; display: block; margin-top: 7px; } .okay_list .okay_list_ordfig_val { display: block; } .okay_list .okay_list_ordfig_name { display: block; float: none; width: 100% } /* Скрытые блоки списков */ .okay_list .okay_list_features_tag, .boxed_sorting, .okay_list_status, .okay_list_translations_num, .okay_list .okay_list_option, .okay_list_reportstats_categories, .okay_list_comments_btn, .okay_list_usergroups_sale, .okay_list_reportstats_total, .okay_list_currency_exchange, .okay_list_usergroups_counts, .okay_list_brands_tag, .okay_list_categorystats_total, .okay_list_orders_price, .okay_list_count, .okay_list .okay_list_footer, .okay_list_check, .variants_item_drag, .okay_list_menu_setting, .okay_list_drag { display: none; } .currencies_wrap .okay_list_footer { display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; } /* Переопределение размеров списков */ .okay_list .okay_list_currency_name { width: calc(100% - 130px); } .okay_list .okay_list_categorystats_categories { width: calc(100% - 100px); } .okay_list .okay_list_reportstats_products { width: calc(100% - 100px); } .okay_list .okay_list_bransimages_name { width: calc(100% - 320px); } .okay_list .okay_list_log_name { width: calc(100% - 200px); } .okay_list .okay_list_order_stg_lbl_name { width: calc(100% - 80px); } .okay_list .okay_list_order_stg_sts_name { width: calc(100% - 110px); } .okay_list .okay_list_translations_variable { width: calc((100% - 200px) / 2); } .okay_list .okay_list_translations_name { width: calc((100% - 0px) / 2); } .okay_list .okay_list_languages_name { width: calc(100% - 80px); } .okay_list .okay_list_manager_name { width: calc(100% - 0px); } .okay_list .okay_list_delivery_name { width: calc(100% - 140px); } .okay_list .okay_list_comments_name { width: calc(100% - 0px); } .okay_list .okay_list_blog_name { width: calc(100% - 80px); } .okay_list .okay_list_page_name { width: calc(100% - 200px); } .okay_list .okay_list_subscribe_name { width: calc(100% - 0px); } .okay_list .okay_list_coupon_name { width: calc(100% - 110px); } .okay_list .okay_list_usergroups_name { width: calc(100% - 0px); } .okay_list .okay_list_users_name { width: calc(100% - 140px); } .okay_list .okay_list_order_name { width: calc(100% - 140px); } .okay_list .okay_list_orders_name { width: calc(100% - 100px); } .okay_list .okay_list_features_name { width: calc(100% - 0px); } .okay_list .okay_list_brands_name { width: calc(100% - 80px); } .okay_list .subcategories_level_1 .okay_list_categories_name { width: calc(100% - 90px); } .okay_list .subcategories_level_2 .okay_list_categories_name { width: calc(100% - 120px); } .okay_list .okay_list_categories_name { width: calc(100% - 60px); } .okay_list .okay_list_related_name { width: calc(100% - 50px); } .okay_list .okay_list_name { width: calc(100% - 80px); } .okay_list .okay_list_menu_name { width: calc(100% - 40px); } .activity_of_switch { flex-direction: row; -webkit-box-orient: inherit; -webkit-box-direction: normal; -webkit-flex-direction: inherit; -ms-flex-direction: row; margin-top: 20px; } .feature_alias_variable, .feature_alias_name, .feature_alias_value{ width: 100%; } .ok_related_list .okay_list_head{ display: none; } .ok_related_list .okay_list_close .btn_close{ display: inline-block; font-weight: normal; line-height: 1; text-align: center; white-space: nowrap; vertical-align: middle; border-radius: 3px; font-weight: 600; cursor: pointer; user-select: none; border: 1px solid transparent; border-top-color: transparent; border-right-color: transparent; border-bottom-color: transparent; border-left-color: transparent; padding: 0.3rem 1rem; font-size: 0.875rem; transition: all 0.2s ease-in-out; color: rgb(255, 255, 255); background-color: rgb(245, 87, 83); border-color: rgb(245, 87, 83); padding: 5px 15px; font-size: 14px; } .ok_related_list .okay_list_close { width: 100%; float: none; text-align: left; } .ok_related_list .okay_list_close .btn_close svg { width: 12px; height: 12px; margin-right: 3px; } .ok_related_list .okay_list_close .btn_close span { display: inline-block; vertical-align: middle; } .ok_related_list .okay_list_row{ -webkit-box-orient: vertical !important; -webkit-box-direction: normal !important; -webkit-flex-direction: column !important; -ms-flex-direction: column !important; flex-direction: column !important; } /* Дополнительное (с правой стороны) меню */ #quickview { position: fixed; right: -285px; top: 0; width: 285px; background: #fff; bottom: 0; z-index: 1000; box-shadow: 0 0 9px rgba(191, 191, 191, 0.36); -webkit-transition: -webkit-transform 400ms cubic-bezier(0.05, 0.74, 0.27, 0.99); transition: transform 400ms cubic-bezier(0.05, 0.74, 0.27, 0.99); -webkit-backface-visibility: hidden; -ms-backface-visibility: hidden; -webkit-perspective: 1000; } #quickview.open { -webkit-transform: translate3d(-100%, 0, 0); transform: translate3d(-100%, 0, 0); -ms-transform: translate(-100%, 0); } .admin_languages, .admin_notification, .admin_techsupport, .admin_exit { float: none; width: 100%; margin-top: 0px; margin-bottom: 10px; cursor: pointer; text-align: left; } .admin_languages a, .admin_notification .notification_title, .admin_techsupport a, .admin_languages .languages_title, .admin_exit a { background: rgb(250, 250, 250); color: rgb(35, 40, 48); border-bottom: 1px solid rgba(0, 0, 0, 0.07); border-top: 1px solid rgba(0, 0, 0, 0.07); text-transform: uppercase; font-size: 12px; } .admin_languages .languages_title { padding: 10px 20px; height: 40px; font-weight: 500; position: relative; display: block; margin-bottom: 10px; } .admin_languages .languages_inner { padding: 0px; } .admin_languages a svg, .admin_notification .notification_title svg, .admin_techsupport a svg { display: none; } .admin_techsupport a { border-top: none; } .admin_languages .quickview_hidden, .admin_notification .quickview_hidden, .admin_techsupport .quickview_hidden, .admin_exit .quickview_hidden { display: inline-block !important; } .notification_toggle { opacity: 1; top: inherit; position: static; visibility: visible; width: 100%; border-radius: 0px; left: 0px; display: block; box-shadow: none; border: none; transition: none; -webkit-transform: translateX(0%); -ms-transform: translateX(0%); padding: 10px 15px 0px 10px; z-index: 200; } .admin_notification .counter, .admin_techsupport .counter { top: 10px; right: 20px; } .techsupport_toggle span { padding: 0px 15px 0px 10px; margin-top: 10px; display: block; } .main .container-fluid { padding-bottom: 60px; } #quickview .sidebar_header { padding-left: 10px; } #quickview .sidebar_header .logo_box { float: left; } .admin_notification .notification_title, .admin_techsupport a, .admin_exit a { padding: 10px; } #footer { line-height: 24px; height: auto; } .boxed_sorting .bootstrap-select { margin-bottom: 10px; } .mobile_input-group { margin-bottom: 10px; } .mobile_text_right { text-align: right; } .mb_mobile_seofilter{ margin-bottom: 10px; } } /* Extra Small Devices, Phones */ @media (min-width : 576px) { .visible_xs{display: none;} .card-group { display: block; width: 100%; table-layout: inherit; } .card-group .card { display: block; vertical-align: top; } .card-group .card + .card { margin-left: 0; border-left: 0; } } @media only screen and (max-width : 575px) { .page-link, .pagination-datatables li a, .pagination li a {padding: 3px 12px;margin: 4px 1px;} .okay_list .okay_list_delivery_photo {width: 80px;} .boxed_search .btn{width: 100%;} .box_adswitch .btn{padding: 8px 18px;} .wrap_head_mob{padding: 0px 0px 20px ;} .btn_small {padding: 12px 18px;width: 100%;} .okay_list .okay_list_footer .btn {margin-right: 10px;margin-left: 10px;} .box_btn_heading, .box_heading {display: block;} .boxes_inline {display: inline-block;} .heading_normal {font-size: 14px;line-height: 18px;margin-bottom: 10px;} .heading_box .box_btn_heading, .wrap_heading .boxes_inline, .wrap_heading .box_heading {display: inline-block;} .okay_list .okay_list_delivery_photo a { width: 60px; height: auto; line-height: inherit; padding: 5px; } .options_aliases .okay_list_head{ display: none; } .theme_btn_heading a{ margin-top: 5px; } .modal-body .btn + .btn { margin-top: 10px; } .modal-body .mx-h { margin-right: 0 !important; margin-left: 0 !important; } .translations_scrolls{min-width: 570px;} .delivery_type{display: block;margin-bottom: 10px;} .delivery_inline_block {display: block;margin-right: 0px;} /* Переопределение размеров списков */ .okay_list .okay_list_currency_name {width: calc(100% - 0px);} .okay_list .okay_list_bransimages_name {width: calc(100% - 140px);} .okay_list .okay_list_log_status {width: 80px;} .okay_list .okay_list_order_stg_sts_name {width: calc(100% - 100px);} .okay_list .okay_list_log_name {width: calc(100% - 160px);} .okay_list .okay_list_delivery_name {width: calc(100% - 80px);} .okay_list .okay_list_page_name {width: calc(100% - 0px);} .okay_list .okay_list_users_name {width: calc(100% - 0px);} .okay_list .okay_list_order_name {width: calc(100% - 80px);} .okay_list .okay_list_order_stg_sts_name_1c { width: 100%; padding-left: 10px !important; } /* Скрытые блоки списков */ .okay_list_users_group, .okay_list_brands_group, .cur_settings, .okay_list_currency_num, .okay_list_pages_group, .okay_list_order_stg_sts_status, .okay_list_order_stg_sts_status2, .okay_list_heading.okay_list_delivery_photo, .okay_list_order_amount_price{display: none;} .options_aliases .okay_list .okay_list_row { width: 100%; height: auto; min-height: 80px; display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-align-items: center; } .options_aliases .okay_list .okay_list_row{ -webkit-box-orient: vertical !important; -webkit-box-direction: normal !important; -webkit-flex-direction: column !important; -ms-flex-direction: column !important; flex-direction: column !important; } .options_aliases .feature_option_name { width: 100%; float: none!important; text-align: left; } .options_aliases .feature_option_aliases { width: 100%; float: none!important; -webkit-box-orient: vertical !important; -webkit-box-direction: normal !important; -webkit-flex-direction: column !important; -ms-flex-direction: column !important; flex-direction: column !important; padding: 10px !important; margin-right: 0px; margin-left: 0px; text-align: left; } .feature_opt_aliases_list{ -webkit-flex-basis: 0; -ms-flex-preferred-size: 0; flex-basis: 0; -webkit-box-flex: 1; -webkit-flex-grow: 1; -ms-flex-positive: 1; flex-grow: 1; max-width: 100%; padding-right: 0px; padding-left: 0px; } } /* Custom, iPhone Retina */ @media only screen and (max-width : 382px) { } backend/design/css/okay.css000066400000000000000000004004161354315552000161730ustar00rootroot00000000000000/* ================================================== OKAY STYLE ================================================== *//* 1. Подключаемые стили 2. Шрифты 3. Общие стили - Text ( Форматирование текста) - Indents (margin, padding) - Heading (Заголовки) - Buttons (Кнопки) - Pagination (Пагинация) - Links (Ссылки) - Boxed - Form (Элементы форм) - Tag - Raiting (Рейтинг) - Drag and drop 4. Стилизация списков на всех страницах 5. Catalog menu 6. Header_style *//* ================================================== OKAY STYLE ================================================== */ /********************************************************************* Подключаемые стили */ @import url("grid.css"); @import url("reboot.css"); @import url("font-awesome.min.css"); @import url("toastr.css"); @import url("simple-hint.css"); @import url("bootstrap-select.css"); @import url("jquery.scrollbar.css"); @import url("bootstrap_theme.css"); /********************************************************************** Шрифты */ @import url('https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300,300i,700|Open+Sans:300,300i,400,400i,600,600i,700,700i,800,800i&subset=cyrillic,cyrillic-ext,latin-ext'); /************************************************************************* Общие стили */ html { max-width: 100%; min-height: 100%; position: static; /*overflow-x: hidden; min-width: 320px;*/ } body { font-family: 'Open Sans', sans-serif; font-size: 14px; min-height: 100%; line-height: 1.2; color: #848484; font-weight: normal; background-color: #FBFBFB; max-width: 100%; min-width: 320px; -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; max-width: 100%; overflow: hidden; } .main .container-fluid { padding: 0 15px; padding-bottom: 35px; min-height: 100%; position: relative; z-index:2; } .main { width: 100%; padding: 0; padding-top: 55px; margin: 0; min-height: 100%; height: calc(100% - 55px); position: relative; width: 100%; overflow: auto; } .border_img{ background-color: rgb(255, 255, 255); background-image: none; border: 1px solid rgb(204, 204, 204); -webkit-border-radius: 2px; -moz-border-radius: 2px; } .d_flex{ display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; } body:not(.top-nav) header.navbar { z-index: 200; } .fn_tooltips{ display: none; } /********************************************************* Text */ .text-success, .text_success{color: #10cfbd;} .text-green, .text_green{color: green;} .text-danger, .text_warning{color: #F55753!important;} .text-primary, .text-info, .text_primary{color: #48b0f7;} .text_dark{color: #2b303b;} .text-white, .text_white{color: #fff;} .text-muted, .text_grey{color: #b4b4b4!important;} .opensans{ font-family: 'Open Sans', sans-serif; } .font_12{font-size: 12px;} .font_14{font-size: 14px;} .font_16{font-size: 16px;} .font_20{font-size: 20px;line-height: 24px;} .text_700{font-weight: 700!important;} .text_600{font-weight: 600!important;} .text_500{font-weight: 500!important;} .text-xs-center, .txt_center{text-align: center!important;} .text-xs-left, .txt_left{text-align: left!important;} .text-xs-right, .txt_left{text-align: right !important;} @media (min-width: 576px) { .text-sm-left {text-align: left !important;} .text-sm-right {text-align: right !important;} .text-sm-center {text-align: center !important;} } @media (min-width: 768px) { .text-md-left {text-align: left !important;} .text-md-right {text-align: right !important;} .text-md-center {text-align: center !important;} } @media (min-width: 992px) { .text-lg-left {text-align: left !important;} .text-lg-right {text-align: right !important;} .text-lg-center {text-align: center !important;} } @media (min-width: 1200px) { .text-xl-left {text-align: left !important;} .text-xl-right {text-align: right !important;} .text-xl-center {text-align: center !important;} } /********************************************************* Indents */ .m-q {margin: 0.25rem 0.25rem !important;} .mt-q {margin-top: 0.25rem !important;} .mb-q { margin-bottom: 0.25rem !important;} .ml-q {margin-left: 0.25rem !important;} .mx-q {margin-right: 0.25rem !important;margin-left: 0.25rem !important;} .my-q {margin-top: 0.25rem !important;margin-bottom: 0.25rem !important;} .m-h {margin: 0.5rem 0.5rem !important;} .mt-h {margin-top: 0.5rem !important;} .mr-h {margin-right: 0.5rem !important;} .mb-h {margin-bottom: 0.5rem !important;} .ml-h {margin-left: 0.5rem !important;} .mx-h {margin-right: 0.5rem !important;margin-left: 0.5rem !important;} .my-h {margin-top: 0.5rem !important;margin-bottom: 0.5rem !important;} .m-0 {margin: 0 0 !important;} .mt-0 { margin-top: 0 !important;} .mr-0 {margin-right: 0 !important;} .mb-0 {margin-bottom: 0 !important;} .ml-0 {margin-left: 0 !important;} .mx-0 {margin-right: 0 !important;margin-left: 0 !important;} .my-0 {margin-top: 0 !important;margin-bottom: 0 !important;} .m-1 {margin: 1rem 1rem !important;} .mt-1 {margin-top: 1rem !important;} .mr-1 {margin-right: 1rem !important;} .mb-1 {margin-bottom: 1rem !important;} .ml-1 {margin-left: 1rem !important;} .mx-1 { margin-right: 1rem !important;margin-left: 1rem !important;} .my-1 {margin-top: 1rem !important;margin-bottom: 1rem !important;} .m-2 {margin: 1.5rem 1.5rem !important;} .mt-2 {margin-top: 1.5rem !important;} .mr-2 {margin-right: 1.5rem !important;} .mb-2 {margin-bottom: 1.5rem !important;} .ml-2 { margin-left: 1.5rem !important;} .mx-2 {margin-right: 1.5rem !important;margin-left: 1.5rem !important;} .my-2 {margin-top: 1.5rem !important;margin-bottom: 1.5rem !important;} .m-3 {margin: 3rem 3rem !important;} .mt-3 {margin-top: 3rem !important;} .mr-3 {margin-right: 3rem !important;} .mb-3 {margin-bottom: 3rem !important;} .ml-3 {margin-left: 3rem !important;} .mx-3 {margin-right: 3rem !important;margin-left: 3rem !important;} .my-3 {margin-top: 3rem !important;margin-bottom: 3rem !important;} .p-q {padding: 0.25rem 0.25rem !important;} .pt-q {padding-top: 0.25rem !important;} .pr-q {padding-right: 0.25rem !important;} .pb-q {padding-bottom: 0.25rem !important;} .pl-q {padding-left: 0.25rem !important;} .px-q {padding-right: 0.25rem !important;padding-left: 0.25rem !important;} .py-q {padding-top: 0.25rem !important;padding-bottom: 0.25rem !important;} .p-h {padding: 0.5rem 0.5rem !important;} .pt-h {padding-top: 0.5rem !important;} .pr-h {padding-right: 0.5rem !important;} .pb-h {padding-bottom: 0.5rem !important;} .pl-h {padding-left: 0.5rem !important;} .px-h {padding-right: 0.5rem !important;padding-left: 0.5rem !important;} .py-h {padding-top: 0.5rem !important;padding-bottom: 0.5rem !important;} .p-0 {padding: 0 0 !important;} .pt-0 {padding-top: 0 !important;} .pr-0 {padding-right: 0 !important;} .pb-0 {padding-bottom: 0 !important;} .pl-0 {padding-left: 0 !important;} .px-0 {padding-right: 0 !important;padding-left: 0 !important;} .py-0 {padding-top: 0 !important;padding-bottom: 0 !important;} .p-1 {padding: 1rem 1rem !important;} .pt-1 {padding-top: 1rem !important;} .pr-1 {padding-right: 1rem !important;} .pb-1 {padding-bottom: 1rem !important;} .pl-1 {padding-left: 1rem !important;} .px-1 {padding-right: 1rem !important;padding-left: 1rem !important;} .py-1 {padding-top: 1rem !important;padding-bottom: 1rem !important;} .p-2 {padding: 1.5rem 1.5rem !important;} .pt-2 {padding-top: 1.5rem !important;} .pr-2 {padding-right: 1.5rem !important;} .pb-2 {padding-bottom: 1.5rem !important;} .pl-2 {padding-left: 1.5rem !important;} .px-2 {padding-right: 1.5rem !important;padding-left: 1.5rem !important;} .py-2 {padding-top: 1.5rem !important;padding-bottom: 1.5rem !important;} .p-3 {padding: 3rem 3rem !important;} .pt-3 {padding-top: 3rem !important;} .pr-3 {padding-right: 3rem !important;} .pb-3 {padding-bottom: 3rem !important;} .pl-3 {padding-left: 3rem !important;} .px-3 {padding-right: 3rem !important;padding-left: 3rem !important;} .py-3 {padding-top: 3rem !important;padding-bottom: 3rem !important;} /************************************************************************* Heading */ .heading_page{ font-family: 'Open Sans Condensed', sans-serif; font-weight: 600; color: #2b303b; font-size: 28px; line-height: 30px; margin-top: 20px; margin-bottom: 20px; } .heading_box{ font-family: 'Open Sans Condensed', sans-serif; font-weight: 700; color: #2b303b; font-size: 18px; line-height: 22px; margin-bottom: 15px; position: relative; } .heading_label{ font-family: 'Open Sans', sans-serif; font-weight: normal; color: #767676; font-size: 14px; line-height: 24px; } .heading_label--required span{ position: relative; } .heading_label--required span:after{ content: "*"; color: #f74c4c; font-size: 14px; margin-left: 3px; } .required__heading_label { color: #f74c4c; font-size: 12px; margin-left: 3px; font-weight: 600; vertical-align: bottom; } .heading_normal{ font-family: 'Open Sans', sans-serif; font-weight: normal; color: #767676; font-size: 16px; line-height: 26px; } .translation_icon{ display: inline-block; vertical-align: bottom; margin-right: 3px; height: 24px; border: 1px solid #ccc9; border-radius: 3px; } .translation_icon img { margin-top: -5px; } .min_height_210px{ min-height: 210px; } .min_height_230px{ min-height: 230px; } .min_height_250px{ min-height: 250px; } .min_height_335px{ min-height: 335px; } .hidden { display: none!important; } .okay_bg{ background: #091A33; } .page-container { width: 100%; height: 100%; padding-left: 70px; position: fixed; overflow: hidden; } .okay_list_heading .hidden_check_1{ display: none; } .okay_list_heading a, .okay_list_heading span{ display: inline-block; vertical-align: middle; } .okay_list_heading a{ color: #fff; margin-left: 3px; } .okay_list_heading a svg{ width: 18px; height: 18px; } /************************************************************************* Links */ a.link{ font-size: 14px; font-weight: normal; font-style: normal; font-stretch: normal; line-height: normal; letter-spacing: normal; color: #263238; text-decoration: underline; } a.link:focus, a.link:hover{ text-decoration: none; } a.link_white{ color: #fff; text-decoration: underline; } a.link_white:focus, a.link_white:hover{ text-decoration: none; } /************************************************************************* Buttons */ .btn { display: inline-block; font-weight: normal; line-height: 1; text-align: center; white-space: nowrap; vertical-align: middle; border-radius: 3px; font-weight: 600; cursor: pointer; user-select: none; border: 1px solid transparent; padding: 0.3rem 1rem; font-size: 0.875rem; transition: all 0.2s ease-in-out; } .btn_admin{ display: inline-block; font-weight: 500; text-align: center; white-space: nowrap; vertical-align: middle; border-radius: 3px; cursor: pointer; user-select: none; border: 1px solid #6d5cae; padding: 6px 10px; transition: all 0.2s ease-in-out; color: #fff; background-color: #6d5cae; } .btn_admin:focus, .btn_admin:hover{ color: #fff; background-color: #8a7dbe; border-color: #8a7dbe; } .btn_vid_help{ border: 1px solid #d55959; color: #fff; background-color: #d55959; margin-left: 5px; margin-bottom: 5px; } .btn_vid_help:focus, .btn_vid_help:hover{ color: #fff; background-color: #de3838; border-color: #de3838; } .btn.btn_big svg{ width: 20px; height: 20px; margin-right: 3px; } .btn.btn_small svg{ width: 14px; height: 14px; margin-right: 5px; } .btn.btn_small.add svg{ width: 20px; height: 20px; } .btn.btn_mini svg{ width: 14px; height: 14px; margin-right: 3px; } .btn:focus, .btn:hover {text-decoration: none;} .btn:active, .btn.active {background-image: none;outline: 0;} .btn.disabled, .btn:disabled {cursor: not-allowed;opacity: .65;} .btn_big{ padding: 0.75rem 1.5rem; font-size: 16px; } .btn_small{ padding: 8px 18px; font-size: 14px; } .btn_mini{ padding: 5px 15px; font-size: 14px; } .btn-block { display: block; width: 100%; } /* Button save */ .btn_blue { color: #fff; background-color: #48b0f7; border-color: #48b0f7; } .btn_blue:active, .btn_blue:focus, .btn_blue:hover { color: #fff; background-color: #6dc0f9; border-color: #6dc0f9; } .btn_blue:active:hover, .btn_blue:active:focus{ color: #fff; background-color: #3a8fc8; border-color: #3a8fc8; } .btn_blue:disabled:focus{ background-color: #3a8fc8; border-color: #3a8fc8; } .btn_blue:disabled:hover { background-color: #3a8fc8; border-color: #3a8fc8; } /* Button info and download */ .btn-info{ color: #fff; background-color: #10cfbd; border-color: #10cfbd; } .btn-info:hover{ color: #fff; background-color: #40d9ca; border-color: #40d9ca; } .btn-info:focus{ color: #fff; background-color: #40d9ca; border-color: #40d9ca; } .btn-info:active{ color: #fff; background-color: #0da899; border-color: #0da899; background-image: none; } .btn-info:active:hover, .btn-info:active:focus{ color: #fff; background-color: #0da899; border-color: #0da899; } .btn-info:disabled:focus{ background-color: #0da899; border-color: #0da899; } .btn-info:disabled:hover { background-color: #0da899; border-color: #0da899; } /* Button add*/ .btn_yellow{ color: #fff; background-color: #f8d053; border-color: #f8d053; } .btn_yellow:hover{ color: #fff; background-color: #f9d975; border-color: #f9d975; } .btn_yellow:focus{ color: #fff; background-color: #f9d975; border-color: #f9d975; } .btn_yellow:active{ color: #fff; background-color: #c9a843; border-color: #c9a843; background-image: none; } .btn_yellow:active:hover, .btn_yellow:active:focus{ color: #fff; background-color: #c9a843; border-color: #c9a843; } .btn_yellow:disabled:focus{ background-color: #c9a843; border-color: #c9a843; } .btn_yellow:disabled:hover { background-color: #c9a843; border-color: #c9a843; } /* Button comments*/ .btn-warning{ color: #fff; background-color: #6d5cae; border-color: #6d5cae; } .btn-warning:hover{ color: #fff; background-color: #8a7dbe; border-color: #8a7dbe; } .btn-warning:focus{ color: #fff; background-color: #8a7dbe; border-color: #8a7dbe; } .btn-warning.active, .btn-warning:active{ color: #fff; background-color: #584b8d; border-color: #584b8d; background-image: none; } .btn-warning.active:hover, .btn-warning:active:hover, .btn-warning:active:focus{ color: #fff; background-color: #584b8d; border-color: #796300; } .btn-warning:disabled:focus{ background-color: #584b8d; border-color: #584b8d; } .btn-warning:disabled:hover { background-color: #584b8d; border-color: #584b8d; } /* Button danger*/ .btn-danger{ color: #fff; background-color: #f55753; border-color: #f55753; } .btn-danger:hover{ color: #fff; background-color: #f77975; border-color: #f77975; } .btn-danger:focus{ color: #fff; background-color: #f77975; border-color: #f77975; } .btn-danger:active{ color: #fff; background-color: #c64643; border-color: #c64643; background-image: none; } .btn-danger:active:hover, .btn-danger:active:focus{ color: #fff; background-color: #c64643; border-color: #c64643; } .btn-danger:disabled:focus{ background-color: #c64643; border-color: #c64643; } .btn-danger:disabled:hover { background-color: #c64643; border-color: #c64643; } .btn-secondary { color: #fff; background-color: #2b303b; border-color: #2b303b; } .btn-secondary:hover{ color: #fff; background-color: #3d424d;; border-color: #3d424d;; } .btn-secondary:focus{ color: #fff; background-color: #3d424d; border-color: #3d424d; } .btn-secondary:active{ color: #fff; background-color: #3d424d; border-color: #3d424d; background-image: none; } .btn-secondary:active:hover, .btn-secondary:active:focus{ color: #fff; background-color: #3d424d; border-color: #3d424d; } .btn-secondary:disabled:focus{ background-color: #3d424d; border-color: #3d424d; } .btn-secondary:disabled:hover{ background-color: #3d424d; border-color: #3d424d; } .btn_border_blue{ color: #48b0f7 ; background-image: none; background-color: transparent; border-color: #48b0f7 ; } .btn_border_blue:hover{ color: #fff; background-color: #6dc0f9 ; border-color: #6dc0f9 ; } .btn_border_blue:focus{ color: #fff; background-color: #48b0f7 ; border-color: #48b0f7 ; } .btn_border_blue:active{ color: #fff; background-color: #3a8fc8 ; border-color: #3a8fc8 ; } .btn_border_blue:active:hover, .btn_border_blue:active:focus{ color: #fff; background-color: #6dc0f9; border-color: #6dc0f9; } .btn_border_blue:disabled:focus{ border-color: #6dc0f9; } .btn_border_blue:disabled:hover { border-color: #6dc0f9; } .btn-outline-info{ color: #10cfbd; background-image: none; background-color: transparent; border-color: #10cfbd; } .btn-outline-info:hover { color: #fff; background-color: #10cfbd; border-color: #10cfbd; } .btn-outline-info:focus{ color: #fff; background-color: #10cfbd; border-color: #10cfbd; } .btn-outline-info:active{ color: #fff; background-color: #0da899; border-color: #0da899; } .btn-outline-info:active:hover, .btn-outline-info:active:focus{ color: #fff; background-color: #0da899; border-color: #0da899; } .btn-outline-info:disabled:focus{ border-color: #0da899; } .btn-outline-info:disabled:hover { border-color: #0da899; } .btn_border_yellow{ color: #f8d053; background-image: none; background-color: transparent; border-color: #f8d053; } .btn_border_yellow:focus, .btn_border_yellow:hover { color: #fff; background-color: #f8d053; border-color: #f8d053; } .btn_border_yellow:active{ color: #fff; background-color: #c9a843; border-color: #c9a843; } .btn_border_yellow:active:hover, .btn_border_yellow:active:focus{ color: #fff; background-color: #c9a843; border-color: #c9a843; } .btn_border_yellow:disabled:focus{ border-color: #c9a843; } .btn_border_yellow:disabled:hover { border-color: #c9a843; } .btn-outline-warning{ color: #6d5cae; background-image: none; background-color: transparent; border-color: #6d5cae; } .btn-outline-warning:focus, .btn-outline-warning:hover { color: #fff; background-color: #6d5cae; border-color: #6d5cae; } .btn-outline-warning.active, .btn-outline-warning:active{ color: #fff; background-color: #584b8d; border-color: #584b8d; } .btn-outline-warning.active:hover, .btn-outline-warning:active:hover, .btn-outline-warning:active:focus{ color: #fff; background-color: #584b8d; border-color: #584b8d; } .btn-outline-warning:disabled:focus{ border-color: #584b8d; } .btn-outline-warning:disabled:hover { border-color: #584b8d; } .btn-outline-danger{ color: #f55753; background-image: none; background-color: transparent; border-color: #f55753; } .btn-outline-danger:hover { color: #fff; background-color: #f55753; border-color: #f55753; } .btn-outline-danger:disabled:focus{ border-color: #fdcdcc; } .btn-outline-danger:disabled:hover { border-color: #fdcdcc; } .btn-outline-secondary{ color: #b0bec5; background-image: none; background-color: transparent; border-color: #b0bec5; } .btn-outline-secondary:hover{ background-color: #20a8d8; border-color: #20a8d8; color: #fff; } .btn-outline-secondary.fn_active_class { background-color: #20a8d8; border-color: #20a8d8; color: #fff; } .btn-outline-secondary:active{ color: #fff; background-color: #b0bec5; border-color: #b0bec5; } .btn-outline-secondary:disabled:focus{ border-color: #ebeef0; } .btn-outline-secondary:disabled:hover { border-color: #ebeef0; } /************************************************************************* Boxed */ .boxed{ background: #FFF; border-radius: 4px 4px 2px 2px; border: 1px solid #e6e6e6; padding: 15px; margin-bottom: 15px; } .boxed_success, .boxed_warning, .boxed_attention{ background-color: #39ccfc; color: #fff; border-color: #39ccfc; background-image: none; box-shadow: none; text-shadow: none; padding: 15px; border-radius: 3px; font-size: 14px; border-width: 0; -webkit-transition: all 0.2s linear 0s; transition: all 0.2s linear 0s; border: 1px solid transparent; } .boxed_warning{ background-color: #F55753; color: #fff; border-color: #F55753; } .boxed_success{ background-color: #0A7C71; color: #fff; border-color: #0A7C71; } .boxed_notify{ background-color: #6d5cae; color: #fff; border-color: #6d5cae; } .boxed_yellow{ background-color: #F8D053; color: #fff; border-color: #F8D053; } .boxed_success .heading_box, .boxed_warning .heading_box, .boxed_attention .heading_box{ font-weight: 600; color: #fff; text-shadow: none; font-size: 20px; margin: 0px; line-height: 24px; } .boxed_success .text_box, .boxed_warning .text_box, .boxed_attention .text_box{ color: #fff; text-shadow: none; font-size: 15px; margin-top: 15px; padding-left: 15px } .boxed_success .text_box li, .boxed_warning .text_box li, .boxed_attention .text_box li{ margin: 7px 0px; line-height: 22px; } .boxed_sorting{ margin-bottom: 15px; } .boxed_button{ margin: 10px 0px 40px; text-align: right; } .box_btn_heading, .boxes_inline, .box_heading{ display: inline-block; vertical-align: middle; margin: 0px; } .box_heading{ margin-right: 20px; line-height: 36px; } .boxes_inline{ margin-right: 10px; } .wrap_heading{ padding: 20px 0px; } .boxed_success .btn_return{ color: #fff; background-image: none; background-color: transparent; border: 2px solid #fff; } .boxed_success .btn_return svg{ width: 15px; height: 15px; margin-right: 5px; } .boxed_success .btn_return:hover{ background-color: #fff; border-color: transparent; color: #0A7C71; } /************************************************************************* Form */ .variant_input, .form-control { background-color: #ffffff; background-image: none; border: 1px solid #ccc; -webkit-appearance: none; color: #2c2c2c; outline: 0; height: 35px; padding: 6px 12px; line-height: normal; font-size: 14px; font-weight: normal; vertical-align: middle; min-height: 35px; -webkit-transition: all 0.12s ease; transition: all 0.12s ease; -webkit-box-shadow: none; box-shadow: none; border-radius: 2px; -webkit-border-radius: 2px; -moz-border-radius: 2px; -webkit-transition: background 0.2s linear 0s; transition: background 0.2s linear 0s; display: block; width: 100%; position: relative; } .import_file{ -webkit-appearance: none; color: #2c2c2c; outline: 0; height: 35px; padding: 6px 12px; line-height: normal; font-size: 14px; font-weight: normal; vertical-align: middle; min-height: 35px; -webkit-transition: all 0.12s ease; transition: all 0.12s ease; -webkit-box-shadow: none; box-shadow: none; border-radius: 2px; -webkit-border-radius: 2px; -moz-border-radius: 2px; -webkit-transition: background 0.2s linear 0s; transition: background 0.2s linear 0s; display: block; width: 100%; position: relative; } .file_upload { position: relative; overflow: hidden; width: 20%; height: 30px; background: url('../images/uploader.png') no-repeat; -webkit-background-size: 30px; background-size: 30px; text-align: center; } .variant_input:focus, .form-control:focus { border-color: rgba(0,0,0,0.1); background-color: #f0f0f0; outline: 0 !important; -webkit-box-shadow: none; box-shadow: none; -webkit-transition: none !important; } .new_feature::-moz-placeholder, .variant_input::-moz-placeholder, .form-control::-moz-placeholder { color: #626262; opacity: 1 } .new_feature:-ms-input-placeholder, .variant_input:-ms-input-placeholder, .form-control:-ms-input-placeholder { color: #626262; } .new_feature::-webkit-input-placeholder, .variant_input::-webkit-input-placeholder, .form-control::-webkit-input-placeholder { color: #626262; } .form-control:disabled, .form-control[readonly] {background-color: #cfd8dc;opacity: 1;cursor: not-allowed} .date_filter .form-control[readonly] {background-color: transparent;cursor: pointer} input[type=search] { -webkit-appearance: none } .form-group { margin-bottom: 15px } select.form-control:focus::-ms-value {color: #607d8b;background-color: #fff;} select{ width: 100%; } .activity_of_switch{ height: 100%; display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; flex-direction: column; -webkit-box-orient: vertical; -webkit-box-direction: normal; -webkit-flex-direction: column; -ms-flex-direction: column; justify-content: center; -webkit-box-pack: justify; -webkit-justify-content: center; -ms-flex-pack: justify; } .activity_of_switch .activity_of_switch_item{ display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; } .hidden_check{ display: none; } .hidden_check_1{ display: none; } .okay_ckeckbox{ width: 20px; height: 20px; display: block; position: relative; text-align: center; margin: 0 auto; } .okay_ckeckbox:before{ cursor: pointer; background-color: #fff; border: 1px solid #cccccc; border-radius: 10%; content: ""; display: inline-block; height: 20px; left: 0; position: absolute; transition: border 0.15s ease-in-out 0s, color 0.15s ease-in-out 0s; width: 20px; } input[type=checkbox]:checked + .okay_ckeckbox:before{ content: '\f00c'; font-family: "FontAwesome"; color: rgb(43, 48, 59); } .fn_user_complite{cursor: pointer;} .header_switcher > a{ color: #263238; display: block; width: 100%; height: 100%; padding: 0.75rem; text-decoration: none; cursor: pointer; } .hide_switcher{ display: none; } .switch_block{ display: block!important; } /* Переключатель */ label.switch_label { margin-top: 3px; margin-right: 10px; } .switch.switch-default { position: relative; display: inline-block; vertical-align: top; width: 30px; height: 5px; background-color: #efefef; cursor: pointer; border-radius: 3px; margin-top: 10px; margin-bottom: 10px; } .switch.switch-default .switch-input { position: absolute; top: 0; left: 0; opacity: 0; } .switch.switch-default .switch-label { position: relative; display: block; height: inherit; font-size: 10px; font-weight: 600; text-transform: uppercase; background-color: #dcdee0; border: 1px solid #dcdee0; border-radius: 2px; -moz-transition: 0.15s ease-out; -o-transition: 0.15s ease-out; -webkit-transition: 0.15s ease-out; transition: 0.15s ease-out; -moz-transition-property: opacity background; -o-transition-property: opacity background; -webkit-transition-property: opacity background; transition-property: opacity background; } .switch.switch-default .switch-input:checked ~ .switch-label::before { opacity: 0; } .switch.switch-default .switch-input:checked ~ .switch-label::after { opacity: 1; } .switch.switch-default .switch-handle { position: absolute; top: -5px; left: 0px; width: 15px; height: 15px; background: #b1aeae; border: 1px solid #b1aeae; border-radius: 50%; -moz-transition: left 0.15s ease-out; -o-transition: left 0.15s ease-out; -webkit-transition: left 0.15s ease-out; transition: left 0.15s ease-out; } .switch.switch-default .switch-input:checked ~ .switch-handle { left: 15px; background: #20a8d8; border: 1px solid #20a8d8; } /************************************************************************* Tag */ .wrap_tags{margin-bottom: -3px; margin-right: -2px;} .tag { line-height: 1; color: rgb(255, 255, 255); text-align: center; vertical-align: baseline; border-radius: 3px; margin-right: 1px; margin-bottom: 2px; margin-top: 2px; font-weight: 600; font-size: 12px; display: inline-block; padding: 3px 9px 5px; text-transform: lowercase; } .tag-default {background-color: rgb(230, 230, 230);color: rgb(98, 98, 98);} .tag-primary {background-color: rgb(58, 143, 200);} .tag-success {background-color: rgb(16, 207, 189);} .tag-info {background-color: rgb(72, 176, 247);} .tag-warning {background-color: rgb(248, 208, 83);} .tag-danger {background-color: rgb(245, 87, 83);} .watermark_image{max-width: 200px;} /* Search */ .boxed_search{padding: 20px 0px;} .search{overflow: hidden;} .search button{height: 35px;} /************************************************************************* Raiting */ .raiting_boxed{ margin-bottom: 15px; margin-top: 5px; } .raiting_boxed .range_input{ margin-top: 3px; } .raiting_boxed .raiting_range_number{ overflow: hidden; margin-top: 3px; } /************************************************************************* Drag and drop */ .move_zone.fa-arrows{ font-size: 20px; color: #02bcf2; } .sortable_flex{ display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; flex-direction: column; -webkit-box-orient: vertical; -webkit-box-direction: normal; -webkit-flex-direction: column; -ms-flex-direction: column; } .sortable_flex_items{ display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; justify-content: space-between; -webkit-box-pack: justify; -webkit-justify-content: space-between; -ms-flex-pack: justify; overflow: hidden; border-bottom: 1px solid #ccc; } .sortable_flex_items_inner{ display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; } .sortable_flex_item{ padding: 10px 15px 10px 0px; } .sortable_flex_item .product_icon{ width: 43px; height: 43px; display: block; background-color: #ffffff; border: solid 1px #cfd8dc; line-height: 43px; text-align: center; } .sortable_flex_item:last-child{ padding: 10px 0px 10px 0px; float: right; } .dropzone_block_image{ background: #F8F8F8; width: 100%; height: 100%; text-align: center; padding: 15px; border: 1px dashed #ddd; position: relative; top: 0; left: 0; cursor: pointer; display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; justify-content: center; -webkit-box-pack: justify; -webkit-justify-content: center; -ms-flex-pack: justify; } .dropzone_block_image .dropzone_image{ opacity: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; cursor: pointer; } .dropzone_block_image:hover{ background: #bababa; } .limit_show{ margin-bottom: 1rem; margin-top: 1rem; padding-left: 0; } .export_block{ float: none; display: inline-block; margin-left: 5px; color: #02bcf2; cursor: pointer; font-size: 32px; position: relative; } .print_block { float: none; display: inline-block; margin-left: 5px; color: #584b8d; cursor: pointer; font-size: 32px; position: relative; } .print_block:hover { color: #584b8d; } .okay_icon img{ width: 22px; } .item_image{ list-style: none; position: relative; border: 1px solid #cfd8dc; padding: 2px; text-align: center; overflow: hidden; max-height: 130px; max-width: 130px; cursor: pointer; height: 130px; width: 130px; line-height: 130px; float: left; } .delete_item{ position: absolute; top: 0; right: 0; display: none; } .item_image:hover > .delete_item{ display: block; } .image_wrapper{ position:relative; } .delete_image{ display: none; position: absolute; top:0; right: 0; } .image_wrapper:hover .delete_image { display: block; } .site_logo_wrap { min-height: 38px; line-height: 38px; vertical-align: middle; } /************************************************************************* Autocomplete */ .autocomplete-suggestions { background-color: #fff; overflow: hidden; overflow-y: auto; display: block; margin-top: 10px; box-shadow: 5px 5px rgba(102, 102, 102, .1); text-shadow: none; margin: 10px 0 0; border: 1px solid #eee; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; max-width: 100%; } .autocomplete-suggestion { display: block; width: 100%; padding: 5px 10px; cursor: pointer; } .autocomplete-suggestion:nth-child(even) { background-color: #fbfbfb; } .autocomplete-suggestions .autocomplete-selected { background: #f0f0f0; } .autocomplete_arrow{ position: relative; cursor: pointer; } .autocomplete_arrow > input{ cursor: pointer; } .autocomplete_arrow > input:focus{ cursor: text; } .autocomplete_arrow::after { content: "\f107"; border: 0; font-family: FontAwesome; font-style: normal; font-weight: 400; position: absolute; right: 10px; top: 10px; } .autocomplete-suggestions strong { font-weight: normal; color: #10cfbd; } .autocomplete-suggestion div { width: 45px !important; text-align: center; margin-right: 5px; } .autocomplete-suggestion div, .autocomplete-suggestions span, .autocomplete-suggestions a { display: inline-block; vertical-align: middle; } .autocomplete-suggestions span { white-space: nowrap; width: calc(100% - 55px); } /************************************************************************* Pagination */ .pagination { display: inline-block; padding-left: 0; margin-top: 20px; margin-bottom: 5px; } .page-item, .pagination-datatables li, .pagination li { display: inline-block; } .page-item:first-child .page-link, .pagination-datatables li:first-child .page-link, .pagination li:first-child .page-link, .page-item:first-child .pagination-datatables li a, .pagination-datatables li .page-item:first-child a, .pagination-datatables li:first-child a, .page-item:first-child .pagination li a, .pagination li .page-item:first-child a, .pagination li:first-child a { margin-left: 0; } .page-item.active .page-link, .pagination-datatables li.active .page-link, .pagination li.active .page-link, .page-item.active .pagination-datatables li a, .pagination-datatables li .page-item.active a, .pagination-datatables li.active a, .page-item.active .pagination li a, .pagination li .page-item.active a, .pagination li.active a, .page-item.active .page-link:focus, .pagination-datatables li.active .page-link:focus, .pagination li.active .page-link:focus, .page-item.active .pagination-datatables li a:focus, .pagination-datatables li .page-item.active a:focus, .pagination-datatables li.active a:focus, .page-item.active .pagination li a:focus, .pagination li .page-item.active a:focus, .pagination li.active a:focus, .page-item.active .page-link:hover, .pagination-datatables li.active .page-link:hover, .pagination li.active .page-link:hover, .page-item.active .pagination-datatables li a:hover, .pagination-datatables li .page-item.active a:hover, .pagination-datatables li.active a:hover, .page-item.active .pagination li a:hover, .pagination li .page-item.active a:hover, .pagination li.active a:hover { z-index: 2; border-radius: 3px; color: #fff; cursor: default; background-color: #48b0f7; border-color: #48b0f7; } .page-item.disabled .page-link, .pagination-datatables li.disabled .page-link, .pagination li.disabled .page-link, .page-item.disabled .pagination-datatables li a, .pagination-datatables li .page-item.disabled a, .pagination-datatables li.disabled a, .page-item.disabled .pagination li a, .pagination li .page-item.disabled a, .pagination li.disabled a, .page-item.disabled .page-link:focus, .pagination-datatables li.disabled .page-link:focus, .pagination li.disabled .page-link:focus, .page-item.disabled .pagination-datatables li a:focus, .pagination-datatables li .page-item.disabled a:focus, .pagination-datatables li.disabled a:focus, .page-item.disabled .pagination li a:focus, .pagination li .page-item.disabled a:focus, .pagination li.disabled a:focus, .page-item.disabled .page-link:hover, .pagination-datatables li.disabled .page-link:hover, .pagination li.disabled .page-link:hover, .page-item.disabled .pagination-datatables li a:hover, .pagination-datatables li .page-item.disabled a:hover, .pagination-datatables li.disabled a:hover, .page-item.disabled .pagination li a:hover, .pagination li .page-item.disabled a:hover, .pagination li.disabled a:hover { color: #b0bec5; pointer-events: none; cursor: not-allowed; background-color: #fff; border-color: #ddd; } .page-link, .pagination-datatables li a, .pagination li a { position: relative; float: left; padding: 4px 15px; text-decoration: none; background-color: #fff; border: 1px solid #ccc; border-radius: 3px; color: #626262; margin: 0px 1px; font-size: 12px; } .page-link:focus, .pagination-datatables li a:focus, .pagination li a:focus, .page-link:hover, .pagination-datatables li a:hover, .pagination li a:hover { color: #fff; background-color: #48b0f7; border-color: #48b0f7; } .pagination .drop_active { background-color: #c3def1; } .pagination .drop_hover { background-color: #79c5fb; } .pagination-lg .page-link, .pagination-lg .pagination-datatables li a, .pagination-datatables li .pagination-lg a, .pagination-lg .pagination li a, .pagination li .pagination-lg a { padding: 0.75rem 1.5rem; font-size: 1.25rem; } .pagination-sm .page-link, .pagination-sm .pagination-datatables li a, .pagination-datatables li .pagination-sm a, .pagination-sm .pagination li a, .pagination li .pagination-sm a { padding: 0.275rem 0.75rem; font-size: 0.875rem; } /*************************************************** Стилизация списков на всех страницах */ .okay_list{ text-align: center; border: 1px solid #ccc; } .ok_related_list{ border: none; margin-bottom: 15px; } .okay_list.variants_list{ text-align: left; border: 1px solid #ccc; border-bottom: none; -webkit-overflow-scrolling: touch; width: 100%; } .okay_list .dropdown-menu{ text-align: left; } .okay_list .okay_list_head{ width: 100%; height: 60px; display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; color: #fff; background-color: #2b303b; } .okay_list .okay_list_footer{ width: 100%; height: 60px; color: #263238; display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; justify-content: space-between; -webkit-box-pack: justify; -webkit-justify-content: space-between; -ms-flex-pack: justify; } .okay_list .okay_list_footer .btn{ margin-right: 15px; } .okay_list .okay_list_footer .okay_list_foot_left{ display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; } .okay_list .okay_list_body_item, .okay_list .okay_list_body{ width: 100%; display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; flex-direction: column; -webkit-box-orient: vertical; -webkit-box-direction: normal; -webkit-flex-direction: column; -ms-flex-direction: column; justify-content: center; -webkit-box-pack: justify; -webkit-justify-content: center; -ms-flex-pack: justify; } .okay_list .okay_list_body_item{ border-bottom: 1px solid #ccc; min-height: 80px; } .okay_list .min_h{ border-bottom: 1px solid #ccc; min-height: 80px; } .okay_list .okay_list_body_item:hover{ background-color: #f9fcfe; } .okay_list .okay_list_row{ width: 100%; height: auto; min-height: 80px; display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-align-items: center; } .okay_list .okay_list_body_item_child_comments{ border-bottom: 0px; margin-bottom: 10px; } .okay_list .okay_list_body .okay_list_boding, .okay_list .okay_list_head .okay_list_heading{ float: left; padding: 10px; } .okay_list .okay_list_head .okay_list_heading { font-weight: 600; font-family: 'Open Sans Condensed', sans-serif; text-transform: uppercase; font-size: 14px; } .okay_list .okay_list_drag{ width: 40px; cursor: grab; } .okay_list .variants_item_drag{ width: 40px; cursor: grab; } .okay_list .okay_list_boding .heading_label{ min-height: 24px; } .okay_list .variants_item_sku{ width: 120px; } .okay_list .variants_item_name{ width: calc(100% - 775px); } .okay_list .variants_item_price{ width: 115px; } .okay_list .variants_item_discount{ width: 115px; } .okay_list .variants_item_currency{ width: 90px; } .okay_list .variants_item_amount{ width: 90px; } .okay_list .variants_item_weight{ width: 90px; } .okay_list .variants_item_units{ width: 90px; } .okay_list .variants_item_yandex{ width: 120px; } .okay_list .variants_item_yandex .heading_label{ width: 120px; } .okay_list .variants_item_file{ /* width: 220px;*/ width: auto; } .okay_list .variants_list_item{ position:relative; height: 90px; } .okay_list .variants_list_item .okay_list_row{ min-height: 80px; } .okay_list .okay_list_close.remove_variant{ position: absolute; width: 50px; right: 0px; top: 0px; padding: 5px; border-radius: 50%; width: 35px; } .okay_list .okay_list_close.remove_variant .btn_close { background: none; border: none; outline: none; cursor: pointer; position: relative; color: red; } .okay_list .okay_list_close.remove_variant .btn_close svg{ height: 12px; width: 12px; } .okay_list .okay_list_subicon{ width: 50px; } .okay_list .okay_list_subicon a{ display: block; font-size: 20px; color: #02bcf2; border: 0px; outline: 0px; border-radius: 3px; } .okay_list .okay_list_check{ width: 40px; margin-left: 10px; } .okay_list .okay_list_subicon + .okay_list_drag{ margin-left: -20px; } .okay_list .okay_list_drag + .okay_list_check { margin-left: -10px; } .okay_list .okay_list_option{ width: auto; margin-left: 10px; } .okay_list .okay_list_loc_pos{ float: right; } .okay_list .okay_list_photo{ width: 80px; text-align: center!important; } .okay_list .okay_list_related_photo{ width: 50px; text-align: center!important; } .okay_list .okay_list_related_name { width: calc(100% - 150px); position: relative; text-align: left; } .okay_list .okay_list_brands_photo{ width: 140px; text-align: center!important; } .okay_list .okay_list_delivery_photo{ width: 140px; text-align: center!important; } .okay_list .okay_list_comments_btn{ width: 240px; text-align: center!important; } .okay_list .okay_list_brands_group{ width: 180px; text-align: center!important; } .okay_list .okay_list_boding a{ color: #2b303b; display: block; text-decoration: none; } .okay_list .okay_list_boding.okay_list_comments_name a{ color: #02bcf2; display: inline-block; text-decoration: underline; } .okay_list .okay_list_boding a:hover{ color: #2b303b; text-decoration: none; } .okay_list .okay_list_boding.okay_list_comments_name a:hover{ color: #02bcf2; } .okay_list .okay_list_photo a{ border: 1px solid #eee; display: block; border-radius: 3px; width: 60px; height: 60px; text-align: center; line-height: 55px; margin: 0px auto; background: #fff } .okay_list .okay_list_brands_photo a{ border: 1px solid #eee; display: block; border-radius: 3px; width: 110px; height: 80px; text-align: center; line-height: 76px; margin: 0px auto; background: #fff } .okay_list .okay_list_delivery_photo a{ border: 1px solid #eee; display: block; border-radius: 3px; width: 110px; height: 80px; text-align: center; line-height: 76px; margin: 0px auto; background: #fff } .okay_list .okay_list_photo a img{ max-width: 100%; max-height: 60px; } .okay_list .okay_list_brands_photo a img{ max-width: 100%; max-height: 80px; } .okay_list .okay_list_delivery_photo a img{ max-width: 100%; max-height: 80px; } .okay_list .okay_list_name_brand{ margin-top: 3px; font-size: 12px; } .okay_list .okay_list_name{ width: calc(100% - 690px); position: relative; text-align: left; } .okay_list .okay_list_blog_name{ width: calc(100% - 570px); position: relative; text-align: left; } .okay_list .okay_list_page_name{ width: calc(100% - 550px); position: relative; text-align: left; } .okay_list .okay_list_comments_name{ width: calc(100% - 260px); position: relative; text-align: left; } .okay_list .okay_list_delivery_name{ width: calc(100% - 610px); position: relative; text-align: left; } .okay_list .okay_list_languages_name{ width: calc(100% - 350px); position: relative; text-align: left; } .okay_list .okay_list_bransimages_name{ width: calc(100% - 580px); position: relative; text-align: left; } .okay_list .okay_list_variant_name{ width: calc(100% - 690px); position: relative; text-align: left; } .okay_list .okay_list_manager_name{ width: calc(100% - 120px); position: relative; text-align: left; } .okay_list .okay_list_usergroups_name{ width: calc(100% - 450px); position: relative; text-align: left; } .okay_list .okay_list_subscribe_name{ width: calc(100% - 110px); position: relative; text-align: left; } .okay_list .okay_list_coupon_name{ width: calc(100% - 785px); position: relative; text-align: left; } .okay_list .okay_list_coupon_sale{ width: 145px; text-align: center; } .okay_list .okay_list_usergroups_sale{ width: 150px; text-align: center; } .okay_list .okay_list_usergroups_counts{ width: 180px; text-align: center; } .okay_list .okay_list_coupon_condit{ width: 140px; text-align: center; } .okay_list .okay_list_blog_type{ width: 150px; text-align: center; } .okay_list .okay_list_delivery_condit{ width: 220px; text-align: left; } .okay_list .okay_list_coupon_validity{ width: 160px; text-align: center; } .okay_list .okay_list_boding.okay_list_delivery_condit, .okay_list .okay_list_boding.okay_list_coupon_validity, .okay_list .okay_list_boding.okay_list_coupon_condit{ line-height: 18px; font-weight: 500; color: #2b303b; } .okay_list .okay_list_coupon_disposable{ width: 110px; text-align: center; } .okay_list .okay_list_coupon_count{ width: 120px; text-align: center; } .okay_list .okay_list_categories_name{ width: calc(100% - 470px); position: relative; text-align: left; } .okay_list .okay_list_reportstats_categories{ width: calc((100% - 250px) / 2); position: relative; text-align: left; } .okay_list .okay_list_reportstats_products{ width: calc((100% - 250px) / 2); position: relative; text-align: left; } .okay_list .okay_list_categorystats_categories{ width: calc(100% - 250px); position: relative; text-align: left; } .okay_list .okay_list_categorystats_total, .okay_list .okay_list_reportstats_total{ width: 140px; text-align: center; } .okay_list .okay_list_categorystats_setting, .okay_list .okay_list_reportstats_setting{ width: 100px; text-align: center; } .okay_list .subcategories_level_1 .okay_list_categories_name{ width: calc(100% - 500px); } .okay_list .subcategories_level_2 .okay_list_categories_name{ width: calc(100% - 530px); } .okay_list .subcategories_level_1 .okay_list_subicon{ margin-left: 30px; } .okay_list .subcategories_level_2 .okay_list_subicon{ margin-left: 60px; } .okay_list .submenu_level_1 .okay_list_body_item { border-bottom: 0px solid rgb(204, 204, 204); } .okay_list .okay_list_boding .menu_icon_add{ color: RGB(16, 207, 189); margin-top: 4px; } .okay_list .okay_list_boding .menu_icon_add:hover{ color: RGB(16, 207, 189); } .okay_list .okay_list_menu_name{ width: calc(100% - 400px); display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-flex-wrap: wrap; -ms-flex-wrap: wrap; flex-wrap: wrap; margin-right: -10px; margin-left: -10px; } .okay_list .okay_list_menu_name .okay_list_menu_item{ position: relative; width: 100%; min-height: 1px; padding-right: 10px; padding-left: 10px; -webkit-flex-basis: 0; -ms-flex-preferred-size: 0; flex-basis: 0; -webkit-box-flex: 1; -webkit-flex-grow: 1; -ms-flex-positive: 1; flex-grow: 1; max-width: 100%; text-align: left; } .okay_list .submenu_level_1 .okay_list_body_item{ padding-left: 30px; } .okay_list .submenu_level_2 .okay_list_body_item{ padding-left: 60px; } .okay_list .submenu_level_3 .okay_list_body_item{ padding-left: 90px; } .okay_list .okay_list_features_name{ width: calc(100% - 560px); position: relative; text-align: left; } .okay_list .okay_list_support_name{ width: calc(100% - 560px); position: relative; text-align: left; } .okay_list .okay_list_support_num{ width: 160px; } .okay_list .okay_list_support_status{ width: 250px; } .okay_list .okay_list_support_time{ width: 150px; } .okay_list .okay_list_topic_name{ width: 290px; position: relative; text-align: left; } .okay_list .okay_list_topic_message{ width: calc(100% - 460px); position: relative; text-align: left; } .okay_list .okay_list_topic_time{ width: 150px; } .okay_list .okay_list_brands_name{ width: calc(100% - 430px); position: relative; text-align: left; } .okay_list .okay_list_features_tag{ width: 320px; text-align: left; } .okay_list .okay_list_currency_name{ width: 160px; text-align: left; position: relative; } .okay_list .okay_list_currency_num{ width: 30px; } .okay_list .okay_list_brands_tag{ width: 420px; text-align: left; } .okay_list .okay_list_price{ width: 150px; } .okay_list .okay_list_orders_price{ width: 150px; } .okay_list .okay_list_count{ width: 110px; } .okay_list .okay_list_status{ width: 110px; text-align: center; } .okay_list .okay_list_url_status{ width: 110px; text-align: center; } .okay_list .okay_list_log_status{ width: 120px; text-align: center; } .okay_list .okay_list_currency_iso, .okay_list .okay_list_currency_sign{ width: 80px; text-align: center; } .okay_list .okay_list_currency_exchange_item .equality{ font-weight: 600; font-size: 26px; margin: 0px 10px; text-align: center; display: inline-block; vertical-align: middle; } .okay_list .okay_list_log_name{ width: calc(100% - 250px); text-align: left; } .okay_list .okay_list_currency_exchange{ width: calc(100% - 650px); text-align: left; } .okay_list .okay_list_currency_exchange_item{ max-width:260px; width: 100%; text-align: left; } .okay_list_currency_name .currency_name_active{ position: absolute; right: 12px; top: 11px; line-height: 1.1; color: #fff; text-align: center; vertical-align: baseline; border-radius: 2px; margin-right: 1px; margin-bottom: 2px; margin-top: 2px; font-weight: 600; font-size: 10px; display: inline-block; padding: 2px 1px 5px; text-transform: lowercase; background-color: rgb(245, 87, 83); width: 55px; } .okay_list .okay_list_currency_exchange_item .cur_input_exchange{ width: 115px; } .okay_list .okay_list_order_number{ width: 100px; } .okay_list .okay_list_currency_number{ width: 100px; } .okay_list .okay_list_order_date{ width: 150px; } .okay_list .okay_list_users_date{ width: 160px; } .okay_list .okay_list_order_status{ width: 120px; } .okay_list .okay_list_user_number{ width: 140px; } .okay_list .okay_list_user_name{ width: calc(100% - 500px); text-align: left; } .okay_list .okay_list_user_date{ width: 160px; } .okay_list .okay_list_user_price{ width: 200px; } .okay_list .okay_list_ordfig_name{ width: calc(100% - 340px); position: relative; text-align: left; } .okay_list .okay_list_ordfig_val{ width: 130px; text-align: center; } .okay_list .okay_list_ordfig_price{ width: 150px; text-align: center; } .okay_list .okay_list_text_inline, .okay_list .okay_list_order_product_count span, .okay_list .okay_list_order_status span{ display: inline-block; vertical-align: middle; } .okay_list .okay_list_orders_name{ width: calc(100% - 705px); position: relative; text-align: left; } .okay_list .okay_list_order_name{ width: calc(100% - 550px); position: relative; text-align: left; } .okay_list .okay_list_users_name{ width: calc(100% - 720px); position: relative; text-align: left; } .okay_list .okay_list_order_product_count{ width: 90px; } .okay_list .okay_list_order_product_count i{ color: #48b0f7; cursor: pointer; } .okay_list .okay_list_order_total_price{ width: 200px; } .okay_list .okay_list_order_amount_price{ width: 150px; } .okay_list .okay_list_order_marker{ width: 140px; } .okay_list .okay_list_order_stg_sts_name{ width: calc(100% - 160px); text-align: left; } .okay_list .okay_list_order_stg_sts_name_1c{ width: calc(100% - 220px); text-align: left; padding-left: 20px!important; } .okay_list .okay_list_order_stg_lbl_name{ width: calc(100% - 120px); text-align: left; } .okay_list .okay_list_order_stg_sts_status{ -webkit-box-flex: 0; -webkit-flex: 0 0 85px; -ms-flex: 0 0 85px; flex: 0 0 85px; max-width: 85px; text-align: center; } .okay_list .okay_list_order_stg_sts_status2{ -webkit-box-flex: 0; -webkit-flex: 0 0 200px; -ms-flex: 0 0 200px; flex: 0 0 200px; max-width: 200px; text-align: center; } .okay_list .okay_list_order_stg_sts_label{ width: 60px; text-align: center; } .okay_list .okay_list_order_stg_sts_label .label_color_item{ width: 30px; height: 30px; cursor: pointer; display: inline-block; border-radius: 50%; border: 1px solid #cccccc; } .okay_list .okay_list_pages_group{ width: 200px; text-align: center!important; } .okay_list .okay_list_users_group{ width: 140px; text-align: center!important; } .okay_list .okay_list_users_email{ width: 200px; text-align: left!important; } .okay_list .okay_list_blog_setting, .okay_list .okay_list_pages_setting, .okay_list .okay_list_features_setting, .okay_list .okay_list_products_setting{ width: 110px; text-align: center; } .okay_list .okay_list_setting{ width: 100px; } .okay_list .okay_list_menu_setting{ width: 100px; } .okay_list .cur_settings{ width: 90px; } .okay_list .products_variants_block .okay_list_setting{ text-align: left; padding-left: 12px; } .okay_list .okay_list_close{ width: 50px; } .okay_list .okay_list_translations_num{ width: 70px; } .okay_list .okay_list_translations_name{ width: calc((100% - 200px) / 2); position: relative; text-align: left; } .okay_list .okay_list_translations_variable{ width: calc((100% - 200px) / 2); position: relative; text-align: left; } .okay_list .okay_list_close .btn_close{ background: none; border: none; outline: none; cursor: pointer; position: relative; color: #8c8c8c; } .btn_close{ background: transparent; border: none; outline: none; cursor: pointer; position: relative; color: #fff; } .btn_close svg, .okay_list .okay_list_close .btn_close svg{ display: inline-block; cursor: pointer; transition: 0.1s all; margin: 2px 2px; vertical-align: middle; line-height: 0px; vertical-align: middle; height: 16px; width: 16px; } .btn_close.delete_feature svg{ margin-top: 10px; height: 10px; width: 10px; color: #848484; } .btn_close.delete_grey:hover svg, .btn_close:hover svg, .okay_list .okay_list_close .btn_close:hover{ background: none; border: none; outline: none; color: #f82828; } .okay_list .okay_list_variants{ margin-top: -10px; margin-bottom: 10px; } .input-group-addon-date, .input-group-addon, .input-group > .variant_input, .input-group-btn, .input-group-qw, .import_file, .input-group .form-control { display: table-cell; vertical-align: top; } .search .input-group-btn{ width: 50px; } .okay_list_currency_exchange_item .input-group-qw{vertical-align: middle;} .okay_list_boding .bootstrap-select.form-control:not([class*="col-"]) { width: auto; } .input-group--date .form-control{ -moz-appearance: none; z-index: 0!important; border-right: 1px solid #ccc!important; } .input-group--date .form-control:hover { z-index: 0!important; } .input-group--date:after { content: "\f073"; position: absolute; right: 0px; top: 0px; z-index: 1; text-align: center; width: 10%; height: 100%; pointer-events: none; box-sizing: border-box; transition: 0.5s all; display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; line-height: 35px; } .input-group{ position: relative; width: 100%; display: table; border-collapse: separate; border-radius: 3px; } .date_filter button{ height: 35px; } .input-group .form-control:focus { border-color: rgba(0,0,0,0.1); background-color: #f0f0f0; outline: 0 !important; -webkit-box-shadow: none; box-shadow: none; -webkit-transition: none !important; color: #626262; } .input-group-addon { width: 1%; min-width: 40px; white-space: nowrap; vertical-align: middle; padding: 0.3rem 0.75rem; margin-bottom: 0; font-size: 0.875rem; font-weight: normal; line-height: 1.25; color: #626262; text-align: center; border: 1px solid rgba(0,0,0,0.1); background-color: #f0f0f0; } .input-group-addon-date { min-width: 40px; white-space: nowrap; vertical-align: middle; padding: 0.3rem 0.75rem; margin-bottom: 0; font-size: 0.875rem; font-weight: normal; line-height: 1.25; color: #626262; text-align: center; } .input-group .form-control { position: relative; z-index: 2; /* float: left;*/ width: 100%; margin-bottom: 0; border-radius: 0px; border-right: 0px; color: #626262; } .okay_list .okay_list_ordfig_val .form-control, .okay_list .okay_list_count .form-control, .okay_list .okay_list_price .form-control{ height: 30px; padding: 3px 7px; min-height: 30px; } .cur_settings .setting_icon, .okay_list_setting .setting_icon{ display: inline-block; height: 28px; width: 40px; background: rgb(255, 255, 255); color: rgb(206, 206, 206); position: relative; border: 1px solid rgb(206, 206, 206); border-radius: 2px; cursor: pointer; transition: 0.1s all; margin: 4px 2px; line-height: inherit; vertical-align: middle; font-size: 12px; } .cur_settings .setting_icon svg, .cur_settings .setting_icon svg, .okay_list_setting .setting_icon svg{ display: inline-block; vertical-align: top; height: 14px; width: 16px; } .cur_settings .setting_icon_yandex.fn_active_class, .okay_list_setting .setting_icon_yandex.fn_active_class{ background: #10CFBD; border-color: #10CFBD; color: #fff; font-weight: 600; } .okay_list_setting .setting_icon_featured.fn_active_class, .okay_list_setting .setting_icon_featured:hover{ background: #F8D053; border-color: #F8D053; color: #fff } .okay_list_setting .setting_icon_open svg{ height: 26px; width: 16px; } .okay_list_setting .setting_icon_open:hover{ background: #8A7DBE; border-color: #8A7DBE; color: #fff } .okay_list_setting .setting_icon_copy{ } .okay_list_setting .setting_icon_copy:hover{ background: #2B6A94; border-color: #2B6A94; color: #fff } /*************************************************** Стилизация списков 2 вариант */ .purchases_table{ width: 100%; background-color: #fff; border: 1px solid #ccc; border-bottom: none; height: auto; } .purchases_table .purchases_head{ width: 100%; overflow: hidden; min-height: 30px; display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; color: #2b303b; font-weight: 600; font-family: 'Open Sans Condensed', sans-serif; text-transform: uppercase; font-size: 14px; background-color: transparent; border-bottom: 1px solid #ccc; } .purchases_table .purchases_body_items, .purchases_table .purchases_body{ width: 100%; min-height: 40px; height: auto; display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; flex-direction: column; -webkit-box-orient: vertical; -webkit-box-direction: normal; -webkit-flex-direction: column; -ms-flex-direction: column; justify-content: center; -webkit-box-pack: justify; -webkit-justify-content: center; -ms-flex-pack: justify; } .purchases_table .purchases_body_item { width: 100%; height: 100%; min-height: 40px; display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; } .purchases_table .purchases_body_item{ background: #fff; border-bottom: 1px solid #ccc; color: #2b303b; } .purchases_head .purchases_heading, .purchases_body .purchases_bodyng{ padding: 10px 10px; } .purchases_table .purchases_table_orders_num{ width: 50px; min-height: 30px; } .purchases_table .purchases_table_orders_sku{ width: 150px; min-height: 30px; } .purchases_table .purchases_table_orders_price{ width: 100px; min-height: 30px; } .purchases_table .purchases_table_orders_unit{ width: 100px; min-height: 30px; } .purchases_table .purchases_table_orders_total{ width: 110px; min-height: 30px; } .purchases_table .purchases_table_orders_name{ width: calc(100% - 520px); text-align: left; min-height: 30px; } /****************************************** Catalog menu */ .pg_id_grup{ width: calc(100% - 60px); margin: 0px; } /****************************************** Catalog menu */ body.mobile-open { max-width: 100%; overflow-x: hidden; } body.mobile-open .sidebar { margin-left: 0; } body.mobile-open #footer, body.mobile-open .main { margin-left: 200px !important; } body .main .page_scroll{ height: calc(100% - 15px); width: 100%; } body.sidebar-nav .sidebar { margin-left: 0; } body.sidebar-nav #footer, body.sidebar-nav .main { padding-left: 200px!important; } body.menu-pin #admin_catalog { width: 280px; transform: translate(210px,0) !important; -webkit-transform: translate(210px,0) !important; -ms-transform: translate(210px,0) !important; } body.menu-pin .page-container { padding-left: 0; } #admin_catalog { width: 280px; background-color: #2b303b; z-index: 1100; left: -210px; position: fixed; bottom: 0; top: 0px; right: auto; cursor: pointer; overflow: hidden; transform: translate3d(0px, 0px, 0px); -webkit-transition: -webkit-transform 400ms cubic-bezier(0.05,0.74,0.27,0.99); -moz-transition: -moz-transform 400ms cubic-bezier(0.05,0.74,0.27,0.99); -o-transition: -o-transform 400ms cubic-bezier(0.05,0.74,0.27,0.99); transition: transform 400ms cubic-bezier(0.05,0.74,0.27,0.99); -webkit-backface-visibility: hidden; -webkit-perspective: 1000; } #quickview .sidebar_header, #admin_catalog .sidebar_header { display: block; height: 55px; line-height: 55px; background-color: #272b35; border-bottom: 1px solid #232730; color: #ffffff; width: 100%; padding: 0 10px; padding-left: 55px; clear: both; z-index: 10; } #quickview .sidebar_header .logo_box, #admin_catalog .sidebar_header .logo_box{ display: inline-block; width: 150px; } .fix_logo_img{ position: fixed; left: 0px; width: 31px; top: 8px; } #admin_catalog .sidebar-menu { height: calc(100% - 55px); position: relative; width: 100%; } #admin_catalog .sidebar-menu .menu_items { list-style: none; margin: 0; padding: 0; position: relative; overflow: auto; -webkit-overflow-scrolling: touch; height: calc(100% - 0px); padding-bottom: 25px!important; width: 100%; } #admin_catalog .sidebar-menu .menu_items > li { display: block; padding: 0; clear: right; line-height: 24px; } #admin_catalog .sidebar-menu .menu_items > li::after, #admin_catalog .sidebar-menu .menu_items > li::before { display: table; content: " "; clear: both; } #admin_catalog .sidebar-menu .menu_items > li > a { display: block; padding: 3px 3px; padding-left: 20px; min-height: 40px; line-height: 40px; font-size: 14px; clear: both; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 100%; color: rgb(120, 129, 149); } #admin_catalog .icon-thumbnail{ display: inline-block; background: #21252d; height: 40px; width: 40px; line-height: 46px; text-align: center; vertical-align: middle; position: relative; left: 0; float: right; margin-right: 13px; margin-left: 18px; font-size: 16px; -webkit-transition: -webkit-transform 0.4s cubic-bezier(0.05,0.74,0.27,0.99); transition: transform 0.4s cubic-bezier(0.05,0.74,0.27,0.99); -webkit-backface-visibility: hidden; -webkit-perspective: 1000; font-family: "Segoe UI","Helvetica Neue",Helvetica,Arial,sans-serif; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; font-weight: bold; } #admin_catalog .sidebar-menu .menu_items > li.active > a, #admin_catalog .sidebar-menu .menu_items > li.active > .icon-thumbnail, #admin_catalog .sidebar-menu .menu_items > li:hover > a, #admin_catalog .sidebar-menu .menu_items > li:hover > .icon-thumbnail{ color: #fff; } #admin_catalog .sidebar-menu .menu_items > li > a > .title { float: left; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; width: calc(100% - 85px); } #admin_catalog .sidebar-menu .menu_items> li > a > .arrow { float: right; } #admin_catalog .sidebar-menu .menu_items > li > a > .arrow::before { float: right; display: inline; font-size: 16px; font-family: FontAwesome; height: auto; content: "\f104"; font-weight: 300; text-shadow: none; -webkit-transition: all 0.12s ease; transition: all 0.12s ease; } #admin_catalog .sidebar-menu .menu_items > li.nav-dropdown.open > a > .arrow::before { -webkit-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg); } #admin_catalog .sidebar-menu .menu_items > li ul.submenu { display: none; list-style: none; clear: both; margin: 0 0 10px 0; background-color: #21252d; padding: 10px 0 10px 0; } #admin_catalog .sidebar-menu .menu_items > li.nav-dropdown.open > ul.submenu { display: block; } #admin_catalog .sidebar-menu .menu_items > li ul.submenu > li { background: none; padding: 0px 20px 0 40px; margin-top: 1px; } #admin_catalog .sidebar-menu .menu_items > li ul.submenu > li > a { display: block; padding: 5px 0px; font-size: 13px; white-space: normal; color: #788195; } #admin_catalog .sidebar-menu .menu_items > li ul.submenu > li:hover > a, #admin_catalog .sidebar-menu .menu_items > li ul.submenu > li:hover > .icon-thumbnail, #admin_catalog .sidebar-menu .menu_items > li ul.submenu > li.active > a, #admin_catalog .sidebar-menu .menu_items > li ul.submenu > li.active > .icon-thumbnail{ color: #fff; } #admin_catalog .sidebar-menu .menu_items > li ul.submenu > li .icon-thumbnail { width: 30px; height: 30px; line-height: 30px; margin: 0; background-color: #2b303b; font-size: 14px; } #admin_catalog .scrollbar-inner > .scroll-element.scroll-y{ left: 0px; } body.menu-pin #admin_catalog .scrollbar-inner > .scroll-element.scroll-y, #admin_catalog:hover .scrollbar-inner > .scroll-element.scroll-y{ left: inherit; } #mob_menu { top: -100%; position: absolute; -webkit-transition: all 0.2s ease; transition: all 0.2s ease; width: 100%; height: 100%; background-color: #272b35; display: block; z-index: 9; padding: 80px 20px 20px 20px; } /******************************************* Header_style *******/ header.navbar { position: fixed!important; top: 0 !important; right: 0 !important; left: 0 !important; position: relative; height: 55px; padding: 0; background-color: rgb(43, 48, 59); border-bottom: 1px solid #cfd8dc; z-index: 1030; padding-left: 70px; } header.navbar .container-fluid{ height: 55px; } .admin_switches{ position: relative; margin-left: 0px; margin-top: 10px; display: inline-block; } .admin_switches .box_adswitch{ display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; } .admin_switches .adswitch{ font-family: Roboto; font-size: 14px; font-weight: 500; color: #02bcf2; display: block; width: 50%; text-align: center; } .admin_switches .adswitch:hover{ background: #fff; color: #02bcf2; } .admin_switches .adswitch.active{ background: #02bcf2; color: #ffffff; } .admin_languages, .admin_notification, .admin_techsupport, .admin_exit{ float: right; margin-top: 8px; cursor: pointer; } .admin_notification .notification_title, .admin_techsupport a, .admin_exit a{ display: block; height: 40px; padding: 10px 15px; font-size: 14px; font-weight: 500; position: relative; } .admin_languages .languages_inner{ display: block; padding-right: 5px; font-size: 14px; font-weight: 500; position: relative; margin-top: 8px; } .admin_languages a{ display: inline-block; vertical-align: middle; margin-left: 5px; height: 24px; border: 1px solid rgba(204, 204, 204, 0.6); border-radius: 3px; opacity: 0.5; } .admin_languages a.focus, .admin_languages a:hover{ opacity: 1; } .admin_languages a:before { margin-top: 10px; } .admin_languages a:after { margin-top: 20px; } .admin_languages a img{ margin-top: -5px; } .wrap_flag{ display: inline-block; vertical-align: middle; margin-right: 5px; height: 40px; border: 1px solid #ccc9; border-radius: 3px; margin-bottom: 0; } .wrap_flag img{ margin-top: -8px; } .admin_notification .notification_title, .admin_techsupport a{ color: #fff; } .admin_notification .notification_title:hover, .admin_techsupport a:hover{ color: #02bcf2; } .admin_notification .counter, .admin_techsupport .counter{ background: #02bcf2; color: #ffffff; width: 18px; height: 18px; text-align: center; line-height: 17px; font-size: 11px; position: absolute; top: 0px; right: 12px; font-weight: 700; border-radius: 50%; display: block; } .admin_notification .counter{ background: #10CFBD; } .admin_techsupport [data-hint]::after { width: 140px; line-height: 24px; } .admin_exit a{ color: #fff; padding-right: 15px; } .admin_exit a:hover { color: #f82828; } .btn svg, .btn span, .admin_notification .notification_title span, .admin_notification .notification_title svg, .admin_techsupport a span, .admin_techsupport a svg, .admin_exit a span, .admin_exit a svg, .admin_switches a span, .admin_switches a svg{ display: inline-block; vertical-align: middle; } .admin_exit a svg, .admin_notification .notification_title svg, .admin_techsupport a svg{ margin-left: 5px; width: 20px; height: 20px; } .admin_switches a svg{ margin-right: 5px; width: 20px; height: 20px; } .admin_switches a.btn_vid_help svg{ margin-right:0px; } .menu_switch{ position: relative; width: 50px; height: 55px; margin: 0px 0px 0 0; line-height: 55px; display: block; float: right; padding-top: 30px; padding-left: 10px; cursor: pointer; } .menu_hamburger{ width: 24px; height: 3px; background: #fff; border-radius: 4px; transition: all 300ms cubic-bezier(0.68, -0.55, 0.265, 1.55); position: relative; display: block; } .menu_hamburger::before, .menu_hamburger::after { content: ''; display: block; width: 24px; height: 3px; background: #fff; position: absolute; border-radius: 4px; transition: all 300ms cubic-bezier(0.68, -0.55, 0.265, 1.55); } .menu_hamburger::before { top: -8px; left: 0; width: 22px; } .menu_hamburger::after { top: 8px; width: 16px; left: 0; } .menu_switch:hover .menu_hamburger::before, .menu_switch:hover .menu_hamburger::after { width: 24px; animation: xfade 48s 0s infinite; } @keyframes xfade{ 0%{ transition: all 300ms cubic-bezier(0.68, -0.55, 0.265, 1.55); } 33% { transition: all 300ms cubic-bezier(0.68, -0.55, 0.265, 1.55); } 66%{ transition: all 300ms cubic-bezier(0.68, -0.55, 0.265, 1.55); } 100% { transition: all 300ms cubic-bezier(0.68, -0.55, 0.265, 1.55); } } #quickview.open .menu_switch .menu_hamburger, body.menu-pin .menu_switch .menu_hamburger { background: none; } #quickview.open .menu_switch .menu_hamburger::before, #quickview.open .menu_switch .menu_hamburger::after, body.menu-pin .menu_switch .menu_hamburger::before, body.menu-pin .menu_switch .menu_hamburger::after { top: 0; width: 24px; -webkit-transform: rotate(45deg); -ms-transform: rotate(45deg); transform: rotate(45deg); } #quickview.open .menu_switch .menu_hamburger::after, body.menu-pin .menu_switch .menu_hamburger::after { -webkit-transform: rotate(-45deg); -ms-transform: rotate(-45deg); transform: rotate(-45deg); } .notification_inner{position: relative;} .notification_toggle{ top: 125%; opacity: 0; -webkit-transition: opacity 0.3s ease, visibility 0.3s ease, top 0.3s ease; transition: opacity 0.3s ease, visibility 0.3s ease, top 0.3s ease; background: #ccc; width: 240px; white-space: normal; border-radius: 3px; left: 50%; -webkit-transform: translateX(-50%); -ms-transform: translateX(-50%); transform: translateX(-50%); /* margin-top: 10px;*/ display: inline-block; /* pointer-events: none;*/ position: absolute; visibility: hidden; border: 1px solid rgba(204, 204, 204, 0.2); padding: 0px; background: #fff; -webkit-box-shadow: 0px 0px 5px rgba(204, 204, 204,0.2); box-shadow: 0px 0px 5px rgba(204, 204, 204,0.2); color: rgb(118, 118, 118); cursor: pointer; z-index: 200; } .notification_inner:hover > .notification_toggle, .notification_inner .notification_toggle:hover{ top: 100%; opacity: 1; visibility: visible; } .notification_toggle .notif_item{ line-height: inherit; margin-right: 5px; background: rgb(255, 255, 255); border-bottom: 1px solid rgba(204, 204, 204, 0.2); position: relative; display: inline-block; font-size: 14px; width: 100%; height: 40px; display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; justify-content: space-between; -webkit-box-pack: justify; -webkit-justify-content: space-between; -ms-flex-pack: justify; } .notification_toggle .notif_item .l_notif{ display: flex; align-items: center; display: -moz-flex; align-items: -moz-center; display: -webkit-flex; align-items: -webkit-center; width: calc(100% - 35px); } .notification_toggle .notif_item:last-child{ border-bottom: none; } .notification_toggle .notif_icon{ padding: 0px; width: 40px; text-align: center; height: 40px; border-radius: 0px; line-height: 49px; } .notification_toggle .notif_icon svg{ width: 18px; height: 18px; } .notification_toggle .notif_icon svg{ width: 18px; height: 18px; } .notification_toggle .notif_count, .notification_toggle .notif_title{ padding: 10px; cursor: pointer; } .notification_toggle .notif_count{ color: #2b303b; width: 35px; } /************************************************************************* Footer */ #footer { padding: 0px 15px 0px; line-height: 35px; color: rgb(38, 50, 56); position: absolute; left: 0; right: 0; bottom: 0; background-color: rgb(43, 48, 59); height: 35px; padding-left: 0px; z-index: 100; } /************************************************************************* Products.tpl */ .fixed-panel{ position: fixed; top: 55px; z-index: 2000; transition: 0.5s all; } .variants_toggle{ cursor: pointer; color: #20a8d8; font-size: 12px; display: inline-block; vertical-align: middle; margin-top: 3px; font-weight: 500; } .products_variants_block{ display: none; width: 100%; } .tablet_icon_menu{ display: none; padding: 5px; border-radius: 2px; position: absolute; box-shadow: 0px 2px 7px rgba(0,0,0,0.5); left: 0; right: 0; top: 33px; width: 100%; background: #fff; } .fn_show_icon_menu.show .tablet_icon_menu{ display: block; } .fn_show_icon_menu.show:before{ content: ''; position: absolute; bottom: -9px; border: 5px solid transparent; border-top: 5px solid #20a8d8; } /************************************************************************* Products.tpl */ .file_upload:hover span { color: #20a8d8; } .file_upload input[type="file"]{ display: none; } .file_upload label { display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; cursor: pointer; } .file_upload span { line-height: 30px; } /************************************************************************* Order.tpl */ .wrap_order_label{ padding: 15px; border-radius: 3px; font-size: 14px; background-color: #fefefe; -webkit-transition: all 0.2s linear 0s; transition: all 0.2s linear 0s; border: dashed 1px #cfd8dc; margin-bottom: 15px; } .wrap_order_label .box_order_label{ } .box_border_buyer{ border-top: 1px solid #cfd8dc; padding-top: 15px; margin-top: 15px; } .add_order_marker .tag{ margin-bottom: 0px; } .checkbox_email{ width: 290px; margin-top: 10px; } .checkbox_email .checkbox_label span{ display: inline-block; vertical-align: middle; } .checkbox_email .checkbox_label{ width: 20px; height: 20px; position: relative; text-align: center; margin: 0 auto; display: inline-block; vertical-align: middle; } .checkbox_email .checkbox_label::before { cursor: pointer; background-color: #fff; border: 1px solid #cccccc; border-radius: 10%; content: ""; display: inline-block; height: 20px; left: 0; position: absolute; transition: border 0.15s ease-in-out 0s, color 0.15s ease-in-out 0s; width: 20px; } .checkbox_email input[type="checkbox"]:checked + .checkbox_label::before { content: '\f00c'; font-family: "FontAwesome"; } .neighbors_orders { float: right; } .neighbors_orders .prev_order, .neighbors_orders .next_order { background-color: #ffffff; background-image: none; border: 1px solid #ccc; -webkit-appearance: none; color: #2c2c2c; outline: 0; width: 35px; height: 35px; line-height: 32px; text-align: center; display: inline-block; } /************************************************************************* Orders.tpl */ .orders_toggle{ position: absolute; top: 0; right: 0; cursor: pointer; width: 25px; height: 25px; text-align: center; } .purchases_table div.table_row:nth-of-type(even){ background-color: #eceff1; } .order_paid{ margin-top: 5px; } .okay_list .orders_labels .tag{ margin-top: 10px; margin-bottom: 0px; } .okay_list .okay_list_order_marker .orders_labels .tag{ margin-top: 5px } .box_labels_show{ display: inline-block; padding-bottom: 2px; border-bottom: 1px dotted #48b0f7; position: relative; cursor: pointer; } .box_labels_show:hover{ border-bottom: 1px dotted transparent; } .box_labels_show span, .box_labels_show svg{ display: inline-block; vertical-align: middle; color: #48b0f7; } .box_labels_show svg{ width: 12px; height: 12px; } .box_labels_hide{ background: #fff; border-radius: 3px; border: 1px solid #D6DADC; border-bottom-color: #C4C9CC; box-shadow: 0 1px 6px rgba(0,0,0,.15); display: none; overflow: hidden; position: absolute; width: 170px; z-index: 70; -webkit-transform: translate3d(0,0,0); } .box_labels_hide.active_labels{ display: block; } .box_labels_hide .heading_label{ -moz-box-sizing: border-box; box-sizing: border-box; display: block; border-bottom: 1px solid #D6DADC; margin-bottom: 10px; overflow: hidden; font-weight: 500; padding: 5px 10px; position: relative; text-overflow: ellipsis; white-space: nowrap; z-index: 1; } .btn_close.delete_grey svg, .btn_close.delete_labels_hide svg{ color: #848484; height: 10px; width: 10px; } .btn_close.delete_labels_hide{ position: absolute; right: 10px; top: 5px; } .box_labels_hide .option_labels_box{ margin: 0px; padding: 0px 10px; } .box_labels_hide .option_labels_box li{ margin-bottom: 10px; display: block; border-radius: 3px; color: #fff; font-weight: 600; text-shadow: 0 0 1px rgba(0,0,0,.2),0 0 2px #000; text-align: left; padding: 5px 5px 6px; font-size: 12px; } .option_labels_box .label_labels{ cursor: pointer; width: 100%; height: 100%; margin: 0px; } .option_labels_box .label_labels span{ display: inline-block; vertical-align: middle; margin-left: 22px; } .option_labels_box .label_labels::before { content: ""; display: inline-block; color: #fff; text-shadow: 0 0 1px rgba(0,0,0,.2),0 0 2px #000; vertical-align: middle; left: inherit; position: absolute; transition: border 0.15s ease-in-out 0s, color 0.15s ease-in-out 0s; width: 20px; margin-right: 0px; text-align: center; } .option_labels_box .label_labels:hover::before, .option_labels_box input[type="checkbox"]:checked + .label_labels::before { content: '\f00c'; font-family: "FontAwesome"; } .orders_purchases_block { width: 100%; padding: 0px 10px 10px; height: auto; } /************************************************************************* Comments.tpl */ .admin_note{ border-left: 5px solid #02bcf2; padding: 0px 10px!important; } .admin_note2{ border-bottom: none; padding-bottom: 10px; } .okay_list .okay_list_comments_name.admin_note { width: calc(100% - 280px); margin-left: 20px; } /************************************************************************* Import.tpl */ .import_table_wrap{ overflow-x: auto; } .import_item{ font-size: 12px; } /************************************************************************* Export.tpl */ .option_export_wrap label{ display: block!important; cursor: pointer; } .option_export_wrap input{ display: none; } .export_item{ display: block; position: relative; padding: 0.25rem; margin: 0 auto; } .export_item:before{ color: #4dbd74; content: ""; cursor: pointer; font-size: 32px; height: 100%; position: absolute; right: 0; top: -9px; transition: border 0.15s ease-in-out 0s, color 0.15s ease-in-out 0s; width: 15%; } .option_export_wrap input[type=radio]:checked + .export_item:before{ content: '\f00c'; font-family: "FontAwesome"; } .option_export_wrap input[type=radio]:checked + .export_item + .export_options{ display: block!important; } /************************************************************************* Theme.tpl */ .gray_filter{ -webkit-filter: grayscale(1); filter: grayscale(1); filter: gray; } .rename_theme{ cursor: pointer; padding: 0.3rem; width: 30px; height: 30px; display: inline-block; } .opacity_toggle{ opacity: 0; } .theme_active{ color: #48b0f7; float: left; margin-top: 5px; margin-right: 10px; } .theme_active svg{ width: 22px; height: 22px; font-weight: 600; } .theme_active_span{ display: inline-block; vertical-align: middle; } .banner_card_header { color: #fff; background-color: #2b303b; font-weight: 600; font-family: 'Open Sans Condensed', sans-serif; text-transform: uppercase; font-size: 14px; padding: 15px; } .img_bnr_c_head{ min-height: 60px; line-height: 28px; } /************************************************************************* Images.tpl */ .theme_image_item{ width: 100%; height: 150px; text-align: center; display: block; background: url("../images/transparent.gif"); line-height: 150px; } .theme_image_item > img{ max-width: 140px; max-height: 140px; } .wrap_bottom_tag_images{ position: relative; } .wrap_bottom_tag_images .tag{ position: absolute; bottom: -5px; } .btn_images_add{ float: left; } .btn_images_add+input{ float: left; width: auto; margin-left: 15px; height: 36px; padding: 0px; } /************************************************************************* Categories.tpl */ .okay_textarea{ width: 100%; min-height: 107px; resize: none; } .short_textarea{ width: 100%; min-height: 75px; resize: none; } .category_image img{ max-width: 100%; max-height: 100%; } .category_image{ max-width: 250px; margin: 0 auto; } .categories_sub_block{ width: 100%; } .categories_sub_block .fn_row{ min-height: 80px; } /************************************************************************* Banner.tpl */ .banner_card{ margin-bottom: 20px; position: relative; display: block; background-color: #fff;border: 1px solid #ccc; } .banner_card_header{ color: #fff; background-color: #2b303b; font-weight: 600; font-family: 'Open Sans Condensed', sans-serif; text-transform: uppercase; font-size: 14px; padding: 15px; } .banner_card_block{ padding: 15px; } .theme_block_image{ min-height: 300px; max-height: 300px; text-align: center; line-height: 300px; } .theme_block_image img{ max-height: 290px; } .theme_block_image .btn{ position:absolute; right: 0px; width: 100%; } .theme_block_image .theme_btn_admin{ bottom:0px; } .theme_block_image .theme_btn_block{ bottom:45px; } .bnr_id_grup{ width: 100%; margin: 0px 0px 10px; } .bnr_id_grup .form-control{ border-right: 1px solid #ccc; } .menus_id_grup{ width: 35%; margin: 0px; } /************************************************************************* Banners_image.tpl */ .banner_image{ position: relative; width: auto; display: inline-block; /* max-height: 250px; height: 250px; */ } .watermark_image, .admin_banner_images{ max-width: 100%; max-height: 100%; } .delete_banner{ display: none; } .banner_image:hover .delete_banner{ position: absolute; top: 0; right: 0; display: block; } .dropzone_banner{ position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; } .dropzone_block_banner{ background: #F8F8F8; width: 100%; height: 100%; text-align: center; padding: 15px; border: 1px dashed #ddd; position: absolute; top: 0; left: 0; cursor: pointer; } .dropzone_block_banner:hover{ background: #bababa; } .banner_placeholder{ font-size: 60px; color: #ddd; } /************************************************************************* Category.tpl */ .category_images_list{ list-style: none; padding: 0; margin: 0; margin-left: -1%; margin-right: -1%; margin-bottom: -10px; overflow: hidden; } .category_images_list li{ min-height: 100px; overflow: hidden; margin-left: 1%; margin-right: 1%; margin-bottom: 10px; position: relative; height: 120px; line-height: 115px; background: #F8F8F8; width: 215px; float: left; text-align: center; cursor: pointer; -moz-transition: 0.1s all; -webkit-transition: 0.1s all; transition: 0.1s all; box-sizing: border-box; } .category_image_item{ border: 1px solid #ddd; padding: 0; float: left; width: 18%; text-align: center; line-height: 100px; cursor: grab; } .category_image_item:hover .remove_image { position: absolute; top: 0; right: 0; display: block; width: 40px; height: 40px; border: none; z-index: 10; } /************************************************************************* Brand.tpl */ .brand_images_list{ list-style: none; padding: 0; margin: 0; margin-left: -1%; margin-right: -1%; margin-bottom: -10px; overflow: hidden; } .brand_images_list li{ min-height: 100px; overflow: hidden; margin-left: 1%; margin-right: 1%; margin-bottom: 10px; position: relative; height: 120px; line-height: 115px; background: #F8F8F8; width: 215px; float: left; text-align: center; cursor: pointer; -moz-transition: 0.1s all; -webkit-transition: 0.1s all; transition: 0.1s all; box-sizing: border-box; } .brand_image_item{ border: 1px solid #ddd; padding: 0; float: left; width: 18%; text-align: center; line-height: 100px; cursor: grab; } .banner_image:hover .remove_image, .brand_image_item:hover .remove_image { position: absolute; top: 0; right: 0; display: block; width: 40px; height: 40px; border: none; z-index: 10; } /************************************************************************* Product.tpl */ .toggle_arrow_wrap{ position: absolute; top: 0; right: 0; width: 30px; height: 30px; text-align: center; padding: 0px; } .toggle_arrow_wrap a{ position: relative; display: block; font-size: 24px; } .action_title{ position: relative; } .toggle_body_wrap{ display: none; } .toggle_body_wrap.on{ display: block } .product_images_list{ list-style: none; padding: 0; margin: 0; margin-left: -1%; margin-right: -1%; margin-bottom: -10px; } .product_images_list li{ min-height: 100px; overflow: hidden; margin-left: 1%; margin-right: 1%; margin-bottom: 10px; position: relative; height: 120px; line-height: 115px; } .product_image_item{ border: 1px solid #ddd; padding: 0; float: left; width: 18%; text-align: center; line-height: 100px; cursor: grab; } .product_image_item:hover{ border: 1px solid #4DCDC1; -webkit-box-shadow: -1px 3px 5px 0px rgba(221,221,221,1); -moz-box-shadow: -1px 3px 5px 0px rgba(221,221,221,1); box-shadow: 0px 1px 3px 0px rgba(77,205,193,1); } .dropzone_block{ background: #F8F8F8; width: 18%; float: left; text-align: center; padding: 15px; border: 1px dashed #ddd; position: relative; cursor: pointer; -moz-transition: 0.1s all; -webkit-transition: 0.1s all; transition: 0.1s all; box-sizing: border-box; } .product_image_item img{ max-width: 100%; text-align: center; max-height: 120px; } .dropzone_block:hover, .dropzone_block:hover span{ background: #bababa; cursor: pointer; } .dropzone_block i{ -moz-transition: 0.1s all; -webkit-transition: 0.1s all; transition: 0.1s all; } .dropzone_block:hover i{ color: #F8F8F8; } .first_image{ border-color: #4DCDC1; } .first_image:before{ display: block; position: absolute; top: 0; right: 0; content: ''; border: 20px solid transparent; border-top: 20px solid #4DCDC1; border-right: 20px solid #4DCDC1; } .first_image:after{ display: block; width: 15px; height: 15px; content: '✔'; color: #fff; position: absolute; top: 0; right: 3px; font-size: 17px; line-height: 22px; } .remove_image{ display: none; position: relative; background: none; border: none; outline: none; padding: 0px; cursor: pointer; } .remove_image:before{ display: block; position: absolute; top: 0; right: 0; content: ''; border: 20px solid transparent; border-top: 20px solid #f66a6a; border-right: 20px solid #f66a6a; } .remove_image:hover:before{ border-top-color: #f82828; border-right-color: #f82828; } .remove_image:after{ display: block; width: 15px; height: 15px; content: '\f00d'; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; color: #fff; position: absolute; top: 4px; right: 4px; } .product_image_item:hover .remove_image{ position: absolute; top: 0; right: 0; display: block; width: 40px; height: 40px; border: none; z-index: 10; } .dropinput{ width: 100%; height: 100%; position: absolute; left: 0; top: 0; display: block; opacity: 0; cursor: pointer; } .variants_header div{ float: left; } input[type=range] { -webkit-appearance: none; border: 1px solid white; width: 100%; } input[type=range]::-webkit-slider-runnable-track { width: 100%; height: 7px; background: #cfd8dc; border: none; border-radius: 3px; } input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; border: none; width: 17px; height: 17px; background-color: #4ccdc1; box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.5); border-radius: 50%; margin-top: -4px; } input[type=range]:focus { outline: none; } input[type=range]:focus::-webkit-slider-runnable-track { background: #cfd8dc; } input[type=range]::-moz-range-track { width: 100%; height: 7px; background: #cfd8dc; border: none; border-radius: 3px; } input[type=range]::-moz-range-thumb { border: none; width: 17px; height: 17px; background-color: #4ccdc1; box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.5); border-radius: 50%; } /*hide the outline behind the border*/ input[type=range]:-moz-focusring{ outline: 1px solid white; outline-offset: -1px; } input[type=range]::-ms-track { width: 100%; height: 7px; /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */ background: transparent; /*leave room for the larger thumb to overflow with a transparent border */ border-color: transparent; border-width: 6px 0; /*remove default tick marks*/ color: transparent; } input[type=range]::-ms-fill-lower { background: #cfd8dc; border-radius: 10px; } input[type=range]::-ms-fill-upper { background: #cfd8dc; border-radius: 10px; } input[type=range]::-ms-thumb { border: none; height: 16px; width: 16px; border-radius: 50%; background: #4ccdc1; } input[type=range]:focus::-ms-fill-lower { background: #cfd8dc; } input[type=range]:focus::-ms-fill-upper { background: #cfd8dc; } .feature_row{ width: 100%; border-radius: 5px; margin-bottom: 10px; height: 34px; overflow: hidden; } .new_feature_row{ width: 100%; margin-bottom: 10px; overflow: hidden; } .wrap_inner_new_feature{ border: solid 1px rgba(0, 0, 0, 0.15); border-radius: 5px; width: calc(100% - 35px); float: left; overflow: hidden; } .delete_feature{ float: right; } .delete_variant_1{ width: 34px; height: 34px; text-align: center; background-color: transparent; background-image: none; background-clip: padding-box; border: none; cursor: pointer; font-size: 16px; line-height: 34px; color: #f66a6a; } .delete_variant_1:hover{ color: #f62323; } .feature_name{ float: left; font-style: normal; font-stretch: normal; line-height: normal; letter-spacing: normal; color: #ffffff; background-color: rgba(118, 118, 118, 0.7); width: 35%; padding: 5px 10px; height: 34px; font-size: 14px; font-weight: 400; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .feature_name a{ color: #ffffff; } .additional_values.feature_name { background: transparent; } .new_feature_row .new_feature_name{ float: left; width: 35%; } .new_feature_row .new_feature_value{ float: left; width: 65%; } .new_feature_row .new_feature{ padding: 5px 10px; border: none; transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; border-left: 1px solid rgba(0, 0, 0, 0.15); background: #fff; border-radius: 0px; height: 34px; font-weight: 400; font-size: 14px; color: #263238; background-color: #fff; box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } .new_feature_row .new_feature:first-child{ border-left: none; } .feature_value{ float: left; width: 65%; } .feature_multi_values { width: 35px; padding: 5px; float: left; height: 34px; text-align: center; border-radius: 0px; } .feature_multi_values.btn.btn_mini svg{ margin: 0; } .feature_input { display: block; width: calc(100% - 35px); padding: 5px 10px; font-size: 14px; color: #607d8b; border: none; transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; background: #f7f7f7; height: 34px; font-weight: 400; border: 1px solid transparent; float: left; } .feature_input:focus { border-color: rgba(118, 118, 118, 0.7); background: #fff; border-radius: 0px 5px 5px 0px; } .feature_value::-ms-expand { background-color: transparent; border: 0; } .feature_value:focus { color: #607d8b; background-color: #fff; border-color: #66afe9; outline: none; } .feature_value::placeholder { color: #999; opacity: 1; } .feature_value:disabled, .variant_input[readonly] { background-color: #cfd8dc; opacity: 1; } .feature_value:disabled { cursor: not-allowed; } .new_feature{ display: block; float: left; width: 45%; padding: 4px; font-size: 0.875rem; line-height: 1.25; color: #607d8b; background-color: #fff; background-image: none; background-clip: padding-box; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 0; transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; } .new_feature:focus{ color: #607d8b; background-color: #fff; border-color: #66afe9; outline: none; } .tab{ display: none; } .tab_navigation{ border-bottom: 1px solid #ddd; padding-bottom: 5px; } .tab_navigation_link{ text-transform: uppercase; font-weight: 600; color: rgb(183, 183, 183); font-size: 16px; margin-right: 20px; text-decoration: none; position: relative; } .tab_navigation_link.selected{ color: #263238; text-decoration: none; } .tab_container{ min-height: 160px; } .tab_navigation_link:hover{ color: #263238; } .tab_navigation_link.selected:before{ position: absolute; bottom: -4px; left: 0; display: block; width: 100%; content: ''; border-bottom: 2px solid #4ccdc1; } .show_more_images{ width: 100%; font-size: 14px; font-weight: 500; color: #02bcf2; cursor: pointer; user-select: none; -moz-user-select: none; -webkit-user-select: none; margin-top: 18px; text-decoration: underline; } .show_more_images:hover{ text-decoration: none; } .save_btn{ font-weight: bold; color: #000; } .product_category_item{ float: left; padding: 5px 5px; background: #f7f7f7; border-radius: 4px; color: #83959d; margin: 5px; position: relative; cursor: pointer; max-width: 100%; white-space: nowrap; border: 1px solid transparent; line-height: 14px; } .sortable_cat{ overflow: hidden; margin-left: -5px; margin-bottom: -5px; } .product_category_item .product_cat_name{ max-width: 95%; overflow: hidden; white-space: nowrap; display: inline-block; vertical-align: middle; } .product_category_item label{ margin: 0 0 0 1px !important; position: relative; text-align: center; top: 0; right: 0; color: #f66a6a; font-size: 13px; cursor: pointer; display: inline-block; vertical-align: middle; } .product_category_item input{ display: none; } .product_category_item.first_category{ border-color: #4DCDC1; } .first_category:before{ display: block; position: absolute; top: 0; right: 0; content: ''; border: 5px solid transparent; border-top: 5px solid #4DCDC1; border-right: 5px solid #4DCDC1; } .product_image_item.product_special{ border-color: #4DCDC1; } .product_special:before{ display: block; position: absolute; top: 0; right: 0; content: ''; border: 20px solid transparent; border-top: 20px solid #4DCDC1; border-right: 20px solid #4DCDC1; } .product_special:after{ display: block; width: 15px; height: 15px; content: "✔"; color: rgb(255, 255, 255); position: absolute; top: 0px; right: 3px; font-size: 17px; line-height: 22px; } .change_special{ display: none; position: absolute; bottom: 0; width: 100%; text-align: center; left: 0; } .product_image_item:hover .change_special{ display: block; line-height: 28px; background: #4DCDC1; color: #fff; cursor: pointer; font-size: 14px; font-style: normal; font-weight: 500; } /************************************************************************* manager.tpl */ .permission_block{ padding: 15px; background: #f7f7f7; border-radius: 4px; color: #83959d; position: relative; border: 1px solid transparent; margin-bottom: 15px; } .permission_block .permission_boxes{ } .permission_block .permission_box{ padding: 10px 0px; display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; } .permission_block .permission_box span{ margin-right: 15px; } .permission_block .permission_box label{ } /************************************************************************* templates.tpl */ .design_tabs{ } .design_tabs .design_navigation{ border-bottom: 1px solid #ddd; padding-bottom: 5px; margin-bottom: 10px; } .design_tabs .design_navigation .design_navigation_link{ text-transform: uppercase; font-weight: 600; font-size: 16px; color: #83959d; margin-right: 20px; position: relative;font-family: 'Open Sans Condensed', sans-serif; line-height: 22px; margin-bottom: 15px; } .design_tabs .design_navigation .design_navigation_link:hover, .design_tabs .design_navigation .design_navigation_link.focus{ color: #263238; text-decoration: none; } .design_tabs .design_navigation .design_navigation_link.focus::before { position: absolute; bottom: -4px; left: 0; display: block; width: 100%; content: ''; border-bottom: 2px solid #4ccdc1; } .design_tabs .design_container{ min-height: 100px; overflow: hidden; } .design_tabs .design_container .design_tab{ float: left; padding: 5px 5px; background: #f7f7f7; border-radius: 4px; color: #83959d; margin: 5px; position: relative; cursor: pointer; max-width: 100%; white-space: nowrap; border: 1px solid transparent; line-height: 14px; } .design_tabs .design_container .design_tab:hover, .design_tabs .design_container .design_tab.focus{ border-color: #4DCDC1; } .design_tabs .design_container .design_tab:hover::before, .design_tabs .design_container .design_tab.focus::before { display: block; position: absolute; top: 0; right: 0; content: ''; border: 5px solid transparent; border-top: 5px solid #4DCDC1; border-right: 5px solid #4DCDC1; } /************************************************************************* Delivery.tpl */ .payment_item{ height: 60px; display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; } .wrap_payment_item{ margin-top: 10px; } .bnr_dl_price{ width: 120px; margin: 0px; } .delivery_inline_block{ display: inline-block; vertical-align: middle; margin-right: 20px; } .payment_item .okay_ckeckbox{ width: 100%; height: auto; display: flex; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; align-items: center; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; text-align: left; padding: 10px 0px; cursor: pointer; } .okay_ckeckbox::before { cursor: pointer; background-color: #fff; border: 1px solid #cccccc; border-radius: 10%; content: ""; display: inline-block; height: 20px; left: inherit; position: relative; transition: border 0.15s ease-in-out 0s, color 0.15s ease-in-out 0s; width: 20px; margin-right: 10px; text-align: center; } .payment_item .okay_ckeckbox .payment_name_wrap, .payment_item .okay_ckeckbox .payment_img_wrap { display: inline-block; vertical-align: middle; min-height: inherit; } .payment_item .okay_ckeckbox .payment_img_wrap { margin-right: 10px; } .chosen-container-multi .chosen-choices { cursor: pointer!important; border: 1px solid #ccc!important; -webkit-appearance: none; color: #2c2c2c; outline: 0; padding: 5px 5px 40px !important; line-height: normal; font-size: 14px; font-weight: normal; vertical-align: middle; min-height: 35px!important; -webkit-transition: all 0.12s ease; transition: all 0.12s ease; -webkit-box-shadow: none; box-shadow: none; border-radius: 2px; -webkit-border-radius: 2px; -moz-border-radius: 2px; -webkit-transition: background 0.2s linear 0s; transition: background 0.2s linear 0s; display: block; width: 100%; } .chosen-container-multi .chosen-choices:after { content: "\f107"; border: 0; font-family: FontAwesome; font-style: normal; font-weight: 400; position: absolute; right: 15px; top: 15px; } .chosen-container-multi .chosen-choices li.search-choice { float: left; padding: 5px 5px!important; background: #f7f7f7!important; border-radius: 4px!important; color: #848383 !important; margin: 5px!important; position: relative!important; cursor: pointer!important; max-width: 100%!important; white-space: nowrap; border: 1px solid #e4e4e4!important; line-height: 14px!important; -webkit-box-shadow: none!important; box-shadow: none!important; } .chosen-container-multi .chosen-choices li.search-choice .search-choice-close { margin: 0 0 0 1px !important; position: relative!important; text-align: center!important; top: 0!important; right: 0!important; width: 20px!important; height: 14px!important; color: #f66a6a!important; font-size: 13px!important; cursor: pointer!important; display: inline-block!important; vertical-align: middle!important; transition: 0.5s all!important; background: none!important; font: normal normal normal 14px/1 FontAwesome!important; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .chosen-container-multi .chosen-choices li.search-choice .search-choice-close::before { content: "\f00d"; } .chosen-container-multi .chosen-choices li.search-choice span { word-wrap: break-word!important; display: inline-block!important; vertical-align: middle!important; } .chosen-container .chosen-drop { box-shadow: 5px 5px rgba(102, 102, 102, .1)!important; text-shadow: none!important; padding: 0!important; background-color: #fff!important; margin: 10px 0 0!important; border: 1px solid #eee!important; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif!important; } .chosen-container-active .chosen-choices { -webkit-box-shadow: none!important; box-shadow: none!important; } .chosen-container .chosen-results li.highlighted { text-decoration: none!important; background-image: none!important; background-color: #f6f6f6!important; color: #555!important; filter: none!important; } .chosen-container .chosen-results li { padding: 8px 16px!important; color: #6f6f6f!important; text-decoration: none!important; display: block!important; clear: both!important; font-weight: 300!important; line-height: 18px!important; white-space: nowrap!important; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif!important; } .chosen-container-multi .chosen-drop .result-selected { display: list-item!important; color: rgb(204, 204, 204)!important; cursor: default!important; } .seo_cateogories_wrap{ min-height: 300px; max-height: 650px; overflow-y: auto; border: 1px solid #ddd; } .seo_item{ position: relative; cursor: pointer; padding: 5px; } .seo_item:hover, .seo_item.active { background: rgba(38, 50, 56, 0.4); cursor: pointer; } .ajax_preloader{ position: absolute; top:0; left: 0; width: 100%; height: 100%; text-align: center; opacity: 0.7; background: #fff url(../images/ajax_preloader.gif) no-repeat center center; z-index: 9999; } /***************************************************** select language */ .borderRadius { -moz-border-radius: 5px; border-radius: 5px; } .borderRadiusTp { -moz-border-radius: 5px 5px 0 0; border-radius: 5px 5px 0 0; } .borderRadiusBtm { -moz-border-radius: 0 0 5px 5px; border-radius: 0 0 5px 5px; } .ddcommon { position: relative; display: -moz-inline-stack; zoom: 1; display: inline-block; *display: inline; cursor: pointer; } .ddcommon ul { padding: 0; margin: 0; } .ddcommon ul li { list-style-type: none; } .borderRadiusTp ul li:last-child { -moz-border-radius: 0 0 5px 5px; border-radius: 0 0 5px 5px; border-bottom: 0 none #c3c3c3; } .borderRadiusBtm ul li:first-child { -moz-border-radius: 5px 5px 0 0; border-radius: 5px 5px 0 0; border-bottom: 1 solid #c3c3c3; } .ddcommon .disabled img, .ddcommon .disabled span, .ddcommon.disabledAll { opacity: .5; /* standard: ff gt 1.5, opera, safari */ -ms-filter: "alpha(opacity=50)"; /* ie 8 */ filter: alpha(opacity=50); /* ie lt 7 */ -khtml-opacity: .5; /* safari 1.x */ -moz-opacity: .5; /* ff lt 1.5, netscape */ color: #999999; } .ddcommon .clear { clear: both } .ddcommon .shadow { -moz-box-shadow: 5px 5px 5px -5px #888888; -webkit-box-shadow: 5px 5px 5px -5px #888888; box-shadow: 5px 5px 5px -5px #888888; } .ddcommon input.text { color: #7e7e7e; padding: 0 0 0 0; position: absolute; background: #fff; display: block; width: 98%; height: 98%; left: 2px; top: 0; border: none; } .ddOutOfVision { position: relative; display: -moz-inline-stack; display: inline-block; zoom: 1; *display: inline; } .borderRadius .shadow { -moz-box-shadow: 5px 5px 5px -5px #888888; -webkit-box-shadow: 5px 5px 5px -5px #888888; box-shadow: 5px 5px 5px -5px #888888; } .borderRadiusBtm .shadow { -moz-box-shadow: -5px -5px 5px -5px #888888; -webkit-box-shadow: -5px -5px 5px -5px #888888; box-shadow: -5px -5px 5px -5px #888888 } .borderRadiusTp .border, .borderRadius .border { -moz-border-radius: 0 0 5px 5px; border-radius: 0 0 5px 5px; } .borderRadiusBtm .border { -moz-border-radius: 5px 5px 0 0; border-radius: 5px 5px 0 0; } img.fnone { float: none !important } .ddcommon .divider { display: none; } .ddcommon .ddArrow { display: inline-block; position: absolute; right: 4px; } .ddcommon .ddArrow:hover { background-position: 0 100%; } .ddcommon .ddTitle { padding: 0; position: relative; display: inline-block; width: 100%; border: 1px solid rgb(123, 123, 123); -webkit-appearance: none; -webkit-transition: all 0.12s ease; transition: all 0.12s ease; -webkit-box-shadow: none; box-shadow: none; border-radius: 2px; -webkit-border-radius: 2px; -moz-border-radius: 2px; -webkit-transition: background 0.2s linear 0s; transition: background 0.2s linear 0s; height: 35px; vertical-align: middle; padding: 1px 6px; line-height: normal; font-size: 14px; font-weight: normal; outline: 0; line-height: 1.42857143; color: rgb(44, 44, 44); background-color: rgb(255, 255, 255); background-image: none; padding-right: 25px; z-index: 1; } .ddcommon .ddTitle .ddTitleText { display: block; } .ddcommon .ddTitle .ddTitleText .ddTitleText { padding: 0; } .ddcommon .ddTitle .description { display: block; } .ddcommon .ddTitle .ddTitleText img { position: relative; vertical-align: middle; float: left } .ddcommon .ddChild { position: absolute; display: none; width: 100%; overflow-y: auto; overflow-x: hidden; zoom: 1; z-index: 9999 } .ddcommon .ddChild li { clear: both; } .ddcommon .ddChild li .description { display: block; } .ddcommon .ddChild li img { border: 0 none; position: relative; vertical-align: middle; float: left } .ddcommon .ddChild li.optgroup { padding: 0; } .ddcommon .ddChild li.optgroup .optgroupTitle { padding: 0 5px; font-weight: bold; font-style: italic } .ddcommon .ddChild li.optgroup ul li { padding: 5px 5px 5px 15px } .ddcommon .noBorderTop { border-top: none 0 !important; padding: 0; margin: 0; } /*************** default theme **********************/ .dd .divider { border-left: 1px solid #c3c3c3; border-right: 1px solid #fff; ; right: 24px; } .dd .ddArrow{ width: 16px; height: 16px; margin-top: 7px; } .dd .ddArrow:before { content: "\f107"; display: inline-block; border: 0; font-family: FontAwesome; font-style: normal; font-weight: 400; font-size: 14px; line-height: 1.42857143; color: rgb(44, 44, 44); } .dd .ddArrow:hover { background-position: 0 100%; } .dd .ddTitle .ddTitleText { padding: 5px 20px 5px 5px; } .dd .ddTitle .ddTitleText .ddTitleText { padding: 0; } .dd .ddTitle .description { font-size: 12px; color: #666 } .dd .ddTitle .ddTitleText img { padding-right: 5px; max-width: 28px; } .dd .ddChild { border: 1px solid #c3c3c3; background-color: #fff; left: -1px; } .dd .ddChild li { padding: 5px; background-color: #fff; border-bottom: 1px solid #c3c3c3; } .dd .ddChild li .description { color: #666; } .dd .ddChild li .ddlabel { color: #333; } .dd .ddChild li.hover { background-color: #f2f2f2 } .dd .ddChild li img { padding: 0 6px 0 0; max-width: 28px; } .dd .ddChild li.optgroup { padding: 0; } .dd .ddChild li.optgroup .optgroupTitle { padding: 0 5px; font-weight: bold; font-style: italic } .dd .ddChild li.optgroup ul li { padding: 5px 5px 5px 15px } .dd .ddChild li.selected { background-color: #d5d5d5; color: #000; } #footer, .main { transition-duration: 0.25s, 0.25s, 0.25s, 0.25s; transition-property: padding-left, padding-right, margin-left, margin-right; } .aside-menu { transition-duration: 0.25s, 0.25s; transition-property: left, right; } .footer { transition-duration: 0.25s, 0.25s, 0.25s, 0.25s, 0.25s, 0.25s; transition-property: padding-left, padding-right, margin-left, margin-right, left, right; } .modal-open { overflow: hidden; } .modal { display: none; overflow: hidden; position: fixed; top: 0px; right: 0; bottom: 0; left: 0; z-index: 1050; -webkit-overflow-scrolling: touch; outline: 0; } .modal.fade .modal-dialog { -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); -o-transform: translate(0, -25%); transform: translate(0, -25%); -webkit-transition: -webkit-transform 0.3s ease-out; -o-transition: -o-transform 0.3s ease-out; transition: transform 0.3s ease-out; } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } .modal-open .modal { overflow-x: hidden; overflow-y: auto; } .modal-dialog { position: relative; width: auto; margin: 10px; } .modal-content { position: relative; background-color: #ffffff; border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); -webkit-background-clip: padding-box; background-clip: padding-box; outline: 0; } .modal-backdrop { display: none; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.42857143; } .modal-body { position: relative; padding: 20px; text-align: center; } .modal-body .btn-danger svg{ width: 12px; height: 12px; } .modal-footer { padding: 20px; text-align: right; border-top: 1px solid #e5e5e5; } .modal-footer .btn + .btn { margin-left: 5px; margin-bottom: 0; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } .modal .card-header { padding: 0.75rem 1.25rem; margin-bottom: 0; background-color: rgb(43, 48, 59); border-bottom: 1px solid rgb(33, 37, 45); } .modal .heading_modal { font-family: 'Open Sans', sans-serif; font-weight: 500; color: rgb(255, 255, 255); font-size: 22px; line-height: 28px; text-align: center; } .modal .card-header::after { content: ""; display: table; clear: both; } .modal-scrollbar-measure { position: absolute; top: -9999px; width: 50px; height: 50px; overflow: scroll; } @media (min-width: 768px) { .modal-dialog { width: 600px; margin: 100px auto 30px; } .modal-content { -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); } .modal-sm { width: 300px; } .modal-md { width: 400px; } } @media (min-width: 992px) { .modal-lg { width: 900px; } } /************************************************************************* Progress Bar */ .progress { display: block; width: 100%; height: 1rem; margin-bottom: 1rem; } .progress[value] { background-color: #eceff1; border: 0; appearance: none; } .progress[value]::-ms-fill { background-color: #0074d9; border: 0; } .progress[value]::-moz-progress-bar { background: url(../images/progress.gif); } .progress[value]::-webkit-progress-value { background: url(../images/progress.gif); } .progress[value]::-webkit-progress-bar { background-color: #eceff1; } base::-moz-progress-bar, .progress[value] { background-color: #eceff1; } @media screen and (min-width: 0\0) { .progress { background-color: #eceff1; } .progress-bar { display: inline-block; height: 1rem; text-indent: -999rem; background-color: #0074d9; } } .progress-striped[value]::-webkit-progress-value { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-size: 1rem 1rem; } .progress-striped[value]::-moz-progress-bar { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-size: 1rem 1rem; } .progress-striped[value]::-ms-fill { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-size: 1rem 1rem; } @media screen and (min-width: 0\0) {} .progress-animated[value]::-webkit-progress-value { animation: progress-bar-stripes 2s linear infinite; } .progress-animated[value]::-moz-progress-bar { animation: progress-bar-stripes 2s linear infinite; } @media screen and (min-width: 0\0) {} .progress-success[value]::-webkit-progress-value { background-color: #4dbd74; } .progress-success[value]::-moz-progress-bar { background-color: #4dbd74; } .progress-success[value]::-ms-fill { background-color: #4dbd74; } @media screen and (min-width: 0\0) { .progress-success .progress-bar { background-color: #4dbd74; } } .progress-info[value]::-webkit-progress-value { background-color: #63c2de; } .progress-info[value]::-moz-progress-bar { background-color: #63c2de; } .progress-info[value]::-ms-fill { background-color: #63c2de; } @media screen and (min-width: 0\0) { .progress-info .progress-bar { background-color: #63c2de; } } .progress-warning[value]::-webkit-progress-value { background-color: #f8cb00; } .progress-warning[value]::-moz-progress-bar { background-color: #f8cb00; } .progress-warning[value]::-ms-fill { background-color: #f8cb00; } @media screen and (min-width: 0\0) { .progress-warning .progress-bar { background-color: #f8cb00; } } .progress-danger[value]::-webkit-progress-value { background-color: #f86c6b; } .progress-danger[value]::-moz-progress-bar { background-color: #f86c6b; } .progress-danger[value]::-ms-fill { background-color: #f86c6b; } @media screen and (min-width: 0\0) { .progress-danger .progress-bar { background-color: #f86c6b; } } .progress.progress-sm { height: 8px; } /**/ .d-table{display: table;height: 100%} .d-100vh-va-middle{display: table-cell;vertical-align: middle;} .d-table .input-group .form-control{border-right: 1px solid rgb(204, 204, 204);border-left: 0px} .card { position: relative; display: block; background-color: #fff; border: 1px solid #cfd8dc; } .card-block {padding: 20px;} .okay_bg {background: RGB(9, 26, 51);} .card-group { display: table; width: 100%; table-layout: fixed; } .card-group .card { display: table-cell; vertical-align: middle; } .card-group .card + .card { margin-left: 0; border-left: 0; } .fn_fast_save { bottom: 0; left: 0; position: fixed; width: 100%; text-align: center; background-color: rgba(43, 48, 59, 0.9); padding: 10px; transition: 1s; display: none; z-index: 1000; } .fn_fast_save button { display: inline-block; float: none; } .fn_fast_action_block { display: inline-block; } .fn_fast_save .additional_params, .fn_fast_save .action { max-width: 300px; display: inline-block; vertical-align: middle; text-align: left; } .fn_fast_save .additional_params>div { width: 100% !important; } .fn_disable_url{cursor:pointer;} div.mce-fullscreen { top: 60px!important; background: #fff!important; } .colorpicker {z-index: 100!important;} #ui-datepicker-div{z-index: 100!important;} .system_header{ color: #fff; background-color: #2b303b; font-weight: 600; font-family: 'Open Sans Condensed', sans-serif; text-transform: uppercase; font-size: 14px; padding: 15px; } .system_information{ min-height: 50px; text-align: left; } .import_row{ min-height: 35px } .seo_template_button{ color: #2b303b; } .feature_alias_variable{ width: 30%; text-align: left; } .feature_alias_name{ width: 30%; text-align: left; } .feature_alias_value{ width: calc(40% - 90px); text-align: left; } .feature_option_name { width: 250px; } .feature_option_aliases { width: calc(100% - 250px); display: -webkit-box; display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; padding: 15px 0px!important; margin-right: -10px; margin-left: -10px; } .feature_opt_aliases_list{ position: relative; width: 100%; min-height: 1px; padding-right: 10px; padding-left: 10px; -webkit-box-flex: 0; -webkit-flex: 0 0 33.333333%; -ms-flex: 0 0 33.333333%; flex: 0 0 33.333333%; max-width: 33.333333%; min-height: 65px; } .option_alias_name{ text-align: left; } .feature_value_name{ width: calc(100% - 500px); text-align: left; } .feature_value_translit{ width: 200px; text-align: left; } .feature_value_products_num{ width: 90px; text-align: left; } .feature_value_products_num .form-control { text-align: center; background-color: #cfd8dc; } .feature_value_index{ width: 120px; text-align: center; } .fn_test_smtp_status { width: auto; border: none; margin-left: 15px; display: none; } .jssocials-share {border-bottom: 3px solid #fff;} .jssocials-share.active { border-bottom: 3px solid #080688; } .jssocials-share-link {color: #20a8d8;} .theme_color { display: block; width: 100%; height: 35px; border: 1px solid #ccc; border-radius: 1px; cursor: pointer; } .tooltip_box{ display: inline-block; color: #48b0f7; margin: 0px 2px; width: 16px; height: 16px; line-height: 1; } .tooltip_box--warning{ color: #ff9a07; } .tooltip_box svg{ width: 16px; height: 16px; display: block; line-height: 1; } .tooltip_box::after { width: 250px!important; white-space: normal!important; font-size: 13px!important; line-height: 1.3!important; font-weight: 400!important; border-radius: 3px!important; padding: 8px 5px 7px!important; font-family: 'Open Sans', sans-serif!important; } @media only screen and (max-width: 768px) { .tooltip_box:after, .tooltip_box:before {display: block; } } .card form{ margin-bottom: 0px; } .auth_buttons{ display: block; } .auth_buttons .link{ color: #626262; } .auth_buttons__recovery{ margin-bottom: 20px; display: block; } .auth_heading { font-weight: 700; color: #2b303b; font-size: 26px; line-height: 1.2; margin-top: 0px; margin-bottom: 10px; text-align: center; } .auth_heading_promo{ color: #8d8d8d; font-style: italic; text-align: center; margin-bottom: 25px; } .error_box { border-radius:0px; display: block; padding: 10px; border-left: 5px solid #C0392B; background-color: #F2D7D5; color: #C0392B; } .jssocials-share-odnoklassniki, .jssocials-share-vkontakte{ display: none!important; }backend/design/html/000077500000000000000000000000001354315552000146655ustar00rootroot00000000000000backend/design/html/order_settings.tpl000066400000000000000000000414701354315552000204470ustar00rootroot00000000000000{* Title *} {$meta_title=$btr->order_settings_labels scope=global} {*Название страницы*}
{$btr->order_settings_orders|escape}
{*Блок статусов заказов*}
{$btr->order_settings_statuses|escape} {include file='svg_icon.tpl' svgId='icon_tooltips'}
{*Шапка таблицы*}
{$btr->general_name|escape}
{$btr->order_settings_colour|escape}
{if $orders_statuses} {foreach $orders_statuses as $order_status}
{include file='svg_icon.tpl' svgId='drag_vertical'}
{if $is_mobile == true}
{/if}
{if $is_mobile == false}
{/if}
{if count($orders_statuses) > 1} {*delete*} {/if}
{/foreach} {/if}
{if $is_mobile == true}
{/if}
{if $is_mobile == false}
{/if}
{*Блок массовых действий*}
{*Блок меток заказов*}
{$btr->order_settings_labels|escape}
{*Шапка таблицы*}
{$btr->general_name|escape}
{$btr->order_settings_colour|escape}
{foreach $labels as $label}
{*delete*}
{/foreach}
{*Блок массовых действий*}
{* On document load *} {literal} {/literal} config/000077500000000000000000000000001354315552000123265ustar00rootroot00000000000000config/config.php000066400000000000000000000100261354315552000143030ustar00rootroot00000000000000; license = 6krnbqvtld bcwcejpzgj nvwnxosqyt ovrztnqqr1 xutb9nhlsl ik7a6y9z zqwhhrtwdx gihygryqik sxknuyr6xn qus8rtylvl fzzrotobdm 9qjpshflqm xwhjoxhmyn rumsknsnnl rdpcqnplvm rnavvrbt6f qsqs8zhofs hymnurdttq mzyfvryc kwwbrqqozk povbqn8kpx dmvkswonpz 9trlkmtwvy vnevholswk k6zvmqlzxd nppptcvivx mtkyzxxztq rmdxpympvt i9pgr7tvko nmpsklravr mtudvsskxl wwumxjcmxz fwyvktgywo gibfedydq9 ezjrhtsrzg ovjiqevq vooqyktn zp7z4wo2lx y8ylkeghxr yjsevsjvsn zikgnljhoh puvlswwsxy xvf2dlzobk obyvhepz pbvapwoyhq xwozmqqmiz skntlxuutx rfqny5xpf6 i7pp9ewg8a bzbhrlelmn kitumtymls vywouvlqpk ycostvrmsp xegu9xpifu ogay9zweyp dvxnenvnfq qwirwpyuj1 lgupzbwot6 q8xe7uixwz hegzfiqg9i qzfkfntzdu hyxpyulqsy zsxjvqvvvs xjxnptvvjm 4tkwavel6n 9xrnjokzjr nyflrlttxx sty9weslnh rjtdztqrsg yhyi3i9lhz modrzqtpou a2xjj6mlks syx6pmmhsq pkwwsvopsw vnvnznmzov 9seonrdom4 9bvdtebnom l8erpzsjpf xpndqrqjuf nhwousuyyr ux7vewsut9 6u677ypnhe shswghomud woxnwiojru nwlwwuvrvs tywtcarl74 9dp7eom9jp bzovmvjehy vvfnxuxtql stvnpyolot yvv8pmx97h xm57ukciwn zbjwnugxzh cflvpnoovo uympwotxor pbpwzevzw7 rldr88ef8v fjdw [database] ;Сервер базы данных db_server = localhost ;Пользователь базы данных db_user = root ;Пароль к базе db_password = "" ;Имя базы db_name = okaycms-git ;Драйвер базы данных db_driver = mysql ;Префикс для таблиц db_prefix = ok_ ;Кодировка базы данных db_charset = UTF8MB4 db_names = utf8mb4 ;Режим SQL db_sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" ;Смещение часового пояса ;db_timezone = +04:00 [php] error_reporting = E_ALL php_charset = UTF8 php_locale_collate = ru_RU php_locale_ctype = ru_RU php_locale_monetary = ru_RU php_locale_numeric = ru_RU php_locale_time = ru_RU ;php_timezone = Europe/Moscow debug_mode = false [smarty] smarty_compile_check = true smarty_caching = false smarty_cache_lifetime = 0 smarty_debugging = false smarty_html_minify = false smarty_security = true [design] debug_translation = false scripts_defer = true [images] ;Указываем какую библиотеку использовать для нарезки изображений. Варианты: Gregwar, Imagick или GD. Это имя класса адаптера resize_adapter = Gregwar ;Директория общих изображений дизайна (лого, фавикон...) design_images = files/images/ ;Файл изображения с водяным знаком watermark_file = backend/files/watermark/watermark.png ;Промо изображения special_images_dir = files/special/ ;Директория оригиналов и нарезок фоток товаров original_images_dir = files/originals/products/ resized_images_dir = files/resized/products/ ;Изображения оригиналов и нарезок фоток блога original_blog_dir = files/originals/blog/ resized_blog_dir = files/resized/blog/ ;Изображения оригиналов и нарезок фоток брендов original_brands_dir = files/originals/brands/ resized_brands_dir = files/resized/brands/ ;Изображения оригиналов и нарезок фоток категории original_categories_dir = files/originals/categories/ resized_categories_dir = files/resized/categories/ ;Изображения оригиналов и нарезок фоток доставки original_deliveries_dir = files/originals/deliveries/ resized_deliveries_dir = files/resized/deliveries/ ;Изображения оригиналов и нарезок фоток способов оплаты original_payments_dir = files/originals/payments/ resized_payments_dir = files/resized/payments/ ;Изображения баннеров banners_images_dir = files/originals/slides/ resized_banners_images_dir = files/resized/slides/ ; Папка изображений языков lang_images_dir = files/originals/lang/ lang_resized_dir = files/resized/lang/