2015-07-31 2 views
0

У меня есть два объекта с одним или несколькими проектами отношений и прототипом. И я искал способ перечислить прототипы, принадлежащие проекту в действии show. вот мой проект лицо:Соната для администрирования Sonata, манипулировать объектами

<?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') 


; 

} 



} 

Я получаю прототипы (имена)

Но я хотел бы «перечислить» прототипы, принадлежащие проекту, такие как представление списка (имя, описание прототипа ...)

Как это сделать?

ответ

0

Я нашел способ решить проблему b у все же я чувствую, что это не лучший способ я создал контроллер и перекрытый в 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 
    ))); 
    } 
} 

Тогда я получаю список прототипов, которые принадлежат к проекту.

0

Один из способов определить шаблон для prototypes поля в showMapper

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 %} 
+0

Большое спасибо за ваш ответ! Я попытаюсь посмотреть, не решит ли он мою проблему –

 Смежные вопросы

  • Нет связанных вопросов^_^