2012. november 1., csütörtök
Twig dátum összehasonlítása a pillanatnyi idővel
{% 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
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
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
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
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
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