KnpMenuBundle + рд╕реЛрдирд╛рдЯрд╛ред рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдПрдХ рдореЗрдиреВ рдмрдирд╛рдирд╛

рджрд┐рди рдХреЗ рд╕рднреА рд╕реБрдЦрдж рд╕рдордп, рдкреНрд░рд┐рдп Khabrovitesред рдореБрдЭреЗ рд╕рд┐рдореНрдлрдиреА рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИред рдореИрдВ рдЙрд╕реЗ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдЙрд╕реЗ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рд╕реЛрдирд╛рдЯрд╛рдЕрдорд┐рдирдорд┐рдирд▓ рднреА рдкрд╕рдВрдж рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдореЗрдВ рд╕реЗ рдХрдИ рд▓реЛрдЧ рднреА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдПрдХ рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЗрдиреВ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрдм KNPMenuBundle + SonataAdminBundle рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рднрд╛рдЧ рд▓реЗрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореЗрдиреВ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ рдФрд░ рдмрдВрдбрд▓ рдХреЗ рдЧреАрдердм рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рд╕реЗ рдкреНрд░рдмрдВрдзрдиреАрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдиреВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ? рдлрд┐рд░ рдореИрдВ рдмрд┐рд▓реНрд▓реА рдорд╛рдБрдЧрддрд╛ рд╣реВрдБред

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

рдХрдВрд╕реЛрд▓ рдЦреЛрд▓реЗрдВ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд▓рд┐рдЦреЗрдВ:
# рдПрдлрдкреА рдРрдк / рдХрдВрд╕реЛрд▓ рдЬрдирд░реЗрдЯ: рдмрдВрдбрд▓

рдЖрдк рдмрдВрдбрд▓ рдХреЗ рд▓рд┐рдП рдирд╛рдо рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдореЗрдиреВрдмрдВрдбрд▓ рдХрд╣рд╛ рд╣реИред
рдЖрдкрдХреЛ 2 рдЗрдХрд╛рдЗрдпрд╛рдБ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрдВрдбрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЗрдХрд╛рдИ рдлрд╝реЛрд▓реНрдбрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрдирд╛рдПрдВред рддреЛ, рд╕рдордп рдХреА рдлрд╝рд╛рдЗрд▓ рд╕рдВрдЦреНрдпрд╛ Menu.php рд╣реИред рдлрд╝рд╛рдЗрд▓ рдирдВрдмрд░ рджреЛ MenuType.php рд╣реИред рджреВрд╕рд░реА рдлрд╛рдЗрд▓ рдХреНрдпрд╛ рд╣реИ, рдореИрдВ рдмрд╛рдж рдореЗрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред

рдореИрдВ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХрдИ рдмрд╛рд░ рджреЗрддрд╛ рд╣реВрдВ:

namespace MyFolder\MenuBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="menu") * @ORM\Entity(repositoryClass="MyFolder\MenuBundle\Entity\MenuRepository") */ class Menu{ /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(type="string", length=100) */ protected $title; /** * @ORM\Column(type="string", length=100) */ protected $route; /** * @ORM\Column(type="string", nullable=true) */ protected $alias; /** * @ORM\Column(type="boolean") */ protected $static; /** * @ORM\ManyToOne(targetEntity="MyFolder\MenuBundle\Entity\MenuType", inversedBy="menuTypeId") * @ORM\JoinColumn(name="menuTypeId", referencedColumnName="id") */ protected $menuTypeId; } 


рдЖрдЗрдП рдлрд╛рдЗрд▓ рдирдВрдмрд░ рджреЛ рдХреЛ рджреЗрдЦреЗрдВ:
 namespace MyFolder\MenuBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="menu_type") * @ORM\Entity(repositoryClass="MyFolder\MenuBundle\Entity\MenuTypeRepository") */ class MenuType { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(type="string", length=100) */ protected $title; /** * @ORM\OneToMany(targetEntity="Menu", mappedBy="menuTypeId") */ private $typeId; } 


рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ 2 рдореЙрдбрд▓ рд▓рд┐рдЦреЗ рд╣реИрдВ, рдЖрдЗрдП рдЙрдирдХреЗ рд▓рд┐рдП рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рдмрдирд╛рдПрдВ!
# php рдРрдк / рдХрдВрд╕реЛрд▓ рд╕рд┐рджреНрдзрд╛рдВрдд: рдЬреЗрдирд░реЗрдЯ рдХрд░реЗрдВ: рдЗрдХрд╛рдЗрдпрд╛рдВ MyFolder / MenuBundle / Entity / Menu
рдФрд░
# php рдРрдк / рдХрдВрд╕реЛрд▓ рд╕рд┐рджреНрдзрд╛рдВрдд: рдЙрддреНрдкрдиреНрди: рдЗрдХрд╛рдЗрдпрд╛рдВ MyFolder / MenuBundle / Entity / MenuType

рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд░рд╣рд╛, рддреЛ рдЖрдкрдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдирдХреЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рдЙрдирдХреЗ рдЧреЗрдЯрд░реНрд╕ рдФрд░ рдмрд╕рдиреЗ рдЪрд╛рд╣рд┐рдПред

рдЙрд╕рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
# php рдРрдк / рдХрдВрд╕реЛрд▓ рд╕рд┐рджреНрдзрд╛рдВрдд: рд╕реНрдХреАрдорд╛: рдЕрдкрдбреЗрдЯ --рдлреЛрд░реНрд╕

рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ ManyToOne рджреНрд╡рд╛рд░рд╛ 2 рдЯреЗрдмрд▓ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред рдпрд╣реА рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЯреЗрдмрд▓ рдЯрд╛рдЗрдо рдХрд╛ рддрд╛рд▓рд┐рдХрд╛ TWO рдХреЗ рд╕рд╛рде рдХрдИ рд╕рдВрдмрдВрдз рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдереЛрдбрд╝рд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░ред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдореЗрдВ рд╕рдВрдЪрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗред

рдлрд╝рд╛рдЗрд▓ рдЯрд╛рдЗрдо рд▓рд╛рдЗрди рд╕реЗ рдиреАрдЪреЗред
 /** * @ORM\ManyToOne(targetEntity="MyFolder\MenuBundle\Entity\MenuType", inversedBy="menuTypeId") * @ORM\JoinColumn(name="menuTypeId", referencedColumnName="id") */ protected $menuTypeId; 


рд╡реЗ рд╣рдореЗрдВ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдХрдИ рдкрдВрдХреНрддрд┐рдпрд╛рдБ MyFolder \ MenuBundle \ Entity \ Menu рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИрдВ MyFolder \ MenuBundle \ Entity \ MenuType, рдЬрд┐рд╕реЗ рд╣рдореЗрдВ TWO рдлрд╛рдЗрд▓ рд╕реЗ рдПрдиреЛрдЯреЛрдЯ рджреНрд╡рд╛рд░рд╛ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
 /** * @ORM\OneToMany(targetEntity="Menu", mappedBy="menuTypeId") */ private $typeId; 


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рд╕рд┐рдореНрдлрдиреА рдореЗрдВ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред

рд╣рдо рдХреЛрдб рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛, рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдпрд╛ред рд╣рдо рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рднрд╛рдЧ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдорд╛рд░реЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗред рдмрдВрдбрд▓ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдлрд╝реЛрд▓реНрдбрд░ рдФрд░ рдЗрд╕рдореЗрдВ 2 рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдВред рдлрд╝рд╛рдЗрд▓ рд╕рдордп - MenuAdmin, рдлрд╝рд╛рдЗрд▓ рджреЛ - MenuTypeAdminред рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдХреЛрдб ONCE:
 namespace MyFolder\MenuBundle\Admin; use Sonata\AdminBundle\Admin\Admin; use Sonata\AdminBundle\Datagrid\ListMapper; use Sonata\AdminBundle\Datagrid\DatagridMapper; use Sonata\AdminBundle\Form\FormMapper; use Sonata\AdminBundle\Show\ShowMapper; class MenuAdmin extends Admin{ protected function configureFormFields(FormMapper $formMapper) { $formMapper ->add('title', null, array()) ->add('route', null, array()) ->add('alias', null, array()) ->add('static', null, array('required' => false)) ->add('menuTypeId', 'sonata_type_model', array( 'class'=>'MenuBundle:MenuType', 'property'=>'title', 'required' => false ) ) ; } protected function configureDatagridFilters(DatagridMapper $datagridMapper) { $datagridMapper ->add('title', null, array()) ->add('id', null, array()) ->add('route', null, array()) ; } public function configureShowField(ShowMapper $showMapper){ $showMapper ->add('title', null, array()) ->add('id', null, array()) ->add('route', null, array()) ; } protected function configureListFields(ListMapper $listMapper) { $listMapper ->addIdentifier('title', null, array()) ->add('route', null, array()) ->add('id', null, array()) ->add('menuTypeId', 'entity', array( 'class'=>'MenuBundle:MenuType', 'property'=>'title' ) ) ; } } 


рдореИрдВ рддреБрд░рдВрдд рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣рд╛рдВ рдирд╣реАрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдпрд╛ рдЙрд╕ рдкрдВрдХреНрддрд┐ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрдЦ рд╕реЛрдирд╛рдЯрд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдореИрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░реВрдВрдЧрд╛, рдЕрдЧрд░ рдРрд╕реА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рджреЛ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдХреЛрдб:
 namespace MyFolder\MenuBundle\Admin; use Sonata\AdminBundle\Admin\Admin; use Sonata\AdminBundle\Datagrid\ListMapper; use Sonata\AdminBundle\Datagrid\DatagridMapper; use Sonata\AdminBundle\Form\FormMapper; use Sonata\AdminBundle\Show\ShowMapper; class MenuTypeAdmin extends Admin{ protected function configureFormFields(FormMapper $formMapper) { $formMapper ->add('title', null, array()) ; } protected function configureDatagridFilters(DatagridMapper $datagridMapper) { $datagridMapper ->add('title', null, array()) ->add('id', null, array()) ; } public function configureShowField(ShowMapper $showMapper){ $showMapper ->add('title', null, array()) ->add('id', null, array()) ; } protected function configureListFields(ListMapper $listMapper) { $listMapper ->addIdentifier('title', null, array()) ->add('id', null, array()) ; } } 


рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рд╕реЛрдирд╛рдЯрд╛ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЙрд╕реЗ рд╣рдорд╛рд░рд╛ рдлреЛрд▓реНрдбрд░ рдФрд░ рд╣рдорд╛рд░реА 2 рдлрд╛рдЗрд▓реЗрдВ рджреЗрдЦрдиреА рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╕реЗрд╡рд╛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ MyFolder / MenuBundle / Resources / config / services.yml рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВред рдореИрдВ рдкреВрд░реА рдлрд╛рдЗрд▓ рдХрд╛ рдХреЛрдб рджреВрдВрдЧрд╛ рддрд╛рдХрд┐ рдХреЛрдИ рд╡рд┐рд╕рдВрдЧрддрд┐рдпрд╛рдВ рди рд╣реЛрдВ:
 parameters: services: admin.menu: class: MyFolder\MenuBundle\Admin\MenuAdmin tags: - { name: sonata.admin, manager_type: orm, group: , label: } arguments: [null, MyFolder\MenuBundle\Entity\Menu, SonataAdminBundle:CRUD] admin.menu_type: class: MyFolder\MenuBundle\Admin\MenuTypeAdmin tags: - { name: sonata.admin, manager_type: orm, group:  , label:  } arguments: [null, MyFolder\MenuBundle\Entity\MenuType, SonataAdminBundle:CRUD] 


рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдиреЗ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рдХреЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рднрд╛рдЧ рдореЗрдВ 2 рдЕрдВрдХ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╡реЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдВрдЧреЗ:
рдЫрд╡рд┐

рдпрджрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдореБрдЭреЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (sin666m4a1fox@gmail.com), рдореИрдВ рдЦрд╝реБрд╢реА рд╕реЗ рдЗрди рдкрддреНрд░реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреВрдВрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдореЗрдиреВ рдЖрдЗрдЯрдореЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ, рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ, рд╣рдЯрд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред

рдЖрдк рдРрд╕реА рдЬрдЯрд┐рд▓рддрд╛ рдХреНрдпреЛрдВ рдкреВрдЫрддреЗ рд╣реИрдВ? рд╕рдВрднрд╡рддрдГ рдпрд╣ рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐ рд╣рдордиреЗ рдпрд╣рд╛рдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдореЗрдиреВ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╢реЛрдзрди рдХреА рд╕рд╛рджрдЧреА рдФрд░ рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреГрд╖реНрда рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдФрд░ рдЗрд╕рдХреА рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдордЧреНрд░реА ... рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрдВред

рдЪрд▓рд┐рдП рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдиреЗ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдкрд╣рд▓рд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореЗрдиреВ рдмрдирд╛рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреА рд╣рд┐рдореНрдордд рдХрд░рддрд╛ рд╣реВрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, "рдореЗрдиреВ рдкреНрд░рдХрд╛рд░" рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдкреНрд▓рд╕ рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде рдмрдЯрди рджрдмрд╛рдПрдВред рддреЛ рдмрд╕ рд╕рдм рдХреБрдЫ рд╣реЛрдирд╛ рд╣реИред рдПрдХ рдлреАрд▓реНрдб рдЯрд╛рдЗрдЯрд▓ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдореЗрдиреВ рдкреНрд░рдХрд╛рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдмрд╛рдж рдореЗрдВ рд╣рдо рдореЗрдиреВ рдЖрдЗрдЯрдо рдХреЛ рдмрд╛рдВрдз рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЗрдиреВ ("рдореБрдЦреНрдп рдореЗрдиреВ" рдФрд░ "рддрд╣рдЦрд╛рдиреЗ рдореЗрдВ рдореЗрдиреВ") рдмрдирд╛рдПред рд╣рдо рдореЗрдиреВ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдФрд░ рдПрдХ рдирдпрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдпрд╣ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред
рдЫрд╡рд┐

рджрд░рдЕрд╕рд▓, рдЯрд╛рдЗрдЯрд▓ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВ, рд░реВрдЯ рдПрдХ рд▓рд┐рдВрдХ рд╣реИ рдЬреЛ KNPMenuBundle рдкрд░ рдЬрд╛рдПрдЧрд╛ред рдПрд▓рд┐рдпрд╛рд╕ рдореЗрд░реА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ, рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╕реНрдЯреЗрдЯрд┐рдХ рдЪреЗрдХрдмреЙрдХреНрд╕ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдкреГрд╖реНрда рдХрд╕реНрдЯрдо рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕реЗ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдПрдХреНрд╢рди рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдореЗрдиреВ рдкреНрд░рдХрд╛рд░ рдЖрдИрдбреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрди рдореЗрдиреВ рдЖрдЗрдЯрдо рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ рдЬреЛ рдЖрдкрдиреЗ рдКрдкрд░ рдмрдирд╛рдП рдереЗред рдпрд╣ рд╕реНрд╡рдпрдВ рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╣реИ, рдЬреЛ рдмрд╛рдж рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрдк рдЕрднреА рднреА рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд┐рд╕ рдореЗрдиреВ рдЖрдЗрдЯрдо рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдПрдХ рдкрд▓ред рдХрд╕реНрдЯрдо рд░реВрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдореЗрдВ, рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЬреЗрдПрд╕ рдХреЛрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛ред
 $(document).ready(function () { $('input[id$="_static"]').click(function(){ var $_thisRoute = $('input[id$="_route"]'), defaultValues = $_thisRoute.val().split('/'); if($(this).is(':checked')) { $_thisRoute.val('/custom/'+defaultValues[defaultValues.length -1]); } else { $_thisRoute.val('/'+defaultValues[defaultValues.length -1]); } }) }); 


рдпрд╣реА рд╣реИ, рдЬрдм рдЖрдк рд╕реНрдЯреЗрдЯрд┐рдХ рдЖрдЗрдЯрдо рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдорд╛рд░реНрдЧ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ рддреЛ рдпрд╣ / рдХрд╕реНрдЯрдо / рд╣рдорд╛рд░реЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдпрд╣ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ js рдХреЛ рд╕реЛрдирд╛рдЯрд╛ рдХреЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рднрд╛рдЧ рдореЗрдВ рдХреИрд╕реЗ рдЬреЛрдбрд╝реВрдВ, рдпрд╣ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдБ, рдмрд╕ рдкреВрдЫреЗрдВ :)

рдореИрдВрдиреЗ 7 рдореЗрдиреВ рдЖрдЗрдЯрдо рдмрдирд╛рдП

рдЫрд╡рд┐

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд░реВрдЯ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИред рдпрд╣ рд╕рдм рдХреЗрд╡рд▓ рдореЗрди рдореЗрдиреНрдпреВ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рднрд╛рдЧ рдХреЗ рд╕рд╛рде рд╣рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред KNPMenuBundle рдкрд░ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдмрдВрдбрд▓ 1.1 рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 2.2 рд╣реИ, рдлрд┐рд░ рднреА рдореИрдВ 2.2 рд╕реЛрдирд╛рдЯрд╛ рдХреЗ рд╕рд╛рде рджреЛрд╕реНрдд рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реБрдЖ, рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдореЗрдВ рд╕реЛрдирд╛рдЯрд╛ рдореЗрдВ KNPMenuBundle 1.1 рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреБрдЫ рднреА рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдо рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдмрдВрдбрд▓ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдореЗрдиреВ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ рдЗрд╕рдореЗрдВ рдмрд┐рд▓реНрдбрд░ред рдПрдлрдкреАрдкреА рдлрд╝рд╛рдЗрд▓ред рдпрд╣рд╛рдБ рдЙрд╕рдХрд╛ рдХреЛрдб рд╣реИ:
 namespace MyFolder\MenuBundle\Menu; use Knp\Menu\FactoryInterface; use Knp\Menu\ItemInterface; use Symfony\Component\DependencyInjection\ContainerAware; class Builder extends ContainerAware { public function mainMenu(FactoryInterface $factory, array $options) { $menuItems = $this->container->get('menu')->getMainMenu(); $menu = $factory->createItem('root'); $this->setCurrentItem($menu); $menu->setChildrenAttribute('class', 'nav'); $menu->setExtra('currentElement', 'active'); foreach($menuItems as $item) { $menu->addChild($item->getTitle(), array('uri' => $item->getRoute())); } return $menu; } protected function setCurrentItem(ItemInterface $menu) { $menu->setCurrentUri($this->container->get('request')->getPathInfo()); } } 


рдпрд╣рд╛рдБ рдХреБрдЫ рдмрд┐рдВрджреБ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдмрд┐рд▓реНрдбрд░ рдХреЛ рдХрдВрдЯреЗрдирд░рд╡реЗрдпрд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ $ рдЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ-> рдХрдВрдЯреЗрдирд░-> рдорд┐рд▓рддрд╛ рд╣реИ (), рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдореЗрдиреВ рдЖрдЗрдЯрдо рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджреА рд╕реЗ рдПрдХ рд╕реЗрд╡рд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВред рдЬрд▓реНрджреА рд╕реЗ рдирд╣реАрдВ рдХрд╣рд╛ред

рдмрдВрдбрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рд╕реЗрд╡рд╛ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ рдФрд░ рдЙрд╕рдореЗрдВ рдПрдХ MenuService.php рдлрд╝рд╛рдЗрд▓ред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдЗрд╕рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЖрдЗрдП рд╕реЗрд╡рд╛ рдЙрдкрд▓рдмреНрдз рдХрд░реЗрдВ, рдЕрд░реНрдерд╛рддреН, рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ MyFolder / MenuBundle / Resources / config / services.yml рддрд╛рдХрд┐ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓реЗрдВ:
 parameters: services: menu: class: MyFolder\MenuBundle\Service\MenuService arguments: [@service_container] admin.menu: class: MyFolder\MenuBundle\Admin\MenuAdmin tags: - { name: sonata.admin, manager_type: orm, group: , label: } arguments: [null, MyFolder\MenuBundle\Entity\Menu, SonataAdminBundle:CRUD] admin.menu_type: class: MyFolder\MenuBundle\Admin\MenuTypeAdmin tags: - { name: sonata.admin, manager_type: orm, group:  , label:  } arguments: [null, MyFolder\MenuBundle\Entity\MenuType, SonataAdminBundle:CRUD] 


рджрд░рдЕрд╕рд▓ рдЕрдм рдлрд╛рдЗрд▓ рдХреЛрдб MyFolder / MenuBundle / Service / MenuService рд╣реИ
 namespace MyFolder\MenuBundle\Service; use Symfony\Component\DependencyInjection\Container; class MenuService { private $doctrine; private $container; private $menuRepository; public function __construct(Container $container) { $this->container = $container; $this->doctrine = $this->container->get('doctrine'); $this->menuRepository = $this->doctrine->getRepository('MenuBundle:Menu'); } public function getMainMenu() { return $this->menuRepository->getMainMenu(); } } 


рдореИрдВ рдЖрдкрдХреЛ Menu.php рдЗрдХрд╛рдИ рд╕реЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ
ORM \ Entity (рд░рд┐рдкреЙрдЬрд┐рдЯрд░реАрдХреНрд▓рд┐рдХ = "MyFolder \ MenuBundle \ Entity \ MenuRepository")
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрдХрд╛рдИ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, MenuRepository.php рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 namespace MyFolder\MenuBundle\Entity; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Query\ResultSetMapping; class MenuRepository extends EntityRepository { public function getMainMenu() { return $this->findBy(array('menuTypeId' => 1)); } } 


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдмрд╣реБрдд рд╣реА рдЪрдпрди рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ "рдореБрдЦреНрдп рдореЗрдиреВ" рдкреНрд░рдХрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдореЗрдиреВ рдЖрдЗрдЯрдо рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред

рд╣рдо рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ: рдЕрдм, рдЕрдкрдирд╛ рдореЗрдиреВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯреНрд╡реАрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдореЗрдВ, рдмрд╕ рдЗрд╕ рдкрдВрдХреНрддрд┐ рдХреЛ рд▓рд┐рдЦреЗрдВ:
 {{ knp_menu_render('MenuBundle:Builder:mainMenu', { 'currentClass': 'active'}) }} 


рд╕реАрдПрд╕рдПрд╕ рд╡рд░реНрдЧ рд╕рдХреНрд░рд┐рдп рдЙрд╕ рдореВрд▓реНрдп рдкрд░ рд╣реЛрдЧрд╛ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдореЗрд░реА рддрд░рд╣ рдПрдХ рдореЗрдиреВ рдмрдирд╛рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
 /** * @Template() * @Route("/custom/{link}", name="_custom_page", defaults={"link" = "/"}) */ public function customAction($link) { return $this->render('CommonBundle:Default:commonPage.html.twig', array('page' => $link)); } 


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

рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╣ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЗрдЦ рдХреЗрд╡рд▓ рд╕рдм рдХреБрдЫ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдЖрд╕рд╛рди рдпрд╛ рддреЗрдЬрд╝ рд▓рд┐рдЦрдирд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдореЗрд░реЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рднреА рдврд╛рдВрдЪреЗ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛, рд╣рдо рд╕рдм рдХреБрдЫ рдЬрдЯрд┐рд▓ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред

PS рдЕрдЧрд░ рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд╣реАрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдЬреЛ рдирд╣реАрдВ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореЗрд▓ рдкрд░ рд▓рд┐рдЦреЗрдВ, рдореИрдВ рдЦрд╝реБрд╢реА рд╕реЗ рд╕рднреА рдХреЛ рдЬрд╡рд╛рдм рджреВрдВрдЧрд╛ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЬрд▓реНрдж рдорд┐рд▓рддреЗ рд╣реИрдВред

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


All Articles