2016-01-04 4 views
14

Mam mały problem z niestandardowym Wpisz w polu formularza: Próbuję dodać "ImageType" związane z encji "Obraz", który ma "url" i "alt" jako zmienne.
otrzymuję ten błąd:Dodaj ImageType wewnątrz formularza: "nie można odczytać indeksu ... nie implementuje ArrayAccess"?

nie można odczytać indeks "URL" z obiektu typu "Proxies__CG __ \ OC \ PlatformBundle \ Entity \ obrazu", ponieważ nie wdrożyć \ ArrayAccess.

Oto Typ:

<?php 
// src/OC/PlatformBundle/Form/ImageType.php 

namespace OC\PlatformBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 

class ImageType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
    $builder 
     ->add('url', TextType::class) 
     ->add('alt', TextType::class) 
    ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
    $resolver->setDefaults(array(
     'data_class' => 'OC\PlatformBundle\Entity\Image' 
    )); 
    } 

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

Postać:

class AdvertType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
    $builder 
     ->add('title', TextType::class) 
     ->add('date', DateType::class) 
     ->add('categories', EntityType::class, array(
      'class' => 'OCPlatformBundle:Category', 
      'choice_label' => 'name', 
      'multiple' => true 
     )) 
     ->add('image', ImageType::class) 
     ->add('save', SubmitType::class, array('label' => 'Create Task')) ; 
    } 

a podmiotem:

<?php 

namespace OC\PlatformBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Image 
* 
* @ORM\Table(name="image") 
* @ORM\Entity(repositoryClass="OC\PlatformBundle\Repository\ImageRepository") 
*/ 
class Image 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

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

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


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

    /** 
    * Set url 
    * 
    * @param string $url 
    * 
    * @return Image 
    */ 
    public function setUrl($url) 
    { 
     $this->url = $url; 

     return $this; 
    } 

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

    /** 
    * Set alt 
    * 
    * @param string $alt 
    * 
    * @return Image 
    */ 
    public function setAlt($alt) 
    { 
     $this->alt = $alt; 

     return $this; 
    } 

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

nie mam żadnej tablicy w klasie Obrazek , więc nie jestem pewien, co rzuca problem.

+0

Może być konieczne do wdrożenia 'getParent()' funkcję oznaczać, że chcesz tego, aby przedłużyć 'EntityType 'class (Symfony \ Bridge \ Doctrine \ Form \ Type \ EntityType) –

+0

@JasonRoman Dzięki, redagowałem swój post, dodałem' getParent() 'ale to powoduje błąd. – Paul

+0

Myśląc o tym więcej, nie chciałbyś, aby był to EntityType, ponieważ masz nowy formularz z wieloma polami, a EntityType to tylko jeden wybór, który wybierasz. Czy utworzyłeś szablon Twig dla nowego pola? –

Odpowiedz

30

Otrzymujesz ten błąd, ponieważ Symfony szuka klasy danych Twojego typu formularza, ale nie może jej znaleźć. Twój kod zadziałałby dla wersji Symfony 2.x, gdzie był ważny setDefaultOptions(). Począwszy od Symfony 2.7, ta metoda była deprecated in favor of configureOptions() i całkowicie usunięta w wersji 3.0.

Twoja funkcja istnieje w klasie formularza, ale Symfony nigdy nie będzie się do niej odwoływać. Pasek narzędzi do debugowania może nawet nie pokazywać tego wycofania, ponieważ został całkowicie usunięty w wersji 3.0. Prostsze typy formularzy mogą nie być błędami, jeśli popełnisz ten sam błąd, ale setDefaultOptions() nigdy nie zostanie wywołany, więc przejdę do innych formularzy i sprawdzę, czy są one poprawne.

Jako rozwiązanie, to zmienić:

use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class AdvertType extends AbstractType 
{ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'OC\PlatformBundle\Entity\Image', 
     )); 
    } 
} 

do tego:

use Symfony\Component\OptionsResolver\OptionsResolver; 

class AdvertType extends AbstractType 
{ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'OC\PlatformBundle\Entity\Image', 
     )); 
    } 
} 
+0

Działa również jak amulet, jeśli zmienisz klasę data_class na Image :: klasa – murtho

+0

Prawda, i z nowszą wersją Symfony, która powinna być preferowaną metodą –

Powiązane problemy