рд╕рд┐рдореНрдлрдиреА 2 рдкрд░ рдПрдХ CRUD рдПрдкреНрд▓реАрдХреЗрд╢рди рдмрдирд╛рдирд╛

рд╕рд┐рдореНрдлрдиреА 2.0


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

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

рд╕рд┐рдореНрдлрдиреА 2 рдкрд░ рдПрдХ рдорд╛рдирдХ рд╕реАрдЖрд░рдпреВрдбреА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдореБрдЦреНрдп рдЪреБрдиреМрддрд┐рдпрд╛рдВ


  1. рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╡рд┐рдХрд╛рд╕
  2. рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ, рдкрдврд╝рдиреЗ, рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХреЛрдВ, рд░реВрдкреЛрдВ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рд╡рд┐рдХрд╛рд╕

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

рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╡рд┐рдХрд╛рд╕


рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ yml рдпрд╛ xml рд▓рд┐рдЦрдХрд░ рдЗрдХрд╛рдИ рд╡рд┐рд╡рд░рдг рдмрдирд╛рдирд╛ рдПрдХ рдердХрд╛рдК рдХрд╛рдо рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдк рдореИрд╕рдХрд▓ рд╡рд░реНрдХрдмреЗрдиреНрдЪ рдкреНрд▓рдЧрдЗрди рдпрд╛ рд╡рд┐рд╢реЗрд╖ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд┐рдореНрдлрдиреА 2 рдореЗрдВ рдПрдХ рдореМрдЬреВрджрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХрд╛ рд╡рд┐рд╡рд░рдг рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рд╛рдзрди рд╣реИ ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, TestNewsBundle рдмрдВрдбрд▓ рдмрдирд╛рдПрдВ:

php app/console generate:bundle --namespace=Test/NewsBundle --format=annotation --structure 


рдореИрд╕рдХреЗрд▓ рд╡рд░реНрдХрдмреЗрдиреНрдЪ (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдЯреВрд▓) рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдХреАрдорд╛ рдмрдирд╛рдПрдБ:



 SET FOREIGN_KEY_CHECKS=0; CREATE TABLE `news` ( `id` INT NOT NULL AUTO_INCREMENT , `news_category_id` INT NOT NULL , `title` VARCHAR(255) NULL , `announce` TEXT NULL , `text` TEXT NULL , `pub_date` DATE NULL , PRIMARY KEY (`id`) , INDEX `pub_date` (`pub_date` ASC) , INDEX `fk_news_news_category` (`news_category_id` ASC) , CONSTRAINT `fk_news_news_category` FOREIGN KEY (`news_category_id` ) REFERENCES `news_category` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; CREATE TABLE `news_category` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(255) NULL , PRIMARY KEY (`id`) ) ENGINE = InnoDB CREATE TABLE `news_link` ( `id` int(11) NOT NULL AUTO_INCREMENT, `news_id` INT NOT NULL , `url` varchar(255) DEFAULT NULL, `text` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) , INDEX `fk_news_link_news1` (`news_id` ASC) , CONSTRAINT `fk_news_link_news1` FOREIGN KEY (`news_id` ) REFERENCES `news` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; 

рд╕рд┐рджреНрдзрд╛рдВрдд рд╡рд░реНрдЧ рдмрдирд╛рдПрдБ:

 php app/console doctrine:mapping:import TestNewsBundle annotation 


рдЗрд╕ рдЖрджреЗрд╢ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, Test / NewsBundle / Entity рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ Doctrine ORM рдХреЗ рд▓рд┐рдП рд░рд┐рд▓реЗрд╢рдирд▓ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдореИрдк рдХрд░рдиреЗ рдХрд╛ рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рдЪрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 <?php namespace Test\NewsBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * Test\NewsBundle\Entity\News * * @ORM\Table(name="news") * @ORM\Entity */ class News { /** * @var integer $id * * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @var string $title * * @ORM\Column(name="title", type="string", length=255, nullable=true) */ private $title; /** * @var text $announce * * @ORM\Column(name="announce", type="text", nullable=true) */ private $announce; /** * @var text $text * * @ORM\Column(name="text", type="text", nullable=true) */ private $text; /** * @var date $pubDate * * @ORM\Column(name="pub_date", type="date", nullable=true) */ private $pubDate; /** * @var NewsCategory * * @ORM\ManyToOne(targetEntity="NewsCategory") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="news_category_id", referencedColumnName="id") * }) */ private $newsCategory; } 

рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдкреВрд░рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 php app/console doctrine:generate:entities TestNewsBundle 


CRUD рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдмрдирд╛рдирд╛ - рдЖрд╡реЗрджрди


рд╣рдо рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдХреНрдд рдмрдирд╛рддреЗ рд╣реИрдВ : рдЙрддреНрдкрдиреНрди: рдХреНрд░реВрдб рдХрдорд╛рдВрдб ред рд░реВрдЯрд┐рдВрдЧ рдкреНрд░рд╛рд░реВрдк - рдирд┐рдпрдВрддреНрд░рдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди (рдЯреЗрд╕реНрдЯ / рдиреНрдпреВрдЬрд╝рдмрдВрдбрд▓ / рдХрдВрдЯреНрд░реЛрд▓рд░ / рдиреНрдпреВрдЬрд╝рдХрдВрдЯреНрд░реЛрд▓рд░)ред рдирд┐рдпрдВрддреНрд░рдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реВрдЯрд┐рдВрдЧ SensioFrameworkExtra рдмрдВрдбрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рд╕рд┐рдореНрдлрдиреА 2 рдПрд╕рдИ рдХреЗ рд╕рд╛рде рд╢рд╛рдорд┐рд▓ рд╣реИ)ред

 php app/console doctrine:generate:crud --entity=TestNewsBundle:News --route-prefix=news --with-write --format=annotation 

рдЕрдм, рдЬрдм рдкреАрдврд╝реА рдХреЗ рджреМрд░рд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрде рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ (рдпрджрд┐ рд╕рд┐рдореНрдлрдиреА 2 wwwroot рдореЗрдВ рдЕрдирдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - http: //localhost/Symfony/web/app_dev.php/news/ ), рд╕рдорд╛рдЪрд╛рд░ рдХреА рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЬрдм рдЖрдк рдирдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд▓рд┐рдВрдХ рдмрдирд╛рдПрдБ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░рд┐рдХреЙрд░реНрдб рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдкрддреНрд░ред

рдЖрдЗрдП рд╕рдорд╛рдЪрд╛рд░ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд░рд┐рдХреНрдд рдмрдирд╛рдПрдВ рдФрд░ рдХрдИ рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рджрд░реНрдЬ рдХрд░реЗрдВ:

 php app/console doctrine:generate:crud --entity=TestNewsBundle:NewsCategory --route-prefix=newscategory --with-write --format=annotation 


рд╕рдорд╛рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд░рд┐рдХреНрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реА рддрд░рд╣ рдиреНрдпреВрдЬрд╝рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдХреНрдд рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ:

 php app/console doctrine:generate:crud --entity=TestNewsBundle:NewsLink --route-prefix=newslink --with-write --format=annotation 


рддрд╛рдХрд┐ рд╕рдорд╛рдЪрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╕рдордп, рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдкрддрд╛ рдЪрд▓реЗ рдХрд┐ рдХрд┐рд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЪрдпрди рдХрд░рдирд╛ рд╣реИ, рдЯреЗрд╕реНрдЯ / рдиреНрдпреВрдЬрд╝рдмрдВрдбрд▓ / рдПрдВрдЯрд┐рдЯреА / рдиреНрдпреВрдЬрд╝рдХреИрдЯрд░рд░реА рдХреНрд▓рд╛рд╕ рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 function __toString() { return $this->getName(); } 


рдЖрдХрд╛рд░ рд╡рд░реНрдЧ рд╕рдВрд╢реЛрдзрди


рдЕрдм рд╣рдо рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдлреЙрд░реНрдо рдЯреЗрд╕реНрдЯ / NewsBundle / рдлреЙрд░реНрдо / NewsType рдХреЛ рд╕рд╣реА рдХрд░реЗрдВрдЧреЗред рд╢реАрд░реНрд╖рдХреЛрдВ рдХреЛ рдлрд╝реАрд▓реНрдбреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ (рд▓реЗрдмрд▓), рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░ рдбрд╛рд▓реЗрдВ - рдкрд╛рда (рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░ = рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ), рдЯреЗрдХреНрд╕рд╛рд░рд┐рдпрд╛ред рдкрдмрдбреЗрдЯ рдФрд░ рдиреНрдпреВрдЬрд╝рдХреИрдЯрд░рд░реА рдлрд╝реАрд▓реНрдбреНрд╕ рдореЗрдВ, рд╣рдо рдлреАрд▓реНрдб рдЯрд╛рдЗрдк рдХреЛ рд╢реВрдиреНрдп рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд┐рдореНрдлрдиреА рдлреЙрд░реНрдо рдХрдВрдкреЛрдиреЗрдВрдЯ рдЦреБрдж "рдЕрдиреБрдорд╛рди" рд▓рдЧрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдлреАрд▓реНрдб рдХреЛ рджрд┐рдЦрд╛рдирд╛ рд╣реИред

 <?php namespace Test\NewsBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilder; class NewsType extends AbstractType { public function buildForm(FormBuilder $builder, array $options) { $builder->add('title', 'text', array('label' => '')) ->add('announce', 'textarea', array('label' => '')) ->add('text', 'textarea', array('label' => '')) ->add('pubDate', null, array('label' => ' ')) ->add('newsCategory', null, array('label' => '')); } public function getName() { return 'news'; } } 


рдкреНрд░рдкрддреНрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рд╕рдВрд╢реЛрдзрди


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

 {% form_theme form 'form_table_layout.html.twig' %} 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдореЗрдВ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдорд╛рдирдХ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рд╕рдорд╛рдЪрд╛рд░ рдкрд░реАрдХреНрд╖рдг / рдиреНрдпреВрдЬрд╝рдмрдВрдбрд▓ / рд╕рдВрд╕рд╛рдзрди / рд╡рд┐рдЪрд╛рд░ / рд╕рдорд╛рдЪрд╛рд░ / new.html.twig рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдЦрд╛рдХрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 {% use 'form_table_layout.html.twig' %} {% form_theme form _self %} <h1> </h1> <form action="{{ path('news_create') }}" method="post" {{ form_enctype(form) }}> {{ form_widget(form) }} <p> <button type="submit"> </button> </p> </form> <ul class="record_actions"> <li> <a href="{{ path('news') }}">    </a> </li> </ul> 


рдкреНрд░рдкрддреНрд░ рддрд╛рд▓рд┐рдХрд╛ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


рд╕рдВрдмрдВрдзрд┐рдд рдкрджреЛрдВ рдХрд╛ рд╕рдВрдкрд╛рджрди


рдЕрдм рдЪрд▓рд┐рдП рдордЬрд╝реЗрджрд╛рд░ рднрд╛рдЧ - рд╕рдВрдкрд╛рджрди рд╕рдорд╛рдЪрд╛рд░ рд▓рд┐рдВрдХ рдкрд░ред рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди, рдХреЗрд╡рд▓ "рд▓рд┐рдВрдХ -> рд╕рдорд╛рдЪрд╛рд░" рд▓рд┐рдВрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрдХрд╛рдИ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред "News -> Links" рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреНрд▓рд╛рд╕ рдЯреЗрд╕реНрдЯ \ NewsBundle \ Entity \ News рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

 /** * @ORM\OneToMany(targetEntity="NewsLink", mappedBy="news", cascade={"all"}) */ protected $newsLinks; function __construct() { $this->newsLinks = new \Doctrine\Common\Collections\ArrayCollection(); } 

рдлрд┐рд░ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ ($ newsLinks рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдЧреЗрдЯреНрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛):

 php app/console doctrine:generate:entities TestNewsBundle 


рдЕрдм рдХрдХреНрд╖рд╛ рдЯреЗрд╕реНрдЯ / рдиреНрдпреВрдЬрд╝рдмрдВрдбрд▓ / рдлреЙрд░реНрдо / рдиреНрдпреВрдЬрд╝ рдЯрд╛рдЗрдк рдореЗрдВ рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ "рдПрдбрд┐рд╢рди" рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

 $builder->add('title', 'text', array('label' => '')) .... ->add('newsLinks', 'collection', array( 'label' => '  ', 'type' => new NewsLinkType(), 'allow_add' => true, 'allow_delete' => true, 'prototype' => true )); 

Test \ NewsBundle \ Form \ NewsLinkType рд╡рд░реНрдЧ рдореЗрдВ, рдЖрдкрдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рдЗрдХрд╛рдИ рдХрд╛ рд╡рд░реНрдЧ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (data_class рд╡рд┐рдХрд▓реНрдк):

 <?php namespace Test\NewsBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilder; class NewsLinkType extends AbstractType { public function buildForm(FormBuilder $builder, array $options) { $builder->add('url') ->add('text'); } public function getName() { return 'newsLinkType'; } public function getDefaultOptions(array $options) { return array( 'data_class' => 'Test\NewsBundle\Entity\NewsLink', ); } } 


рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдк рдЕрдм рдлреЙрд░реНрдо рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреЗрд╡рд▓ "рд▓рд┐рдВрдХ рдЯреВ рдиреНрдпреВрдЬ" рдлрд╝реАрд▓реНрдб рдХрд╛ рд╢реАрд░реНрд╖рдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдкрддреНрд░ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрднреА рднреА рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрд╕реА рд╕рдордп, рд╣рдо рдлреЙрд░реНрдо рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдирд┐рдХрд╛рд▓ рд▓реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ / NewsBundle / Resources / views / News / form.html.twig:
 {% use 'form_table_layout.html.twig' %} {% form_theme form _self %} <script language="JavaScript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> <form action="{{ entity.id ? path('news_update', { 'id': entity.id }) : path('news_create') }}" method="post" {{ form_enctype(form) }}> {{ form_errors(form) }} <table> {{ form_row (form.title) }} {{ form_row (form.announce) }} {{ form_row (form.text) }} {{ form_row (form.pubDate) }} {{ form_row (form.newsCategory) }} <tr> <td valign="top">  </td> <td> <!--      /    --> {% macro linkRow(link) %} <tr> <td>{{ form_widget(link.url) }}</td> <td>{{ form_widget(link.text) }}</td> <td><a href="#" class="deleteRowLink">X</a></td> </tr> {% endmacro %} <!--       /    --> <!--     #addLink     --> <script type="text/html" id="nl">{{ _self.linkRow (form.newsLinks.get('prototype')) }} </script> <!--         --> <table id="linksTable"> <tr><td>Url</td><td> </td></tr> {% for key, link in form.newsLinks %} {{ _self.linkRow(link) }} {% endfor %} </table> <input type="button" id="addLink" value=" "> <script> $(function() { $("#addLink" ).click(function() { $('#linksTable tbody').append($('#nl').html().replace(/\$\$name\$\$/g, $('#linksTable tbody tr').length)); }); $("form a.deleteRowLink").live('click', function() { $(this).closest('tr').remove(); }); }); </script> </td> </tr> </table> {{ form_rest(form) }} <p><button type="submit"></button></p> </form> 


рд░рд┐рдХреЙрд░реНрдб рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЯреЗрд╕реНрдЯ / рдиреНрдпреВрдЬрд╝рдмрдВрдбрд▓ / рд╕рдВрд╕рд╛рдзрди / рд╡рд┐рдЪрд╛рд░ / рд╕рдорд╛рдЪрд╛рд░ / new.html.twig:

 <h1> </h1> {% include 'TestNewsBundle:News:form.html.twig' %} <ul class="record_actions"> <li> <a href="{{ path('news') }}">    </a> </li> </ul> 


рдкреНрд░рд╡реЗрд╢ рдкрд░реАрдХреНрд╖рд╛ / рдиреНрдпреВрдЬрд╝рдмрдВрдбрд▓ / рд╕рдВрд╕рд╛рдзрди / рд╡рд┐рдЪрд╛рд░ / рд╕рдорд╛рдЪрд╛рд░ / edit.html рдХреЗ рд╕рдВрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкреНрд▓реЗрдЯ:

 <h1> </h1> {% include 'TestNewsBundle:News:form.html.twig' with { 'form' : edit_form } %} <ul class="record_actions"> <li> <a href="{{ path('news') }}"> Back to the list </a> </li> <li> <form action="{{ path('news_delete', { 'id': entity.id }) }}" method="post"> {{ form_widget(delete_form) }} <button type="submit">Delete</button> </form> </li> </ul> 


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

рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреНрд▓рд╛рд╕ рдЯреЗрд╕реНрдЯ / рдиреНрдпреВрдЬрд╝рдмрдВрдбрд▓ / рдХрдВрдЯреНрд░реЛрд▓рд░ / рдиреНрдпреВрдЬрд╝рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджреНрдпрдкрд┐ рд╣рдордиреЗ рдХреИрд╕реНрдХреЗрдб = "рд╕рдорд╛рдЪрд╛рд░ - рд▓рд┐рдВрдХ" рд╕рдВрдЪрд╛рд░ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╕рднреА рд╡рд┐рдХрд▓реНрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рд╣реИрдВ (рдЬрдм рдПрдХ рдЗрдХрд╛рдИ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рддреЛ рдпрд╣ рдореВрд▓ рд╕рдорд╛рдЪрд╛рд░ рд╡рд╕реНрддреБ рдкрд░ NewsLink рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдмрдВрдзрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ:

 public function createAction() { $entity = new News(); $request = $this->getRequest(); $form = $this->createForm(new NewsType(), $entity); $form->bindRequest($request); if ($form->isValid()) { $em = $this->getDoctrine()->getEntityManager(); //     foreach ($entity->getNewsLinks() as $link) { $link->setNews($entity); } $em->persist($entity); $em->flush(); return $this->redirect($this->generateUrl('news_show', array('id' => $entity->getId()))); } return array( 'entity' => $entity, 'form' => $form->createView()); } 


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

  public function updateAction($id) { $em = $this->getDoctrine()->getEntityManager(); $entity = $em->getRepository('TestNewsBundle:News')->find($id); if (!$entity) { throw $this->createNotFoundException('Unable to find News entity.'); } $beforeSaveLinks = $currentLinkIds = array(); foreach ($entity->getNewsLinks() as $link) $beforeSaveLinks [$link->getId()] = $link; $editForm = $this->createForm(new NewsType(), $entity); $deleteForm = $this->createDeleteForm($id); $request = $this->getRequest(); $editForm->bindRequest($request); if ($editForm->isValid()) { foreach ($entity->getNewsLinks() as $link) { $link->setNews($entity); //  -     (   id) if ($link->getId()) $currentLinkIds[] = $link->getId(); } $em->persist($entity); //          -   foreach ($beforeSaveLinks as $linkId => $link) if (!in_array( $linkId, $currentLinkIds)) $em->remove($link); $em->flush(); return $this->redirect($this->generateUrl('news_edit', array('id' => $id))); } return array( 'entity' => $entity, 'edit_form' => $editForm->createView(), 'delete_form' => $deleteForm->createView(), ); } 


рд╕рдВрдмрдВрдзрд┐рдд рд░рд┐рдХреЙрд░реНрдб рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╡рд╛рд▓рд╛ рдПрдХ рдлреЙрд░реНрдо:

рд╕рдВрдмрдВрдзрд┐рдд рд░рд┐рдХреЙрд░реНрдб рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рдкрддреНрд░

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

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


All Articles