2014-11-07 14 views
7

का उपयोग करके संबंधित आइटम जोड़ना मेरे पास सोनाटा एडमिन है और दो मॉडल/एडमिन क्लास परिभाषित के साथ प्रोपेल का उपयोग कर चल रहा है; Portfolio और Image, जहां एक पोर्टफोलियो आइटम में कई छवियां हो सकती हैं।सोनाटा एडमिन और प्रोपेल

मेरे पास ImageAdmin है जो पोर्टफोलियो आइटम से जुड़े चित्रों को अपलोड करने की अनुमति देता है।
PortfolioAdmin में मैं मॉडल फ़ॉर्म मैपर प्रकार का उपयोग कर पोर्टफोलियो आइटम में मौजूदा छवियां जोड़ सकता हूं।

क्या कोई पोर्टफोलियो आइटम जोड़ने/संपादित करते समय छवियों को जोड़ने/हटाने की क्षमता जोड़ने का कोई तरीका है, बल्कि केवल मौजूदा आइटम चुनें, या संबंधित आइटम जोड़ने/निकालने का एक तरीका केवल छवि ऑब्जेक्ट को हटाएं इस समय मेरे लिए मामला है।

मुझे पता है कि मेरे पास पोर्टफोलियो कक्षा के लिए कस्टम एडमिन कंट्रोलर लिखने का विकल्प है, लेकिन क्या इस व्यवहार को प्राप्त करने का एक पूर्व-निर्मित तरीका है?

संदर्भ के लिए, मैंने जो कुछ किया है उसके कुछ कोड अंश;
Schema.xml

<database name="default" namespace="MyBundle\Model" defaultIdMethod="native"> 

    <table name="portfolio"> 
     <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" /> 
     <column name="title" type="varchar" primaryString="1" size="100" /> 
     <column name="description" type="LONGVARCHAR" /> 
     <behavior name="sluggable" /> 
     <behavior name="timestampable" /> 
     <behavior name="archivable" /> 
    </table> 

    <table name="image"> 
     <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" /> 
     <column name="portfolio_id" type="integer" required="true" /> 
     <column name="title" type="varchar" primaryString="1" size="100" /> 
     <column name="path" type="varchar" size="255" /> 
     <column name="description" type="LONGVARCHAR" /> 
     <foreign-key foreignTable="portfolio"> 
      <reference local="portfolio_id" foreign="id"/> 
     </foreign-key> 
     <behavior name="sluggable" /> 
     <behavior name="timestampable" /> 
     <behavior name="archivable" /> 
    </table> 

</database> 

PortfolioAdmin.php

class PortfolioAdmin extends Admin 
{ 

    protected $baseRouteName = 'portfolio'; 
    protected $baseRoutePattern = 'portfolio'; 

    // Fields to be shown on create/edit forms 
    protected function configureFormFields(FormMapper $formMapper) 
    { 
     $formMapper 
      ->add('title', 'text', array('label' => 'Title')) 
      ->add('Images', 'model', array(
        'class' => 'MyBundle\Model\Image', 
         'multiple' => true, 
         'expanded' => true, 
      ), array()) 
      ->add('description', 'text', array('label' => 'Description')) 
     ; 
    } 
} 

ImageAdmin.php

class ImageAdmin extends Admin 
{ 

    protected $baseRouteName = 'image'; 
    protected $baseRoutePattern = 'image'; 

    // Fields to be shown on create/edit forms 
    protected function configureFormFields(FormMapper $formMapper) 
    { 
     $formMapper 
      ->add('title', 'text', array('label' => 'Title')) 
      ->add('portfolio', 'sonata_type_model', array('label' => 'Job')) 
      ->add('description', 'text', array('label' => 'Description')) 
      ->add('file', 'file', array('required' => false)) 
     ; 
    } 
} 

admin.yml

services: 
    sonata.admin.portfolio: 
     class: MyBundle\Admin\PortfolioAdmin 
     tags: 
      - { name: sonata.admin, manager_type: propel, group: "Content", label: "Portfolio" } 
     arguments: 
      - ~ 
      - MyBundle\Model\Portfolio 
      - ~ 
     calls: 
      - [ setTranslationDomain, [MyBundle]] 
    sonata.admin.image: 
     class: MyBundle\Admin\ImageAdmin 
     tags: 
      - { name: sonata.admin, manager_type: propel, group: "Images", label: "Portfolio Image" } 
     arguments: 
      - ~ 
      - MyBundle\Model\Image 
      - ~ 
     calls: 
      - [ setTranslationDomain, [MyBundle]] 

उत्तर

2

आप सादे इस्तेमाल कर सकते हैं पुराना collection फ़ील्ड प्रकार।

को देखते हुए निम्नलिखित ImageType:

class ImageType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('title', 'text'); 
     $builder->add('description', 'textarea'); 
     $builder->add('file', 'file', array('required' => false)); 
    } 

    public function getName() 
    { 
     return 'image'; 
    } 
} 

PortfolioAdmin वर्ग बन जाता है:

class PortfolioAdmin extends Admin 
{ 
    protected $baseRouteName = 'portfolio'; 
    protected $baseRoutePattern = 'portfolio'; 

    // Fields to be shown on create/edit forms 
    protected function configureFormFields(FormMapper $formMapper) 
    { 
     $formMapper 
      ->add('title', 'text', array('label' => 'Title')) 
      ->add('images', 'collection', array(
       'type'   => new ImageType(), 
       'by_reference' => false, 
       'allow_add' => true, 
       'allow_delete' => true, 
      )) 
      ->add('description', 'text', array('label' => 'Description')) 
     ; 
    } 
} 
संबंधित मुद्दे