1
core.php in web – MultiMag

source: web/core.php @ 083593f

Last change on this file since 083593f was 083593f, checked in by Blacklight <blacklight@…>, 8 years ago
  • Устранена ошибка при изменении документа *перемежение средств (касса)* #482
  • Реализована рабта с рекомендуемыми розничными ценами #475
  • Property mode set to 100644
File size: 31.6 KB
Line 
1<?php
2//      MultiMag v0.1 - Complex sales system
3//
4//      Copyright (C) 2005-2012, BlackLight, TND Team, http://tndproject.org
5//
6//      This program is free software: you can redistribute it and/or modify
7//      it under the terms of the GNU Affero General Public License as
8//      published by the Free Software Foundation, either version 3 of the
9//      License, or (at your option) any later version.
10//
11//      This program is distributed in the hope that it will be useful,
12//      but WITHOUT ANY WARRANTY; without even the implied warranty of
13//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14//      GNU Affero General Public License for more details.
15//
16//      You should have received a copy of the GNU Affero General Public License
17//      along with this program.  If not, see <http://www.gnu.org/licenses/>.
18//
19
20/**
21@mainpage Cистема комплексного учёта торговли multimag. Документация разработчика.
22<h2>Часто используемые классы</h2>
23BETemplate в core.php содержит шаблонизатор страницы. \n
24doc.core.php содержит основные функции работы с документами \n
25Vitrina (vitrina.php) формирует все страницы витрины и может быть перегружен шаблоном \n
26doc_Nulltype является базовым классом для всех документов системы \n
27BaseReport используется для генерации отчётов \n
28От AsyncWorker наследуются обработчики, выполняющиеся независимо от веб сервера \n
29PosEditor содержит методы для работы с редактором списка товаров \n
30Смотри <a href='annotated.html'>структуры данных</a> и <a href='hierarchy.html'>иерархию классов</a>, чтобы получить полное представление о классах системы
31**/
32
33if(!function_exists('mysql_connect'))
34{
35        header("500 Internal Server Error");
36        echo"<h1>500 Внутренняя ошибка сервера</h1>Расширение php-mysql не найдено. Обратитесь к администратору по адресу <a href='mailto:{$CONFIG['site']['admin_email']}'>{$CONFIG['site']['admin_email']}</a> c описанием проблемы.";
37        exit();
38}
39
40if(!function_exists('mb_internal_encoding'))
41{
42        header("500 Internal Server Error");
43        echo"<h1>500 Внутренняя ошибка сервера</h1>Расширение php-mbstring не найдено. Обратитесь к администратору по адресу <a href='mailto:{$CONFIG['site']['admin_email']}'>{$CONFIG['site']['admin_email']}</a> c описанием проблемы.";
44        exit();
45}
46
47$time_start = microtime(true);
48session_start();
49mb_internal_encoding("UTF-8");
50
51define('__ROOT__', dirname(dirname(__FILE__)));
52$base_path = __ROOT__;
53
54if(! include_once("$base_path/config_site.php"))
55{
56        header("500 Internal Server Error");
57        echo"<h1>500 Внутренняя ошибка сервера</h1>Конфигурационный файл не найден! Обратитесь к администратору по адресу <a href='mailto:{$CONFIG['site']['admin_email']}'>{$CONFIG['site']['admin_email']}</a> c описанием проблемы.";
58        exit();
59}
60
61include_once($CONFIG['location']."/common/core.common.php");
62
63if($CONFIG['site']['force_https'])
64{
65        header('Location: https://'.$_SERVER["HTTP_HOST"].$_SERVER['REQUEST_URI'], true, 301);
66}
67
68if(!isset($CONFIG['site']['display_name']))     $CONFIG['site']['display_name']=$CONFIG['site']['name'];
69
70if(!@mysql_connect($CONFIG['mysql']['host'],$CONFIG['mysql']['login'],$CONFIG['mysql']['pass']))
71{
72        header("503 Service temporary unavariable");
73        echo"<h1>503 Сервис временно недоступен!</h1>Не удалось соединиться с сервером баз данных. Возможно он перегружен, и слишком медленно отвечает на запросы, либо выключен. Попробуйте подключиться через 5 минут. Если проблема сохранится - пожалуйста, напишите письмо по адресу <a href='mailto:{$CONFIG['site']['admin_email']}'>{$CONFIG['site']['admin_email']}</a> c описанием проблемы.";
74        exit();
75}
76if(!@mysql_select_db($CONFIG['mysql']['db']))
77{
78    echo"Невозможно активизировать базу данных! Возможно, база данных повреждена. Попробуйте подключиться через 5 минут. Если проблема сохранится - пожалуйста, напишите письмо по адресу <a href='mailto:{$CONFIG['site']['admin_email']}'>{$CONFIG['site']['admin_email']}</a> c описанием проблемы.";
79    exit();
80}
81
82mysql_query("SET CHARACTER SET UTF8");
83mysql_query("SET character_set_client = UTF8");
84mysql_query("SET character_set_results = UTF8");
85mysql_query("SET character_set_connection = UTF8");
86
87header("X-Powered-By: MultiMag ".MULTIMAG_VERSION);
88
89$ip=mysql_real_escape_string(getenv("REMOTE_ADDR"));
90$ag=mysql_real_escape_string(getenv("HTTP_USER_AGENT"));
91$rf=mysql_real_escape_string(urldecode(getenv("HTTP_REFERER")));
92$qq=mysql_real_escape_string(urldecode($_SERVER['REQUEST_URI'].'?'.$_SERVER['QUERY_STRING']));
93$ff=mysql_real_escape_string($_SERVER['SCRIPT_NAME']);
94$tim=time();
95
96if(!isset($_REQUEST['ncnt'])) @mysql_query("INSERT INTO `counter` (`date`,`ip`,`agent`,`refer`,`query`,`file`) VALUES ('$tim','$ip','$ag','$rf','$qq','$ff')");
97
98class ipv6
99{
100        function is_ipv6($ip = "")
101        {
102                if($ip=='')     return false;
103                if (substr_count($ip,":") > 0 && substr_count($ip,".") == 0)
104                        return true;
105                else    return false;
106        }
107
108        function is_ipv4($ip = "")
109        {
110                if($ip=='')     return false;
111                return !ipv6::is_ipv6($ip);
112        }
113
114        function get_ip()
115        {
116                return  getenv ("REMOTE_ADDR");
117        }
118
119        function uncompress_ipv6($ip ="")
120        {
121                if($ip=='')     return false;
122                if(strstr($ip,"::" ))
123                {
124                        $e = explode(":", $ip);
125                        $s = 8-sizeof($e)+1;
126                        foreach($e as $key=>$val)
127                        {
128                                if ($val == "")
129                                        for($i==0;$i<=$s;$i++)          $newip[] = 0;
130                                else    $newip[] = $val;
131                        }
132                        $ip = implode(":", $newip);
133                }
134                return $ip;
135        }
136
137        function compress_ipv6($ip ="")
138        {
139                if($ip=='')     return false;
140                if(!strstr($ip,"::" ))
141                {
142                        $e = explode(":", $ip);
143                        $zeros = array(0);
144                        $result = array_intersect ($e, $zeros );
145                        if (sizeof($result) >= 6)
146                        {
147                                if ($e[0]==0) $newip[] = "";
148                                foreach($e as $key=>$val)
149                                        if ($val !=="0") $newip[] = $val;
150                                $ip = implode("::", $newip);
151                        }
152                }
153                return $ip;
154        }
155}
156
157function get_max_upload_filesize()
158{
159    $max_post = trim(ini_get('post_max_size'));
160    $last = strtolower($max_post[strlen($max_post)-1]);
161    switch($last) {
162        // The 'G' modifier is available since PHP 5.1.0
163        case 'g':
164            $max_post *= 1024;
165        case 'm':
166            $max_post *= 1024;
167        case 'k':
168            $max_post *= 1024;
169    }
170
171    $max_fs = trim(ini_get('upload_max_filesize'));
172    $last = strtolower($max_fs[strlen($max_fs)-1]);
173    switch($last) {
174        // The 'G' modifier is available since PHP 5.1.0
175        case 'g':
176            $max_fs *= 1024;
177        case 'm':
178            $max_fs *= 1024;
179        case 'k':
180            $max_fs *= 1024;
181    }
182
183
184    return min($max_fs, $max_post);
185}
186
187/// Форматирование номера телефона, записанного в международном формате, в легкочитаемый вид
188/// Номера, не начинающиеся с +, возвращаются без форматирования
189function formatPhoneNumber($phone)
190{
191        if($phone[0]!='+')      return $phone;
192        $divs=array('','','-','','','-','','','-','','-','','-','','-','','-','','-','','','','','','','','','','','','','','','','','','','','');
193        $fphone='';
194        $len=strlen($phone);
195        for($i=0;$i<$len;$i++)
196        {
197                $fphone.=$divs[$i].$phone[$i];
198        }
199        return $fphone;
200}
201
202function exception_handler($exception)
203{
204        $ip=getenv("REMOTE_ADDR");
205        $ag=getenv("HTTP_USER_AGENT");
206        $rf=urldecode(getenv("HTTP_REFERER"));
207        $ff=$_SERVER['REQUEST_URI'];
208        $uid=$_SESSION['uid'];
209        $s=mysql_real_escape_string($exception->getMessage());
210        $ag=mysql_real_escape_string($ag);
211        $rf=mysql_real_escape_string($rf);
212        $ff=mysql_real_escape_string($ff);
213        mysql_query("INSERT INTO `errorlog` (`page`,`referer`,`msg`,`date`,`ip`,`agent`, `uid`) VALUES
214        ('$ff','$rf','$s',NOW(),'$ip','$ag', '$uid')");
215        header('HTTP/1.0 404 Internal error');
216        header('Status: 404 Internal error');
217        echo"<!DOCTYPE html><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><title>Error 500: Необработанная внутренняя ошибка</title>
218        <style type='text/css'>body{color: #000; background-color: #eee; text-align: center;}</style></head><body>
219        <h1>Необработанная внутренняя ошибка</h1>".get_class($exception).": $s<br>Страница:$ff<br>Сообщение об ошибке передано администратору</body></html>";
220}
221set_exception_handler('exception_handler');
222
223// =================================== Подсветка найденного текста ====================================
224function SearchHilight($str,$substr)
225{
226        if(!$substr) return $str;
227        $tmp=split($substr,' '.$str.' ');
228        $result='';
229        foreach($tmp as $t)
230        {
231                if(!$result) $result=$t;
232                else $result.='<span class=b_selection>'.$substr.'</span>'.$t;
233        }
234        return $result;
235}
236
237// ====================================== Генератор кодов ==================================================
238function keygen_unique($num=0, $minlen=5, $maxlen=12)
239{
240        if($minlen<1) $minlen=5;
241        if($maxlen>10000) $maxlen=10000;
242        if($maxlen<$minlen) $maxlen=$minlen;
243        if(!$num)
244        {
245                $sstr="bcdfghjklmnprstvwxz";
246                $gstr="aeiouy1234567890aeiouy";
247                $rstr="aeiouy1234567890aeiouybcdfghjklmnprstvwxz";
248                $sln=18; // +1
249                $gln=21; // +1
250                $rln=40; //+1
251        }
252        else
253        {
254                $sstr="135790";
255                $gstr="24680";
256                $rstr="1234567890";
257                $sln=5; // +1
258                $gln=4; // +1
259                $rln=9; //+1
260        }
261        $r=rand(0,$rln);
262        $s=$rstr[$r];
263        $ln=rand($minlen,$maxlen);
264        $sig=0;
265        for($i=1;$i<$ln;$i++)
266        {
267                if(eregi($s[$i-1],$sstr))
268                {
269                        $r=rand(0,$gln);
270                        $s.=$gstr[$r];
271                }
272                else
273                {
274                        $r=rand(0,$sln);
275                        $s.=$sstr[$r];
276                }
277        }
278        return $s;
279}
280
281// ======================================= Обработчики ввода переменных ====================================
282/// Переделать: cохранить безопасность записи данных в базу, но убрать преобразование в html-символы
283function rcv($varname,$def="")
284{
285        $dt=htmlentities(@$_POST[$varname],ENT_QUOTES,"UTF-8");
286        if($dt=="") $dt=htmlentities(@$_GET[$varname],ENT_QUOTES,"UTF-8");
287        if($dt) return $dt;
288        else return $def;
289}
290
291/// Безопасное получение целого значения
292function rcvint($varname,$def=0)
293{
294        if(isset($_REQUEST[$varname]))  return intval($_REQUEST[$varname]);
295        return $def;
296}
297
298/// Получение строкового значения для записи в базу
299function rcvstrsql($varname,$def='')
300{
301        if(isset($_REQUEST[$varname]))  return mysql_real_escape_string($_REQUEST[$varname]);
302        return $def;
303}
304
305
306function unhtmlentities ($string)
307{
308        return html_entity_decode ($string,ENT_QUOTES,"UTF-8");
309}
310
311function getpost($varname,$def="")
312{
313        if(isset($_POST[$varname]))     return $_POST[$varname];
314        if(isset($_GET[$varname]))      return $_GET[$varname];
315        return $def;
316}
317
318/// INSERT данных из массива c экранированием
319function mysql_escaped_insert($table,$array_data)
320{
321        $keys='';
322        $values='';
323        foreach($array_data as $id => $data)
324        {
325                if($keys)
326                {
327                        $keys.=', ';
328                        $values.=', ';
329                }
330                $keys.='`'.mysql_real_escape_string($id).'`';
331                if(is_int($data))       $values.=$data;
332                else                    $values.='\''.mysql_real_escape_string($data).'\'';
333        }
334        mysql_query("INSERT INTO `$table` ($keys) VALUES ($values)");
335}
336
337// =================================== Аутентификация и контроль привилегий ============================================
338/// Требование аутентификации
339function need_auth()
340{
341        global $tmpl;
342        if(!auth())
343        {
344                $SESSION['last_page']=$ff.$qq;
345                $_SESSION['cook_test']='data';
346                header('Location: /login.php');
347                $tmpl->msg("Для продолжения необходимо выполнить вход!","info","Требуется аутентификация");
348                $tmpl->write();
349                exit();
350        }
351        return 1;
352}
353
354// Проверка аутентификации
355function auth()
356{
357        return (@$_SESSION['uid']==0)?0:1;
358}
359
360// Получить привилегии (read, write, edit, delete) доступа к указанному объекту.
361// Не используется для остальных
362// Не рекомендуется к использованию с версии 0.0.1r221
363function getright($object,$uid)
364{
365        //throw new Exception("Проверка привилений доступа через удаляемую функцию getright($object,$uid)");
366        if($uid==1)
367        {
368                $nxt['read']=1;
369                $nxt['write']=1;
370                $nxt['edit']=1;
371                $nxt['delete']=1;
372                return $nxt;
373        }
374        $res=mysql_query("
375        SELECT MAX(`users_grouprights`.`a_read`) AS `read`, MAX(`users_grouprights`.`a_write`) AS `write`, MAX(`users_grouprights`.`a_edit`) AS `edit`, MAX(`users_grouprights`.`a_delete`) AS `delete`
376        FROM `users_grouprights`
377        INNER JOIN `users_groups` ON `users_groups`.`gid`=`users_grouprights`.`gid` AND ( `users_groups`.`uid`='$uid'
378        OR `users_groups`.`uid`='0')
379        WHERE `users_grouprights`.`object`='$object'
380        GROUP BY `users_grouprights`.`object`");
381
382        $nxt=mysql_fetch_assoc($res);
383        return $nxt;
384}
385
386// Есть ли право доступа к указанному объекту для указанной операции
387function isAccess($object, $action,$no_redirect=false)
388{
389        $uid=@$_SESSION['uid'];
390        if($uid==1)     return true;
391        $res=mysql_query("(
392        SELECT `users_acl`.`id` FROM `users_acl` WHERE `uid`='$uid' AND `object`='$object' AND `action`='$action'
393        ) UNION (
394        SELECT `users_groups_acl`.`id` FROM `users_groups_acl`
395        INNER JOIN `users_in_group` ON `users_in_group`.`gid`=`users_groups_acl`.`gid`
396        WHERE `uid`='$uid' AND `object`='$object' AND `action`='$action')
397        UNION (
398        SELECT `users_groups_acl`.`id` FROM `users_groups_acl`
399        INNER JOIN `users_in_group` ON `users_in_group`.`gid`=`users_groups_acl`.`gid`
400        WHERE `uid`='0' AND `object`='$object' AND `action`='$action')
401        UNION(
402        SELECT `users_acl`.`id` FROM `users_acl` WHERE `uid`='0' AND `object`='$object' AND `action`='$action')");
403        if(mysql_errno())       throw new MysqlException("Выборка привилегий не удалась");
404        $access=(mysql_num_rows($res)>0)?true:false;
405        if((!$uid) && (!$access) && (!$no_redirect))    need_auth();
406        return $access;
407}
408
409// Транслитерация
410function translitIt($str)
411{
412    $tr = array(
413        "А"=>"A","Б"=>"B","В"=>"V","Г"=>"G",
414        "Д"=>"D","Е"=>"E","Ж"=>"J","З"=>"Z","И"=>"I",
415        "Й"=>"Y","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N",
416        "О"=>"O","П"=>"P","Р"=>"R","С"=>"S","Т"=>"T",
417        "У"=>"U","Ф"=>"F","Х"=>"H","Ц"=>"TS","Ч"=>"CH",
418        "Ш"=>"SH","Щ"=>"SCH","Ъ"=>"","Ы"=>"YI","Ь"=>"",
419        "Э"=>"E","Ю"=>"YU","Я"=>"YA","а"=>"a","б"=>"b",
420        "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"j",
421        "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
422        "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
423        "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
424        "ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
425        "ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya"
426    );
427    return strtr($str,$tr);
428}
429
430
431
432// ==================================== Рассылка ===================================================
433function SendSubscribe($tema,$msg)
434{
435        global $CONFIG;
436        $res=mysql_query("SELECT `firm_name` FROM `doc_vars` WHERE `id`='{$CONFIG['site']['default_firm']}'");
437        if(mysql_errno())       throw new MysqlException("Ошибка получения наименования организации");
438        $firm_name=mysql_result($res,0,0);
439        $res=mysql_query("(SELECT `name`, `reg_email`, `real_name` FROM `users` WHERE `reg_email_subscribe`='1' AND `reg_email_confirm`='1')
440        UNION
441        (SELECT `name`, `email`, `fullname` AS `rname` FROM `doc_agent` WHERE `no_mail`='0' AND `email`!='')
442        ");
443        if(mysql_errno())       throw new MysqlException("Ошибка получения списка подписчиков");
444        while($nxt=mysql_fetch_row($res))
445        {
446                if($nxt[2])     $nxt[0]="$nxt[2] ($nxt[0])";
447                $txt="
448Здравствуйте, $nxt[0]!
449
450$tema
451------------------------------------------
452
453$msg
454
455------------------------------------------
456
457Вы получили это письмо потому что подписаны на рассылку сайта {$CONFIG['site']['display_name']} ( http://{$CONFIG['site']['name']} ), либо являетесь клиентом $firm_name.
458Отказаться от рассылки можно, перейдя по ссылке http://{$CONFIG['site']['name']}/login.php?mode=unsubscribe&email=$nxt[1]
459";
460                mail($nxt[1],$tema." - {$CONFIG['site']['name']}", $txt ,"Content-type: text/plain; charset=UTF-8\nFrom: {$CONFIG['site']['display_name']} <{$CONFIG['site']['admin_email']}>");
461        }
462}
463
464function sendAdmMessage($text,$subject='')
465{
466        global $CONFIG;
467        if($subject=='')        $subject="Admin mail from {$CONFIG['site']}";
468
469        if($CONFIG['site']['doc_adm_email'])
470                mailto($CONFIG['site']['doc_adm_email'],$subject ,$text, $from);
471
472        if($CONFIG['site']['doc_adm_jid'] && $CONFIG['xmpp']['host'])
473        {
474                try
475                {
476                        require_once($CONFIG['location'].'/common/XMPPHP/XMPP.php');
477
478                        $xmppclient = new XMPPHP_XMPP( $CONFIG['xmpp']['host'], $CONFIG['xmpp']['port'], $CONFIG['xmpp']['login'], $CONFIG['xmpp']['pass'], 'xmpphp', '', $printlog=false, $loglevel=XMPPHP_Log::LEVEL_INFO);
479                        $xmppclient->connect();
480                        $xmppclient->processUntil('session_start');
481                        $xmppclient->presence();
482                        $xmppclient->message($CONFIG['site']['doc_adm_jid'], $text);
483                        $xmppclient->disconnect();
484                }
485                catch(XMPPHP_Exception $e)
486                {
487                        $tmpl->logger("Невозможно отправить сообщение по XMPP!","err");
488                }
489        }
490}
491
492function date_day($date)
493{
494   $ee=date("d M Y 00:00:00",$date);
495   $tm=strtotime($ee);
496   return $tm;
497}
498
499function SafeLoadTemplate($template)
500{
501        global $tmpl, $CONFIG;
502        if($template)   $tmpl->LoadTemplate($template);
503}
504
505/// Получить данные профиля пользователя по uid
506function getUserProfile($uid)
507{
508        settype($uid,'int');
509        $user_profile=array();
510        $user_profile['main']=array();
511        $user_profile['dop']=array();
512
513        $res=mysql_query("SELECT * FROM `users` WHERE `id`='$uid'");
514        if(mysql_errno())       throw new MysqlException("Не удалось получить основные данные пользователя!");
515        if(! mysql_num_rows($res))      return $user_profile;   // Если не найден
516        $user_profile['main']   = mysql_fetch_assoc($res);
517        unset($user_profile['main']['pass']);   // В целях безопасности
518        unset($user_profile['main']['pass_change']);
519        $rr=mysql_query("SELECT `param`,`value` FROM `users_data` WHERE `uid`='$uid'");
520        if(mysql_errno())       throw new MysqlException("Не удалось получить дополнительные данные пользователя!");
521        while($nn=mysql_fetch_row($rr))
522        {
523                $user_profile['dop'][$nn[0]]=$nn[1];
524        }
525       
526        return $user_profile;
527}
528
529/// Класс шаблонизатора вывода страницы. Содержит методы, отвечающие за загрузку темы оформления, заполнения страницы содержимым и отправки в броузер
530class BETemplate
531{
532        var $tpl;                       ///< Шаблон
533        var $ajax=0;                    ///< Флаг ajax выдачи
534        var $tplname;                   ///< Наименование загруженного шаблона
535        var $page_blocks=array();       ///< Новые блоки шаблонизатора. Ассоциативный массив. Замена устаревшего $page
536        var $hide_blocks=array();       ///< Скрытые блоки. Блоки, отображать которые не нужно
537
538        function BETemplate()
539        {
540                global $CONFIG;
541                if($CONFIG['site']['skin'])     $this->LoadTemplate($CONFIG['site']['skin']);
542                else                            $this->LoadTemplate('default');
543        }
544        /// Загрузка шаблона по его имени
545        function LoadTemplate($s)
546        {
547                $this->tplname=$s;
548                $fd=@file('skins/'.$s.'/style.tpl');
549                if($fd)
550                {
551                        $this->tpl="";
552                        foreach($fd as $item)
553                                $this->tpl.=$item;
554                }
555        }
556
557        /// Установить флаг скрытия заданной части страницы
558        function HideBlock($block)
559        {
560                $this->hide_blocks[$block]=true;
561        }
562
563        /// Снять флаг скрытия заданной части страницы
564        function ShowBlock($block)
565        {
566                unset($this->hide_blocks[$block]);
567        }
568
569        /// Задать HTML содержимое шапки страницы
570        function SetTop($s)
571        {
572                @$this->page_blocks['top']=$s;
573        }
574
575        /// Добавить HTML содержимое в конец шапки страницы
576        function AddTop($s)
577        {
578                @$this->page_blocks['top'].=$s;
579        }
580
581        /// Задать HTML содержимое правой колонки страницы
582        function SetRight($s)
583        {
584                @$this->page_blocks['right']=$s;
585        }
586
587        /// Вставить HTML содержимое в начало правой колонки страницы
588        function InsRight($s)
589        {
590                @$this->page_blocks['right']=$s.$this->page_blocks['right'];
591        }
592
593        /// Добавить HTML содержимое в конец правой колонки страницы
594        function AddRight($s)
595        {
596                @$this->page_blocks['right'].=$s;
597        }
598
599        /// Вставить HTML содержимое в начало левой колонки страницы
600        function AddLeft($s)
601        {
602                @$this->page_blocks['left'].=$s;
603        }
604
605        /// Задать HTML содержимое левой колонки страницы
606        function SetLeft($s)
607        {
608                @$this->page_blocks['left']=$s;
609        }
610
611        /// Задать текст заголовка (обычно тэг title) страницы
612        function SetTitle($s)
613        {
614                @$this->page_blocks['title']=$s;
615        }
616
617        /// Задать содержимое мета-тэга keywords
618        function SetMetaKeywords($s)
619        {
620                @$this->page_blocks['meta_keywords']=$s;
621        }
622
623        /// Задать содержимое мета-тэга description
624        function SetMetaDescription($s)
625        {
626                @$this->page_blocks['meta_description']=$s;
627        }
628
629        /// Добавить HTML содержимое к основному блоку страницы (content)
630        /// Не рекомендуется к использованию. Вместо этого используйте SetContent
631        /// @sa SetContent
632        function SetText($s)
633        {
634                @$this->page_blocks['content']=$s;
635        }
636
637        /// Задать HTML содержимое основного блока страницы (content)
638        /// Не рекомендуется к использованию. Вместо этого используйте AddContent
639        /// @sa AddContent
640        function AddText($s)
641        {
642                @$this->page_blocks['content'].=$s;
643        }
644
645        /// Задать HTML содержимое основного блока страницы (content)
646        function SetContent($s)
647        {
648                @$this->page_blocks['content']=$s;
649        }
650
651        /// Добавить HTML содержимое к основному блоку страницы (content)
652        function AddContent($s)
653        {
654                @$this->page_blocks['content'].=$s;
655        }
656
657        /// Добавить содержимое к таблице стилей страницы (тэг style)
658        function AddStyle($s)
659        {
660                @$this->page_blocks['stylesheet'].=$s;
661        }
662
663        /// Задать содержимое к пользовательского блока страницы
664        /// @param block_name Имя блока. Не должно совпадать с именами стандартных блоков.
665        /// @param data HTML данные блока
666        function SetCustomBlockData($block_name, $data)
667        {
668                @$this->page_blocks[$block_name]=$data;
669        }
670        /// Добавить содержимое к пользовательскому блоку страницы
671        /// @param block_name Имя блока. Не должно совпадать с именами стандартных блоков.
672        /// @param data HTML данные блока
673        function AddCustomBlockData($block_name, $data)
674        {
675                @$this->page_blocks[$block_name].=$data;
676        }
677
678        /// Добавить блок (div) с информацией к основному блоку страницы (content)
679        /// @param text Текст сообщения
680        /// @param mode Вид сообщения: ok - сообщение об успехе, err - сообщение об ошибке, info - информационное сообщение
681        /// @param head Заголовок сообшения
682        function msg($text="",$mode="",$head="")
683        {
684                if($text=="") return;
685                if($mode=="error") $mode="err";
686                if($mode=='info') $mode='notify';
687                if(($mode!="ok")&&($mode!="err")) $mode="notify";
688                if($head=="")
689                {
690                        $msg="Информация:";
691                        if($mode=="ok") $msg="Сделано!";
692                        if($mode=="err") $msg="Ошибка!";
693                }
694                else $msg=$head;
695
696                @$this->page_blocks['content'].="<div class='$mode'><b>$msg</b><br>$text</div>";
697        }
698
699        /// Сформировать HTML и отправить его, в соответствии с загруженным шаблоном и установленным содержимым блоков
700        function write()
701        {
702                global $time_start;
703                if(stripos(getenv("HTTP_USER_AGENT"), "MSIE" )!==FALSE )
704                {
705                        $this->page_blocks['notsupportbrowser']="<div style='background: #ffb; border: 1px #fff outset; padding: 3px; padding-right: 15px; text-align: right; font-size: 14px;'><img src='/img/win/important.png' alt='info' style='float: left'>
706                        Вероятно, Вы используете неподдерживаемую версию броузера.<br><b>Для правильной работы сайта, скачайте и установите последнюю версию <a href='http://mozilla.com'>Mozilla</a>, <a href='http://www.opera.com/download/'>Opera</a> или <a href='http://www.google.com/intl/ru/chrome/browser/'>Chrome</a></b><div style='clear: both'></div></div>";
707                }
708                $time = microtime(true) - $time_start;
709                $this->page_blocks['gentime']=round($time,4);
710
711                @include_once("skins/".$this->tplname."/style.php");
712                if($this->ajax)         echo @$this->page_blocks['content'];
713                else
714                {
715                        @include_once("skins/".$this->tplname."/style.php");
716                        if(function_exists('skin_prepare'))
717                        {
718                                $res=skin_prepare();
719                        }
720
721                        if(function_exists('skin_render'))
722                        {
723                                $res=skin_render($this->page_blocks,$this->tpl);
724                        }
725                        else
726                        {
727                                $signatures=array();
728                                foreach($this->page_blocks as $key => $value)
729                                {
730                                        $signatures[]="<!--site-$key-->";
731                                }
732                                $res=str_replace($signatures,$this->page_blocks,$this->tpl);
733                        }
734                        echo"$res";
735                }
736                $time = microtime(true) - $time_start;
737                if($time>=3)
738                        $this->logger("Exec time: $time",1);
739        }
740
741        /// Записать сообщение об ошибке в журнал и опционально вывести на страницу
742        /// @param s Основной текст сообщения
743        /// @param silent Если TRUE, то сообщение не выводится на страницу. FALSE по умолчанию.
744        /// @param hidden_data Скрытый текст сообщения об ошибке. Заносится в журнал, на страницу не выводится.
745        function logger($s, $silent=0, $hidden_data='')
746        {
747                $ip=getenv("REMOTE_ADDR");
748                $ag=getenv("HTTP_USER_AGENT");
749                $rf=getenv("HTTP_REFERER");
750                $ff=$_SERVER['REQUEST_URI'];
751                $uid=@$_SESSION['uid'];
752                $s=mysql_real_escape_string($s);
753                $hidden_data=mysql_real_escape_string($hidden_data);
754                $ag=mysql_real_escape_string($ag);
755                $rf=mysql_real_escape_string($rf);
756                $ff=mysql_real_escape_string($ff);
757                mysql_query("INSERT INTO `errorlog` (`page`,`referer`,`msg`,`date`,`ip`,`agent`, `uid`) VALUES
758                ('$ff','$rf','$s $hidden_data',NOW(),'$ip','$ag', '$uid')");
759
760                if(!$silent)
761                $this->msg("$s<br>Страница:$ff<br>Сообщение об ошибке передано администратору","err","Внутренняя ошибка!");
762        }
763};
764
765/// Класс-исключение используется для информирования о отсутствии привилегий на доступ к запрошенной функции
766class AccessException extends Exception
767{
768        function __construct($text='')
769        {
770                parent::__construct($text);
771        }
772};
773
774/// Класс-исключение используется для информирования о отсутствии запрашиваемого объекта. Устанавливает заголовок 404 Not found
775class NotFoundException extends Exception
776{
777        function __construct($text='')
778        {
779                header('HTTP/1.0 404 Not found');
780                parent::__construct($text);
781        }
782};
783
784/// Класс-исключение используется для информирования об ошибке при выполнении myqsl запроса
785class MysqlException extends Exception
786{
787        var $sql_error;
788        var $sql_errno;
789        function __construct($text)
790        {
791                $this->sql_error=mysql_error();
792                $this->sql_errno=mysql_errno();
793                switch($this->sql_errno)
794                {
795                        case 1062:      $text.=" {$this->sql_errno}:Дублирование - такая запись уже существует в базе данных. Исправьте данные, и попробуйте снова.";   break;
796                        case 1452:      $text.=" {$this->sql_errno}:Нарушение связи - введённые данные недопустимы, либо предпринята попытка удаления объекта, от которого зависят другие объекты. Проверьте правильность заполнения полей.";   break;
797                }
798                parent::__construct($text);
799                $this->WriteLog();
800        }
801
802        /// Записывает событие в журнал ошибок
803        function WriteLog()
804        {
805                $ip=getenv("REMOTE_ADDR");
806                $ag=getenv("HTTP_USER_AGENT");
807                $rf=getenv("HTTP_REFERER");
808                $qq=$_SERVER['QUERY_STRING'];
809                $ff=$_SERVER['PHP_SELF'];
810                $uid=@$_SESSION['uid'];
811                $s=mysql_real_escape_string($this->message);
812                $hidden_data=mysql_real_escape_string($this->sql_errno).": ".mysql_real_escape_string($this->sql_error);
813                $ag=mysql_real_escape_string($ag);
814                $rf=mysql_real_escape_string($rf);
815                $qq=mysql_real_escape_string($qq);
816                $ff=mysql_real_escape_string($ff);
817                @mysql_query("INSERT INTO `errorlog` (`page`,`referer`,`msg`,`date`,`ip`,`agent`, `uid`) VALUES
818                ('$ff $qq','$rf','$s $hidden_data',NOW(),'$ip','$ag', '$uid')");
819        }
820};
821
822global $tmpl;
823global $uid;
824global $mode;
825$tmpl=new BETemplate;
826
827/// Глобальная переменная должна быть заменена в местах использования на $_REQUEST['mode']
828if(isset($_REQUEST['mode']))    $mode=$_REQUEST['mode'];
829else                            $mode='';
830
831/// Нужно вычистить глобальную переменную UID везде
832if(isset($_SESSION['uid']))     $uid=$_SESSION['uid'];
833if($uid=='') $uid=0;
834
835/// Должно быть убрано, должно подключаться и создаваться по необходимости
836require_once("include/imgresizer.php");
837require_once("include/wikiparser.php");
838
839$wikiparser=new WikiParser();
840$wikiparser->reference_wiki     = "/wiki/";
841$wikiparser->reference_site     = @($_SERVER['HTTPS']?'https':'http')."://{$_SERVER['HTTP_HOST']}/";
842$wikiparser->image_uri          = "/share/var/wikiphoto/";
843$wikiparser->ignore_images      = false;
844
845$dop_status=array('new'=>'Новый', 'err'=>'Ошибочный', 'inproc'=>'В процессе', 'ready'=>'Готов', 'ok'=>'Отгружен');
846if(is_array(@$CONFIG['doc']['status_list']))    $CONFIG['doc']['status_list']=array_merge($dop_status, $CONFIG['doc']['status_list']);
847else                                            $CONFIG['doc']['status_list']=$dop_status;
848?>
Note: See TracBrowser for help on using the repository browser.