0

私は、サイト上のすべてのページをまとめて、それらのページを子 (ある場合) と一緒に表示するページを作成しようとしています。

これまでのところ、すべてのトップ レベルのページをループして表示することができましたが、子ページを適切な場所に表示するのに苦労しています。それらを取得して最後に表示するか、まったく取得しないようにすることができるようです。

次のようにする必要があります。

<div id="parent" class="guide-item">
    <h2>Parent</h2>
    <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>
    <div id="child" class="guide-item">
        <h2>Child</h2>
        <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>
    </div>
</div>

これが私のコントローラーです(子をループさせる試みを含む:

// Render pages from database
public function sectorAction($sector)
{
    $em = $this->getDoctrine()->getManager();
    $pages = $this->getDoctrine()
    ->getRepository('acmeStyleGuideBundle:pageSector')
    ->findBySectorJoinedToUrlTopLevel($sector);

    if (!$pages) throw $this->createNotFoundException('Unable to find any matching sectors');

    foreach ($pages as $page) {
        if ($page->getChildPages()) {
            $children = $this->getDoctrine()
                ->getRepository('acmeStyleGuideBundle:pageContent')
                ->findBySectorAndParent($sector, $page->getPageUrl());
        }
    }

    return $this->render(
        'acmeStyleGuideBundle:Page:pages.html.twig', 
        array(
            'Pages' => $pages,
            'Children' => $children,
            'header' => $sector
        )
    );
}

関連するリポジトリは次のとおりです。

public function findBySectorJoinedToUrlTopLevel($sector)
{
    $query = $this->getEntityManager()
        ->createQuery('
            SELECT p, s FROM acmeStyleGuideBundle:PageContent p
            JOIN p.pageSector s
            LEFT JOIN p.pageTypes t
            WHERE s.sectorName = :sector
            AND t.typeName != :type
            AND p.parentPage IS NULL'
        )
        ->setParameter('type', 'Section Headers')
        ->setParameter('sector', $sector);

    try {
        return $query->getResult();
    } catch (\Doctrine\ORM\NoResultException $e) {
        return null;
    }
}

    public function findBySectorAndParent($sector, $pageParent)
{
    $query = $this->getEntityManager()
        ->createQuery('
            SELECT p, s, c FROM acmeStyleGuideBundle:PageContent p
            JOIN p.pageSector s
            LEFT JOIN p.pageTypes t
            LEFT JOIN p.parentPage c
            WHERE s.sectorName = :sector
            AND p.pageUrl = :parent
            AND t.typeName != :type'
        )
        ->setParameter('sector', $sector)
        ->setParameter('parent', $pageParent)
        ->setParameter('type', 'Section Headers');

    try {
        return $query->getResult();
    } catch (\Doctrine\ORM\NoResultException $e) {
        return null;
    }
}

そして、コードを出力したい私の小枝テンプレートは次のとおりです。

{% extends 'acmeStyleGuideBundle::landing.html.twig' %}
{% block definition %}
    <article class="js-load pageLoad">
        <h1>
            {% if header is defined %}
                {{ header | title }}
            {% else %}
                {{ Pages[0].pageName }}
            {% endif %}
        </h1>
        {% for pe in Pages %}
            <div id="{{ pe.pageUrl | lower}}" class="guide-item">
                <h2>{{ pe.pageName }}</h2>
                {{ pe.richText | raw }}
            </div>
        {% endfor %}
    </article>
{% endblock %}

コントローラーで子をループして、「ページ」ではなく「子」として小枝テンプレートに適用できたのではないかと思いましたが、次のコードが最後のコードを常に繰り返しているため、うまくいかないようでした子ページではなかったデータベース内の要素:

{% for ce in Children %}
    <div class="childPage">
        <div id="{{ ce.pageUrl | lower}}" class="guide-item">
            <h2>{{ ce.pageName }}</h2>
            {{ ce.richText | raw }}
            <div class="explanation">
                <div class="card active">
                    <h3>Example</h3>
                    {# ce.example | raw#}
                </div>
                <div class="card">
                    <h3>Code Example</h3>
                    <pre name="code" class="{#ce.lang#}">{# ce.example #}</pre>
                </div>
            </div>
        </div>
    </div>
{% endfor %}

私はこの問題をしばらく見てきたので、おそらく木に木が見えなくなったので、自由にコードをバラバラにしてください。いずれにせよ、私は symfony/twig/doctrine の学習者なので、気になるフィードバックがあれば喜んでお受けします。

4

1 に答える 1

0

私は解決策を見つけることができました。

1 つのコントローラーとテンプレートですべてを実行しようとする代わりに、という名前の新しいテンプレートを作成し、次のchildpages.html.twigコードを挿入しました。

{% for pe in Pages %}
        <div id="{{ pe.pageUrl | lower}}" class="guide-item child">
            <h2>{{ pe.pageName }}</h2>
            {{ pe.richText | raw }}
            {{ render(controller('acmeStyleGuideBundle:Page:findCodeExamples', { 'pageParent': pe.codeExample })) }}
        </div>
{% endfor %}

次に、新しいコントローラーを作成しました。

    // Render children from database (Similar to showSubAction but without the $pageUrl requirement)
    public function findChildrenAction($pageParent, $sector)
    {
        $em = $this->getDoctrine()->getManager();
        $pages = $this->getDoctrine()
        ->getRepository('acmeStyleGuideBundle:PageSector')
        ->findBySectorJoinedToParent($sector, $pageParent);
        return $this->render(
            'acmeStyleGuideBundle:Page:childPages.html.twig', 
            array(
                'Pages' => $pages,
                'sector' => $sector
            )
        );
    }

元のテンプレートに表示するために必要な場所でそれを参照しました。

{{ 
    render(controller('acmeStyleGuideBundle:Page:findChildren', { 
        'pageParent': pe.id, 
        'sector': 'residential'
    }))
}}

それが最もエレガントなソリューションかどうかはわかりませんが、うまくいきました。

于 2013-10-01T13:50:55.667 に答える