Автор Тема: www.hankrum.info  (Прочетена 12889 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

HanKrum

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 125
  • -Получени: 73
  • Публикации: 1005
  • Кибик
Re: www.hankrum.info
« Отговор #30 -: 15 Декември 2013, 18:08:10 »
Направих си един фреймуорк и пренаписах и предекорирах секциите на сайта ми.
С фреймуоркчето и темплейтната системка от видеоурока се пище страшно бързо и лесно.
Ето пример за Галерия с гоблени

темплейт
Код: HTML
  1. <!DOCTYPE html>
  2.     <head>
  3.         <!--Галерия с гоблени{{START}}-->
  4.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5.         <title>{{HOMETITLE}}</title>
  6.         <meta name="Author" content="hankrum.info">
  7.         <meta name="Description" content="{{DESCRIPTION}}">
  8.         <meta name="Keywords" content="{{KEYWORD}}">
  9.         <link rel="stylesheet" href="./view/css/index.css" type="text/css">
  10.         <script type="text/javascript" src="http://hankrum.info/jsLibs/jquery.js"></script>
  11.         <script type="text/javascript" src="http://hankrum.info/jsLibs/functions.js"></script>
  12.         <script type="text/javascript" src="./view/js/index.js"></script>
  13.     </head>
  14.     <body>
  15.         <header>
  16.             <div id="header">
  17.                 <div id="left_header"></div>
  18.                 <div id="center_header">
  19.                     <div class="border_center_header">
  20.                         <div class="smallMenuTop">
  21.                             {{SMALLMENU}}
  22.                         </div>
  23.                         <div id="title">
  24.                             <a href="./">{{HOMETITLE}}</a>
  25.                         </div>
  26.                     </div>
  27.                 </div>
  28.                 <div id="right_header"></div>
  29.             </div>
  30.         </header>
  31.         <div id="content">
  32.             <div class="nav">
  33.                 {{NAV}}
  34.             </div>
  35.             <div class="content">
  36.                 {{CONTENT}}
  37.             </div>
  38.         </div>
  39.         <div id="dolu">
  40.             {{SMALLMENU}}
  41.             <br />
  42.             <a href="http://hankrum.info">Powered by HanKrum © http://hankrum.info</a>
  43.         </div>
  44.         <div id="validator">
  45.             <span>
  46.                 <a href="http://jigsaw.w3.org/css-validator/check/referer?profile=css3">
  47.                     <img style="border:0;width:88px;height:31px"
  48.                         src="http://jigsaw.w3.org/css-validator/images/vcss"
  49.                         alt="Валиден CSS!">
  50.                 </a>
  51.             </span>
  52.             <span>
  53.                 <a href="http://validator.w3.org/check?uri=referer">
  54.                     <img style="border:0;width:88px;height:31px"
  55.                         src="http://hankrum.info/files/valid-html5.png"
  56.                         alt="Валиден HTML5!">
  57.                 </a>
  58.             </span>
  59.         </div>
  60.     </body>
  61. </html>

метод за заместване, ако е първа страница
Код: PHP
  1.  /**
  2. *
  3. * @param string $filename
  4. * @param bool $popylvane
  5. * @param array $etiket
  6. * @param array $sydyrjanie
  7. * @return string $content
  8. */
  9. public  function view($filename, $popylvane = false, $etiket = array(), $sydyrjanie = array()) {
  10.     $file = \fopen($filename, 'r');
  11.     $content = \fread($file, \filesize($filename));
  12.     if ($popylvane) {
  13.         for ($b = 0; $b < \count($etiket); $b++) {
  14.             $content = \str_replace('{{' . $etiket[$b] . '}}', $sydyrjanie[$b], $content);
  15.         }
  16.     }
  17.     \fclose($file);
  18.     return $content;
  19. }

метод за изпълнение на маркерите {{METHOD}} като методи
Код: PHP
  1. /**
  2.  *
  3.  * @param string $text_of_template
  4.  * @return string
  5.  */
  6. public static function pattern($text_of_template) {// {{...}}
  7.     self::$count_pattern = \preg_match_all('/(\{\{(.+[A-Z])\}\})/', $text_of_template, $arr);
  8.     self::$pattern = \array_map('strtolower', $arr[2]);
  9.     return $arr[2];
  10. }
  11.  
  12. /**
  13.  *
  14.  * @return array
  15.  */
  16. public static function replace() {// Замества {{...}} с метод
  17.     foreach (self::$pattern as $k => $v) {
  18.         $replace[] = self::$v();
  19.     }
  20.     return $replace;
  21. }

и индекс файла изглежда така:
Код: PHP
  1. <?php
  2.  
  3. include_once 'run.php';
  4. $ob = \Model\App::getInstance();
  5. $ob->run();
  6. $page = $ob->getSession()->page = $ob->_input()->get('p', 'int');
  7. echo \Here\Lib_::view_index($page);

ето и метода content извикан от маркера {{CONTENT}} в темплейта:
Код: PHP
  1. /**
  2.  *
  3.  * @return string
  4.  */
  5. public static function content() {
  6.     $br = 0;
  7.     if (self::getSession()->page == 0) {
  8.         foreach (self::$kategoriq as $v) {
  9.             $br++;
  10.             $html .= self::view('./view/html/page/tab.html', true,
  11.                     array('LINK', 'ALT', 'PIC',
  12.                              'TEXT', 'RND'),
  13.                     array('./?p=' . $v['kat_id'], $v['kat_ime'], './files/' . $v['kat_dir'] . '.jpg',
  14.                         $v['kat_ime'], \rand(0, 3)));
  15.             if ($br % 4 == 0) {
  16.                 $html .= '<br>';
  17.             }
  18.         }
  19.     } else {
  20.         $res = self::bd()->prepare('SELECT kat_dir, kat_ime, kat_id FROM kategoriq WHERE kat_id=?')
  21.                 ->execute(array(self::getSession()->page))->fetchAllAssoc();
  22.         for ($a = 0; $a < \count(self::scandir('./files/' . $res[0]['kat_dir'] . '/')); $a++) {
  23.             $html .= self::view('./view/html/page/tab_.html', true,
  24.                     array('ALT', 'ID', 'PIC',
  25.                              'TEXT', 'RND'),
  26.                     array($res[0]['kat_ime'], $res[0]['kat_id'], './files/' . $res[0]['kat_dir'] . '/' . $a .'.jpg',
  27.                              $res[0]['kat_ime'] . '&nbsp;' . $a, \rand(0, 3)));
  28.             if (($a+1) % 4 == 0) {
  29.                 $html .= '<br>';
  30.             }
  31.         }
  32.     }
  33.     return $html . '<div id="back_to_top">Върни се горе!</div>';
  34. }
« Последна редакция: 15 Декември 2013, 18:30:52 от HanKrum »
"Силата на правителството се крепи на невежеството на народа, и те знаят това и винаги ще се борят против просвещението." Лев Толстой

HD

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 208
  • -Получени: 165
  • Публикации: 3077
Re: www.hankrum.info
« Отговор #31 -: 15 Декември 2013, 19:17:23 »
Браво Хане! А валидационния клас как си го реализирал ако не е тайна, че аз се боря с един в момента и все не ми харесва как се получава.

HanKrum

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 125
  • -Получени: 73
  • Публикации: 1005
  • Кибик
Re: www.hankrum.info
« Отговор #32 -: 15 Декември 2013, 21:09:13 »
Както Иван показва в MVC сериите:
функция за нормализиране:

Код: PHP
  1.     public static function normalize($data, $types) { // Нормализиране на данни
  2.         $types = \explode('|', $types);
  3.         if (\is_array($types)) {
  4.             foreach ($types as $v) {
  5.                 if ($v == 'int') {
  6.                     $data = (int) $data;
  7.                 }
  8.                 if ($v == 'float') {
  9.                     $data = (float) $data;
  10.                 }
  11.                 if ($v == 'double') {
  12.                     $data = (double) $data;
  13.                 }
  14.                 if ($v == 'bool') {
  15.                     $data = (bool) $data;
  16.                 }
  17.                 if ($v == 'str') {
  18.                     $data = (string) $data;
  19.                 }
  20.                 if ($v == 'trim') {
  21.                     $data = \trim($data);
  22.                 }
  23.                 if ($v == 'xss') {
  24.                     $data = self::xss_clean($data);
  25.                 }
  26.                 if ($v == 'html') {
  27.                     $data = \htmlspecialchars($data);
  28.                 }
  29.                 if ($v == 'stripslash') {
  30.                     $data = \stripcslashes($data);
  31.                 }
  32.                 if ($v == 'addslash') {
  33.                     $data = \addslashes($data);
  34.                 }
  35.             }
  36.         }
  37.         return $data;
  38.     }

и класа за валидиране:
Код: PHP
  1. <?php
  2.  
  3. namespace Model;
  4.  
  5. class Validation {
  6.  
  7.     private $_rules = array();
  8.     private $_errors = array();
  9.  
  10.     public function setRule($rule, $value, $params = null, $name = null) {
  11.         $this->_rules[] = array('val' => $value, 'rule' => $rule, 'par' => $params, 'name' => $name);
  12.         return $this;
  13.     }
  14.  
  15.     public function validate() {
  16.         $this->_errors = array();
  17.         if (count($this->_rules) > 0) {
  18.             foreach ($this->_rules as $v) {
  19.                 if (!$this->$v['rule']($v['val'], $v['par'])) {
  20.                     if ($v['name']) {
  21.                         $this->_errors[] = $v['name'];
  22.                     } else {
  23.                         $this->_errors[] = $v['rule'];
  24.                     }
  25.                 }
  26.             }
  27.         }
  28.         return (bool) !count($this->_errors);
  29.     }
  30.  
  31.     public function getErrors() {
  32.         return $this->_errors;
  33.     }
  34.  
  35.     public function __call($a, $b) {
  36.         //TODO
  37.         throw new \Exception('Invalid validation rule', 500);
  38.     }
  39.  
  40.     public static function required($val) {
  41.         if (\is_array($val)) {
  42.             return !empty($val);
  43.         } else {
  44.             return $val != '';
  45.         }
  46.     }
  47.  
  48.     public static function matches($val1, $val2) {
  49.         return $val1 == $val2;
  50.     }
  51.  
  52.     public static function matchesStrict($val1, $val2) {
  53.         return $val1 === $val2;
  54.     }
  55.  
  56.     public static function different($val1, $val2) {
  57.         return $val1 != $val2;
  58.     }
  59.  
  60.     public static function differentStrict($val1, $val2) {
  61.         return $val1 !== $val2;
  62.     }
  63.  
  64.     public static function minlenght($val, $param) {
  65.         return (\mb_strlen($val) >= $param);
  66.     }
  67.  
  68.     public static function maxlenght($val, $param) {
  69.         return (\mb_strlen($val) <= $param);
  70.     }
  71.  
  72.     public static function exaclenght($val, $param) {
  73.         return (\mb_strlen($val) == $param);
  74.     }
  75.  
  76.     public static function big($val1, $val2) {
  77.         return $val1 > $val2;
  78.     }
  79.  
  80.     public static function litle($val1, $val2) {
  81.         return $val1 < $val2;
  82.     }
  83.  
  84.     public static function letter($val) {
  85.         return (bool) \preg_match('/^([a-z])+$/i/', $val);
  86.     }
  87.  
  88.     public static function letternum($val) {
  89.         return (bool) \preg_match('/^([a-z0-9])+$/i/', $val);
  90.     }
  91.  
  92.     public static function letternumdash($val) {
  93.         return (bool) \preg_match('/^([a-z0-9_-])+$/i/', $val);
  94.     }
  95.  
  96.     public static function num($val) {
  97.         return \is_numeric($val);
  98.     }
  99.  
  100.     public static function emaill($val) {
  101.         return \filter_var($val, FILTER_VALIDATE_EMAIL) !== false;
  102.     }
  103.  
  104.     public static function emaills($val) {
  105.         if (\is_array($val)) {
  106.             foreach ($val as $v) {
  107.                 if (!self::emaill($v)) {
  108.                     return false;
  109.                 }
  110.             }
  111.         } else {
  112.             return false;
  113.         }
  114.         return true;
  115.     }
  116.  
  117.     public static function url($val) {
  118.         return \filter_var($val, FILTER_VALIDATE_URL) !== false;
  119.     }
  120.  
  121.     public static function ip($val) {
  122.         return \filter_var($val, FILTER_VALIDATE_IP) !== false;
  123.     }
  124.  
  125.     public static function regexp($val1, $val2) {
  126.         return (bool) \preg_match($val1, $val2);
  127.     }
  128.  
  129.     public static function custom($val1, $val2) {
  130.         if ($val2 instanceof \Closure) {
  131.             return (boolean) \call_user_func($val2, $val1);
  132.         } else {
  133.             throw new \Exception('Invalid validation function', 500);
  134.         }
  135.     }
  136.  
  137. }


п.п. и за xss:
Код: PHP
  1. /**
  2.      * Code is taken from https://gist.github.com/1098477
  3.      * @param type $data
  4.      * @return string
  5.      */
  6.     public static function xss_clean($data) {
  7.  
  8.         // Fix &entity\n;
  9.         $data = \str_replace(array('&amp;', '&lt;', '&gt;'), array('&amp;amp;', '&amp;lt;', '&amp;gt;'), $data);
  10.         $data = \preg_replace('/(&#38;#*\w+)[\x00-\x20]+;/u', '$1;', $data);
  11.         $data = \preg_replace('/(&#38;#x*[0-9A-F]+);*/iu', '$1;', $data);
  12.         $data = \html_entity_decode($data, ENT_COMPAT, 'UTF-8');
  13.         // Remove any attribute starting with "on" or xmlns
  14.         $data = \preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu', '$1>', $data);
  15.         // Remove javascript: and vbscript: protocols
  16.         $data = \preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $data);
  17.         $data = \preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data);
  18.         $data = \preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data);
  19.         // Only works in IE: <span style="width: expression(alert('Ping!'));"></span>
  20.         $data = \preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
  21.         $data = \preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
  22.         $data = \preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data);
  23.         // Remove namespaced elements (we do not need them)
  24.         $data = \preg_replace('#</*\w+:\w[^>]*+>#i', '', $data);
  25.         do {
  26.             // Remove really unwanted tags
  27.             $old_data = $data;
  28.             $data = \preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data);
  29.         } while ($old_data !== $data);
  30.         // we are done...
  31.         return $data;
  32.     }
"Силата на правителството се крепи на невежеството на народа, и те знаят това и винаги ще се борят против просвещението." Лев Толстой

HD

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 208
  • -Получени: 165
  • Публикации: 3077
Re: www.hankrum.info
« Отговор #33 -: 16 Декември 2013, 08:45:36 »
Аз съм реализирал нещо подобно, но при мен по-скоро беше проблем да го измисля кое как да стане.  Взимам няколко идеи от твоя ако може  :)
И като сме още на темата вместо тази голяма функция за предпазване от xss, не може ли да се използва filter_var и като параметър да му дадеш информацията, която иска да валидираме и като филтър  FILTER_SANITIZE_STRING
« Последна редакция: 16 Декември 2013, 09:13:23 от HD »

HanKrum

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 125
  • -Получени: 73
  • Публикации: 1005
  • Кибик
Re: www.hankrum.info
« Отговор #34 -: 16 Декември 2013, 12:53:47 »
Ползвай, но това е идея на Иван и аз я ползвам ;)

"Силата на правителството се крепи на невежеството на народа, и те знаят това и винаги ще се борят против просвещението." Лев Толстой