2012. november 1., csütörtök

Twig dátum összehasonlítása a pillanatnyi idővel

Egy dátumot a pillanatnyi idővel így lehet összehasonlítani twig-ben:

{% if ( testdate|date('U') < "now"|date('U') ) %}
{# do something #}
{% endif %}

Az date('U') timestamp formátumba konvertálja a dátumot, amit már egyszrű összehasonlítani.

2012. október 29., hétfő

Doctrine lifecycle callbacks használata

A symfony-ban lehetőségünk van a Doctryne lifecycle callbacks használatára, amivel olyan függvényeket tudunk létrehozni, amik a mentés előtt, vagy után fussanak le. Lehetőségünk van egy prePersist (), és postPersist() eseményekre feliratkozni, arra azonban figyelni kell, hogy csak akkor futnak le az események, ha valami változott az Entity-ben. Ez azért fontos, mert ha az Entity-ben használunk olyan attribútumot (pl file), amik nem szerepelnek az adatbázisban és csak az az attribútum változik, akkor nem fog lefutni az esemény, pedig lehet, hogy ezt a változót használva változtattunk volna az Entity-n.


Erre az lehet a megoldás, hogy van egy updated mezője ez entity-nek, ami legyen DateTime típusú, és ha válozott az Entity, akkor állítsuk \DateTime("now")-ra, ezzel lefut a változtatás, amikor kell.


Példa a symfony-ban:

http://symfony.com/doc/current/cookbook/doctrine/file_uploads.html


Doctrine:
http://symfony.com/doc/current/cookbook/doctrine/file_uploads.html

Használatát annotation-nel lehet elérni. Kell az entity osztálynak egy HasLifecycleCallbacks annotation:


/**
* @ORM\Table()
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class Attachment

ezenkívül kell egy függvény, ami szeretne feliratkozni egy eseményre:

/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpload()



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");
}

2012. június 28., csütörtök

Itt egy egyszerű alap kód, a symfony2 használatára:

https://github.com/hangyagy/MyCMS/

- php annotation-t használ az entity-knél, ami mostmár támogatottab a yaml-ös változatnál
- van benne form
- a rooting az még yaml-ből megy, azt majd egyszer át kellene írni annotation-re, a controllerbe kellene átteni, valahogy így:

/**
* Page controller.
*
* @Route("/admin/page")
*/
class PageController extends Controller