1

私は Symfony2 と Twig を使用しています。Doctrine で階層データを処理するように設定されたテーブルがあります。親→子→サブチャイルド→サブサブチャイルド…など、バリエーション豊富なカテゴリ一覧です。

そのようにページに表示することはできますが、問題は、どの要素がどの親または子または子子などに属しているかを示す「インデント」がないことです.

 <table class="table" id="tableList">
            <thead>
            <tr>
                <th>Category Name</th>
            </tr>
            </thead>
            <tbody>
            {% for productCategory in productCategories %}
                <tr>
                    <td>{{ productCategory.name }}</td>
                </tr>
            {% endfor %}
            </tbody>
        </table>

リストを次のようにしたいと思います。

 Parent 
      Child
           Child
 Parent
      Child
 Parent
      Child
           Child
                Child

このような代わりに:

 Parent
 Child
 Child
 Child
 Parent
 Child
 Parent
 etc.
 etc.

元の実体:

 <?php

 namespace WIC\ProductCategoryBundle\Entity;

 use Doctrine\ORM\Mapping as ORM;
 use Doctrine\Common\Collections\ArrayCollection;
 use Gedmo\Mapping\Annotation as Gedmo;
 use WIC\CommonBundle\DoctrineExtensions\Mapping\Annotation as Common;
 use Symfony\Component\Validator\Constraints as Assert;


 /**
  * ProductCategory
  *
  * @ORM\Table()
  * @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
  * @Gedmo\Tree(type="nested")
  * @Common\Loggable(logEntryClass="WIC\ProductCategoryBundle\Entity\ProductCategoryLog")
  * @Common\Accountable
  * @Gedmo\SoftDeleteable(fieldName="deletedAt")
  */
 class ProductCategory
 {
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 * @ORM\Column(name="name", type="string", length=255, nullable=false)
 * @Common\Versioned
 * @Assert\NotBlank(message="Location Name Cannot Be Left Blank.")
 */
protected $name;

/**
 * @Gedmo\TreeLeft
 * @ORM\Column(name="lft", type="integer")
 */
protected $lft;

/**
 * @Gedmo\TreeLevel
 * @ORM\Column(name="lvl", type="integer")
 */
protected $lvl;

/**
 * @Gedmo\TreeRight
 * @ORM\Column(name="rgt", type="integer")
 */
protected $rgt;

/**
 * @Gedmo\TreeRoot
 * @ORM\Column(name="root", type="integer", nullable=true)
 */
protected $root;

/**
 * @Gedmo\TreeParent
 * @ORM\ManyToOne(targetEntity="ProductCategory", inversedBy="children")
 * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="SET NULL")
 */
protected $parent;

/**
 * @ORM\OneToMany(targetEntity="ProductCategory", mappedBy="parent")
 * @ORM\OrderBy({"lft" = "ASC"})
 */
protected $children;

/**
 * @ORM\ManyToMany(targetEntity="WIC\ProductBundle\Entity\Product", mappedBy="productCategories", cascade={"persist"})
 */
protected $products;

/**
 * @ORM\ManyToOne(targetEntity="WIC\UserBundle\Entity\User")
 * @ORM\JoinColumn(name="created_by", referencedColumnName="id")
 * @Common\Blameable(on="create")
 */
private $createdBy;

/**
 * @ORM\ManyToOne(targetEntity="WIC\UserBundle\Entity\User")
 * @ORM\JoinColumn(name="updated_by", referencedColumnName="id")
 * @Common\Blameable(on="update")
 */
private $updatedBy;

/**
 * @ORM\ManyToOne(targetEntity="WIC\AccountBundle\Entity\Account", inversedBy="productCategorys", cascade={"remove","persist"})
 * @ORM\JoinColumn(name="account_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
 * @Common\Versioned
 * @Common\Blameable(on="create")
 */
protected $account;


/**
 * @var datetime $created
 *
 * @Common\Timestampable(on="create")
 * @ORM\Column(type="datetime")
 */
private $created;

/**
 * @var datetime $updated
 *
 * @Common\Timestampable(on="update")
 * @ORM\Column(type="datetime", nullable=true)
 */
protected $updated;

/**
 * @ORM\Column(name="deletedAt", type="datetime", nullable=true)
 */
private $deletedAt;


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


/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set name
 *
 * @param string $name
 * @return ProductCategory
 */
public function setName($name)
{
    $this->name = $name;

    return $this;
}

/**
 * Get name
 *
 * @return string 
 */
public function getName()
{
    return $this->name;
}


public function setLvl(ProductCategory $lvl = null)
{
    $this->lvl = $lvl;
}

public function getLvl()
{
    return $this->lvl;
}


public function setParent(ProductCategory $parent = null)
{
    $this->parent = $parent;
}

public function getParent()
{
    return $this->parent;
}

/**
 * Set account
 *
 * @param \WIC\AccountBundle\Entity\Account $account
 * @return User
 */
public function setAccount(\WIC\AccountBundle\Entity\Account $account = null)
{
    $this->account = $account;

    return $this;
}


/**
 * Get account
 *
 * @return \WIC\AccountBundle\Entity\Account
 */
public function getAccount()
{
    return $this->account;
}

/**
 * Add product
 *
 * @param \WIC\ProductBundle\Entity\Product $product
 * @return Product
 */
public function addProduct(\WIC\ProductBundle\Entity\Product $product)
{
    $this->products[] = $product;

    return $this;
}

/**
 * Remove product
 *
 * @param \WIC\ProductBundle\Entity\Product $product
 */
public function removeProduct(\WIC\ProductBundle\Entity\Product $product)
{
    $this->products->removeElement($product);
}

/**
 * Set products
 *
 * @return Product
 */
public function setProducts($products)
{
    $this->products = $products;

    return $this;
}

/**
 * Get products
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getProducts()
{
    return $this->products;
}

/**
 * Set updated
 *
 * @param \DateTime $updated
 * @return User
 */
public function setUpdated($updated)
{
    $this->updated = $updated;

    return $this;
}

/**
 * Get updated
 *
 * @return \DateTime
 */
public function getUpdated()
{
    return $this->updated;
}

/**
 * Set deletedAt
 *
 * @param \DateTime $deletedAt
 * @return User
 */
public function setDeletedAt($deletedAt)
{
    $this->deletedAt = $deletedAt;

    return $this;
}

/**
 * Get deletedAt
 *
 * @return \DateTime
 */
public function getDeletedAt()
{
    return $this->deletedAt;
}

public function getOptionLabel()
{
    return str_repeat(
            html_entity_decode('&nbsp;', ENT_QUOTES, 'UTF-8'),
            ($this->getLvl() + 0 ) * 3
    ) . $this->getName();
}


}

これを達成する方法を知っている人はいますか?

本当にありがとう!

4

2 に答える 2

4

ブラウザのデフォルトのユーザーエージェントスタイルシートによって自動的にインデントされるため、順序なしリストを使用するとインデントがはるかに簡単になります。これはそれを行う必要があります:

このメソッドを ProductCategory エンティティに追加します。

public function getChildren() {
    return $this->children;
}

そしてこれはあなたの小枝テンプレートにあります

{% for productCategory in productCategories %}
    {{ _self.display_tree(productCategory) }}
{% endfor %}

{% macro display_tree(level) %}
    <ul>
        <li>{{ level.name }}
        {% if level.children|default() %}
            {% for child in level.children %}
                {{ _self.display_tree(child) }}
            {% endfor %}
        {% endif %}
        </li>
    </ul>
{% endmacro %}
于 2013-10-17T20:12:33.100 に答える
0

以前の回答を少しアップグレードします。

<ul>
{% for productCategory in productCategories %}
    {{ _self.display_tree(productCategory) }}
{% endfor %}
</ul>

{% macro display_tree(level) %}
    <li>{{ level.name }}
    {% if level.children|default() %}
        <ul>
        {% for child in level.children %}
            {{ _self.display_tree(child) }}
        {% endfor %}
        </ul>
    {% endif %}
    </li>
{% endmacro %}

これにより、見栄えの良い html が構築されます。

于 2014-03-19T11:59:19.083 に答える