master
Pavel Belyaev 4 years ago
parent 175948447b
commit eac6c5ec5d

@ -0,0 +1,53 @@
<?php
class LE_PHONE
{
public static function prepare($inp)
{
$inp = str_replace(";", ",",Preg_replace(".[^0-9,;].", "", $inp));
if (count($arr = explode(',',$inp))>1) $inp=$arr;
if (is_array($inp))
{
for ($i=0;$i<count($inp);$i++) $inp[$i]=self::format($inp[$i]);
return implode(', ', $inp);
}
else
return self::format($inp);
}
public static function clear($num)
{
$num = str_replace(";", ",",Preg_replace(".[^0-9,;].", "", $num));
$arr = explode(',',$num);
$cnt = count($arr);
//print_r($arr);
if ($cnt>1)
{
for ($i=0;$i<$cnt;$i++) $arr[$i] = self::mobile_prepare($arr[$i]); return implode(',',$arr);
}
return self::mobile_prepare($num);
}
public static function mobile_prepare($num)
{
return preg_replace('/^[+]{0,1}[78]{0,1}9/','89',$num);
}
public static function format($num)
{
$num = self::mobile_prepare($num);
$n=strlen($num = Preg_replace(".[^0-9].", "", $num));
if ($n==6) return preg_replace("/([0-9]{2})([0-9]{2})([0-9]{2})/", "$1-$2-$3", $num);
if ($n==7) return preg_replace("/([0-9]{3})([0-9]{2})([0-9]{2})/", "$1-$2-$3", $num);
if ($n==10) return preg_replace("/([0-9]{3})([0-9]{3})([0-9]{2})([0-9]{2})/", "($1)$2-$3-$4", $num);
if ($n==11) return preg_replace("/([0-9])([0-9]{3})([0-9]{3})([0-9]{2})([0-9]{2})/", "$1($2)$3-$4-$5", $num);
return $num;
}
}

@ -0,0 +1,6 @@
<?php
class LE_TBL
{
}

@ -0,0 +1,117 @@
<?php
/*
Mail v3.1
*/
if(!defined("I")) die;
//статический класс для отправки уведомлений
class LE_MAIL
{
//отправка текстового письма Mail::send("электронный@адрес", "адрес отправителя", "текст письма", "тема_письма")
public static function send($address,$sender,$mail_body,$subject)
{
$headers="";
$text ='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional //EN">
<html><head>
<META http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>';
$text.=$mail_body;
$text.='</body></html>';
$text=iconv('UTF-8', 'windows-1251//TRANSLIT', $text);
$subject=iconv('UTF-8', 'windows-1251//TRANSLIT', $subject);
$subject = '=?windows-1251?B?'.base64_encode($subject).'?=';
$headers .= "MIME-Version: 1.0\n";
$headers .="Content-Type: text/html; charset=windows-1251 \n";
$headers .= "From: ".$sender."\r\n";
mail($address, $subject, $text, $headers);
}
//отправка письма с вложением Mail::send("электронный@адрес", "адрес отправителя", "тема письма", "текст письма", "путь до файла", "имя файла(отображаемое в письме)")
public static function send_file($address, $sender, $subject, $text, $path, $filename)
{
$text=iconv('UTF-8', 'windows-1251//TRANSLIT', $text);
$subject=iconv('UTF-8', 'windows-1251//TRANSLIT', $subject);
$subject = '=?windows-1251?B?'.base64_encode($subject).'?=';
$fp = fopen($path,"r"); if (!$fp) {print "Файл $path не может быть прочитан"; exit();}
$file = fread($fp, filesize($path)); fclose($fp);
$boundary = "--".md5(uniqid(time())); // генерируем разделитель
$headers .= "MIME-Version: 1.0\n";
$headers .="Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
$headers .= "From: ".$sender."\r\n";
$multipart .= "--$boundary\n";
$multipart .= "Content-Type: text/html; charset=windows-1251\n";
$multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n";
$multipart .= "$text\n\n";
$message_part = "--$boundary\n";
$message_part .= "Content-Type: application/octet-stream\n";
$message_part .= "Content-Transfer-Encoding: base64\n";
$message_part .= "Content-Disposition: attachment; filename = \"".$filename."\"\n\n";
$message_part .= chunk_split(base64_encode($file))."\n";
$multipart .= $message_part."--$boundary--\n";
if(!mail($address, $subject, $multipart, $headers)) {echo "К сожалению, письмо не отправлено"; exit();}
}
public function gen_message($mailfrom,$mailto,$body,$subject,$file=false)
{
$separator = md5(time());
$filename = 'myfile';
$path = 'your path goes here';
$file = $path . "/" . $filename;
$mailto = 'mail@mail.com';
$subject = 'Subject';
$message = 'My message';
$content = file_get_contents($file);
$content = chunk_split(base64_encode($content));
// a random hash will be necessary to send mixed content
// carriage return type (RFC)
$eol = "\r\n";
// main header (multipart mandatory)
$headers = "From: name <test@test.com>" . $eol;
$headers .= "MIME-Version: 1.0" . $eol;
$headers .= "Content-Type: multipart/mixed; boundary=\"" . $separator . "\"" . $eol;
$headers .= "Content-Transfer-Encoding: 7bit" . $eol;
$headers .= "This is a MIME encoded message." . $eol;
// message
$body = "--" . $separator . $eol;
$body .= "Content-Type: text/plain; charset=\"iso-8859-1\"" . $eol;
$body .= "Content-Transfer-Encoding: 8bit" . $eol;
$body .= $message . $eol;
// attachment
$body .= "--" . $separator . $eol;
$body .= "Content-Type: application/octet-stream; name=\"" . $filename . "\"" . $eol;
$body .= "Content-Transfer-Encoding: base64" . $eol;
$body .= "Content-Disposition: attachment" . $eol;
$body .= $content . $eol;
$body .= "--" . $separator . "--";
//SEND Mail
if (mail($mailto, $subject, $body, $headers)) {
echo "mail send ... OK"; // or use booleans here
} else {
echo "mail send ... ERROR!";
print_r( error_get_last() );
}
}
}

@ -0,0 +1,51 @@
<?
/**
* TEST BETA, need refactoring
*/
class LE_RABBITMQ
{
protected $connection,$channel,$exchange;
function __construct($inp=[])
{
if (!isset($inp['host'])) $inp['host']='127.0.0.1';
$this->connection = $this->connect($inp['host'],$inp['login'],$inp['pass']);
$this->channel = new AMQPChannel($this->connection);
$this->exchange = new AMQPExchange($this->channel);
}
function connect($host,$login,$pass)
{
$connection = new AMQPConnection();
$connection->setHost($host);
$connection->setLogin($login);
$connection->setPassword($pass);
$connection->connect();
return $connection;
}
function get_q($q)
{
$queue = new AMQPQueue($this->channel);
$queue->setName($q);
$queue->setFlags(AMQP_NOPARAM);
$queue->declareQueue();
return $queue;
}
function send_message($m,$q)
{
$qu = $this->get_q($q);
$this->exchange->publish($m, $q);
}
function get_message($q,&$f)
{
$this->get_q($q)->consume($f);
}
}

@ -0,0 +1,212 @@
<?
/**
*
*/
class MP_VK
{
public $web,$api_v,$client_id,$secure_key,$service_key,$token;
public $group_key = "";
public $group_id = "";
public $admin_id = "";
function __construct($i=[])
{
if (isset($i['web'])) $this->web = &$i['web'];
$this->api_v = arr_v($i,'api_v','5.92');
$this->client_id = arr_v($i,'client_id','0');
$this->secure_key = arr_v($i,'secure_key','0');
$this->service_key = arr_v($i,'service_key','0');
}
public function getf_act($cont)
{
return $this->web->reg_find($cont,'<[^>]+action="([^"]+)"',1);
}
public function url2token($url)
{
$url = str_replace('https://oauth.vk.com/blank.html#', '', $url);
parse_str($url, $out);
if (!isset($out['access_token'])) return false;
return $out['access_token'];
}
public function web_auth($login,$pass)
{
$ref = $inp['url'] = "https://m.vk.com";
$html = $this->web->get_cont($inp);
$inp['url'] = $this->getf_act($html);
$inp['ref'] = $ref;
$inp['post'] = ['email'=>$login,'pass'=>$pass];
return true;
}
//тут еще надо доработать на примере ботинка...
public function oauth()
{
$url = 'https://oauth.vk.com/authorize?client_id='.$this->client_id;
$url.='&display=mobile&redirect_uri=https://oauth.vk.com/blank.html';
//https://vk.com/dev/permissions
$url.='&scope='.(2+4+8+16+64+256+1024+8192+65536+262144+524288+1048576);
$url.='&response_type=token&v='.$this->api_v;
$inp['url'] = $url;
//return;
$inp['get_redirect'] =1;
$html = $this->web->get_cont($inp);
echo $html.BR.BR;
//если уже есть доступ
if ($this->web->redirect)
{
$inp['url'] = $this->web->redirect;
$html = $this->web->get_cont($inp);
return $this->url2token($this->web->redirect);
}
//этот момент еще недоработан///
$inp['url'] = $html;
$html = $this->web->get_cont($inp);
var_dump($html); echo BR.BR; return;
$inp['post'] = 1;
//echo $html.BR.BR;
$inp['url'] = $this->getf_act($html);
return;
echo $inp['url'].BR;
$inp['ref'] = $url;
$res = $this->web->get_cont($inp);
var_dump($res);
return true;
}
public function query($method,$data=[],$access_token=1)
{
$inp['url'] = "https://api.vk.com/method/".$method;
if ($access_token) $data['access_token'] = $this->token;
$data['v'] = $this->api_v;
$inp['post'] = $data;
$res = $this->web->get_cont($inp);
$res = json_decode($res,1);
if(isset($res['error']))
{
print_r($res['error']);
return false;
}
print_r($res);
return $res['response'];
}
public function long_pool_init()
{
$par = ['group_id'=>$this->group_id,'access_token'=>$this->group_key];
$c = $this->query("groups.getLongPollServer",$par);
$url = $c['server']."?act=a_check&key=".$c['key'].'&wait=25';
return [$c,$url];
}
public function long_pool(&$f=false,$timeout=0)
{
if ($f===false) $f = function($i){return false;};
list ($c,$url) = $this->long_pool_init();
while ($r=$this->web->get_cont($url.'&ts='.$c['ts']))
{
set_time_limit(0);
$_r = $r; //debug
$r = json_decode($r,1);
if (isset($r['failed']))
{
switch ($r['failed'])
{
case '1':
$c['ts'] = $r['ts'];
break;
case '2':
case '3':
list ($c,$url) = $this->long_pool_init();
echo BR.BR."UPDATE KEY".BR.BR;
break;
}
continue;
}
if (!isset($r['ts']))
{
echo "response hzhz".BR;
var_dump($_r);
echo "try again...".BR.BR;
sleep(3);
continue;
}
$c['ts'] = $r['ts'];
if (is_array($r['updates']) && count($r['updates']))
$f($r['updates']);
}
echo "ERROR GET URL, timeout: ".$timeout.BR;
sleep($timeout);
$timeout+=1;
$timeout*=2;
return $this->long_pool($f,$timeout);
}
public function bot_message($user_id,$message)
{
$data=[];
if (is_string($message))
$data['message'] = $message;
elseif (is_array($message))
$data = $message;
$data['random_id'] = rand(0,99999);
$data['peer_id'] = $this->group_id;
$data['access_token']=$this->group_key;
$data['user_id'] = $user_id;
$this->query("messages.send",$data,0);
}
}

@ -0,0 +1,49 @@
<?php
class YA_CL
{
public $iam,$folder,$token,$web;
public $tts_lang="ru-RU",$tts_speed="1.12",$tts_voice="filipp",$tts_emo="neutral";
// read more on
// https://cloud.yandex.ru/docs/iam/operations/iam-token/create
public function get_iam()
{
$inp['url'] = "https://iam.api.cloud.yandex.net/iam/v1/tokens";
$inp['raw'] = '{"yandexPassportOauthToken":"'.$this->token.'"}';
$res = $this->web->get_cont($inp);
$res = json_decode($res,1);
//print_r($res);
$this->iam = $res['iamToken'];
return $this->iam;
}
public function speech($text,$file="./out.ogg",$p=[])
{
$post = [];
$post['lang'] = arr_v($p,'lang',$this->tts_lang);
$post['speed'] = arr_v($p,'speed',$this->tts_speed);
$post['voice'] = arr_v($p,'voice',$this->tts_voice);
$post['emotion'] = arr_v($p,'emo',$this->tts_emo);
$post['format'] = arr_v($p,'format','oggopus');
$post['folderId']=$this->folder;
$post['text'] = $text;
$inp['url'] = "https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize";
$inp['post'] = $post;
$inp['headers'] = ['Authorization: Bearer '.$this->iam];
$res = $this->web->get_cont($inp);
file_put_contents($file, $res);
chmod($file, 0777);
}
}

@ -0,0 +1,2 @@
<?php
LE::$TPL->mod_cont .= LE::$TPL->fetch('test/main');

@ -0,0 +1,2 @@
<?php
LE::$ALC->set_lev(4);

@ -1 +1,12 @@
Добро пожаловать в новый мир!!!
<?php
//LE::$ALC->logout();
LE::$ALC->set_lev(4);
//тут будет контроллер
LE::$TPL->mod_cont .= "<h1>Добро пожаловать в секретный раздел</h1>";
LE::$TPL->mod_cont .= "kokoko2222";
LE::$TPL->display();

@ -0,0 +1,198 @@
body {
font-family: sans-serif;
margin: 0;
padding: 0;
}
h2 {
font-size: 15px;
}
a {
color: #666;
}
a:hover {
text-decoration: none;
color: #000;
}
/*navi*/
div.mp_navi {
background: #f1f1f1;
overflow: visible;
color: #444;
border-bottom: 1px solid #e7e7e7;
font-size: 16px;
min-height: 50px;
width: 100%;
box-sizing: border-box;
}
div.mp_navi a {
color: inherit;
text-decoration: none;
}
ul.mp_menu {
display: table;
}
ul.mp_menu,
ul.mp_menu ul {
list-style-type: none;
margin: 0;
padding: 0;
}
.mp_navi span.logo a,
ul.mp_menu li a {
line-height: 50px
}
.mp_navi span.logo {
display: block;
float: left;
padding: 0 10px;
background: #4caf50;
border-right: 1px solid #d0d0d0;
}
.mp_navi span.logo a {
color: #fff;
font-size: 18px;
}
ul.mp_menu.vertical>li {
float: left;
}
ul.mp_menu li a {
float: left;
padding: 0 15px;
}
ul.mp_menu li a:hover,
ul.mp_menu li.dropdown:hover>a {
background: #ddd;
}
ul.mp_menu li a.active {
background: #4caf50;
color: #fff;
}
/*dropdown*/
.dropdown {
position: relative;
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #f9f9f9;
width: auto;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
padding: 12px 16px;
z-index: 1;
top: 100%;
min-width: 250px;
}
.dropdown a i.i-down:before {
position: relative;
top: 3px;
font-size: 20px;
margin-right: 0;
}
ul.dropdown-content {
overflow: hidden;
}
ul.mp_menu ul.dropdown-content li,
ul.mp_menu ul.dropdown-content li a {
width: 100%;
display: block;
font-size: 15px;
white-space: nowrap;
clear: both;
}
.dropdown:hover .dropdown-content {
display: block;
}
/*footer*/
.mp_footer {
border-top: 1px solid #eee;
padding: 20px 15px;
font-size: 14px;
line-height: 18px;
clear: both;
text-align: center;
}
/*content*/
div#content {
min-height: 200px;
clear: both;
margin: 5px 20px;
}
/*
@media only screen and (max-width: 600px) {
.mpcol {
width: 100%;
}
.mpcol>div.inner {
margin: 5px;
}
}
*/
:focus,
:selected {
outline: none !important;
}
/*table*/
.tbl {
width: 100%;
border-collapse: collapse;
}
.tbl td,
.tbl th {
border: 1px solid #d9d9d9;
padding: 0.8em;
text-align: left;
}
.tbl tbody tr:nth-of-type(2n+1) {
background-color: #f8f8f8;
}
.tbl caption {
text-align: left;
font-size: 120%;
padding: 0.8em 0.1em;
font-weight: bold;
}
.tbl tr:hover td {
border-color: #bbb;
background-color: #f6fff6;
}

@ -0,0 +1 @@
body{font-family:sans-serif;margin:0;padding:0}h2{font-size:15px}a{color:#666}a:hover{text-decoration:none;color:#000}div.mp_navi{background:#f1f1f1;overflow:visible;color:#444;border-bottom:1px solid #e7e7e7;font-size:16px;min-height:50px;width:100%;box-sizing:border-box}div.mp_navi a{color:inherit;text-decoration:none}ul.mp_menu{display:table}ul.mp_menu,ul.mp_menu ul{list-style-type:none;margin:0;padding:0}.mp_navi span.logo a,ul.mp_menu li a{line-height:50px}.mp_navi span.logo{display:block;float:left;padding:0 10px;background:#4caf50;border-right:1px solid #d0d0d0}.mp_navi span.logo a{color:#fff;font-size:18px}ul.mp_menu.vertical>li{float:left}ul.mp_menu li a{float:left;padding:0 15px}ul.mp_menu li a:hover,ul.mp_menu li.dropdown:hover>a{background:#ddd}ul.mp_menu li a.active{background:#4caf50;color:#fff}.dropdown{position:relative;display:inline-block}.dropdown-content{display:none;position:absolute;background-color:#f9f9f9;width:auto;box-shadow:0 8px 16px 0 rgba(0,0,0,.2);padding:12px 16px;z-index:1;top:100%;min-width:250px}.dropdown a i.i-down:before{position:relative;top:3px;font-size:20px;margin-right:0}ul.dropdown-content{overflow:hidden}ul.mp_menu ul.dropdown-content li,ul.mp_menu ul.dropdown-content li a{width:100%;display:block;font-size:15px;white-space:nowrap;clear:both}.dropdown:hover .dropdown-content{display:block}.mp_footer{border-top:1px solid #eee;padding:20px 15px;font-size:14px;line-height:18px;clear:both;text-align:center}div#content{min-height:200px;clear:both;margin:5px 20px}:focus,:selected{outline:0!important}.tbl{width:100%;border-collapse:collapse}.tbl td,.tbl th{border:1px solid #d9d9d9;padding:.8em;text-align:left}.tbl tbody tr:nth-of-type(2n+1){background-color:#f8f8f8}.tbl caption{text-align:left;font-size:120%;padding:.8em .1em;font-weight:700}.tbl tr:hover td{border-color:#bbb;background-color:#f6fff6}

@ -0,0 +1,22 @@
[class^="lei_"],
svg {
width: 1.2em;
height: 1.2em;
fill: currentColor;
vertical-align: -0.2em;
}
.lei_r {
margin-right: -0.35em;
margin-left: .2em;
}
.lei_l {
margin-left: -0.35em;
margin-right: .2em;
}
.lei_c {
margin-left: -0.3em;
margin-right: -0.3em;
}

@ -0,0 +1 @@
[class^=lei_],svg{width:1.2em;height:1.2em;fill:currentColor;vertical-align:-.2em}.lei_r{margin-right:-.35em;margin-left:.2em}.lei_l{margin-left:-.35em;margin-right:.2em}.lei_c{margin-left:-.3em;margin-right:-.3em}

@ -1,44 +1,44 @@
/*sys*/
body {
font-family: sans-serif;
font-family: sans-serif;
}
/*reset form*/
input, select, button, textarea {
border:1px solid #b8b8b8;
border-radius: 0;
input,
select,
textarea {
border: 1px solid #b8b8b8;
border-radius: 0;
-webkit-border-radius: 0px;
border-radius:0;
padding:1px 5px;
border-radius: 0;
padding: 1px 5px;
height: 40px;
box-sizing: border-box;
font-family: inherit;
font-size:16px;
font-size: 16px;
}
textarea {
min-height: 200px;
padding:8px 8px;
padding: 8px 8px;
}
select {
-webkit-appearance: none;
-moz-appearance: none;
padding-right: 20px;
background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2224%22%20height%3D%2216%22%20viewBox%3D%220%200%2024%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23666%22%20points%3D%2212%201%209%206%2015%206%22%20%2F%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23666%22%20points%3D%2212%2013%209%208%2015%208%22%20%2F%3E%0A%3C%2Fsvg%3E%0A")
,
linear-gradient(to bottom, #ffffff 0%,#ffffff 100%);
background-repeat: no-repeat;
/*background-position: 100% 50%;*/
background-size: 30px auto, 100%;
background-position: right -5px top 50%, 0 0;
-webkit-appearance: none;
-moz-appearance: none;
padding-right: 20px;
background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2224%22%20height%3D%2216%22%20viewBox%3D%220%200%2024%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23666%22%20points%3D%2212%201%209%206%2015%206%22%20%2F%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23666%22%20points%3D%2212%2013%209%208%2015%208%22%20%2F%3E%0A%3C%2Fsvg%3E%0A"), linear-gradient(to bottom, #ffffff 0%, #ffffff 100%);
background-repeat: no-repeat;
/*background-position: 100% 50%;*/
background-size: 30px auto, 100%;
background-position: right -5px top 50%, 0 0;
}
input[type=radio], input[type=checkbox]
{
input[type=radio],
input[type=checkbox] {
display: inline-block;
height: 16px;
width: 16px;
@ -53,7 +53,7 @@ input[type=radio], input[type=checkbox]
border: 1px solid #ccc;
transition: .2s ease-in-out;
transition-property: all;
transition-property: background-color,border;
transition-property: background-color, border;
margin-right: 4px;
}
@ -63,10 +63,10 @@ input[type=radio] {
}
input[type=radio]:checked {
background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Ccircle%20fill%3D%22%23fff%22%20cx%3D%228%22%20cy%3D%228%22%20r%3D%222%22%20%2F%3E%0A%3C%2Fsvg%3E");
background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Ccircle%20fill%3D%22%23fff%22%20cx%3D%228%22%20cy%3D%228%22%20r%3D%222%22%20%2F%3E%0A%3C%2Fsvg%3E");
background-color: #1e87f0;
border-color: transparent;
background-size: 30px auto;
background-size: 30px auto;
}
input[type=checkbox]:checked {
@ -75,24 +75,24 @@ input[type=checkbox]:checked {
border-color: transparent;
}
input:focus:not([type="checkbox"]):not([type="radio"]), select:focus, textarea:focus {
input:focus:not([type="checkbox"]):not([type="radio"]),
select:focus,
textarea:focus {
outline: none;
border-color:#70aae4;
border-color: #70aae4;
box-shadow: inset 0 0 3px -2px #117de9;
}
/*form blocks style*/
.le_form {
display: block;
overflow: hidden;
margin: 10px 0;
padding:25px;
color:#555;
}
padding: 25px;
color: #555;
}
.le_form_head {
display: block;
@ -100,40 +100,35 @@ input:focus:not([type="checkbox"]):not([type="radio"]), select:focus, textarea:f
padding-bottom: 10px;
border-bottom: 1px solid #d9d9d9;
margin-bottom: 20px;
}
.le_shadow {
box-shadow: 0 2px 10px rgba(94, 94, 94, 0.08);
border:1px solid #ececec;
border: 1px solid #ececec;
}
.le_he .le_inp {
margin-left:300px;
margin-left: 300px;
}
.le_fl {
font-size: 14px;
font-size: 14px;
}
.le_he .le_fl {
width:290px;
float:left;
display: flex;
width: 290px;
float: left;
display: flex;
align-items: center;
min-height: 40px;
}
.le_he, .le_ve {
margin-bottom: 25px;
overflow: hidden;
border-bottom: 1px solid #e9e9e9;
padding-bottom: 25px;
.le_he,
.le_ve {
margin-bottom: 25px;
overflow: hidden;
border-bottom: 1px solid #e9e9e9;
padding-bottom: 25px;
}
.le_ve .le_fl {
@ -143,80 +138,131 @@ padding-bottom: 25px;
.le_inp input:not([type="checkbox"]):not([type="radio"]),
.le_inp select,
.le_inp textarea
{
.le_inp textarea {
max-width: 100%;
width:100%;
width: 100%;
}
/*le multi elements*/
.le_me label{
display: block;
padding-top:8px;
.le_me label {
display: block;
padding-top: 8px;
}
/*Multi Element Horizontal*/
.le_meh label{
float:left;
margin-right:10px;
}
.le_meh label {
float: left;
margin-right: 10px;
}
.le_he {
display:flex;
flex-wrap: wrap;
display: flex;
flex-wrap: wrap;
}
.le_he .le_fl {
min-width: 200px;
flex:40%;
flex-grow: 1;
min-width: 200px;
flex: 40%;
flex-grow: 1;
}
.le_he .le_inp {
margin-left:0;
flex-grow: 1; /*растягиваться на свободное пространство*/
min-width: 200px;
flex:60%;
margin-left: 0;
flex-grow: 1;
/*растягиваться на свободное пространство*/
min-width: 200px;
flex: 60%;
}
.le_fl sup {
color:red;
font-size: 17px;
font-weight: bold;
padding-left: 2px;
color: red;
font-size: 17px;
font-weight: bold;
padding-left: 2px;
}
/*buttons*/
[class^="le_btn"] {
cursor: pointer;
display: inline-block;
font-weight: 400;
text-align: center;
white-space: nowrap;
vertical-align: middle;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
padding: .375rem .75rem;
font-size: 1rem;
line-height: 1.5;
transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
margin: 2px 1px;
border-radius: 2px;
border-style: solid;
border-width: 1px;
color: #fff;
}
.le_btn {
display: inline-block;
font-weight: 400;
text-align: center;
white-space: nowrap;
vertical-align: middle;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
border: 1px solid #c9c9c9;
background-color: #f9f9f9;
border-color: #c9c9c9;
color: #444;
}
.le_btn:hover {
background: #f3f3f3;
border-color: #b5b5b5;
}
padding: .375rem .75rem;
font-size: 1rem;
line-height: 1.5;
transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;
background-color: #f9f9f9;
background: linear-gradient(to bottom, #f9f9f9,#f9f9f9);
.le_btn_gr {
background-color: #449d44;
border-color: #398439;
}
.le_btn:hover {
background: linear-gradient(to bottom, #f9f9f9,#f3f3f3);
border-color:#b5b5b5;
.le_btn_gr:hover {
background-color: #0a8f0a;
border-color: #229322;
}
.le_btn_bl {
background-color: #337ab7;
border-color: #2e6da4;
}
.le_btn_bl:hover {
background-color: #286090;
border-color: #204d74;
}
.le_btn_rd {
background-color: #d9534f;
border-color: #d43f3a;
}
.le_btn_rd:hover {
background-color: #c9302c;
border-color: #ac2925;
}
/*color-bl*/
._green {
color: #3c763d;
background-color: #dff0d8;
border-color: #d6e9c6;
}
/*гамбургеры и крестики*/
#nav-icon6 {
width: 60px;
height: 45px;
@ -225,6 +271,7 @@ background: linear-gradient(to bottom, #f9f9f9,#f9f9f9);
margin: 48px auto 12px auto;
cursor: pointer;
}
#nav-icon6 span {
height: 9px;
width: 60px;
@ -232,8 +279,9 @@ background: linear-gradient(to bottom, #f9f9f9,#f9f9f9);
border-radius: 20px;
position: absolute;
transition-duration: .25s;
transition-delay: .25s;
transition-delay: .25s;
}
#nav-icon6 span:before {
left: 0;
position: absolute;
@ -246,6 +294,7 @@ background: linear-gradient(to bottom, #f9f9f9,#f9f9f9);
transition-duration: .25s;
transition: transform .25s, top .25s .25s;
}
#nav-icon6 span:after {
left: 0;
position: absolute;
@ -258,16 +307,19 @@ background: linear-gradient(to bottom, #f9f9f9,#f9f9f9);
transition-duration: .25s;
transition: transform .25s, top .25s .25s;
}
#nav-icon6.open span {
transition-duration: 0.1s;
transition-delay: .25s;
background: transparent;
}
#nav-icon6.open span:before {
transition: top .25s, transform .25s .25s;
top: 0px;
transform: rotateZ(-45deg);
}
#nav-icon6.open span:after {
transition: top 0.4s, transform .25s .25s;
top: 0px;

File diff suppressed because one or more lines are too long

@ -86,52 +86,46 @@ SYSCONF::$MOD_ALIASES['admin'] = [
```nginx
#project1.loc
server {
listen 80;
default_type text/html;
server_name project1.loc;
root /www/projects/project1/web;
location ~* ^/pub/(.+\.(?:gif|jpe?g|png|js|css|woff|ttf|svg|eot|html|htm|txt))$
{
alias /www/kernel/PUB/$1;
access_log off;
expires 10d;
}
index index.php;
location ~* ^.+\.(txt|jpe?g|gif|png|ico|css|txt|bmp|rtf|js|svg|eot|ttf|woff|html?)$
{
access_log off;
add_header Cache-Control "public, max-age=31536000, immutable";
}
listen 80;
default_type text/html;
server_name project1.loc;
root /www/projects/project1/web;
location ~* ^/pub/(.+\.(?:gif|jpe?g|png|js|css|woff|ttf|svg|eot|html|htm|txt))$
{
alias /www/kernel/PUB/$1;
access_log off;
expires 10d;
}
index index.php;
location ~* ^.+\.(txt|jpe?g|gif|png|ico|css|txt|bmp|rtf|js|svg|eot|ttf|woff|html?)$
{
access_log off;
add_header Cache-Control "public, max-age=31536000, immutable";
}
#все запросы направить на index.php
location / {
rewrite ^/(.*)$ /index.php;
}
#все запросы направить на index.php
location / {
rewrite ^/(.*)$ /index.php;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
```
## ToDo
* add class **LE_SQLITE** - иногда нужно делать мини-приложения типа домашней бухгалтерии
* add class **LE_CALENDAR** - простейшие операции с датами, удобно для формирования всяких графиков платежей, например для кредитных калькуляторов
* add class **LE_FORMGEN** - генератор типовых формочек с заполнением полей данными из БД, удобно для быстрого клепания редакторов в админке
* add class **LE_XML**, **LE_CSV** - чтение и генерация форматов для экспорта/импорта
* внедрить сторонние библиотеки для работы с xls, xlsx (SimpleXLS, SimpleXLSX, PHPSpreadsheet, etc...)
* слепить простейший UIKIT, должен состоять как из CSS, так и из JS и бэкендные функции на PHP для генерации всяких модальных окон, нужно еще переопределить всякие алерты и конфирмы на свои, чтобы все вписывалось в интерфейс
> Весь процесс разработки логируется на [YouTube в виде видеоуроков](https://www.youtube.com/watch?v=hEfP0tYnmd4&list=PL0WBDVO8h9xcHuyw19JnOVjbxS-p6X3VF)
> Весь процесс разработки логируется на [YouTube в виде видеоуроков](https://www.youtube.com/watch?v=hEfP0tYnmd4&list=PL0WBDVO8h9xcHuyw19JnOVjbxS-p6X3VF), но пока нет времени, так что следите за гитхабом.

@ -1,4 +1,4 @@
<!--тут будет шапка и меню...-->
<div class="page_cont" style="max-width:1000px; margin:20px auto;">
<div class="page_cont">
<?=$tpl->mod_cont;?>
</div>

@ -2,6 +2,25 @@
$st_cnf = &LE::$TPL->static_list;
$st_dep = &LE::$TPL->static_dep;
$st_cnf[] = [
// 'mod'=>'default',
'pos'=>'top',
'type'=>'css',
'link'=>'/pub/css/icons.css'];
$st_cnf[] = [
// 'mod'=>'default',
'pos'=>'top',
'type'=>'css',
'link'=>'/pub/css/le_form.css'];
$st_cnf[] = [
// 'mod'=>'default',
'pos'=>'top',
'type'=>'css',
'link'=>'/pub/css/admin_interface.css'];
$st_cnf[] = [
'mod'=>'highlight.js',
'pos'=>'top',

@ -0,0 +1,55 @@
<div style="display:none;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<symbol id="ico_edit" viewBox="0 0 24 24">
<path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM21.41 6.34l-3.75-3.75-2.53 2.54 3.75 3.75 2.53-2.54z"/>
</symbol>
<symbol id="ico_download" viewBox="0 0 24 24">
<path d="M19,9h-4V3H9v6H5l7,7L19,9z M5,18v2h14v-2H5z"/>
</symbol>
<symbol id="ico_upload" viewBox="0 0 24 24">
<path d="M5,10h4v6h6v-6h4l-7-7L5,10z M5,18v2h14v-2H5z"/>
</symbol>
<symbol id="ico_trash" viewBox="0 0 24 24">
<path d="M6 21h12V7H6v14zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"/>
</symbol>
<symbol id="ico_plus" viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11h-4v4h-2v-4H7v-2h4V7h2v4h4v2z"/>
</symbol>
<symbol id="ico_trash2" viewBox="0 0 24 24">
<path d="M6 21h12V7H6v14zM8 9h8v10H8V9zm7.5-5l-1-1h-5l-1 1H5v2h14V4h-3.5z"/>
</symbol>
<symbol id="ico_dropdown" viewBox="0 0 24 24">
<path d="M7 10l5 5 5-5H7z"/>
</symbol>
<symbol id="ico_dropup" viewBox="0 0 24 24">
<path d="M7 14l5-5 5 5z"/>
</symbol>
<symbol id="ico_copy" viewBox="0 0 24 24">
<path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/>
</symbol>
<symbol id="ico_acc" viewBox="0 0 24 24">
<circle cx="10" cy="8" r="4"/><path d="M10.67,13.02C10.45,13.01,10.23,13,10,13c-2.42,0-4.68,0.67-6.61,1.82C2.51,15.34,2,16.32,2,17.35V20h9.26 C10.47,18.87,10,17.49,10,16C10,14.93,10.25,13.93,10.67,13.02z"/><path d="M20.75,16c0-0.22-0.03-0.42-0.06-0.63l1.14-1.01l-1-1.73l-1.45,0.49c-0.32-0.27-0.68-0.48-1.08-0.63L18,11h-2l-0.3,1.49 c-0.4,0.15-0.76,0.36-1.08,0.63l-1.45-0.49l-1,1.73l1.14,1.01c-0.03,0.21-0.06,0.41-0.06,0.63s0.03,0.42,0.06,0.63l-1.14,1.01 l1,1.73l1.45-0.49c0.32,0.27,0.68,0.48,1.08,0.63L16,21h2l0.3-1.49c0.4-0.15,0.76-0.36,1.08-0.63l1.45,0.49l1-1.73l-1.14-1.01 C20.72,16.42,20.75,16.22,20.75,16z M17,18c-1.1,0-2-0.9-2-2s0.9-2,2-2s2,0.9,2,2S18.1,18,17,18z"/>
</symbol>
<symbol id="ico_settings" viewBox="0 0 24 24">
<path d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z"/>
</symbol>
<symbol id="ico_items" viewBox="0 0 24 24">
<path d="M12 2l-5.5 9h11z"/><circle cx="17.5" cy="17.5" r="4.5"/><path d="M3 13.5h8v8H3z"/>
</symbol>
<symbol id="ico_post" viewBox="0 0 24 24">
<path d="M19 2h-4.18C14.4.84 13.3 0 12 0c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18H5V4h2v3h10V4h2v16z"/>
</symbol>
<symbol id="ico_book" viewBox="0 0 24 24">
<path d="M19 1l-5 5v11l5-4.5V1zM1 6v14.65c0 .25.25.5.5.5.1 0 .15-.05.25-.05C3.1 20.45 5.05 20 6.5 20c1.95 0 4.05.4 5.5 1.5V6c-1.45-1.1-3.55-1.5-5.5-1.5S2.45 4.9 1 6zm22 13.5V6c-.6-.45-1.25-.75-2-1v13.5c-1.1-.35-2.3-.5-3.5-.5-1.7 0-4.15.65-5.5 1.5v2c1.35-.85 3.8-1.5 5.5-1.5 1.65 0 3.35.3 4.75 1.05.1.05.15.05.25.05.25 0 .5-.25.5-.5v-1.1z"/>
</symbol>
<symbol id="ico_close" viewBox="0 0 24 24">
<path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
</symbol>
<symbol id="ico_menu" viewBox="0 0 24 24">
<path d="M0 0h24v24H0z" fill="none"/><path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/>
</symbol>
<symbol id="ico_list" viewBox="0 0 24 24">
<path d="M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z"/>
</symbol>
</svg>
</div>

@ -0,0 +1,248 @@
<?=LE::$TPL->fetch('svg_icons')?>
<?=LE::$TPL->fetch('test/top_menu')?>
<?php
function icon($id,$t="r")
{
return '<svg class="lei_'.$t.'"><use href="#ico_'.$id.'"></svg>';
}
?>
<div id="content">
<div style="max-width:1200px;margin: 40px auto;">
<h2>Кнопки</h2>
<button class="le_btn">Кнопка</button>
<button class="le_btn">Кнопка<?=icon('edit')?></button>
<button class="le_btn">Кнопка<?=icon('download')?></button>
<button class="le_btn">Кнопка<?=icon('upload')?></button>
<button class="le_btn">Кнопка<?=icon('dropdown')?></button>
<button class="le_btn">Кнопка<?=icon('dropup')?></button>
<button class="le_btn">Кнопка<?=icon('acc')?></button>
<button class="le_btn">Кнопка<?=icon('plus')?></button>
<button class="le_btn">Кнопка<?=icon('trash')?></button>
<button class="le_btn"><?=icon('trash','l')?>Кнопка</button>
<button class="le_btn"><?=icon('settings','c')?></button>
<br>
<button class="le_btn_gr">Зеленая<?=icon('trash')?></button>
<button class="le_btn_rd">Красная<?=icon('trash')?></button>
<button class="le_btn_bl">Синяя<?=icon('trash')?></button>
<span></span>
<h2>Иконки</h2>
<div class="icons" style="font-size:40px;">
<i><svg><use href="#ico_edit"></svg></i>
<i><svg><use href="#ico_download"></svg></i>
<i><svg><use href="#ico_upload"></svg></i>
<i><svg><use href="#ico_trash"></svg></i>
<i><svg><use href="#ico_plus"></svg></i>
<i><svg><use href="#ico_trash2"></svg></i>
<i><svg><use href="#ico_dropdown"></svg></i>
<i><svg><use href="#ico_dropup"></svg></i>
<i><svg><use href="#ico_copy"></svg></i>
<i><svg><use href="#ico_acc"></svg></i>
<i><svg><use href="#ico_settings"></svg></i>
<i><svg><use href="#ico_items"></svg></i>
<i><svg><use href="#ico_post"></svg></i>
<i><svg><use href="#ico_book"></svg></i>
<i><svg><use href="#ico_close"></svg></i>
<i><svg><use href="#ico_menu"></svg></i>
<i><svg><use href="#ico_list"></svg></i>
<style>
</style>
</div>
<table class="tbl">
<caption>CRUD-табличка</caption>
<tr><th style="width:80px">
<button class="le_btn"><?=icon('plus','c')?></button>
</th><th>Header1</th><th>Header2</th><th>Header3</th></tr>
<tr><td><button class="le_btn"><?=icon('edit','c')?></button><button class="le_btn_rd"><?=icon('trash','c')?></button></td><td>val1</td><td>val2</td><td>val3</td></tr>
<tr><td><button class="le_btn"><?=icon('edit','c')?></button><button class="le_btn_rd"><?=icon('trash','c')?></button></td><td>val1</td><td>val2</td><td>val3</td></tr>
<tr><td><button class="le_btn"><?=icon('edit','c')?></button><button class="le_btn_rd"><?=icon('trash','c')?></button></td><td>val1</td><td>val2</td><td>val3</td></tr>
<tr><td><button class="le_btn"><?=icon('edit','c')?></button><button class="le_btn_rd"><?=icon('trash','c')?></button></td><td>val1</td><td>val2</td><td>val3</td></tr>
<tr><td><button class="le_btn"><?=icon('edit','c')?></button><button class="le_btn_rd"><?=icon('trash','c')?></button></td><td>val1</td><td>val2</td><td>val3</td></tr>
<tr><td><button class="le_btn"><?=icon('edit','c')?></button><button class="le_btn_rd"><?=icon('trash','c')?></button></td><td>val1</td><td>val2</td><td>val3</td></tr>
</table>
<h2>Формочка</h2>
<form class="le_form le_shadow">
<span class="le_form_head">Заголовок формы</span>
<div class="le_he">
<label for="inp_name" class="le_fl"><span>Горизонтальный инпут</span></label>
<div class="le_inp"><input type="text" value="kokoko" id="inp_name"></div>
</div>
<div class="le_ve">
<label for="inp_name" class="le_fl"><span>Вертикальный инпут</span></label>
<div class="le_inp"><input type="text" value="kokoko" id="inp_name"></div>
</div>
<div class="le_he">
<label for="inp_name" class="le_fl"><span>Горизонтальный инпут у которого допустим пару строчек, строчки тут две <sup>*</sup></span></label>
<div class="le_inp"><input type="text" value="kokoko" id="inp_name"></div>
</div>
<div class="le_he">
<div for="select_koko" class="le_fl"><span>Горизонтальный селект</span></div>
<div class="le_inp">
<select id="select_koko">
<option>select</option>
<option>select</option>
<option>select</option>
<option>select</option>
<option>select</option>
</select>
</div>
</div>
<div class="le_he le_me">
<div for="inp_name" class="le_fl"><span>Радиокнопки</span></div>
<div class="le_inp">
<label><input type="radio" name="radio1">Radio1</label>
<label><input type="radio" name="radio1">Radio2</label>
</div>
</div>
<div class="le_ve le_me">
<div for="inp_name" class="le_fl"><span>Радиокнопки вертикально</span></div>
<div class="le_inp">
<label><input type="radio" name="radio1">Radio1</label>
<label><input type="radio" name="radio1">Radio2</label>
</div>
</div>
<div class="le_he le_me">
<div for="inp_name" class="le_fl"><span>Чекбоксы<sup>*</sup></span></div>
<div class="le_inp">
<label><input type="checkbox" name="checkbox1">checkbox1</label>
<label><input type="checkbox" name="checkbox1">checkbox2</label>
</div>
</div>
<div class="le_he le_me le_meh">
<div for="inp_name" class="le_fl"><span>Радиокнопки в линию</span></div>
<div class="le_inp">
<label><input type="radio" name="radio1">Radio1</label>
<label><input type="radio" name="radio1">Radio2</label>
</div>
</div>
<div class="le_he">
<label for="inp_name" class="le_fl"><span>Дата <sup>*</sup></span></label>
<div class="le_inp"><input type="date" value="kokoko" id="inp_name"></div>
</div>
<div class="le_ve">
<label for="inp_name" class="le_fl"><span>Текст</span></label>
<div class="le_inp"><textarea class="cktxt">тролололо</textarea></div>
</div>
<div class="le_he">
<label for="inp_name" class="le_fl"><span>Текст горизонтально</span></label>
<div class="le_inp"><textarea>тролололо</textarea></div>
</div>
<div class="le_ve">
<label for="inp_name" class="le_fl"><span>Текст</span></label>
<div class="le_inp"><textarea class="tu-editor">тролололо</textarea></div>
</div>
<div class="le_bbl">
<button class="le_btn" type="submit">Сохранить</button>
<button class="le_btn_bl" type="submit">Синяя</button>
<button class="le_btn_rd" type="submit">Красная</button>
<button class="le_btn_gr" type="submit">Зеленая</button>
</div>
</form>
<div class="modal">
<div class="modal_in">
<div class="mod_h">Готово</div>
<div class="mod_cont">kokoko</div>
<div class="mod_btn">
<button class="le_btn_rd" type="submit">Красная</button>
</div>
</div>
</div>
<style>
.modal {
display:none;
background: #fafafa;
background: transparent;
position: fixed;
top:0%;
left:0%;
width:100%;
height:100%;
}
.modal .modal_in {
box-sizing:border-box;
background: #fafafa;
border:1px solid #ccc;
width:350px;
max-width:95%;
min-width:200px;
margin: 20% auto;
padding:10px;
}
.modal .mod_h {
}
</style>
<h2>Алерты</h2>
<h2>Конфирмы</h2>
<h2>Модальные окошки</h2>
+
</div>
<div class="mp_footer ">
&copy; <a href="http://pavelb.ru/ ">LE Framework by Pavel Belyaev</a> | 2010-2021
</div>

@ -0,0 +1,59 @@
<div class="mp_navi">
<span class="logo">
<a href="/manager/">LeCMS v0.1</a>
</span>
<ul class="mp_menu vertical">
<li class="dropdown"><a href="#">Магазин <i class="lei-dropdown"></i></a>
<ul class="dropdown-content">
<li><a href="/manager/catalog">Каталог</a></li>
<li><a href="/manager/update">Полное обновление</a></li>
<li><a href="/manager/orders">Заказы</a></li>
<li><a href="/manager/currency">Валюты</a></li>
<li><a href="/manager/unit">Единицы измерения</a></li>
<li><a href="/manager/payment_types">Способы оплаты</a></li>
<li><a href="/manager/delivery_types">Способы доставки</a></li>
<li><a href="/manager/params_manage">Управление характеристиками</a></li>
<li><a href="/manager/params_tags_manage">Управление тегами</a></li>
<li><a href="/manager/gallery">Галлереи</a></li>
</ul>
</li>
<li class="dropdown"><a href="#">Сайт <i class="lei-dropdown"></i></a>
<ul class="dropdown-content">
<li><a href="/manager/users" class="i-man-woman">Пользователи</a></li>
<li><a href="/manager/cont_editor" class="i-libreoffice">Редактор контента</a></li>
<li><a href="/manager/pages" class="i-libreoffice">Страницы</a></li>
<li><a href="/manager/tasker" class="i-clipboard">Задачи</a></li>
<li><a href="/manager/slider_content" class="i-clipboard">Слайдер</a></li>
<li><a href="/manager/banners_editor" class="i-clipboard">Редактор баннеров</a></li>
<li><a href="/manager/manuf_editor" class="i-clipboard">Редактор брендов</a></li>
</ul>
</li>
<li><a href="/manager/mysklad" class="i-upload2">Выгрузка в МойСклад</a></li>
<li><a href="/manager/cont_editor" class="i-libreoffice">Редактор контента</a></li>
<li class="dropdown"><a class="i-magic"><i class="lei-dropdown"></i>Импортеры</a>
<ul class="dropdown-content">
<li><a href="/manager/segura_imp">Импорт Сегура</a></li>
<li><a href="/manager/kopttorg_imp">Импорт КоврОптТорг</a></li>
<li><a href="/manager/imp_moderate">Модерация импорта</a></li>
</ul>
</li>
<li class="right_menu">
<a href="/logout" class="i-exit"><span><i class="lei-logout"></i>Завершить сеанс</span></a>
<a href="/" target="_blank" class="i-home"><span>На сайт</span></a>
</li>
</ul>
</div>
Loading…
Cancel
Save