knpmenubundle を使用してメニューを作成しました。これは非常にうまく機能しており、データベースから動的にナビゲーションを取得しています。ただし、クライアントはサブメニューを追加したいと考えています。子ページを見つけるコントローラーを作成しましたが、正しい親の下のサブナビゲーションにそれらをアタッチする方法がわかりません。現時点では、現在の要素のコピーを自分自身に子ノードとしてアタッチします。
メニュービルダーは次のとおりです。
$sector = $options['sector'];
$em = $this->getDoctrine()->getManager();
$navItems = $this->getDoctrine()
->getRepository('acmeStyleGuideBundle:pageSector')
->findBySectorJoinedToUrl($sector);
if (!$navItems) throw $this->createNotFoundException('Unable to find any matching pages');
$menu = $factory->createItem('root');
foreach ($navItems as $nav)
{
// Doesn't have any parents, This is a top level
$parent = $menu->addChild($nav->getPageName(), array(
'route' => 'acme_style_guide_pages_show',
'routeParameters' => array(
'sector' => $sector,
'pageUrl' => $nav->getPageUrl()
)
));
$parent->addChild($nav->getPageName(), array(
'route' => 'acme_style_guide_pages_show_sub',
'routeParameters' => array(
'sector' => $sector,
'pageParent' => $nav->getPageName(),
'pageUrl' => $nav->getPageUrl()
))
);
}
親要素のコントローラーは次のとおりです。
// Render pages from database
public function showAction($sector, $pageUrl)
{
$em = $this->getDoctrine()->getManager();
$pages = $this->getDoctrine()
->getRepository('acmeStyleGuideBundle:PageContent')
->findByUrlJoinedToSector($sector, $pageUrl);
if (!$pages) throw $this->createNotFoundException('Unable to find any matching pages');
return $this->render(
'acmeStyleGuideBundle:Page:pages.html.twig',
array(
'Pages' => $pages,
'sector' => $sector
)
);
}
子要素のコントローラーは次のとおりです。
// Render sub pages from database
public function showSubAction($sector, $pageParent, $pageUrl)
{
$em = $this->getDoctrine()->getManager();
$pages = $this->getDoctrine()
->getRepository('acmeStyleGuideBundle:PageContent')
->findByUrlJoinedToSectorAndParent($sector, $pageParent, $pageUrl);
if (!$pages) throw $this->createNotFoundException('Unable to find any matching pages');
return $this->render(
'acmeStyleGuideBundle:Page:pages.html.twig',
array(
'Pages' => $pages,
'sector' => $sector
)
);
}
これらのコントローラはどちらも、カスタム リポジトリ クラスを使用してデータベースから情報を取得します。
カスタム リポジトリ コードは次のとおりです。
public function findByUrlJoinedToSector($sector, $pageUrl)
{
$query = $this->getEntityManager()
->createQuery('
SELECT p, s FROM acmeStyleGuideBundle:PageContent p
JOIN p.pageSector s
LEFT JOIN p.pageTypes t
WHERE p.pageUrl = :url
AND s.sectorName = :sector
AND t.typeName != :type'
)
->setParameter('url', $pageUrl)
->setParameter('sector', $sector)
->setParameter('type', 'Section Headers');
try {
return $query->getResult();
} catch (\Doctrine\ORM\NoResultException $e) {
return null;
}
}
public function findByUrlJoinedToSectorAndParent($sector, $pageParent, $pageUrl)
{
$query = $this->getEntityManager()
->createQuery('
SELECT p, s, c FROM acmeStyleGuideBundle:PageContent p
JOIN p.pageSector s
LEFT JOIN p.pageTypes t
LEFT JOIN p.PageParent c
WHERE p.pageUrl = :url
AND s.sectorName = :sector
AND c.pageUrl = :parent
AND t.typeName != :type'
)
->setParameter('url', $pageUrl)
->setParameter('sector', $sector)
->setParameter('parent', $pageParent)
->setParameter('type', 'Section Headers');
try {
return $query->getResult();
} catch (\Doctrine\ORM\NoResultException $e) {
return null;
}
}
月曜日の朝の問題かもしれないので、自分で解決しようとし続けます。そうする場合は、回答としてここに投稿します。
追加情報
更新されたビルダー // 親を持つすべてのアイテムを検索します。次に、見つかったアイテムをその親にアタッチします。$subNavItems = $this->getDoctrine() ->getRepository('acmeStyleGuideBundle:pageSector') ->findSubNav($sector, $nav->getPageParent());
// loop over them and add a link for each one:
foreach ($subNavItems as $child) {
if ($child->getPageParent() != NULL) {
$parent->addChild($child->getPageName(), array(
'route' => 'acme_style_guide_pages_show_sub',
'routeParameters' => array(
'sector' => $sector,
'pageParent' => $child->getPageName(),
'pageUrl' => $child->getPageUrl()
)
)
);
}
}
}
出力しています:
<ul>
<li><a href="link">Target Item</a></li>
<li><a href="link">Item</a></li>
<li><a href="link">Item</a></li>
<li><a href="link">Child</a>
<ul>
<li><a href="link">Child</a></li>
</ul>
</li>
</ul>
私はそれを出力する必要がありますが:
<ul>
<li><a href="link">Target Item</a>
<ul>
<li><a href="link">Child</a></li>
</ul>
</li>
<li><a href="link">Item</a></li>
<li><a href="link">Item</a></li>
<li><a href="link">Child</a></li>
</ul>
これは PageContent テーブルのスキーマです
<database name="styleguide">
<!-- Table PageContent -->
<table name="PageContent">
<column name="id">1</column>
<column name="pageTypesId">2</column>
<column name="pageName">Text Elements</column>
<column name="pageUrl">text-elements</column>
<column name="richText"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p><p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p></column>
<column name="PageParent">NULL</column>
</table>
<table name="PageContent">
<column name="id">2</column>
<column name="pageTypesId">2</column>
<column name="pageName">Buttons</column>
<column name="pageUrl">buttons</column>
<column name="richText"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p><p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p></column>
<column name="PageParent">NULL</column>
</table>
<table name="PageContent">
<column name="id">3</column>
<column name="pageTypesId">2</column>
<column name="pageName">Forms</column>
<column name="pageUrl">forms</column>
<column name="richText"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p><p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p></column>
<column name="PageParent">NULL</column>
</table>
<table name="PageContent">
<column name="id">4</column>
<column name="pageTypesId">2</column>
<column name="pageName">Lists</column>
<column name="pageUrl">lists</column>
<column name="richText"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p><p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p></column>
<column name="PageParent">NULL</column>
</table>
<table name="PageContent">
<column name="id">5</column>
<column name="pageTypesId">2</column>
<column name="pageName">Tables</column>
<column name="pageUrl">tables</column>
<column name="richText"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p><p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p></column>
<column name="PageParent">NULL</column>
</table>
<table name="PageContent">
<column name="id">6</column>
<column name="pageTypesId">2</column>
<column name="pageName">Search Box</column>
<column name="pageUrl">search-box</column>
<column name="richText"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p><p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p></column>
<column name="PageParent">NULL</column>
</table>
<table name="PageContent">
<column name="id">7</column>
<column name="pageTypesId">2</column>
<column name="pageName">Pods</column>
<column name="pageUrl">pods</column>
<column name="richText"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p><p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p></column>
<column name="PageParent">NULL</column>
</table>
<table name="PageContent">
<column name="id">8</column>
<column name="pageTypesId">3</column>
<column name="pageName">Business</column>
<column name="pageUrl">business</column>
<column name="richText"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p><p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p></column>
<column name="PageParent">NULL</column>
</table>
<table name="PageContent">
<column name="id">9</column>
<column name="pageTypesId">3</column>
<column name="pageName">Residential</column>
<column name="pageUrl">residential</column>
<column name="richText"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p><p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p></column>
<column name="PageParent">NULL</column>
</table>
<table name="PageContent">
<column name="id">10</column>
<column name="pageTypesId">1</column>
<column name="pageName">Paragraphs</column>
<column name="pageUrl">paragraphs</column>
<column name="richText"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p><p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p></column>
<column name="PageParent">1</column>
</table>
</database>