Sonata 管理包,操作对象

Posted

技术标签:

【中文标题】Sonata 管理包,操作对象【英文标题】:Sonata admin bundle, manipulate objects 【发布时间】:2015-10-23 00:12:45 【问题描述】:

我有 2 个具有一对多关系项目和原型的实体我一直在寻找一种方法来列出属于 show action 中的项目的原型。 这是我的项目实体:

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Projet
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="AppBundle\Entity\ProjetRepository")
 */

class Projet

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

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

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

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

/**
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\Prototype", mappedBy="projet",cascade="persist" , orphanRemoval=true)
 * @ORM\OrderBy("id"="ASC")
 */
protected $prototypes;


public function __construct()
   
    $this->prototypes = new \Doctrine\Common\Collections\ArrayCollection();
    $this->dateCreation =  new \DateTime("now");


/**
 * Get id
 *
 * @return integer 
 */
public function getId()

    return $this->id;


/**
 * Set nom
 *
 * @param string $nom
 * @return Projet
 */
public function setNom($nom)

    $this->nom = $nom;

    return $this;


/**
 * Get nom
 *
 * @return string 
 */
public function getNom()

    return $this->nom;


public function __toString()

return $this->getNom();


/**
 * Set description
 *
 * @param string $description
 * @return Projet
 */
public function setDescription($description)

    $this->description = $description;

    return $this;


/**
 * Get description
 *
 * @return string 
 */
public function getDescription()

    return $this->description;


/**
 * Set dateCreation
 *
 * @param \DateTime $dateCreation
 * @return Projet
 */
public function setDateCreation($dateCreation)

    $this->dateCreation = $dateCreation;

    return $this;


/**
 * Get dateCreation
 *
 * @return \DateTime 
 */
public function getDateCreation()

    return $this->dateCreation;



public function setPrototypes($prototypes)

if (count($prototypes) > 0) 
    foreach ($prototypes as $i) 
        $this->addPrototypes($i);
    


return $this;


/**
 * Add prototypes
 *
 * @param \AppBundle\Entity\Prototype $prototypes
 * @return Projet
 */
public function addPrototypes(\AppBundle\Entity\Prototype $prototypes)

$this->prototypes[]= $prototypes;
return $this;


public function addPrototype(\AppBundle\Entity\Prototype $prototype)

$prototype->setProjet($this);
$this->prototypes->add($prototype);



/**
 * Remove prototypes
 *
 * @param \AppBunble\Entity\Prototype $prototypes
 */
public function removePrototypes(\AppBundle\Entity\Prototype $prototypes)

$this->prototypes->removeElement($prototypes);




/**
 * Get prototypes
 *
 * @return \Doctrine\Common\Collections\Collection 
 */

public function getPrototypes()

return $this->prototypes;





这是我的原型实体

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Prototype
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="AppBundle\Entity\PrototypeRepository")
 */
class Prototype

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

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


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

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


/**
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Projet", inversedBy="prototypes")
 * @ORM\joinColumn(name="projet_id", referencedColumnName="id")
 */
private $projet;

/**
 * Get id
 *
 * @return integer 
 */
public function getId()

    return $this->id;



/**
 * Get nom
 *
 * @return string 
 */
public function getNom()

    return $this->nom;


public function __toString()

return $this->getNom();


/**
 * Set nom
 *
 * @param string $nom
 * @return Prototype
 */
public function setNom($nom)

    $this->nom = $nom;

    return $this;



/**
 * Set description
 *
 * @param string $description
 * @return Prototype
 */
public function setDescription($description)

    $this->description = $description;

    return $this;


/**
 * Get description
 *
 * @return string 
 */
public function getDescription()

    return $this->description;


/**
 * Set dateCreation
 *
 * @param \DateTime $dateCreation
 * @return Prototype
 */
public function setDateCreation($dateCreation)

    $this->dateCreation = $dateCreation;

    return $this;


/**
 * Get dateCreation
 *
 * @return \DateTime 
 */
public function getDateCreation()

    return $this->dateCreation;





/**
 * Set projet
 *
 * @param \AppBundle\Entity\Projet $projet
 * @return Prototype
 */
public function setProjet(\AppBundle\Entity\Projet $projet = null)

    $this->projet = $projet;

    return $this;


/**
 * Get projet
 *
 * @return \AppBundle\Entity\Projet 
 */
public function getProjet()

    return $this->projet;


在我的 projetAdmin 中,我可以在 ShowAction 中显示原型: 这是 projetAdmin :

<?php


namespace AppBundle\Admin;

use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Show\ShowMapper;
use Sonata\AdminBundle\Route\RouteCollection;


class ProjetAdmin extends Admin
   

protected function configureFormFields(FormMapper $formMapper)

    $formMapper
        ->add('nom', 'text', array('label' => 'Nom'))
        ->add('description','text',array('label'=>'Description'))
        ->add('dateCreation', 'date', array('label' => 'Date de création'))


        ;


protected function configureDatagridFilters(DatagridMapper $datagridMapper)

    $datagridMapper
        ->add('nom')
        ->add('dateCreation')

    ;



protected function configureListFields(ListMapper $listMapper)

    $listMapper

        ->add('nom')
        ->add('description')
        ->add('dateCreation')
        ->add('_action', 'actions', array(
                'actions' => array(
                'show' => array(),
                'edit' => array(),
                'delete' => array(),
            )
        )
        )

    ;




protected function configureShowFields(ShowMapper $showMapper)

    $showMapper

    ->add('prototypes')


;






我得到了原型(名字)

但我想“列出”属于该项目的原型,如列表视图(名称、原型描述...)

我该怎么做?

【问题讨论】:

【参考方案1】:

一种方法是在showMapper 中为prototypes 字段定义模板

protected function configureShowFields(ShowMapper $showMapper)

    $showMapper ->add('prototypes',null, array('template' => 'NamespaceYourBundle::Admin/prototypes.html.twig'));


在你的包资源文件夹中创建Admin文件夹并创建prototypes.html.twig文件,用奏鸣曲的base_show_field.html.twig模板扩展你的树枝模板,并在% block field %中定义你自己的标记循环所有相关原型

% extends 'SonataAdminBundle:CRUD:base_show_field.html.twig' %
% block field %
    % spaceless %
        % if object.getPrototypes() is not empty %
            <table class="table table-bordered table-striped">
            <thead>
            <tr class="sonata-ba-list-field-header">
            <th class="sonata-ba-list-field-header-text">Nom</th>
            <th class="sonata-ba-list-field-header-text">Description</th>
                ...
                ...
                ...
            </tr>
            </thead>
            <tbody>
            % for prototype in object.getPrototypes() %
            <tr>
                <td class="sonata-ba-list-field sonata-ba-list-field-text"> prototype.getNom() </td>
                <td class="sonata-ba-list-field sonata-ba-list-field-text"> prototype.getDescription() </td>
                ...
                ...
                ...
            </tr>
            % endfor %
            </tbody>
            </table>
        % endif %
    % endspaceless %
% endblock %

【讨论】:

非常感谢您的回答!我会尝试看看它是否能解决我的问题【参考方案2】:

我找到了解决问题的方法,但我仍然觉得这不是更好的方法 我创建了一个控制器并覆盖了 showAction

<?php


namespace AppBundle\Controller;


use Sonata\AdminBundle\Route\RouteCollection;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Sonata\AdminBundle\Controller\CRUDController as Controller;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class CRUDController extends Controller


    public function showAction($id = null)
    
        return $this->redirect($this->generateUrl('admin_app_prototype_list', array(
        'filter[projet__id][value]'=>$id
    )));
    

然后我得到一个属于某个项目的原型列表。

【讨论】:

以上是关于Sonata 管理包,操作对象的主要内容,如果未能解决你的问题,请参考以下文章

Sonata 管理包:无法删除与 sonata_type_admin 的关系

Sonata 管理包,如何使用实体存储库类

一个 Symfony 应用程序中的两个 Sonata 管理面板包

Symfony 2.1 Sonata 管理包 OneToMany

在 symfony2 sonata 管理包中设置默认值

在 symfony sonata 管理包的不同子菜单中拆分域