使用symfony3,doctrine2和stofDoctrineExtensionsBundle

时间:2016-11-26 16:52:56

标签: php doctrine-orm tree symfony stofdoctrineextensions

简介

我正在使用:

  • Windows 10 Pro
  • XAMPP with PHP v7.0.9
  • Symfony v3.1.7
  • Doctrine v2.5.4
  • StofDoctrineExtensionsBundle [1]以管理树状结构。

设置

要设置树结构,我在Symfony.com [2]上使用了文档,后面是关于GitHub [3]的文档。然后我继续进行树设置 - 使用示例[4]中的树实体,并使用[5]中的代码创建树。

我确实设置了名为FileTree的树结构(代表目录和文件)。我在树中添加了几个自定义字段:item_nameitem_extensionis_file。已移除title,因为我有item_name ...

我的FileTree实体:

<?php

namespace AppBundle\Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\ManyToOne;
use Doctrine\ORM\Mapping\JoinColumn;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection as ArrayCollection;

/**
 * @Gedmo\Tree(type="nested")
 * @ORM\Table(name="file_tree")
 * use repository for handy tree functions
 * @ORM\Entity(repositoryClass="AppBundle\Repository\FileTreeRepository")
 */
class FileTree
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue
     */
    private $id;

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

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

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

    /**
     * @ORM\Column(type="boolean")
     */
    private $is_file;

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

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

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

    /**
     * @Gedmo\TreeRoot
     * @ORM\ManyToOne(targetEntity="FileTree")
     * @ORM\JoinColumn(referencedColumnName="id", onDelete="CASCADE")
     */
    private $root;

    /**
     * @Gedmo\TreeParent
     * @ORM\ManyToOne(targetEntity="FileTree", inversedBy="children")
     * @ORM\JoinColumn(referencedColumnName="id", onDelete="CASCADE")
     */
    private $parent;

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

    /**
     * @ManyToOne(targetEntity="Project", inversedBy="file_tree")
     * @JoinColumn(name="project_id", referencedColumnName="id")
     */
    private $project;

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

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

    /**
     * Set itemPath
     *
     * @param string $itemPath
     *
     * @return FileTree
     */
    public function setItemPath($itemPath)
    {
        $this->item_path = $itemPath;

        return $this;
    }

    /**
     * Get itemPath
     *
     * @return string
     */
    public function getItemPath()
    {
        return $this->item_path;
    }

    /**
     * Set itemName
     *
     * @param string $itemName
     *
     * @return FileTree
     */
    public function setItemName($itemName)
    {
        $this->item_name = $itemName;

        return $this;
    }

    /**
     * Get itemName
     *
     * @return string
     */
    public function getItemName()
    {
        return $this->item_name;
    }

    /**
     * Set isFile
     *
     * @param boolean $isFile
     *
     * @return FileTree
     */
    public function setIsFile($isFile)
    {
        $this->is_file = $isFile;

        return $this;
    }

    /**
     * Get isFile
     *
     * @return boolean
     */
    public function getIsFile()
    {
        return $this->is_file;
    }

    /**
     * Set lft
     *
     * @param integer $lft
     *
     * @return FileTree
     */
    public function setLft($lft)
    {
        $this->lft = $lft;

        return $this;
    }

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

    /**
     * Set lvl
     *
     * @param integer $lvl
     *
     * @return FileTree
     */
    public function setLvl($lvl)
    {
        $this->lvl = $lvl;

        return $this;
    }

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

    /**
     * Set rgt
     *
     * @param integer $rgt
     *
     * @return FileTree
     */
    public function setRgt($rgt)
    {
        $this->rgt = $rgt;

        return $this;
    }

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

    /**
     * Set root
     *
     * @param \AppBundle\Entity\FileTree $root
     *
     * @return FileTree
     */
    public function setRoot(\AppBundle\Entity\FileTree $root = null)
    {
        $this->root = $root;

        return $this;
    }

    /**
     * Get root
     *
     * @return \AppBundle\Entity\FileTree
     */
    public function getRoot()
    {
        return $this->root;
    }

    /**
     * Set parent
     *
     * @param \AppBundle\Entity\FileTree $parent
     *
     * @return FileTree
     */
    public function setParent(\AppBundle\Entity\FileTree $parent = null)
    {
        $this->parent = $parent;

        return $this;
    }

    /**
     * Get parent
     *
     * @return \AppBundle\Entity\FileTree
     */
    public function getParent()
    {
        return $this->parent;
    }

    /**
     * Add child
     *
     * @param \AppBundle\Entity\FileTree $child
     *
     * @return FileTree
     */
    public function addChild(\AppBundle\Entity\FileTree $child)
    {
        $this->children[] = $child;

        return $this;
    }

    /**
     * Remove child
     *
     * @param \AppBundle\Entity\FileTree $child
     */
    public function removeChild(\AppBundle\Entity\FileTree $child)
    {
        $this->children->removeElement($child);
    }

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

    /**
     * Set project
     *
     * @param \AppBundle\Entity\Project $project
     *
     * @return FileTree
     */
    public function setProject(\AppBundle\Entity\Project $project = null)
    {
        $this->project = $project;

        return $this;
    }

    /**
     * Get project
     *
     * @return \AppBundle\Entity\Project
     */
    public function getProject()
    {
        return $this->project;
    }

    /**
     * toString
     *
     * @return string
     */
    public function __toString()
    {
        return $this->getItemName();
    }

    /**
     * Set itemExtension
     *
     * @param string $itemExtension
     *
     * @return FileTree
     */
    public function setItemExtension($itemExtension)
    {
        $this->item_extension = $itemExtension;

        return $this;
    }

    /**
     * Get itemExtension
     *
     * @return string
     */
    public function getItemExtension()
    {
        return $this->item_extension;
    }
}

问题

我需要按文件类型在树的文件夹中订购文件 - 即:item_extension然后按item_name。目前Gedmo Nestedset Treerootlft排序,如下一个代码块所示。

public function getFileTreeNodeArray($file_tree_root_id)
{
    $em = $this->getEntityManager();

    $query = $em
        ->createQueryBuilder()
        ->select('ft')
        ->from('AppBundle:FileTree', 'ft')
        ->where('ft.root = :root')
        ->setParameter('root', $file_tree_root_id)
        ->orderBy('ft.root, ft.lft', 'ASC')
        ->getQuery();

    $query->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true);
    $build_my_tree = $query->getArrayResult();

    return $build_my_tree;
}

遗憾的是,添加额外的->orderBy('ft.item_extension', 'ASC')并未产生任何结果......

然后我了解到[6]有两个功能可以帮助我完成这项工作reorderAllreorder。我尝试了他们两个,但遗憾的是,物品没有改变他们的订单,他们仍然按rootlft订购。

我的代码来自Upload Listener

$repo_file_tree = $this->entityManager->getRepository('AppBundle:FileTree');
$root_node_id = $repo_file_tree->getFileTreeRootNodeIdByProjectId($selected_node_parent_id);
$root_node = $repo_file_tree->findOneBy(array('id' => $root_node_id));
$repo_file_tree->reorder($root_node, 'item_extension, item_name', 'ASC');
$this->entityManager->flush();

$repo_file_tree = $this->entityManager->getRepository('AppBundle:FileTree');
$repo_file_tree->reorderAll('item_extension, item_name', 'ASC');
$this->entityManager->flush();

问题

如何获得FileTreeitem_extension, item_name排序的reorder项目的数组?

我会对以太正确的Doctrine查询(最好)或解释包含函数reorderAll* { margin: 0px; padding: 0px; } .top-header { width: 100%; height: 40px; background: #FFFFFF; } .top-header>img { float: left; width: 70px; height: 25px; padding-left: 10px; padding-top: 8px; padding-right: 10px; padding-left: 100px; } .signinimg { float: left; border-left: 1px solid #E4E4E4; padding-top: 8px; height: 32px; padding-left: 20px; } .signin { float: left; padding-top: 12px; font-family: Arial, Helvetica, freesans, sans-serif; font-size: 80%; padding-right: 10px; font-weight: bold; padding-right: 100px; } .topnav { float: left; list-style: none; } .topnav>.t1 { height: 40px; width: 60px; border-left: 1px solid #E4E4E4; display: inline-block; text-align: center; } .topnav>.t2 { height: 40px; width: 60px; border-left: 1px solid #E4E4E4; display: inline-block; text-align: center; border-right: 1px solid #E4E4E4; } .topnav>.t1>a { text-decoration: none; color: black; font-family: Arial, Helvetica, freesans, sans-serif; font-weight: bold; font-size: 80%; line-height: 40px; } .topnav>.t2>a { text-decoration: none; color: black; font-family: Arial, Helvetica, freesans, sans-serif; font-weight: bold; font-size: 80%; line-height: 40px; } .topnav>.search { height: 40px; display: inline-block; }的代码块有什么问题感到满意。

结论

我错过了什么?

请告知。

感谢您的时间和知识。

1 个答案:

答案 0 :(得分:0)

刚刚将我的项目更新为Symfony v3.2.0

现在我收到错误

Invalid sort options specified: field - item_extension, item_name, direction - ASC
500 Internal Server Error - InvalidArgumentException

使用上述代码时使用reorder

我不确定它是刚刚发生的(升级后)还是Symfony v3.1.x

无论如何 - 很明显reorder只占用了一个字段来命令树分支。我之前尝试的不是多个字段。

所以答案是:在调用reorder函数时不要使用多个排序字段。

$repo_file_tree = $this->entityManager->getRepository('AppBundle:FileTree');
$root_node_id = $repo_file_tree->getFileTreeRootNodeIdByProjectId($selected_node_parent_id);
$root_node = $repo_file_tree->findOneBy(array('id' => $root_node_id));
$repo_file_tree->reorder($root_node, 'item_extension', 'ASC');
$this->entityManager->flush();
相关问题