Paweł Nowicki

Paweł Nowicki Project Manager,
Programista PHP

Temat: Instalacja SonataAdminBundle - Neither the property

Witam, próbuję dostosować Symfony 2.3.7 do swoich potrzeb. Zainstalowałem FOSUserBundle bez problemów. Jednak z Sonatą już nie jest tak pięknie. Wykonując wszystkie punkty z http://sonata-project.org/bundles/admin/master/doc/ref... doszedłem do punktu 2.4 w którym jest napisane że po wejściu w admin/dashboard zobaczę prosty panel do zarządzania i rzeczywiście - prosty panel jest ale po kliknięciu na "Add new" dostaję komunikat:
Neither the property "title" nor one of the methods "getTitle()", "isTitle()", "hasTitle()", "__get()" exist and have public access in class "Acme\DemoBundle\Entity\Post".

Co mogłem źle zrobić (lub wcale nie zrobić) że dostaję taki komunikat ?
Dodam że w bazie posiadam posiadam tylko tabelę fos_user, po instalacji Sonaty nie powinienem mieć więcej tabel ?

Z góry dzięki
Pozdrawiam

konto usunięte

Temat: Instalacja SonataAdminBundle - Neither the property

Przecież odpowiedź jest w błędzie. Twoja klasa `Post` nie ma żadnej z wymienionych funkcji, a co za tym idzie Symfony nie może zbudować dla niej formularza.

Dodaj do tejże klasy `Post` metody: getTitle() + setTitle(), będzie ok (pod warunkiem że to jedyne pola w formularzu zależne od klasy, jeśli nie, powtórz czynność analogicznie jak z `title`).

Polecam zapoznanie się z dokumentacją formularzy Symfony: http://symfony.com/doc/current/book/forms.htmlTen post został edytowany przez Autora dnia 03.12.13 o godzinie 19:00
Paweł Nowicki

Paweł Nowicki Project Manager,
Programista PHP

Temat: Instalacja SonataAdminBundle - Neither the property

Idąc dalej do celu pojawia się kolejny błąd: Notice: Undefined index: title in /home/shutter/projekt/vendor/sonata-project/doctrine-orm-admin-bundle/Sonata/DoctrineORMAdminBundle/Guesser/FilterTypeGuesser.php line 64

Z tego wynika że nie mam zdefiniowanej zmiennej 'title' lecz w pliku Acme/DemoBundle/Entity/Post.php taka zmienna jest:
namespace Acme\DemoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Post
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Acme\DemoBundle\Entity\PostRepository")
*/
class Post
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
private $title;
private $author;
private $body;

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

public function getTitle()
{
return $this->title;
}

public function setTitle($title)
{
$this->title = $title;
}

// Reszta funkcji set i get
}

Dlaczego więc wyrzuca błąd ?
Piotr W.

Piotr W. Symfony2 / MongoDB

Temat: Instalacja SonataAdminBundle - Neither the property

Czy chcesz mieć pola '$title, $author, $body' zapisywane w bazie danych? W takim wypadku musisz zdefiniować je jako kolumny ORM tak samo jak masz nad $id. Jeśli nie to w formularzu musisz wyłączyć te pola za pomocą 'mapped => false' w opcjach. ;)
Paweł Nowicki

Paweł Nowicki Project Manager,
Programista PHP

Temat: Instalacja SonataAdminBundle - Neither the property

Ok dzięki, a teraz pytanie na temat czysto wizualny. Mając taki kod:

/**
* @var string
*
* @Assert\Length(
* min = "4",
* max = "50",
* minMessage = "Podaj conajmniej {{ limit }} znakow",
* maxMessage = "Nie wiecej niz {{ limit }} znakow")
*/
protected $username;


i po wpisaniu w formularzu niepoprawnej wartości (3 znaki) pole podświetla się na czerwono lecz zamiast mojego zdefiniowanego napisu pojawia się napis:
Proszę wprowadzić dane w żądanym formacie.


Domyślam się że działa domyślna walidacja pól - jak ją wyłączyć całkowicie (ew tylko dla tego pola) ?
Sebastian Błaszczak

Sebastian Błaszczak Programista Symfony,
Symfony2

Temat: Instalacja SonataAdminBundle - Neither the property

To jest walidacja po stronie użytkownika, nie korzystam z sonaty ale aby wyłączyć walidację dla pola wystarczy w formularzu dodać: "required=> false"

namespace ACME\DemoBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;


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

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'ACME\DemoBundle\Entity\Book'
));
}

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

}


Z dokumentacji bundla wynika że można zobić to podobnie jak wyżej: http://sonata-project.org/bundles/doctrine-orm-admin/m...

Można też dodać atrybut: "novalidate" do formularza co całkowicie wyłączy dla niego walidację.
Paweł Nowicki

Paweł Nowicki Project Manager,
Programista PHP

Temat: Instalacja SonataAdminBundle - Neither the property

Mam niestety kolejny problem. Próbuję dodać opcję wgrania obrazka bezpośrednio podczas rejestracji (z możliwością jego późniejszej zmiany ale nie o to mi teraz chodzi) korzystając ze standardowego formularza FOSUserBundle. Modyfikuje w tym celu pliki z folderu /vendor (tak, wiem, tych plików nie powinno się modyfikować ale chce tylko zrobić ten upload obrazka tak aby działał i później zająć się nadpisywaniem formularza):
/vendor/friendsofsymfony/user-bundle/FOS/UserBundle/Form/Type/RegistrationFormType.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('username', null, array('label' => 'form.username', 'translation_domain' => 'FOSUserBundle'))
->add('email', 'email', array('label' => 'form.email', 'translation_domain' => 'FOSUserBundle'))
->add('name', null, array('label' => 'Imię:', 'translation_domain' => 'FOSuserBundle'))
->add('plainPassword', 'repeated', array(
'type' => 'password',
'options' => array('translation_domain' => 'FOSUserBundle'),
'first_options' => array('label' => 'form.password'),
'second_options' => array('label' => 'form.password_confirmation'),
'invalid_message' => 'fos_user.password.mismatch',))
->add('avatar', 'file', array('label' => 'Avatar'));}


/src/Acme/DemoBundle/Entity/User.php

/**
* @ORM\Column(type="string", length=255)
*
*/
public $avatar;

public function getName()
{
return $this->name;
}

public function setName($name)
{
$this-> name = $name;
}

public function getAvatar()
{
return $this->avatar;
}

public function setAvatar($avatar)
{
$this->avatar = $avatar;
}

/**
* @Assert\File(maxSize="6000000")
*/
public $file;

public function getUploadRootDir()
{
return __DIR__.'/../../../../web/'.$this->getUploadDir();
}

protected function getUploadDir()
{
return 'uploads/avatars';
}


I teraz moje pytanie: Gdzie (plik/funkcja) umieścić ten kod:


if ($form->isValid()) {
$someNewFilename = '1.jpg';

$form['attachment']->getData()->move($dir, $someNewFilename);
}

żeby przenieść obrazek do jakiegoś folderu ? Bo niestety ale zamotałem się trochę z tym.

Następna dyskusja:

instalacja z PEAR - skaszan...




Wyślij zaproszenie do