403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/cvetdv.ru/bitrix/modules/zverushki.seofilter/lib/cpu/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/modules/zverushki.seofilter/lib/cpu/url.php
<?
namespace Zverushki\Seofilter\Cpu;

use Bitrix\Main,
	Bitrix\Main\Application,
	Bitrix\Main\Config\Option,
	Bitrix\Main\Loader,
	Zverushki\Seofilter\configuration,
	Zverushki\Seofilter\Internals,
	Zverushki\Seofilter\Sections\Section;
use Bitrix\Main\Diag\Debug;
Loader::includeModule('iblock');

/**
* class Controller
*
*
* @package Zverushki\Seofilter
*/
class Url extends Base
{
	private static $Entity = [];

	public static function getEntity ($siteId = false, $langId = false) {
		$langId = $langId ? $langId : LANGUAGE_ID;
		$k = strtolower($siteId.$langId);

		return array_key_exists($k, static::$Entity)
			? static::$Entity[$k]
			: (static::$Entity[$k] = new self($siteId, $langId));
	}

	public function getQueryString($arr){
		$filterVar = configuration::getOption('filtervar', SITE_ID);
		$queryAr = [];
		foreach($arr as $code => $val)
			if(!preg_match('/' . $filterVar . '/i', strtoupper($code)))
				$queryAr[] = $code.'='.trim($val);

		return (count($queryAr) ? '?'.implode('&', $queryAr) : '');
	}

	/**
	 * Поиск ссылки по параметрам
	 * @param  array $arr Массив параметров нужных для поиска ссылки
	 * @return $url
	 */
	public function clearParams(&$arr){
		unset($arr['ajax'], $arr['set_filter'],  $arr['clear_cache'], $arr['DIRECTORY'], $arr['SECTION_CODE'], $arr['SUB_SECTION_CODE']);
		$filterVar = configuration::getOption('filtervar', SITE_ID);
		foreach ($arr as $code => $v) {
			unset($arr[$code]);
			$code = str_replace($filterVar, 'arrPager', $code);

			if(!preg_match('/PAGEN_([0-9]{1,3})/', $code))
				$arr[$code] = $v;
		}
	}
	public function genUrl($arr){
		$this->clearParams($arr['PARAMS']);
		if(empty($arr['PARAMS']))
			return;
		ksort($arr['PARAMS']);
		$cache_id = md5(serialize(array($this->lifeTime, $this->siteId, $this->languageId, $arr)));
		$urlС = '/'.$this->cacheTag.$this->siteId.'/'.$cache_id.'/';
		$сache = Main\Data\Cache::createInstance();

		$cacheManager = Application::getInstance()
							->getTaggedCache();

		if ($сache->initCache($this->lifeTime, $cache_id, $urlС)){
			$url = $сache->getVars();
		}elseif ($сache->startDataCache()){
			$cacheManager->startTagCache($urlС);

			$url = $this->maskLandingSearch($arr);

			if(!$url)
				$url = $this->quickSearch($arr);

			if(!$url)
				$url = $this->maskSearch($arr);

			$cacheManager->registerTag($this->cacheTag.$this->siteId);
			$cacheManager->registerTag($this->cacheTag.'all');

			$cacheManager->endTagCache();

			$сache->endDataCache($url);
		}

		return $url;
	}
	/**
	 * Поиск по чистой ссылке
	 * @param  string $urlDir искомая ссылка
	 * @return array|bool $params массиыв параметров по ссылке
	 */
	private function quickSearch($par){
		$dbRes = Internals\SettingsTable::getList(array(
			'order' => array("SORT" => "ASC", "ID" => "DESC"),
			'filter' => array('IBLOCK_ID' => $par['IBLOCK_ID'], 'SECTION_ID' => $par['SECTION_ID'], "!URL_CPU" => "%#PROP_%", "PARAMS" => serialize($par['PARAMS']), "ACTIVE" => "Y", 'SITE_ID.SITE_ID' => $this->siteId),
			'select' => array('ID', 'IBLOCK_ID', 'SECTION_ID', 'TIMESTAMP_X', 'ACTIVE', 'DESCRIPTION', 'URL_CPU', 'PARAMS')
		));
		while ($params = $dbRes->fetch()){
			if(!preg_match('/\#PROP_(.+?)\#/i', $params['URL_CPU'], $cpu) && count($params['PARAMS']) == count($par['PARAMS'])){
				$cnt = 0;
				foreach ($par['PARAMS'] as $code => $val) {
					if($params['PARAMS'][$code])
						$cnt++;
				}

				if($cnt == count($par['PARAMS'])){
					Section::replace($params);
					return $params['URL_CPU'];
				}
			}
		}

		return;
	}
	/**
	 * Поиск по ссылкам лендингам
	 * @param  string $urlDir искомая ссылка
	 * @return array|bool $params массиыв параметров по ссылке
	 */
	private function maskLandingSearch($par){
		$arParams = $this->getFilterId($this->siteId);

		$sIds = [];
		foreach ($arParams as $item){
			$sIds[] = $item['ID'];
		}
		if(empty($sIds))
			return;
		$dbRes = Internals\LandingTable::getList(array(
			'order' => ["TYPE" => "DESC", "SORT" => "ASC", 'DATE_ELEMENT' => 'DESC', 'SETTING_ID' => 'ASC'],
			'filter' => [
				'SETTING_ID' => $sIds,
				'IBLOCK_ID' => $par['IBLOCK_ID'],
				'SECTION_ID' => $par['SECTION_ID'],
				'TYPE' => ["A", "H"],
				'ACTIVE' => 'Y',
				'ENABLE' => 'N',
				'PARAMS_HASH' => md5(serialize($par["PARAMS"]))
			],
			'select' => ['ID', 'IBLOCK_ID', 'SECTION_ID', 'SETTING_ID', 'TYPE', 'SORT', 'URL_CPU', 'PARAMS'],
			'limit' => 1
		));
		if ($params = $dbRes->fetch()){
			Section::replace($params);
			return $params['URL_CPU'];
		}
		return;
	}
	/**
	 * Поиск ссылки по маске
	 * @param  string $urlDir искомая ссылка
	 * @return array|bool $arr массиыв параметров по ссылке
	 */
	private function maskSearch($par){
		$arr = false;

		$arParams = $this->getGenUrl($this->siteId, $par);
		if($arParams)
			foreach ($arParams as $key => $arrp)
				if($arr = $this->searchMaskInUrl($par, $arrp))
					break;

		return $arr;
	}
	private function getGenUrl($siteId, $par){
		$arParams = $this->getFilterMask($siteId, []);
		foreach($arParams as $k => $item){
			if($item['IBLOCK_ID'] != $par['IBLOCK_ID'] || $par['SECTION_ID'] != $item['SECTION_ID'])
				unset($arParams[$k]);
		}
		if(empty($arParams))
			return;

		$this->propsSelection($arParams);

		usort($arParams, function($a, $b){
		    return (strlen($a['URL_CPU']) == strlen($b['URL_CPU']) ? 0 : (strlen($a['URL_CPU']) > strlen($b['URL_CPU']) ? -1 : 1));
		});

		return $arParams;
	}
	public function getPropsSelection($par){
		return $this->propsSelection($par);
	}

	/**
	 * Поиск подходящей url  в маске
	 * @param  string $sUrl
	 * @param  array &$arr
	 * @return bool $arr
	 */
	private function searchMaskInUrl($par, &$arr){
		foreach ($par['PARAMS'] as $code => $v) {
			if(!empty($arr['PARAMS'][$code]))
				unset($par['PARAMS'][$code], $arr['PARAMS'][$code]);
		}
		if(!empty($arr['PARAMS']))
			return false;


		foreach ($arr['AR_CODE'] as $n => $code) {
			foreach ($arr['FRES'][$code] as $vId => $p) {
				if($par['PARAMS'][$p['CONTROL_ID']] == $p['HTML_VALUE']){
					$arr['URL_CPU'] = preg_replace("/\#PROP_{$code}\#/i", $p['TVALUE'], $arr['URL_CPU'], 1);
					unset($par['PARAMS'][$p['CONTROL_ID']]);
					$arr['IN_CODE'][$code]--;

					if($arr['IN_CODE'][$code] < 1)
						break;
				}
			}
		}
		unset($arr['FRES']);

		if(!preg_match('/\#PROP_(.+?)\#/i', $arr['URL_CPU'], $cpu) && empty($par['PARAMS']))
			return $arr['URL_CPU'];

		return false;
	}

	public function shuffle($par){

		$lurl = [['url' => $par['URL_CPU'], 'params' => $par['PARAMS'] ? $par['PARAMS'] : []]];
		if($par['AR_CODE'])
			foreach ($par['AR_CODE'] as $n => $code) {
				$lurl = $this->getListUrl($lurl, $code, $par['FRES'][$code]);
			}

		foreach ($lurl as &$aurl) {
			$aurl['url'] = str_replace('#', '', $aurl['url']);
		}

		return $lurl;
	}
	private function getListUrl($lurl, $code, $par){
		$arrList = array();
		if(!empty($lurl)){
			foreach ($lurl as $url) {
				if(!empty($par))
					foreach ($par as $p) {
						$cpu = preg_replace("/\#PROP_{$code}\#/i", "#".$p['TVALUE']."#", $url['url'], 1);
						if(preg_match_all("/\#{$p['TVALUE']}\#/i", $cpu, $cnt) && count($cnt[0]) < 2){
							$tmpP = [];
							$tmpV = [];
							$tmpP = $url['params'];
							$tmpV = $url['variable'];
							$tmpP[$p['CONTROL_ID']] = $p['HTML_VALUE'];
							$tmpV['PROP_'.$code][] = $p['VALUE'];
							$arrList[] = ['url' => $cpu, 'params' => $tmpP, 'variable' => $tmpV];
						}
					}

			}
		}
		unset($lurl);
		return $arrList;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit