用实体制作一棵树

时间:2014-04-30 19:05:31

标签: php symfony orm doctrine-orm twig

我从symfony开始,我想像树一样构建我的网站架构,并递归调用一些方法来使用Twig进行渲染。 但我有一个错误,它显示:“ContextErrorException:注意:未定义的索引:D:\ Documents \ site_cdm \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ Internal \ Hydration \ ObjectHydrator.php第269行”中的文本< / p>

当我想知道chidren项目是否有孩子时,会触发此错误。

{% if root.children is not empty %}
    {% for item in root.children %}
        {% if item.children is not empty %}<-- the error is trigged here!
            <li class="dropdown"><a href="{{ path('cdm_site_article_id', { 'id': item.id }) }}" class="dropdown-toggle" data-toggle="dropdown">{{ item.name }}</a>
            {{ include('cdmSiteBundle:Component:menu.html.twig', {'root': item, 'cssClass':"dropdown-menu"}) }} </li>
        {% else %}
           <li><a href="{{ path('cdm_site_article_name', { 'name': item.name }) }}">{{ item.name }}</a></li>
        {% endif %}
    {% endfor %}
{% endif %}

我不能得到item.id但是item.name是。

你能帮帮我吗?)

我对建筑的看法: http://imageshack.com/a/img836/7014/e55d.png

我的数据库的逆向工程: http://imageshack.com/a/img834/4026/ktp3.png

Controller中的buildMenuAction:

class ComponentController extends Controller
{
  public function buildMenuAction()
  {
    $repository = $this->getDoctrine()
        ->getManager()
        ->getRepository('cdmSiteBundle:Category');

    $root = $repository->findOneByName('root');
    echo $root->getId();
    return $this->render('cdmSiteBundle:Component:menu.html.twig', array(
        'root'=>$root,
        'cssClass'=>"nav navbar-nav"
    ));
}

实体模块:

use Doctrine\ORM\Mapping as Orm;
use Doctrine\Common\Collections\ArrayCollection;


/**   
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"category" = "Category", "article" = "Article", "item" = "Item"})
 */
class Module {

/**
 * @ORM\Id
 * @ORM\Column(type="integer", nullable=false)
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;
/**
 * @ORM\ManyToOne(targetEntity="Module", inversedBy="children")
 * @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
 **/
private $parent;

/**
 * @ORM\OneToMany(targetEntity="Module", mappedBy="parent")
 **/
private $children;

public function __construct()
{
    $this->children = new ArrayCollection();
}

实体文章:

    namespace cdm\SiteBundle\Entity;

    use Doctrine\ORM\Mapping as ORM;

    use cdm\SiteBundle\Entity\Module;

/**
 * Article
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="cdm\SiteBundle\Entity\ArticleRepository")
*/
class Article extends Module
{

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="title", type="string", length=255)
 */
private $title;

/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=255)
 */
private $name;

/**
 * @var string
 *
 * @ORM\Column(name="author", type="string", length=255)
 */
private $author;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="createDate", type="date")
 */
private $createDate;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="lastUpdateDate", type="date")
 */
private $lastUpdateDate;

/**
 * @var string
 *
 * @ORM\Column(name="description", type="text", nullable=true)
 */
private $description;

/**
 * @var string
 *
 * @ORM\Column(name="content", type="text", nullable=true)
 */
private $content;


public function __construct()
{
    $this->createDate = new \Datetime(); // Par défaut, la date de l'article est la date d'aujourd'hui
    $this->lastUpdateDate = new \Datetime();
}

2 个答案:

答案 0 :(得分:0)

不要使用直接属性名称,而是使用twig文件中的子项和其他属性的getter

{% if root.getChildren.count > 0 %}
  {% for item in root.getChildren %}
    {% if item.getChildren.count() > 0 %}
        <li class="dropdown"><a href="{{ path('cdm_site_article_id', { 'id': item.getId }) }}" class="dropdown-toggle" data-toggle="dropdown">{{ item.getName }}</a>
        {{ include('cdmSiteBundle:Component:menu.html.twig', {'root': item, 'cssClass':"dropdown-menu"}) }} </li>
    {% else %}
       <li><a href="{{ path('cdm_site_article_name', { 'name': item.getName }) }}">{{ item.getName }}</a></li>
    {% endif %}
  {% endfor %}
{% endif %}

答案 1 :(得分:0)

问题在于buildMenuAction:

public function buildMenuAction()
{
    $repository = $this->getDoctrine()
        ->getManager()
        ->getRepository('cdmSiteBundle:Module');

    $root = $repository->findOneByName('root');

    return $this->render('cdmSiteBundle:Component:menu.html.twig', array(
        'root'=>$root,
        'cssClass'=>"nav navbar-nav"
    ));
}

如果我想获得文章和类别,我必须得到基类。在我写这篇文章之前: - &gt; getRepository(&#39; cdmSiteBundle:Category&#39;)。

现在我需要包含一个界面并限制我的树只显示文章和类别。