2012. augusztus 26., vasárnap

Order by megváltoztatása Entity-ben

Alapból a doctrine OneToMany relation esetén order by desc rendezi a kapcsolódó értékeket, ami nem jó, ha például szeretnénk olyat csinálni, hogy listázzuk az elemeket, és a legrégebbit szeretnénk legelőre tenni.

OneToMany relation esetén az Entity-ben a következő módon lehet megadni azt, hogy milyen orderby-al töltse fel a kapcsolódó értékeket:

/**
* @ORM\OneToMany(targetEntity="Article", mappedBy="section")
* @ORM\OrderBy({"id" = "ASC"})
*/
protected $articles;

Ezáltal nem a default order by lesz, ami sok esetben nem a legjobb.

2012. augusztus 4., szombat

Data transformers

Egy izgi dolgot találtam.

Ha szeretnénk egy formba beírt értéket valamilyen másmilyen formába átalakítani mentés előtt, vagy szeretnénk elmenteni egy másik Entity-t, és nem szeretnénk select-et használni amit alapból nem lehet, mert az entity FieldType őse a choice field.

Ilyen esetekben jól jöhetnek a data transformerek, amiben átalakítjuk a felhasználó által megadott adatokat valami másra. ( pl entity esetén id-ból objektumot csinálunk).

Nekem elsőre nem kicsit gányolásnak tűnik, mivel át kell adnunk a saját Type-unknak az entity manager-t, ami elég furcsa.

http://symfony.com/doc/current/cookbook/form/data_transformers.html

Azt mondjuk elfelejtették beleírni, hogy ha a getDefaultOptions által visszaadott tömbben nincs benne az "em" kulcs, akkor kapunk egy exception-t.

Symfony2 és az ajax/json

Symfony2-ben a következő képpen lehet json-ben visszaadni a tartalmat:

public function indexAction()
{
$data = array();
$response = new Response(json_encode($data));
$response->headers->set('Content-Type', 'application/json');
return $response;
}

Entity-ben datetime default értékének now()-ra állítása

Szenvedtem most azzal egy sort, hogy ha van egy Entity-m, aminek van egy datetime típusú mezője, akkor azt hogyan állítsam alapértelmezettben mostra.

A doctrine2 dokumentációjában ez van:
http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/cookbook/working-with-datetime.html

A megoldás symfony-ban az, hogy a construct-orba kell tenni egy alapértéket (aminek DateTime típusúnak kell lennie, now() nem jó). Sajnos annotation-be nem lehet beleírni ezt, pedig jó lenne, ha lehetne.

public function __construct()
{
$this->created = new \DateTime("now");
}