Возвращает бинарные данные со ссылки с вспомогательными
данными, такими, как тип MIME, имя файла и расширение, если
есть и т.д. По умолчанию использует кеширование в течении
1 часа.
11671
static function get_bin($url, $curl_options = array())
	{
		$original_url = $url;

		$ch = curl_init($url);
		curl_setopt_array($ch, array(
			CURLOPT_TIMEOUT => defval($curl_options, 'timeout', 15),
			CURLOPT_FOLLOWLOCATION => true,
			CURLOPT_MAXREDIRS => 22,
			CURLOPT_ENCODING => 'gzip, deflate',
			CURLOPT_REFERER => defval($curl_options, 'referer', $original_url),
			CURLOPT_AUTOREFERER => true,
//			CURLOPT_HTTPHEADER => $header,
			CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; FunWebProducts; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
			CURLOPT_RETURNTRANSFER => true,
			CURLOPT_COOKIESESSION => true,
			CURLOPT_COOKIEJAR => blib_files::tmp('cookie-jar-2'),
			CURLOPT_COOKIEFILE => blib_files::tmp('cookie-file-2'),
		));

//	if(preg_match("!lenta\.ru!", $url))
//		curl_setopt($ch, CURLOPT_PROXY, 'home.balancer.ru:3128');

		$content = curl_exec($ch);
		$info = curl_getinfo($ch);
		curl_close($ch);

		switch($info['content_type'])
		{
			case 'image/png':
				$ext = 'png';
				break;
			default:
				$ext = NULL;
				break;
		}
		$info['ext'] = $ext;

		$info['content'] = $content;

		return $info;
	}
933654
public function work()
    {
        $workerNeed = self::WORKER_MIN * $this->workerMultiplier;
        $workerCount = count($this->workerPool);

        if (
            ($workerCount < $workerNeed && $workerCount < $this->workerMaxCount)
            && !$this->running
        ) {
            // run new worker
            $this->workerRun = $this->workerStarter->start();
            $this->running = time();
        } elseif ($this->running && $this->running < time() - 10) {
            // timeout 10 sec - не удалось запустить воркер
            $this->running = 0;
            if ($this->workerRun->isRunning()) {
                // убиваем запущенный процесс, если он ещё работает
                $this->workerRun->kill();
            }
        }
    }
684443
function traitEntity_formBuild() {
        $form_class = $this->getClassForm();
        $form       = new $form_class(static::getEntity());
        $form->setModel($this->model);
        $form->setAction($_SERVER['REQUEST_URI']);
        $form->setAction(\Request::getUri());
        //        dd($form);
        //::factory($this->model)
        //билдим форму, если надо - переопределяем метод "traitEntityFormBuild"
        $this->traitEntity_formAddFields($form);
        $form->addRecursiveFilter('trim');
        //        $form_builder->form->setVendor($this->getVendor())
        //                           ->setEntity($this->getEntity())
        //                           ->setDataId(isset($this->model->id) ? $this->model->id : 0);
        $this->form = $form;
        $this->traitEntity_formBuildAfter();
    }
427701
protected static function remind()
    {
        self::$user = null;
        if (!empty(self::$input['COOKIE']['ID'])){
            $ID = explode('|', self::$input['COOKIE']['ID']);
        }else{
            $ID = '';
        }
        // Период запоминания пользователя
        $duration = empty($ID[0])? 0 : $ID[0]; // не больше месяца (примерно)
        // Хэш пользователя для поиска (авторизации)
        $hash = empty($ID[1]) ? '' : $ID[1];
        // Если есть кука, то ищем пользователя в БД
        if ($hash){
            $result = Data::find(array(
                'from' => self::$config['users-list'],
                'select' => 'children',
                'depth' => 'max',
                'where' => array(
                    array('value', '=', $hash),
//                    array('not','is_link')
                ),
                'key' => false,
                'limit' => array(0, 1),
                'comment' => 'auth user by cookie',
            ), false);
            // Пользователь найден и не истекло время его запоминания
            if (!empty($result)){
                self::$user = $result[0];
            }
        }else{
            $hash = self::get_unique_hash();
        }
        // Новый гость
        if (!self::$user){
            self::$user = Data::create(self::$config['user'], self::$config['users-list']);
            self::$user->value($hash);
            $duration = 0;
        }
        self::remember($duration);
    }
1340434
private function newCard() {return dfc($this, function() {
		$m = $this->m(); /** @var Method $m */
		$isCard = $m->isCard(); /** @var bool $isCard */
		df_assert(!$isCard || $this->tokenIsNew());
		$customer = null; /** @var object|null $customer */
		$cardId = null; /** @var string $cardId */
		$fc = FCustomer::s($m); /** @var FCustomer $fc */
		if ($customerId = $this->customerIdSaved() /** @var string $customerId */) {
			// 2016-08-23 https://stripe.com/docs/api/php#retrieve_customer
			// 2017-02-10 Зарегистрированный в ПС покупатель с незарегистрированной в ПС картой.
			// 2017-07-16 We ensure here that the customer with the ID given is really exist in the PSP.
			$customer = $fc->get($customerId);
			// 2017-02-24
			// We can get here, for example, if the store's administrator has switched
			// his Stripe account in the extension's settings: https://mage2.pro/t/3337
			if (!$customer) {
				df_ci_save($this->m(), null);
				$customerId = null;
			}
		}
		if ($customer) {
			if ($isCard) {
				// 2016-08-23
				// Зарегистрированный в ПС покупатель с незарегистрированной в ПС картой.
				// Сохраняем её: https://stripe.com/docs/api#create_card
				/**
				 * 2017-07-16
				 * If a PSP does not support the «cardAdd» operation for a token (like Moip and Spryng),
				 * then the facade should just return the token.
				 * @see \Dfe\Moip\Facade\Customer::cardAdd()
				 * https://github.com/mage2pro/moip/blob/0.7.2/Facade/Customer.php#L37-L55
				 * @see \Dfe\Spryng\Facade\Customer::cardAdd()
				 * https://github.com/mage2pro/spryng/blob/1.1.10/Facade/Customer.php#L18-L27
				 */
				$cardId = $fc->cardAdd($customer, $this->token());
				df_assert_sne($cardId);
			}
		}
		else {
			// 2017-06-11 It registers the customer in the PSP.
			// 2016-08-22 Stripe: https://stripe.com/docs/api/php#create_customer
			// 2016-11-15 Omise: https://www.omise.co/customers-api#customers-create
			// 2017-02-11 Paymill: https://developers.paymill.com/API/index#create-new-client-
			$customer = $fc->create(Reg::request($m));
			df_ci_save($this->m(), $customerId = $fc->id($customer));
			if ($isCard) {
				// 2017-02-18 Вторая часть условия — для ПС (Spryng), которые не поддерживают сохранение карт.
				$cardId =
					// 2017-10-10 Square supports a card saving, but requires an additional step to do it.
					$fc->addCardInASeparateStepForNewCustomers()
					? $fc->cardAdd($customer, $this->token())
					// 2017-07-16
					// Moip supports a card saving, but does not allow to do it on the customer's registration.
					// The card is saved in Moip only on a payment request.
					// https://github.com/mage2pro/moip/blob/0.7.0/P/Reg.php#L24-L29
					// https://github.com/mage2pro/moip/blob/0.7.0/T/CaseT/Customer.php#L94-#L106
					: ($fc->cardIdForJustCreated($customer) ?: $this->token())
				;
			}
		}
		if ($cardId) {
			Token::exchangedSet($this->m()->getCode(), $cardId);
		}
		return [$customerId, $cardId];
	});}
409468
protected function adaptVisitsViewsUsers()
    {

        //Формируем массив данных для графика
        $itemArray = [];

        foreach ($this->data['data'] as $item) {
            $itemArray['date'][] = Carbon::createFromFormat('Y-m-d',
                $item['dimensions'][0]['name'])->formatLocalized('%e.%m');
            $itemArray['visits'][] = $item['metrics'][0];
            $itemArray['pageviews'][] = $item['metrics'][1];
            $itemArray['users'][] = $item['metrics'][2];
        }

        $dataArray = [
            ['name' => 'Визиты', 'data' => $itemArray['visits']],
            ['name' => 'Просмотры', 'data' => $itemArray['pageviews']],
            ['name' => 'Посетители', 'data' => $itemArray['users']],
        ];

        $this->adaptData = [
            'dataArray' => json_encode($dataArray, JSON_UNESCAPED_UNICODE),
            'dateArray' => json_encode($itemArray['date'],
                JSON_UNESCAPED_UNICODE),
        ];
    }
1040317
public function actionProcess()
    {
        ini_set("memory_limit", "512M");

        $imaging = \Yii::$app->imaging;
        if (!$imaging) {
            //TODO: можно добавить проверку YII ensure...
            throw new \yii\base\Exception("Component Imaging not found");
        }

        $newFileSrc = \Yii::$app->request->getPathInfo();
        $extension = Imaging::getExtension($newFileSrc);

        if (!$extension) {
            throw new \yii\base\Exception("Extension not found: ".$newFileSrc);
        }


        if (!$imaging->isAllowExtension($extension)) {
            throw new \yii\base\Exception("Extension '{$extension}' not supported in Imaging component");
        }


        $newFile = File::object($newFileSrc);
        $strposFilter = strpos($newFileSrc, "/".Imaging::THUMBNAIL_PREFIX);
        if (!$strposFilter) {
            throw new NotFoundHttpException("This is not a filter thumbnail: ".$newFileSrc);
        }

        $originalFileSrc = substr($newFileSrc, 0, $strposFilter).".".$newFile->getExtension();

        //TODO: hardcode delete it in the future
        $webRoot = \Yii::getAlias('@webroot');

        $originalFileRoot = $webRoot.DIRECTORY_SEPARATOR.$originalFileSrc;
        $newFileRoot = $webRoot.DIRECTORY_SEPARATOR.$newFileSrc;
        $newFileRootDefault = $webRoot.DIRECTORY_SEPARATOR.str_replace($newFile->getBaseName(),
                Imaging::DEFAULT_THUMBNAIL_FILENAME.".".$extension, $newFileSrc);

        $originalFile = new File($originalFileRoot);

        if (!$originalFile->isExist()) {
            throw new NotFoundHttpException("The original file is not found: ".$newFileSrc);
        }

        //Проверено наличие оригинального файла, есть пути к оригиналу, и результирующему файлу.
        //Отслось собрать фильтр, и проверить наличие параметров. А так же проверить разрешены ли эти параметры, для этого в строке есть захэшированный ключь

        $filterSting = substr($newFileSrc, ($strposFilter + strlen(DIRECTORY_SEPARATOR.Imaging::THUMBNAIL_PREFIX)),
            strlen($newFileSrc));
        $filterCode = explode("/", $filterSting);
        $filterCode = $filterCode[0]; //Код фильтра

        //Если указаны парамтры, то ноужно проверить контрольную строчку, и если они не соответствуют ей, то ничего делать не будем
        if ($params = \Yii::$app->request->get()) {
            $pramsCheckArray = explode(DIRECTORY_SEPARATOR, $filterSting);
            if (count($pramsCheckArray) < 3) {
                throw new \yii\base\Exception("the control line not found: ".$newFileSrc);
            }

            $string = $imaging->getParamsCheckString($params);
            if ($pramsCheckArray[1] != $string) {
                throw new \yii\base\Exception("Parameters invalid: ".$newFileSrc);
            }
        }

        $filterClass = str_replace("-", "\\", $filterCode);


        if (!class_exists($filterClass)) {
            throw new \ErrorException("Filter class is not created: ".$newFileSrc);
        }

        /**
         * @var Filter $filter
         */
        $filter = new $filterClass((array)$params);
        if (!is_subclass_of($filter, Filter::className())) {
            throw new NotFoundHttpException("No child filter class: ".$newFileSrc);
        }

        try {
            //Проверяем а создан ли уже файл, и если да то просто делаем на него ссылку.
            $filter
                ->setOriginalRootFilePath($originalFileRoot)
                ->setNewRootFilePath($newFileRootDefault)
                ->save();

            if (PHP_OS === 'Windows') {
                if ($newFileRoot != $newFileRootDefault) {
                    //Не тестировалось
                    copy($newFileRootDefault, $newFileRoot);
                }
            } else {
                if ($newFileRoot != $newFileRootDefault) {
                    symlink($newFileRootDefault, $newFileRoot);
                }
            }

            $url = \Yii::$app->request->getUrl().($params ?
                    ""//"?" . http_build_query($params) . '&sx-refresh'
                    : '?sx-refresh');

            /*Header("HTTP/1.0 200 OK");
            Image::getImagine()->open($newFileRootDefault)->show('png');
            return '';*/

            return \Yii::$app->response->redirect($url, 302);

        } catch (\Exception $e) {
            return $e->getMessage();
        }
    }
338344
public function updateSettings()
    {
        /*
         * Загрузка логотипа
         */
        if (isset($_FILES['logoImage']['tmp_name']) &&
            is_uploaded_file($_FILES['logoImage']['tmp_name']))
        {
            if (substr($_FILES['logoImage']['name'], -3) == 'png')
            {
                upload('logoImage', $this->getDataDir() .'/logo.png');
            }
            else
            {
                Eresus_Kernel::app()->getPage()
                    ->addErrorMessage('Логотип должен быть в формате PNG');
            }
        }

        try
        {
            $this->templates()->clientWrite('image-list.html', arg('tmplImageList'));
            $this->templates()->clientWrite('image-list.html', arg('tmplImageList'));
            $this->templates()->clientWrite('image-grouped-list.html', arg('tmplImageGroupedList'));
            $this->templates()->clientWrite('image.html', arg('tmplImage'));
            $this->templates()->clientWrite('popup.html', arg('tmplPopup'));
        }
        catch (Exception $e)
        {
            throw new RuntimeException(
                'Не удалось изменить один или несколько шаблонов. Подробная информация доступна в журнале.',
                0,
                $e);
        }

        parent::updateSettings();
    }
18910
function getData (css, opts) {
	var helper = {};

	// удаляем комментарии
	css.walkComments(function (comment) {
		comment.remove();
	});

	// удаляем свойства и правила без данных
	css.walkRules(function (rule, i) {
		rule.walkDecls(function (decl, j) {
			if (!decl.value.match(dataRegexp)) {
				decl.remove();
			};

			if (rule.nodes.length === 0) {
				rule.remove();
			};
		});
	});
	css.walkAtRules(function (atRule) {
		if (atRule.nodes && atRule.nodes.length === 0) {
			atRule.remove();
		};

		if (atRule.name === 'font-face') {
			atRule.walkDecls(function (decl, j) {
				if (decl.prop === 'src') {
					if (!decl.value.match(dataRegexp)) {
						atRule.remove();
					};
				};
			});
		};
	});

	if (opts.pure) {

		// очищаем итоговый файл от дубликатов данных
		css.walkRules(function (rule, i) {
			rule.walkDecls(function (decl, j) {

				var arr;

				if (!helper.hasOwnProperty(decl.prop)) {
					helper[decl.prop] = [];
				};

				// запоминаем массив положений нужного свойства
				arr = helper[decl.prop];

				// получили индекс правила с нужными данными
				// если он есть
				var index = findValue(arr, decl.value);

				if ((arr.length === 0) || (index < 0)) {

					// запоминаем уникальные данные
					arr.push({
						pos: i,
						val: purifyValue(decl.value)
					});
				}
				else if (index >= 0) {

					// собираем селекторы с одинаковыми данными
					css.nodes[index].selector += ','+ rule.selector;
					css.nodes[index].selector = cleanSelector(css.nodes[index].selector);

					decl.remove();
				};

				// сохраняем нужный массив положений свойства
				helper[decl.prop] = arr;

			});

			if (rule.nodes.length === 0) {
				rule.remove();
			};
		});

		// после слияния правил могут остаться пустые медиавыражения
		css.walkAtRules(function (atRule) {
			if (atRule.nodes && atRule.nodes.length === 0) {
				atRule.remove();
			};
		});
	};
}
1346779
function validateData(data){
  /* Создаем промис */
  return new Promise(function(resolve, reject){
    if(
      (data.password == "iddqd")
      &&(data.login == "Carmak")
    ){
      /* Все верно, пользователь авторизирован */
      resolve(data);
    }else{
      /* Ошибка при вводе данных */
      reject(new Error('Ошибка при вводе логина или пароля'));
    }
  });
}
814176
public function getHTML()
    {
        $this->parse();
        $xml = clone $this->xml;

        /* Удаляем расширенные теги */
        $tags = $xml->getElementsByTagNameNS(self::NS, '*');
        while ($tags->length > 0)
        {
            $node = $tags->item(0);
            $node->parentNode->removeChild($node);
        }

        // Есть ли поля для выбора файлов?
        $hasFileInputs = false;

        /*
         * Удаляем расширенные атрибуты
         * Ищем input[type=file]
         */
        $tags = $xml->getElementsByTagName('*');
        for ($i = 0; $i < $tags->length; $i++)
        {
            $node = $tags->item($i);

            $isElement = $node->nodeType == XML_ELEMENT_NODE;
            /** @var DOMElement $node */
            $hasAttributes = $isElement && $node->hasAttributes();

            if ($isElement && $hasAttributes)
            {
                /** @var DOMNamedNodeMap $attrs */
                $attrs = $node->attributes;
                for ($j = 0; $j < $attrs->length; $j++)
                {
                    /** @var DOMAttr $attr */
                    $attr = $attrs->item($j);
                    if ($attr->namespaceURI == self::NS)
                    {
                        $attr->ownerElement->removeAttributeNode($attr);
                        $j--;
                    }
                }

                if ($node->tagName == 'input' && $node->getAttribute('type') == 'file')
                {
                    $hasFileInputs = true;
                }
            }
        }

        if ($hasFileInputs)
        {
            /** @var DOMElement $element */
            $element = $xml->firstChild->nextSibling;
            $element->setAttribute('enctype', 'multipart/form-data');
        }

        // Предотвращаем схлопывание пустых textarea
        $tags = $xml->getElementsByTagName('textarea');
        for ($i = 0; $i < $tags->length; $i++)
        {
            $node = $tags->item($i);
            $cdata = $xml->createCDATASection('');
            $node->appendChild($cdata);
        }

        $xml->formatOutput = true;
        $html = $xml->saveXML($xml->firstChild->nextSibling);
        // Удаляем атрибуты пространств имён
        $html = preg_replace('/\s*xmlns:\w+=("|\').*?("|\')/', '', $html);
        // Удаляем пустые <![CDATA[]]>
        $html = str_replace('<![CDATA[]]>', '', $html);

        return $html;
    }
683010
function __smart_body_template_check()
	{
		if(!empty($this->attr['__smart_body_template_checked']))
			return;

		$this->attr['__smart_body_template_checked'] = true;

		if(!empty($this->attr['body_template']))
		{
			switch(pathinfo($this->attr['body_template'], PATHINFO_EXTENSION))
			{
				case 'tpl':
				{
					$this->attr['body_template_class'] = 'bors_templates_smarty';
					return;
				}
			}
		}

		$current_class = get_class($this);
		$class_files = $GLOBALS['bors_data']['classes_included'];
		$ext	= $this->body_template_ext();
		$suffix	= $this->body_template_suffix();
		$is_smart = $this->is_smart();

		while($current_class)
		{
			if(!($class_file = @$class_files[$current_class]))
			{
				$reflector = new ReflectionClass($current_class);
				$class_file = $reflector->getFileName();
			}

			if($base = preg_replace("!(.+/\w+)\..+?$!", "$1.", $class_file))
			{
				if($is_smart)
				{
					if($suffix && file_exists($bt = $base.$suffix.'.tpl'))
					{
						$this->attr['body_template'] = $bt;
						$this->attr['body_template_class'] = 'bors_templates_smarty';
						return;
					}

					// Было перед .html Из-за этого на страницах с переназначаемым расширением, типа
					// http://www.aviaport.ru/events/apczima2012/
					// грузились базовые формы.
					if(file_exists($bt = $base.$ext))
					{
						$this->attr['body_template'] = $bt;
						$this->attr['body_template_class'] = $this->body_template_class();
						return;
					}
					if(file_exists($bt = $base.'tpl.php'))
					{
						$this->attr['body_template'] = $bt;
						$this->attr['body_template_class'] = 'bors_templaters_php';
						return;
					}
					if(file_exists($bt = $base.'md'))
					{
						$this->attr['body_template'] = $bt;
						$this->attr['body_template_class'] = 'bors_templaters_markdown';
						return;
					}
					if(file_exists($bt = $base.'tpl'))
					{
						$this->attr['body_template'] = $bt;
						$this->attr['body_template_class'] = 'bors_templates_smarty';
						return;
					}
					if(file_exists($bt = $base.'haml') && class_exists('bors_templates_phaml'))
					{
						$this->attr['body_template'] = $bt;
						$this->attr['body_template_class'] = 'bors_templates_phaml';
						return;
					}
					if(file_exists($bt = $base.'html'))
					{
						$this->attr['body_template'] = $bt;
						$this->attr['body_template_class'] = 'bors_templates_smarty';
						return;
					}

					foreach(glob($base.'*') as $test_file)
					{
						$test_ext = str_replace($base, '', $test_file);
						switch($test_ext)
						{
							case 'bbh.tpl':
								$this->attr['body_template'] = $base.$test_ext;
								$this->attr['body_template_class'] = 'bors_templates_bbhtpl';
								continue;
							case 'lcml.tpl':
								$this->attr['body_template'] = $base.$test_ext;
								$this->attr['body_template_class'] = 'bors_templates_lcmltpl';
								continue;
							default:
								$class_name = 'bors_templates_'.str_replace('.', '', $test_ext);
								if(!class_exists($class_name))
									continue;

								$this->attr['body_template'] = $base.$test_ext;
								$this->attr['body_template_class'] = $class_name;
								continue;
						}
					}

					if(!empty($this->attr['body_template_class']))
						return;
				}
				else
				{
					if(file_exists($template_file = $base.$ext))
						return "xfile:{$template_file}";
				}
			}

			$current_class = get_parent_class($current_class);
		}
	}
960121
protected function adaptSourcesSearchPhrases()
    {
        $dataArray = [];

        //Формируем массив
        foreach ($this->data['data'] as $item) {
            $dataArray['data'][] = [
                'searchPhrase'            => $item['dimensions'][0]['name'],
                'searchEngineRoot'        => $item['dimensions'][1]['name'],
                'visits'                  => $item['metrics'][0],
                //Визиты
                'bounceRate'              => $item['metrics'][1],
                //Отказы %
                'pageDepth'               => $item['metrics'][2],
                //Глубина просмотра
                'avgVisitDurationSeconds' => date("i:s", $item['metrics'][3])
                //Время проведенное на сайте мин:сек.
            ];
        }

        //Итого и средние значения
        $dataArray['totals'] = [
            'visits'                  => $this->data['totals'][0],
            'bounceRate'              => $this->data['totals'][1],
            'pageDepth'               => $this->data['totals'][2],
            'avgVisitDurationSeconds' => date("i:s", $this->data['totals'][3]),
        ];

        $this->adaptData = $dataArray;
    }
1182613
public function adminRenderContent()
    {
        $result = '';
        /* @var TAdminUI $page */
        $page = Eresus_Kernel::app()->getPage();
        switch (true)
        {
            /*
             * Управление группами
             * Этот блок должен располагаться до блока управления изображениями из-за того что иначе
             * наличие аргумента id может быть ошибочно расценено как запрос на диалог изменения
             * изображения.
             */
            case arg('action') == 'group':
                $result = $this->adminRenderGroupsList();
                break;
            case arg('group_id') !== null:
                $result = $this->adminEditGroupDialog();
                break;
            case arg('action') == 'group_create':
                $result = $this->adminAddGroupDialog();
                break;
            case arg('action') == 'group_insert':
                $this->adminInsertGroup();
                break;
            case arg('action') == 'group_update':
                $this->adminUpdateGroup();
                break;
            case arg('group_up') !== null:
                $this->adminMoveUpGroup();
                break;
            case arg('group_down') !== null:
                $this->adminMoveDownGroup();
                break;
            case arg('group_delete') !== null:
                $this->adminDeleteGroup();
                break;
            /* Управление изображениями */
            case arg('action') == 'create':
                $result = $this->adminAddItem();
                break;
            case arg('id') !== null:
                $result = $this->adminEditItem();
                break;
            case arg('update') !== null:
                $this->adminUpdateImage();
                break;
            case arg('toggle') !== null:
                $this->adminImageToggle(arg('toggle', 'int'));
                break;
            case arg('cover') !== null:
                $this->coverAction();
                break;
            case arg('delete') !== null:
                $this->delete(arg('delete', 'int'));
                break;
            case arg('up') !== null:
                $this->up(arg('up', 'int'));
                break;
            case arg('down') !== null:
                $this->down(arg('down', 'int'));
                break;
            /* Управление свойствами галереи */
            case arg('action') == 'props':
                $result = $this->adminRenderProperties();
                break;
            case arg('action') == 'props_update':
                $this->updateProperties();
                break;
            /* Действие по умолчанию */
            default:
                $result = $this->adminRenderImagesList();
                break;
        }

        /*
         * Кнопки-"вкладки"
         */
        $tabs = array('width' => '14em', 'items' => array());
        $tabs['items'] []= array(
            'caption' => 'Изображения',
            'url' => preg_replace('/&(id|pg)=\d+/', '', $page->url(null)),
        );

        if ($this->settings['useGroups'])
        {
            $tabs['items'] []= array(
                'caption' => 'Группы',
                'url' => preg_replace('/&(id|pg)=\d+/', '', $page->url(array('action' => 'group'))),
            );
        }

        $tabs['items'] []= array(
            'caption' => 'Свойства галереи',
            'url' => preg_replace('/&(id|pg)=\d+/', '', $page->url(array('action' => 'props'))),
        );

        $result = $page->renderTabs($tabs) . $result;

        return $result;
    }
448172
public function boot()
    {
        /**
         * Подключаем базовые маршруты
         * пока оставляем это для ручной работы
         */
        // if (Config::get('qwertcms.include_routes')) {
        //     include __DIR__ . '/routes.php';
        // }

        /**
         * Языки (резерв)
         */
        // $this->loadTranslationsFrom(__DIR__ . '/lang', 'qwertcms');
        
        /**
         * Настройки
         */
        $this->publishes([
            __DIR__ . '/config/qwertcms.php' => base_path('config/qwertcms.php'),
        ], 'qwertcms_config');

        /**
         * Роуты
         */
        $this->publishes([
            __DIR__ . '/routes' => base_path('routes/'),
        ], 'qwertcms_routes');

        /**
         * Шаблоны для админки
         */
        $this->loadViewsFrom(__DIR__.'/views', 'qwertcms');

        $this->publishes([
            __DIR__ . '/public' => public_path('vendor/qwertcms'),
        ], 'qwertcms_public');

        $this->publishes([
            __DIR__.'/views'  => base_path('resources/views/'),
        ], 'qwertcms_view');

        /**
         * Шаблоны авторизации
         */
        // $this->publishes([
        //     __DIR__.'/views/auth'  => base_path('resources/views/auth'),
        // ], 'qwertcms_view');

        /**
         * Миграции и seeds
         */
        $this->publishes([
            __DIR__ . '/database/migrations/' => database_path('migrations')
        ], 'qwertcms_migrations');

        $this->publishes([
            __DIR__ . '/database/seeds/' => database_path('seeds')
        ], 'qwertcms_seeds');

        /**
         * Базовые контроллеры
         */
        $this->publishes([
            __DIR__ . '/controllers/' => app_path('Http/controllers')
        ], 'qwertcms_controllers');

        /**
         * Модели
         */
        $this->publishes([
            __DIR__ . '/Models/' => app_path()
        ], 'qwertcms_models');

        /**
         * Шаблоны писем
         */
        $this->publishes([
            __DIR__ . '/Mail/' => app_path('Mail')
        ], 'qwertcms_mail');

        /**
         * Функции хелперы
         */
        $this->publishes([
            __DIR__ . '/Helpers/' => app_path('Helpers')
        ], 'qwertcms_helpers');

        /**
         * Языковые файлы
         */        
        $this->publishes([
            __DIR__ . '/lang/adminlte/ru' => base_path('resources/lang/vendor/adminlte/ru/')
        ], 'qwertcms_adminlang');
        $this->publishes([
            __DIR__ . '/lang/laravel/ru' => base_path('resources/lang/ru/')
        ], 'qwertcms_lang');

        /**
         * Middleware для мультиязычности
         */
        $this->publishes([
            __DIR__ . '/Middleware' => app_path('Http/Middleware/')
        ], 'qwertcms_lang');
        
    }
1055287
function get_external() {
        if (!count($this->js_external))
            return '';
        //если не надо собирать все в один билд-файл
        if (!$this->get_need_build_external()) {
            $js_code = '';
            foreach ($this->js_external as $js => $_js) {
                $condition = \Arr::get($_js, 'condition');
                //если надо подключать все по отдельности
                $js_code .= $this->get_link($js, $condition) . "\n";
            }
            return $js_code;
        } else {
            $build = array();
            $no_build = array();
            $js_code = '';
            foreach ($this->js_external as $js => $_js) {
                $condition = \Arr::get($_js, 'condition');
                if (\Arr::get($_js, 'no_build')) {
                    $no_build[$condition][] = $js;
                } else {
                    $build[$condition][] = $js;
                }
            }
            foreach ($no_build as $condition => $js) {
                $condition = \Arr::get($_js, 'condition');
                foreach ($js as $url) {
                    $js_code .= $this->get_link($url, $condition) . "<!-- no build -->" . PHP_EOL;
                }
            }
            foreach ($build as $condition => $js) {
                $build_name = $this->make_file_name($this->js_external, 'js/external' . ($condition ? '/' . $condition : ''), 'js');
                $build_file = Helper::build_file($build_name);
                if (!file_exists($build_file)) {
                    //соберем билд в первый раз
                    $build = array();
                    foreach ($js as $url) {
                        $_js = $this->get_source($url);
                        $_js = $this->prepare($_js, $this->get_need_min_external());
                        $build[] = $_js;
                    }
                    //если требуется собирать инлайн скрипты в один внешний файл
                    $this->require_build($build_name, implode("\n", $build));
                }
                $js_code .= $this->get_link(Helper::build_url($build_name), $condition) . PHP_EOL;
            }
            //$build_name = $this->make_file_name($this->js_inline, 'js/onload', 'js');
            return $js_code;
        }
    }
240473
function getExternal($as_html = true) {
        if(!$as_html) {
            return $this->css_external;
        }
        if(!count($this->css_external)) {
            return '';
        }
        $css_code = '';
        /* если не надо собирать файлы в один */
        if(!config('larakit.lk-staticfiles.css.external.build', false)) {
            foreach($this->css_external as $css => $_css) {
                $css_code .= '        ' . $this->getLink($css, Arr::get($_css, 'media'), Arr::get($_css, 'condition')) . PHP_EOL;
            }
        } else {
            $build     = [];
            $no_builds = [];
            $css_code  = '';
            foreach($this->css_external as $css => $_css) {
                $condition = Arr::get($_css, 'condition');
                $media     = Arr::get($_css, 'media');
                $no_build  = Arr::get($_css, 'no_build');
                if($no_build) {
                    $no_builds[$condition . '|' . $media][] = $css;
                } else {
                    $build[$condition . '|' . $media][] = $css;
                }
            }
            foreach($no_builds as $key => $css) {
                list($condition, $media) = explode('|', $key);
                $css_code .= '<!-- [no build] -->' . PHP_EOL;
                foreach($css as $_css) {
                    $css_code .= $this->getLink($_css, $media, $condition, false) . PHP_EOL;
                }
                $css_code .= '<!-- [/no build] -->' . PHP_EOL;
            }
            foreach($build as $key => $css) {
                list($condition, $media) = explode('|', $key);
                $prefix = ['css'];
                if($condition) {
                    $prefix[] = str_replace(' ', '', $condition);
                }
                if($media) {
                    $prefix[] = $media;
                }
                $build_name = $this->makeFileName($css, implode('/', $prefix), 'css');
                $build_file = $this->buildFile($build_name);
                if(!file_exists($build_file)) {
                    //соберем билд в первый раз
                    $build = [];
                    foreach($css as $url) {
                        $_css    = $this->replaceRelativePath($url);
                        $_css    = $this->prepare($_css, config('larakit.lk-staticfiles.css.external.min') || (mb_strpos($url, '.min.') !== false));
                        $build[] = "/**********************************************************************" . PHP_EOL;
                        $build[] = '* ' . $url . PHP_EOL;
                        $build[] = "**********************************************************************/" . PHP_EOL;
                        $build[] = $_css . PHP_EOL . PHP_EOL;
                    }
                    if(!file_exists(dirname($build_file))) {
                        mkdir(dirname($build_file), 0777, true);
                    }
                    
                    $this->save($build_file, implode('', $build));
                }
                $css_code .= $this->getLink($this->buildUrl($build_name), $media, $condition) . "\n";
            }
        }
        
        return $css_code;
    }