meraproject/module/core/site/model.php
keboss-m 5c21d25d45 Initial commit: Merakomis portal, Docker stack and user-reader API.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-24 11:04:05 +03:00

373 lines
14 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?
use core\core\module\Installed;
use ms\Portal;
use ms\portal\Section;
use core\site\Theme;
use ms\portal\Domain;
use core\site\structure\HTMLPage;
use ms\portal\Verify;
class Site {
static $URL = [];
static $absPath = '';
static $themeAbsPath = '';
static $themeIndex = '';
static $justContent = false;
static $domen = '';
static $protocol = '';
static $host = '';
static $portal = null;
static $section = null;
static $portal_id = 0;
static $section_id = 0;
// Используется для пути к папке
//static $theme = 'bws.oneway';
//static $theme = 'projectman';
// Отображаемый url темы
//static $themeUrl = '/';
//static $theme = 'msto';
//static $theme = 'bws.sova';
//static $themeUrl = 'bws.sova';
/** @var Theme */
static $theme = null;
static $themeName = '';
static $themeUrl = '';
static $sectionUrl = '/';
/*sova
static $theme = 'bws.sova';
static $themeUrl = '/';
static $sectionUrl = '/';
/**/
static $module_id = null;
static $owner_id = 0;
static function toObject(){
}
static function portalUrl(string $url = '',bool $isFull = false){
return ($isFull?self::$domen:'/').$url;
}
static function sectionUrl(string $url = '',bool $isFull = false){
return ($isFull?self::$domen:'').self::$sectionUrl.$url;
}
static function themeUrl(string $url,bool $isFull = false){
return ($isFull?self::$domen:'').self::$themeAbsPath.$url;
}
static function themeFullPath(string $url){
return Core::$FOLDER.substr(self::$themeAbsPath,1).$url;
}
static function header404(){
header("HTTP/1.0 404 Not Found");
}
static function redirect301($link){
if(\Site::$justContent){
HTMLPage::$redirect = $link;
} else {
header("HTTP/1.1 301 Moved Permanently");
header("Location: ".$link);
}
}
static function redirect($link){
if(\Site::$justContent){
HTMLPage::$redirect = $link;
} else {
header("Location: ".$link);
}
}
static function reload(){
header("Refresh:0");
}
static function init() {
$portal = null;
self::$justContent = (isset($_REQUEST['justContent']) && $_REQUEST['justContent'] == 1);
self::$protocol = 'http'.(isset($_SERVER['HTTPS'])?'s':'').'://';
self::$domen = self::$protocol.$_SERVER['HTTP_HOST'];
self::$host = $_SERVER['HTTP_HOST'];
$a = parse_url($_SERVER['REQUEST_URI']);
$b = explode("/", $a['path']);
$arr = [];
foreach ($b as $v) {
if ($v) $arr[] = (string)$v;
}
if (!isset($arr[0]) || $arr[0] === '') {
$arr[0] = '';
}
$x = Installed::getByUrl($arr[0]);
$isModuleSite = false;
/*
if($x){
//
self::$theme = $x[Installed::$THEME];
self::$themeUrl = '/'.$x[Installed::$URL].'/';
self::$module_id = $x[Installed::$ID];
array_shift($arr);
} else
*/
if (count($arr)) {
$C = null;
// Сначала адрес проверяем на регулярку
$a = explode(".",$_SERVER['HTTP_HOST']);
if(count($a)==3){
if(substr($a[0],0,4)=='site'){
$id = intval(substr($a[0],4));
if($id) {
$C = Portal::getByID($id);
$isModuleSite = true;
}
}
}
/*
echo '<pre>';
echo var_dump(\DB::$DB,MYSQL_ADMIN,MYSQL_BASE);
echo '</pre>';
*/
// Потом проверяем, а какой у нас домен.
//if(count($a)==2 and !in_array($_SERVER['HTTP_HOST'],['module.bz','cmsbuilder.in'])){
if(!$C) {
if (count($a) == 2
|| (count($a) == 3 && $a[0] == 'www')
|| (count($a) == 3 )
|| (count($a) == 4 && is_numeric($a[3])) // Типа ip
) {
if ((count($a) == 3 && $a[0] == 'www')) {
array_shift($a);
\Site::redirect301(self::$protocol . implode(".", $a).$_SERVER['REQUEST_URI']);
}
if (count($a) == 3 ) {
$r = Domain::select([
\Query::WHERE => new \Where(\Where::_or([
\Where::_operator(Domain::$DOMAIN, '=', $a[1].'.'.$a[2]),
//\Where::_operator(Domain::$DOMAIN, '=', $a[0].'.'.$a[1].'.'.$a[2]),
])
),
\Query::COUNT => 1,
], true);
if ($r) {
$id = array_pop($r)[Domain::$PORTAL];
if ($id) {
$C = Portal::getByID($id);
}
}
}
// Если это главный портал, и если это админка, то идём в админку
if ((in_array($_SERVER['HTTP_HOST'], ['module.bz', 'module.in']) and $arr[0] == Config::$ADMIN_PAGE) or $arr[0] == Config::$ADMIN_PAGE) {
} else {
$r = Domain::select([
\Query::WHERE => new \Where(\Where::_operator(Domain::$DOMAIN, '=', $_SERVER['HTTP_HOST'])),
\Query::COUNT => 1,
], true);
if ($r) {
$id = array_pop($r)[Domain::$PORTAL];
if ($id) {
$C = Portal::getByID($id);
}
}
}
}
}
if(in_array($_SERVER['HTTP_HOST'],\Core::$CLIENT_DOMAINS) and ($arr[0]!=Config::$ADMIN_PAGE) ){
$C = Portal::getByID($_SERVER['HTTP_HOST']=='module.bz'?10:1);
}
if($C) {
self::$portal = $C;
$portal = $C;
self::$portal_id = $portal_id = $C[Portal::$ID];
// Тут получаем информацию о теме в зависимости от того, в каком мы разделе
$section = null;
if(isset($_POST['_section_path'])){
$section = Section::getByPath($_POST['_section_path'],$portal_id);
}
if(!$section) {
$section = Section::getByPath($arr[0],$portal_id);
}
if(!$section) {
$section = Section::getByPath("",$portal_id);
}
self::$section = $section;
self::$section_id = $section[Section::$ID];
self::$owner_id = $section[Section::$ACCOUNT];
$theme = Theme::init( $section[Section::$THEME] , json_decode( $section[Section::$DATA] ,true ), self::$owner_id );
Profile::init($portal_id);
self::$theme = $theme;
self::$themeName = strtolower($theme::$name);
self::$themeUrl = $theme::$themeUrl;
self::$sectionUrl = '/'.(($c = $section[Section::$PATH])?$c.'/':'');
if($section[Section::$PATH]){
array_shift($arr);
}
$theme::prepare();
//Profile::init($portal_id);
//Theme::prepare();
//$theme::prepare();
}
// Если это не портал
if(! $portal ) {
switch ($arr[0]) {
case 'pm':
//self::$theme = 'pm';
self::$themeUrl = '/pm/';
self::$sectionUrl = '/pm/';
array_shift($arr);
break;
case Config::$ADMIN_PAGE:
//self::$theme = 'admin';
self::$themeUrl = '/admin/';
array_shift($arr);
break;
case 'msto':
//self::$theme = 'msto';
self::$themeUrl = '/msto/';
array_shift($arr);
break;
case 'sova':
//self::$theme = 'bws.sova';
self::$themeUrl = '/sova/';
array_shift($arr);
break;
}
}
}
self::$URL = $arr;
self::$absPath = Core::$FOLDER.'/content/' . self::$themeUrl . '/';
self::$themeAbsPath = '/content/' . self::$themeUrl . '/';
self::$themeIndex = self::$absPath . 'index.php';
if($portal) {
$full_url = self::portalUrl( $_SERVER['REQUEST_URI'] ,true);
$full_path = str_replace("?".$_SERVER['REDIRECT_QUERY_STRING'],"",$full_url);
// Проверяем ссылку на редирект
if($c = $portal[Portal::$REDIRECT]){
$a = explode("\n",$c);
$redirects = [];
foreach ($a as $v){
$v = str_replace("\t"," ",$v);
$v = explode(" ",$v);
$redirects[$v[0]] = $v[1];
}
if($c = $redirects[$full_url]) {\Site::redirect301($c); exit;}
if($c = $redirects[$full_path]) {\Site::redirect301($c); exit;}
}
// Проверяем ссылку
switch (self::$URL[0]){
case 'robots.txt':
header("Content-Type: text/plain");
echo $portal[Portal::$ROBOTS_TXT];
exit;
case 'sitemap.xml':
//*
header("Content-Type: text/xml");
//header("Expires: Thu, 19 Feb 1998 13:24:18 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Cache-Control: post-check=0,pre-check=0");
header("Cache-Control: max-age=0");
header("Pragma: no-cache");
/**/
echo self::$theme->getSitemap();
exit;
case 'yml.xml':
//*
header("Content-Type: text/xml");
//header("Expires: Thu, 19 Feb 1998 13:24:18 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Cache-Control: post-check=0,pre-check=0");
header("Cache-Control: max-age=0");
header("Pragma: no-cache");
/**/
echo self::$theme->getYML();
exit;
case 'merchant.txt':
self::$theme->echoMerchant();
exit;
case 'merchant.xml':
self::$theme->echoMerchantXML();
exit;
case 'turbo.xml':
self::$theme->getTurbo()->echoXml();
exit;
case 'turbo_shop.xml':
header("Content-Type: text/xml");
//header("Expires: Thu, 19 Feb 1998 13:24:18 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Cache-Control: post-check=0,pre-check=0");
header("Cache-Control: max-age=0");
header("Pragma: no-cache");
echo self::$theme->getTurboShop();
exit;
}
// Теперь проверим, вдруг это код верификации
if(count($arr)==1 ) {
$url = $arr[0];
$filename = '';
$v1 = substr($url,-5,5);
if($v1=='.html') $filename = substr($url,0,-5);
$v2 = substr($url,-4,4);
$v3 = substr($url,-3,3);
if($v2=='.htm') $filename = substr($url,0,-4);
if($v2=='.xml') $filename = substr($url,0,-4);
if($v2=='.txt') $filename = substr($url,0,-4);
if($v1=='.json') $filename = substr($url,0,-5);
if($v3=='.js') {
header("Content-Type: application/javascript");
$filename = substr($url,0,-3);
}
$filename = (string)trim($filename);
if($filename){
$r = Verify::select([
\Query::COUNT => 1,
\Query::WHERE => new \Where(\Where::_and([
\Where::_operator(Verify::$PORTAL,'=',self::$portal_id),
\Where::_operator(Verify::$FILENAME,'=',$filename),
]))
],true);
if($r) {
$l = array_pop($r);
echo $l[Verify::$TEXT];
exit;
}
}
}
if($isModuleSite) {
$domains = Domain::getByPortal($C[Portal::$ID]);
if ($domains) {
$domain = array_shift($domains);
\Site::redirect301('http://' . $domain[Domain::$DOMAIN] . $_SERVER['REQUEST_URI']);
exit;
}
}
}
}
static function render(){
if(file_exists(self::$themeIndex)) {
include_once(self::$themeIndex);
}
}
}