Drupal Forms APIред рднрд╛рдЧ 1 - рджреНрд░реБрдкрд╛рд▓ 6 рдХреЗ рд▓рд┐рдП

рдЫрд╡рд┐
рдпрд╣ рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдмрд╕реЗ рд╕рд░рд▓ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рдФрд░ FAPI ( Drupal Forms API ) "рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░" рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ, рд╣рдо Drupal рдлреЙрд░реНрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдореВрд▓ рдмрд╛рддреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ рдФрд░ рдПрдХ рдЫреЛрдЯрд╛ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВрдЧреЗ, рдЬреЛ AHAH рдирд╛рдордХ Drupal ajax рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдирд╛рдо рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдмрд╕ рдЗрд╕ рд╕рд░рд▓ рдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ FAPI рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рд▓реЗрдЦ рдХреНрдпреЛрдВ? рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ Habr├й рдкрд░, FAPI рдХреЗ рд╕рд╛рде рдореЙрдбреНрдпреВрд▓ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рдореЗрд░реЗ рд▓рд┐рдП рдЕрддреАрдд рдореЗрдВ рдпрд╣ рд╕рдордЭрдирд╛ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рдерд╛ рдХрд┐ рдлреЙрд░реНрдо рдХреИрд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ - рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ "рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░" рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред рдореИрдВ рдЕрддреАрдд рдореЗрдВ рдирд╣реАрдВ рд▓реМрдЯ рд╕рдХрддрд╛ - рд▓реЗрдХрд┐рди рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рд╕рдорд╛рди рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЖрд▓реЗрдЦ Drupal рдХреЗ 6.x рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЖрд▓реЗрдЦ рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг 7 рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рд╣реИ - рд▓реЗрдХрд┐рди рдПрдкреАрдЖрдИ рдореЗрдВ рдЕрдВрддрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд▓реЗрдЦ рдХреЗ рднрд╛рдЧ 2 рдореЗрдВ рдПрдкреАрдЖрдИ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 7 рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред



FAPI рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ?


рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдкреНрд░рдкрддреНрд░ рдХреЛ HTML рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╕ рдЗрд╕реЗ рдкреГрд╖реНрда рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЗрд╕реЗ рд╢рд╛рдорд┐рд▓ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк FAPI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд╛рдн рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ:
  1. рдкреНрд░рдкрддреНрд░ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛, Drupal рдХреА рдереАрдорд┐рдВрдЧ, рдЗрд╕рдХрд╛ AHAH рд╕рд┐рд╕реНрдЯрдо (AJAX, Drupal рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 7 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ)ред
  2. рдЯреА () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдХрд░ рдлреЙрд░реНрдо рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  3. рд╣реБрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдВрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдлреЙрд░реНрдо рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  4. рдФрд░, рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ, рдлреЙрд░реНрдо рдХреЛ рдбреНрд░реБрдкрд▓ рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреА рдереАрдо рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЕрдзрд┐рдХ "рдореВрд▓" рдмрдирд╛ рджреЗрдЧрд╛ред


рд╕рд░рд▓рддрдо рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВ


рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдлрд╛рд╕реНрдЯрдХрдиреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо рджреЗрдВред рдлрд╝реЛрд▓реНрдбрд░ / рд╕рд╛рдЗрдЯреНрд╕ / рд╕рднреА / рдореЙрдбреНрдпреВрд▓ / рдлрд╛рд╕реНрдЯрдХрдиреЗрдХреНрдЯ рдмрдирд╛рдПрдВ - рдпрд╣ рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд░реВрдЯ рдлрд╝реЛрд▓реНрдбрд░ рд╣реЛрдЧрд╛ред рдЗрд╕рдореЗрдВ, рджреЛ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдВ - fastcontact.info рдФрд░ fastcontact.module - рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред

Ininfo рдореЗрдВ - рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦреЗрдВ:

; ""   name = Fast Contact ;     description = Test module for learning FAPI ;   version = "6.x-1.0" ;     core = "6.x" ; ""   project = "fastcontact" ;     package = "Other" ;    datestamp = "1294001844" 


рдЕрдм, рд╣рдо рдлреЙрд░реНрдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдлрдПрдкреАрдЖрдИ рдлреЙрд░реНрдо рдХреЗ рдлрд╛рд░реНрдо рдФрд░ рддрддреНрд╡


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

рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдмреЙрдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рдлрд╝реЙрд░реНрдо рдмрдирд╛рдПрдВред

 function fc_form() { $form = array(); //   'name' $form['name'] = array( //   '#type' => 'textfield', //    '#description' => t(' '), //   '#size' => '25', ); //    'submit' $form['submit'] = array( //   Submit (  ) '#type' => 'submit', //    '#value' => 'Submit', //  AHAH (   6) '#ahah' => array( //   click (  JQuery) 'event' => 'click', // ,      'path' => 'fastcontact/js', //      'wrapper' => 'fc-form', //    ( JQuery) 'method' => 'append', //  JQuery    'effect' => 'fade', //   'progress' => array('type' => 'throbber'), ), ); return $form; } 


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдлреЙрд░реНрдо рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдмреЙрдХреНрд╕ рдФрд░ рдПрдХ рд╕рдмрдорд┐рдЯ рдмрдЯрди рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ Ajax (AHAH) рдкрд░ рдЪрд▓рддрд╛ рд╣реИред

рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ


рдЕрдм, рд╣рдореЗрдВ ANAN рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрд╣рд╛ рддрддреНрд╡ рдХреА рдкрде рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрде рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЬрд┐рд╕ рд░реВрдк рдореЗрдВ рд╣рдордиреЗ рдкрде 'рдлрд╛рд╕реНрдЯрдХрдиреЗрдХреНрдЯ / js' рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ)ред рдпрд╣ рд╣реБрдХ_рдореЗрдиреВ () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

Drupal рдореЗрдиреВ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рднреА рдХрд░рддрд╛ рд╣реИ рдЬрдм рдХреБрдЫ рднреА "рдореЗрдиреВ" рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдкрде рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдореЗрдиреВ рдЖрдЗрдЯрдо рдПрдХ рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред

 /** *  hook_menu() */ function fastcontact_menu() { //      $items['fastcontact/js'] = array ( // ,   ""  'page callback' => 'fastcontact_ajax', //      'access arguments' => array('access content'), //        'type' => MENU_CALLBACK, ); return $items; } 


рд╣рдордиреЗ рдореЗрдиреВ рдЖрдЗрдЯрдо рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ MENU_CALLBACK рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рд╕рд╛рдЗрдЯ рдореЗрдиреВ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рдмрд╛рдж рдЗрд╕ рдорд╛рд░реНрдЧ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд┐рдпрд╛ рдЬрд╛рдП (рдпрд╣ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ)ред

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

 /*   */ function fastcontact_ajax() { //     $_POST //         check_plain() $name=check_plain($_POST['name']); //              (  fc-form) $output = '   <i>'.$name.'</i>.'; //         drupal_json(array('status' => TRUE, 'data' => $output)); } 


рдкреНрд░рдкрддреНрд░ рдкреНрд░рджрд░реНрд╢рди


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

 /*   */ function render_fc_form() { //      $out = drupal_get_form('fc_form'); return $out; } 


рд╣рдо рд╣реБрдХ_рдмреНрд▓реЙрдХ () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдмреНрд▓реЙрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ - рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ рдПрдХ рдЗрдирдкреБрдЯ рдлрд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдмреНрд▓реЙрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ php рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлреЙрд░реНрдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  echo render_fc_form(); 


рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо


рдпрджрд┐ рдХреЛрдб рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╛рдХреНрдпрд╛рдВрд╢ "рдЖрдкрдиреЗ рдПрдХ рдирд╛рдо рджрд░реНрдЬ рдХрд┐рдпрд╛ рд╣реИ ..." рдЗрдирдкреБрдЯ рдлрд╝реЙрд░реНрдо рдХреЗ рддрд╣рдд рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЬрд╣рд╛рдВ ellipsis рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдирд╛рдо рд╣реЛрдЧрд╛, рдкреГрд╖реНрда рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдмрд┐рдирд╛ред

Source: https://habr.com/ru/post/In111264/


All Articles