рд╕рднреА рдХреЛ рдмрдзрд╛рдИ! рдФрд░ рдЖрдЗрдП рд╕рд┐рдореНрдлрдиреА рдФрд░ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдПрдХ рд╡рд┐рд╖рдп рдмрдирд╛рдПрдВред
рдкрд░рд┐рдЪрдп
рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд╛рдЗрдмреЗрд░рд┐рдпрди рдбреЗрд╡рд▓рдкрд░ рд╣реВрдВ, рдЬреАрд╡рди рдореЗрдВ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рджреБрдирд┐рдпрд╛ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдирд╛ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдЦреБрд╢ рдХрд░рдирд╛ рд╣реИред рд╕рд┐рдореНрдлрдиреА рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрдИ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПред рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рдХрднреА-рдХрднреА рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдмрд╣реБрдд рдХрдо рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЬрд╣рд╛рдВ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреА рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛, рдФрд░ рдЖрдк, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ, рдореБрдЭреЗ рд╕рд╣реА рд░рд╛рд╕реНрддреЗ рдкрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрдкрдХреА рд╣реИрдХ рднреА рд╕рд╛рдЭрд╛ рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╡рд┐рд╖рдп рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдЙрдкрд░реНрдпреБрдХреНрдд рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдпрд╛ рдЗрд╕рдХреЗ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЬреЛ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВред
рдмрд┐рдВрджреБ рдкрд░ рдкрд╣реБрдБрдЪреЛ
рджрд┐рдирд╛рдВрдХ рдХрд╛рд░реНрдп рдФрд░ рд╕рд┐рджреНрдзрд╛рдВрдд
рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдирд┐рдЬреА рдмреНрд▓реЙрдЧ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЛред рдЖрдкрдХреЛ рд╡рд░реНрд╖ рдФрд░ рдорд╣реАрдиреЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХрд╛рд░реНрдпред рдЖрдк BlogRepository рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдБ, рдФрд░
рдЗрд╕реЗ рдирд╛рдо рджреЗрдВ рдЬреИрд╕реЗ getArchiveByMonths ()ред рдорд╢реАрди рдкрд░, рд╕рдорд╛рди рдХреЛрдб рд▓рд┐рдЦреЗрдВ:
$qb = $this->createQueryBuilder('p'); return $qb ->addSelect('MONTHNAME(p.created) as month') ->addSelect('YEAR(p.created) as year') ->addSelect('COUNT(p) as cnt') ->groupBy('month, year') ->orderBy('p.created', 'DESC') ->getQuery() ->getArrayResult();
рдФрд░ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:
Expected known function, got 'MONTHNAME'
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдбреЙрдХреНрдЯреНрд░рд┐рди рдПрдХ рддрд┐рдерд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдиреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рд╣реИ (
Tyts )
рд╕рдорд╛рдзрд╛рди: рдПрдХ рдЕрджреНрднреБрдд рднрдВрдбрд╛рд░ рд╣реИ:
github.com/simukti/DoctrineExtensions , рд╡рд╣рд╛рдБ рд╣рдо 2 рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:
DoctrineExtensions\Query\Mysql\Month;
DoctrineExtensions\Query\Mysql\Year;
рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ? рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдмрдВрдбрд▓ рдореЗрдВ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Dql рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ,
Acme\BlogBundle\Dql
рдХреЗ рдирд╛рдорд╕реНрдерд╛рди рдХреЛ
Acme\BlogBundle\Dql
рдФрд░ рдЖрдирдиреНрджрд┐рдд рд╣реЛрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдЕрджреНрднреБрдд рднрдВрдбрд╛рд░ рд╣реИред
Monthname
рдлрд╝рдВрдХреНрд╢рди
Month
рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рдж
Monthname
рдЧрдпрд╛ рд╣реИред рдФрд░
рд▓рд┐рдВрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рдореЗрдВ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ред
Config.yml рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред
рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдерд╛ рдХрд┐ рдбреЙрдХреНрдЯреНрд░рд┐рди рдХреЛ рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдЙрд╕реЗ рдЕрдиреНрдп рдлрд╛рдпрджреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдл рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдиреЗрд╡рд┐рдЧреЗрд╢рди рдФрд░ рдмреНрд░реЗрдбрдХреНрд░рдВрдм
рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ
KnpMenuBundle рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛
рд╣реВрдВ ред рдЗрд╕реЗ рдЧреАрдереВрдм рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдкрдврд╝реЗрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдкрдврд╝рд╛, рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдореЗрдиреВ рдмрдирд╛рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
namespace Acme\BlogBundle\Menu; use Knp\Menu\FactoryInterface; use Knp\Menu\MenuItem; use Symfony\Component\DependencyInjection\ContainerAware; class Builder extends ContainerAware { public function mainMenu (FactoryInterface $factory, array $options) { $menu = $factory->createItem('root'); $request = $this->container->get('request'); $menu ->addChild('Homepage', array( 'route' => 'homepage', )); $blog = $menu->addChild('Blog', array( 'route' => 'blog' )); $blog->addChild('BlogView',array( 'route' => 'blog_post_view', 'routeParameters' => array('id' => $request->get('id', 1)), 'display' => false )); return $menu; }
рдЗрд╕ рдореЗрдиреВ рдХреЛ рд╕рд╛рдЗрдЯ рдХреЗ рдмрд╛рдИрдВ / рджрд╛рдИрдВ рдУрд░ рдХрд╣реАрдВ рд▓рд╛рдпрд╛ рдЧрдпрд╛ред рдФрд░ рдЕрдм рд╣рдореЗрдВ рдмреНрд░реЗрдб рдХреНрд░рдореНрдмреНрд╕ рдХреЛ рдмрд╛рд╣рд░ рд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реБрдВрджрд░ рдФрд░ рдЕрджреНрднреБрдд рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдореБрдЭреЗ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рдмреАрдЪ, рдореИрдВ рдЕрдкрдирд╛ рдирд┐рд░реНрдгрдп рджреЗ рджреВрдВрдЧрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ рд╕рдХреНрд░рд┐рдп рдореЗрдиреВ рдЖрдЗрдЯрдо рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЯреАрдПрди рдмрдВрдбрд▓ рдореЗрдВ рдЕрдм рдХреЛрдИ рдорд╛рдирдХ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░реЗ рдореЗрдиреВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ:
namespace Acme\BlogBundle\Menu; use Knp\Menu\FactoryInterface; use Knp\Menu\Iterator\CurrentItemFilterIterator; use Knp\Menu\Iterator\RecursiveItemIterator; use Knp\Menu\MenuItem; use Symfony\Component\DependencyInjection\ContainerAware; class Builder extends ContainerAware { public function mainMenu (FactoryInterface $factory, array $options) { $menu = $factory->createItem('root'); $request = $this->container->get('request'); $menu ->addChild('Homepage', array( 'route' => 'homepage', )); $blog = $menu->addChild('Blog', array( 'route' => 'blog' )); $blog->addChild('BlogView',array( 'route' => 'blog_view', 'routeParameters' => array('id' => $request->get('id', 1)), 'display' => false )); return $menu; } public function getCurrentItem (FactoryInterface $factory, array $options) { $menu = $this->mainMenu($factory, $options); $matcher = $this->container->get('knp_menu.matcher'); $voter = $this->container->get('knp_menu.voter.router'); $matcher->addVoter($voter); $treeIterator = new \RecursiveIteratorIterator( new RecursiveItemIterator( new \ArrayIterator(array($menu)) ), \RecursiveIteratorIterator::SELF_FIRST ); $iterator = new CurrentItemFilterIterator($treeIterator, $matcher);
рд╣рдордиреЗ рд╡рд░реНрддрдорд╛рди рдореЗрдиреВ рдЖрдЗрдЯрдо рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реА рд╣реИред рдЕрдм рд╣рдореЗрдВ рдЗрд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ, рд▓рд┐рдЦреЗрдВ:
{% set breadcrumbs = knp_menu_get('AcmeBlogBundle:Builder:getCurrentItem').getBreadcrumbsArray() %} <ul class="breadcrumb"> <li> <i class="icon-home"></i> <a href="{{ path('homepage') }}">Home</a> <span class="icon-angle-right"></span> </li> {% for link in breadcrumbs %} {% if link.label != 'root' %} <li> <a href="{{ link.uri }}">{{ link.label|trans }}</a> {% if not loop.last %} <span class="icon-angle-right"></span> {% endif %} </li> {% endif %} {% endfor %} </ul>
рдпрд╣рд╛рдВ рд╣рдо
getBreadCrumbsArray()
рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдЬреЛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред
рд╢рд╛рдпрдж рдпрд╣реА рд╕рдм рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧреА рдерд╛ред рддреНрд░реБрдЯрд┐рдпрд╛рдВ, рдХреГрдкрдпрд╛ рдкреАрдПрдо рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЪреБрдЪреА рд▓реЗрдЦрдХ рдирд╣реАрдВ, рдЪреБрдЪреА рдбреЗрд╡рд▓рдкрд░ рд╣реИред рд╡рд┐рд╖рдп рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдирд┐рд░реНрдгрдп рдЬреЛрдбрд╝реЗрдВред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред