PHPLego: Do-it-рдЦреБрдж рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкреНрд▓рдЧрдЗрдиреНрд╕





рд╕реБрдкреНрд░рднрд╛рдд, рдкреНрд░рд┐рдп рдЧреГрд╣ рдкрд╛рдардХреЛрдВ!



рдХреНрдпрд╛ рдЖрдк рдХрднреА рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╡рд┐рдиреАрдд рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдФрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдерд╛ред рддрд╛рдХрд┐ рдПрдХ рдмрд╛рд░ рдХрд┐рд╕реА рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдЦрд┐рдд рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдирдХреА рд╕рдВрд░рдЪрдирд╛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдкрд░ рдлрд┐рд░ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред



рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдПрдХ рдорд╛рдореВрд▓реА рдорд╛рдЗрдХреНрд░реЛрдмрд╛рдЗрдХ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рд╕рд╛рдЗрдЯ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдХрдард┐рди рд╡реНрдпрд╡рд╕рд╛рдп рдореЗрдВ рдореЗрд░реА рдорджрдж рдХрд░рддрд╛ рд╣реИред



рдЖрдкрдХреЗ рд╕рд╛рде рд╣рдорд╛рд░рд╛ рдкрд╣рд▓рд╛ рдкрд░рд┐рдЪрд┐рдд рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдирд┐рдХрд▓рд╛, рдФрд░ рдореИрдВ рдЖрдкрдХреА рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж рджреЗрддрд╛ рд╣реВрдВред рдореИрдВ рдЙрд╕реА рдирд╕ рдореЗрдВ рдЬрд╛рд░реА рд░рд╣рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВред



рдЗрд╕рд▓рд┐рдП, рдЕрдкрдиреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛:



1) рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЪреАрдЬреЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП - рдЯреЗрдореНрдкреНрд▓реЗрдЯ, рдореЙрдбрд▓ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХред рддрд╛рдХрд┐ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдирдпрд╛ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдирдпрд╛ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред

2) рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ - рдпрд╣ рд╡рд╣ рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рди рдХреЗрд╡рд▓ рдореЗрд░реА рд╕рд╛рдЗрдЯ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдореЗрд░реЗ рд╕рднреА рджреЛрд╕реНрддреЛрдВ рдФрд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рд╕рднреА рд╕рд╛рдЗрдЯреЛрдВ рдкрд░ рднреА рдмрд┐рдирд╛ рдХрд┐рд╕реА рдлрд╛рдЗрд▓ рдХреЗ рдбрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

3) рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдпрд╛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИред

4) рдПрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛рдиреА рдиреЗрд╕реНрдЯреЗрдб рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

5) рдореЙрдбреНрдпреВрд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдЕрдВрджрд░ рд▓рд┐рдВрдХ (рдПрдХ href = ...) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рднрд▓реЗ рд╣реА рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдХрд┐рддрдирд╛ рдЧрд╣рд░рд╛ рд╣реЛред рдЕрдЧрд░ рд╣рдо рдПрдХ рдореВрд▓ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯреНрд╕ рдХреЛ рдХреЙрд░реНрди рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

6) рд╕рд╛рдЗрдЯ рдЦреБрдж рднреА рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдПред рдХрд┐рд╕реА рдорд┐рддреНрд░ рд╕реЗ рдХрд╛рд░реНрдп рд╕реНрдерд▓ рдЦрд░реАрджрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрд╕реЗ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦреЗрдВ рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкреГрд╖реНрда рдкрд░ рд╕рднреА рдХреЛ рдПрдореНрдмреЗрдб рдХрд░реЗрдВред



рдЦреИрд░, рдПрдХ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЪрд▓реЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЗрдВред





рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕реНрдХреЗрдЪ рдХрд░реЗрдВ:

/nome/user/www/ |---[.myengine] //    | |---[classes] //   | |---autoload.php //    ,     | `---README.TXT //      |---[classes] //   | |---[articles] //   | | |---[m] //   | | | `---article.class.php //   ( : articles_m_article) | | |---[view] //   CSS   | | | |---[css] //    | | | | `---style.css //    | | | |---article_list.tpl //    | | | `---one_article.tpl //     | | `---controller.class.php //    ( : articles_controller) | |---[comments] //   | |---[fotos] //   | |---[site] //    ( ) | `---[users] //   |---.setup.php //   (  ,    ..) `---index.php //    
      
      







рдореЙрдбреНрдпреВрд▓ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк



рд╕рд┐рд╕реНрдЯрдо рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рд╛рдЗрдЯ рдХреЗ рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рди рдкрд░ рдЬрд╣рд╛рдВ рд╣рдо рдЙрди рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рд╛рдЗрд▓, рдХреБрдЫ рдСрдЯреЛрд▓реИрдб.php рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рд╣рдо рдореЙрдбреНрдпреВрд▓ рдлреЛрд▓реНрдбрд░ рдХреЛ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдпреЛрдЧреНрдп (рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреНрд▓реЛрдмрд▓ рд╡реИрд░рд┐рдПрдмрд▓) рдпрд╛ рдЙрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд░рд╛рд╕реНрддрд╛ рдмрдирд╛рдПрдВрдЧреЗ, рдЗрд╕реЗ рдХрдИ рд░рд╛рд╕реНрддреЗ рд╣реЛрдиреЗ рджреЗрдВрдЧреЗред рдЦреИрд░, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЙрдбреНрдпреВрд▓ рдХреЗ рджреЛ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП - рдПрдХ рдирд┐рдЬреА, рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд▓рд┐рдП, рдФрд░ рджреВрд╕рд░рд╛ рд╕рд╛рдЭрд╛ - рд╕рд╛рдореВрд╣рд┐рдХ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдПред



рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рд╣реИ / .myengine/classes - рдпреЗ рд╣рдорд╛рд░реЗ рдЗрдВрдЬрди рдХреЗ рдореЙрдбреНрдпреВрд▓ рд╣реИрдВ, рдХреБрдЫ рдореЙрдбреНрдпреВрд▓ рдЬреЛ рд╣рдо рдЕрдкрдиреА рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдП / рдХрдХреНрд╖рд╛рдПрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рд╣реИред



рддреЛ, autoload.php рдлрд╝рд╛рдЗрд▓ рд╕реНрд╡рдпрдВ :

 <?php //    PHP,    ,    new SomeClass() function __autoload($class_name){ $class_folder = 'classes'; //      //   //       $class_folder.      $class_paths[] = dirname($_SERVER['SCRIPT_FILENAME'])."/$class_folder/"; //   $class_paths[] = __DIR__."/classes/"; //     $CLASS_PATHS if(!empty($GLOBALS["CLASS_PATHS"])){ if(!is_array($GLOBALS["CLASS_PATHS"])) throw new Exception('$CLASS_PATHS must be array!'); $class_paths = array_merge($class_paths, $GLOBALS["CLASS_PATHS"]); } //   (      A_B_C) $slashed_class_name = str_replace("_", "/", $class_name); // A/B/C $short_path = substr($slashed_class_name, 0, strrpos($slashed_class_name, '/')); // A/B foreach($class_paths as $class_path){ //   A_B_C    /A/B/C.class.php $file_full_name = "{$class_path}/{$slashed_class_name}.class.php"; if(file_exists($file_full_name)){ require_once($file_full_name); return; } //   A_B_C    /A/B/C/A_B_C.class.php //     -      (     ) $file_full_name = "{$class_path}/{$slashed_class_name}/{$class_name}.class.php"; if(file_exists($file_full_name)){ require_once($file_full_name); return; } } } ?>
      
      







рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдлрд╛рдЗрд▓ рдкрд░ рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред рдпрд╣рд╛рдВ рд╣рдордиреЗ рд╡реИрд╢реНрд╡рд┐рдХ $ CLASS_PATHS рд╕рд░рдгреА рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдкрде рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдмрдирд╛рдИред рдСрдЯреЛрд▓реЙрдб рдЗрд╕ рдХреНрд░рдо рдореЗрдВ рдореЙрдбрд▓ рдкрдереЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрдХреНрд░ рдХрд░реЗрдЧрд╛:

1) рдкрд╣рд▓реА рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рджреЗрдЦреЗрдВ

2) рдпрджрд┐ рдирд╣реАрдВ рдорд┐рд▓рд╛, рддреЛ рдЗрдВрдЬрди рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рджреЗрдЦреЗрдВ

2) рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓рд╛, рддреЛ рдпрд╣ $ CLASS_PATHS рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рд╕рднреА рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░реЗрдЧрд╛ред



рдореИрдВ $ CLASS_PATHS рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ - рдЖрдЦрд┐рд░рдХрд╛рд░, рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд╣рд░ рдХреЙрд▓ рд╕рдордп рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЫреЛрдЯрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреАред



рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд .setup.php рдмрдирд╛рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред рдЗрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдЯ рдкрд░, рд╕рд╛рде рд╣реА рдЙрди рд╕рднреА рд╕рдмрдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдореЗрдВ рдмрдирд╛рдПрдВ рдЬрд╣рд╛рдБ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ PHP рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд░реВрдЯ .setup.php рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдлрд╝рд╛рдЗрд▓ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧреА:



 <?php include __DIR__.'.myengine/autoload.php'; //    //     ,      ?>
      
      







рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рдмрдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рднреА .setup.php рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╢реАрд░реНрд╖-рд╕реНрддрд░ .setup.php рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛:



 <?php //  .setup.php  : include __DIR__.'/../.setup.php'; ?>
      
      







рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рд╣реЛрддреА рд╣реИ:



 <?php include '.setup.php'; // --         //   ,   $m = new SomeModule(); $m->run(); echo $m->getOutput(); ?>
      
      







рдФрд░ рдлрд┐рд░, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ (рдЬреЛ рдХрд┐рд╕реА рднреА рд░рдЪрдирд╛рддреНрдордХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЕрдирд┐рд╡рд╛рд░реНрдпрддрд╛ рд╣реИ), рд╣рдореЗрдВ рд╕рдорд╛рд╡реЗрд╢ рдХреЗ рдорд╛рд░реНрдЧ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдм рдХреБрдЫ рддреБрд░рдВрдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред



рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕рд╣рд┐рдд, рд╡рд┐рджреНрдпреБрдд рдЯреЗрдк рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ gluing рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рд╣реИ, рдЕрдЧрд░ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрдВ рдФрд░ рд╡реЗ рдЬрдЯрд┐рд▓ рд╣реИрдВ - рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрд╕реЗ рдкрд╛рд╕реНрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд▓реЗрдЯ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рджреВрд╕рд░реЗ рдХреЛ рдЦреАрдВрдЪрддреА рд╣реИ, рдФрд░ рддреАрд╕рд░рд╛ рдПрдХ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдмрд╣рд┐рд╖реНрдХрд░рдг рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓рд┐рдпрд╛ - рдореЙрдбреНрдпреВрд▓ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдХреБрдЫ рднреА рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ - рд╡реЗ рдЦреБрдж рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдФрд░ PHP рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕рдорд╛рд╡реЗрд╢ рд╣реЛрддрд╛ рд╣реИ - ".setup.php" рд╢рд╛рдорд┐рд▓ рд╣реИрдВред



рдиреЛрдЯ: рдХреБрдЫ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╛рдЗрд▓реЗрдВ 'рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВред' (рдбреЙрдЯреНрд╕) рддрд╛рдХрд┐ рдирд╛рдо рд╕реЗ рдЫрд╛рдВрдЯрдиреЗ рдкрд░ рд╡реЗ рд╢реАрд░реНрд╖ рдкрд░ рд╣реЛрдВ




рдореЙрдбреНрдпреВрд▓ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд░реНрдЧ



рдореЙрдбреНрдпреВрд▓ рдХрдХреНрд╖рд╛рдПрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд▓реЗрдЧреЛ рдирд┐рдпрдВрддреНрд░рдХ рд╣реИрдВред рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдирд┐рдпрдВрддреНрд░рдХ рдирд┐рд╣рд┐рдд рд╣реИ, рдФрд░ рдЗрд╕ рдкрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ, рдЬрд╛рд╡рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╕реАрдПрд╕рдПрд╕ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред



 abstract class Lego{ .................. //     http://habrahabr.ru/company/microset/blog/109481/ abstract public function getDir(); //  ,       //     (.. ,     ) public function getWebDir(){ $viewdir = str_replace('\\', '/', $this->getViewDir()); //  ,     //, !      DOCUMENT_ROOT: return str_ireplace($_SERVER['DOCUMENT_ROOT'], '', $viewdir).'/'.$dirname; } //    -,    public function getJavascripts(){ $js = array(); $h = @opendir($this->getDir()."/js"); while($file = @readdir($h)) if(preg_match("/(\.js|\.js\.php)$/i", $file)) $js[] = $this->getWebDir()."/js/".$file; return $js; } //    ,    public function getStylesheets(){ $css = array(); $h = @opendir($this->getDir()."/view/css"); while($file = @readdir($h)) if(preg_match("/(\.css|\.css\.php)$/i", $file)) $css[] = $this->getWebDir()."/view/css/".$file; return $css; } //  ,    ,        public function getHeaderBlock(){ $csses = $this->getStylesheets(); $jses = $this->getJavascripts(); $ret = ""; foreach($csses as $one) $ret .= "\n<link rel='stylesheet' href='{$one}' type='text/css' media='screen' />\n"; foreach($jses as $one) $ret .= "\n<script type='text/javascript' src='{$one}'></script>\n"; return $ret; } //    (   ,  ) public function fetch($template){ return Smarty::fetch($this->getDefaultDir().'/view/'.$template); } }
      
      







рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рд╕реНрдЯрд╛рдЗрд▓рд╢реАрдЯ, рдЬрд╛рд╡рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореЙрдбреНрдпреВрд▓ рдХреЛ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдирд╛рдо рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ: рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдЕрдВрджрд░ рд▓рд┐рдВрдХ рдХреИрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ? рд╕рдм рдХреЗ рдмрд╛рдж, рд╡реЗ рднреА рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕реНрдерд╛рди рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдЕрдирдЯрд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред



рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рд▓рд┐рдВрдХ



рдпрджрд┐ рд╣рдо рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдЧреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдбреНрд░реЗрд╕ рдмрд╛рд░ рдореЗрдВ рдЕрдкрдиреЗ рд╕рд░рдгреА рдЪрд░ рдХреЛ рдХрд┐рд░рд╛рдП рдкрд░ рд▓реЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдореЙрдбреНрдпреВрд▓ рдирд┐рдпрдВрддреНрд░рдХ рдХреА рдХреБрдЫ рд╡рд┐рдзрд┐ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡рд░реНрддрдорд╛рди рдкрддрд╛ рдмрд╛рд░ рдХреЛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИред рдПрдбреНрд░реЗрд╕ рдмрд╛рд░ рдХреЗ GET рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЖрд▓рд╕реА рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП UriConstrucor class рдмрдирд╛рдПрдВ:

 //       class UriConstructor{ public $arr; public function __construct($arr = false){ $this->arr = $arr ? $arr : $_GET; } //      (     ) public function put($key, $val){ $this->arr = array_replace_recursive($this->arr, array($key => $val)); return $this; } //      public function remove($key){ unset($this->arr[$key]); return $this; } //         public function clear(){ $this->arr = array(); return $this; } //         public function set($lego_name, $action /*....*/){ if(isset($this->arr[$lego_name]) && !is_array($this->arr[$lego_name])) unset($this->arr[$lego_name]); $this->arr[$lego_name]['act'] = $action; $params = func_get_args(); array_shift($params); array_shift($params); foreach($params as $key=>$one){ $this->arr[$lego_name][$action][$key] = $one; } return $this; } //    ,        public function setAct($action /*....*/){ $lego = Lego::current(); $params = array($lego->getName()); $params = array_merge($params, func_get_args()); return call_user_func_array( array($this, "set"), $params ); } //    get-,   (    ) public function url($path = false){ if(!$path) $path = $_SERVER['SCRIPT_NAME']; return $path.'?'.$this; } //      -    GET- public function __toString(){ return http_build_query($this->arr); } //      GET-   public function asArray(){ return $this->arr; } }
      
      







рдФрд░ рд▓реЗрдЧреЛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ, рд╣рдо рдХреБрдЫ рдФрд░ рддрд░реАрдХреЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:



 abstract class Lego{ .................. //    public function uri(){ return new UriConstructor(); } //  ,   ,         href //    action- ,    ,    public function actUri($action /* params */){ $params = func_get_args(); array_unshift($params, $this->getName()); return call_user_func_array( array($this->uri(), "set"), $params ); } }
      
      







рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд╣рдо рдЗрд╕ рддрд░рд╣ рд▓рд┐рдВрдХ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 <a href="{$lego->actUri('allfotos')->url()}"> </a>  ,  ,  : <a href="{$lego->actUri('showonefoto', $id)->url()}"> </a> //       : <a href="/index.php?.....__...&fotos[act]=showonefoto&fotos[0]=123">....</a>
      
      







рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рд▓реЗрдЧреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ $ рд▓реЗрдЧреЛ рд╡реЗрд░рд┐рдПрдмрд▓ рдЙрдкрд▓рдмреНрдз рд╣реЛред рдпрд╣ рд▓реЗрдЧреЛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рд░рди () рдкрджреНрдзрддрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 abstract class Lego{ .................. //    public function run(){ Smarty::assign("lego", $this); //   $lego -     ..... //    } }
      
      







рдЕрдм, рдЕрдм рд╣рдордиреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рднреА рдЦреЛрд▓ рджрд┐рдпрд╛ рд╣реИред рдореЙрдбреНрдпреВрд▓ рдпрд╣ рдЬрд╛рдирдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдХреМрди рд╕рд╛ рдореЙрдбреНрдпреВрд▓, рд╡реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдмреАрдЪ рдЖрд╕рд╛рдиреА рд╕реЗ рдЪрд▓-рдлрд┐рд░ рд╕рдХрддреЗ рд╣реИрдВред



рдмреЗрд╢рдХ, рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд░реНрдерд╣реАрди рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдбреЗрдЯрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред



рдпрд╣рд╛рдБ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:



 /*  ,   ,    $entity_id  $entity_name */ class fotos_controller extends Lego{ private $entity_id; private $entity_name; private $num_for_page = 5; //     ( ),     function __construct($name = false, $entity_id = 0, $entity_name = "User"){ parent::__construct($name); $this->entity_id = $entity_id; $this->entity_name = $entity_name; } //   ,       Lego. public function getDir(){ return __DIR__; } //   -    //   ,    function action_index(){ Database::query("select * from `fotos` where `entity_name`='{$this->entity_name}' and `entity_id`={$this->entity_id} and deleted = 0 order by created desc"); $fotos = Database::fetchObjects(); Output::assign("fotos", $fotos); return $this->fetch("allfotos.tpl"); } //        function action_mainbar(){ $offset = $this->_get($this->getName()."_offset", 0); Database::query("select * from `fotos` where `entity_name`='{$this->entity_name}' and `entity_id`={$this->entity_id} and deleted = 0 order by created desc limit {$offset}, ".($this->num_for_page+1)); $fotos = Database::fetchObjects(); Output::assign("fotos", $fotos); Output::assign("offset", $offset); Output::assign("num_for_page", $this->num_for_page); return $this->fetch("lego_fotos.tpl"); } //             function action_sidebar(){ return $this->action_mainbar(); } //     (   POST) function action_submit(){ $f = new tbl_fotos(); $f['entity_name'] = $this->entity_name; $f['entity_id'] = $this->entity_id; $f['user_id'] = User::getCurrentUser()->getId(); $f['text'] = $this->_post($this->getName()."_text"); $f['file_id'] = FotoStorage::putFromPost($this->getName()."_file"); if($f['file_id']) $f->insert(); $this->_goto($this->actUri("mainbar")->url()); //_goto -   header("Location: ... } //       function action_showone($foto_id){ $f = new tbl_fotos($foto_id); Output::assign("foto", $f); $ret = $this->fetch("showone.tpl"); // .    $c = new comments_controller("foto_comments", "tbl_fotos", $f->getId()); $c->run(); return $ret.$c->getOutput(); //    } //  "  " function action_set_as_main($foto_id){ Auth::authorize(); $f = new tbl_fotos($foto_id); $user = $f->getOwner(); $user['foto'] = $f['file_id']; $user->update(); $this->_goto($this->actUri("showone", $foto_id)->url()); } //  " " function action_delete($foto_id){ Auth::authorize(); $f = new tbl_fotos($foto_id); //FileStorage::delete($f['file_id']); if($f->isMain()){ $user = User::getCurrentUser(); $user['foto'] = ""; $user->update(); } $f['deleted'] = 1; $f->update(); $this->_goto($this->actUri("showone", $foto_id)->url()); } //  "  " function action_restore($foto_id){ Auth::authorize(); $f = new tbl_fotos($foto_id); $f['deleted'] = 0; $f->update(); $this->_goto($this->actUri("showone", $foto_id)->url()); } }
      
      







рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓, рд╕рд╛рдЗрдЯ рдХреЗ рд░реВрдЯ рдореЙрдбреНрдпреВрд▓ рд╕рд╣рд┐рдд, рдХреЛрдб рдХреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдореВрд▓ рдореЗрдВ index.php рд╣реИ:

 <?php include ".setup.php"; //    $lego = new site_controller(); //  -  $lego->run(); //   echo $lego->getOutput();// !      ?>
      
      







рдмрд╕ рдЗрддрдирд╛ рд╣реАред

рдХреИрд╕реЗ рд▓реЗрдЧреЛ-рдореЙрдбреНрдпреВрд▓ рдЬреАрд╡рди-рджреЗрдиреЗ рд╡рд╛рд▓реЗ AJAX рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП, рдЖрдк рдпрд╣рд╛рдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдВ AJAX рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ред



рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред

рд╕рднреА рд╕рдлрд▓ рд▓реЗрдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧред :)

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рд╣рдореЗрд╢рд╛ рддреБрдореНрд╣рд╛рд░рд╛, рдЬреЛрдЬрд╝рд┐рдХред



All Articles