Jak na výpočet a zobrazení věku dle data narození?
- Marek Šneberger
- Člen | 130
Proč bys to počítal až v šabloně, když ti to může spočítat rovnou databáze? Pokud teda nepoužíváš entity.
- Pavel Kravčík
- Člen | 1196
Proč bys to počítal až v šabloně, když ti to může spočítat entity, pokud teda používáš entity.
- leninzprahy
- Člen | 150
filtr třeba…
$template->addFilter('age', function (\DateTime $date) {
return floor((time() - $date->getTimestamp()) / (60 * 60 * 24 * 365.24219));
});
- Oli
- Člen | 1215
ORM. Entita je třída, která drží stav nějakého objektu, který je
typicky natažený z databáze. Takže můžeš mít třeba třídu User,
která má property name, age, address, … no a z databáze se to všechno
vytáhne a namapuje na tu třídu. Ty potom teda voláš například
(new User)->setName('Pepa')->setAddress('Z depa')
. Prostě
pracuješ s databází jako s objekty.
Pro tebe bude asi nejjednodušší počítat to v db. Pokud to budeš potřebovat častěji, tak si napsat ten filter.
- Šaman
- Člen | 2666
Počítat to v db není dobré, pokud k tomu nemáš hodně dobrý důvod (třeba že bys podle věku chtěl řadit už na urovni db – to lze ale obejít řazením podle data narození). Není dobré drobit výpočty, takže pokud máš všechno v modelu, měj tam opravdu všechno.
Nette na to má filtry. Pokud používáš ORM, tak ten věk vrací už
samotná entita. A pokud bys nechtěl použít ani jedno z toho, pořád si
můžeš napsat nějakou pomocnou třídu se statickou metodou
countAge($birthDate)
, případně třeba i
isBirthday(birthDate)
, pokud bys takovou informaci potřeboval.
- Croc
- Člen | 270
Díky za rady.
Jinak ono to bude trochu „složitější“ funkce, než jen vypočítání věku. Potřeboval bych na vstupu 2 parametry.
Výstup by byl:
- Dostupné oba datumy – počet let/měsíců mezi.
- Pouze jeden datum – počet let/měsíců mezi k aktuálnímu datu.
- Pokud v bodu 2 bude věk větší než X, vrátí prázdný řetězec.
Toto bude využíváno na více místech, takže by použití filtru nebylo špatné.
Když budu mít vlastní filtr age, budu moci zapsat toto? (v některých případech bude date2 NULL:
Věk: {$owner->date1|age:$owner->date2}
Editoval Croc (19. 5. 2015 14:08)
- Šaman
- Člen | 2666
IMHO už na tohle filtry nejsou vhodné. Filtr slouží ke zformátování
hodnoty při výpisu, nikoliv pro nějaké složitější výpočty.
Na tohle ideálně tu entitu (a nebo vlastní datový objekt, nebo použít DateInterval) a filtr použít jen pro zformátování
intervalu do požadovaného formátu
- David Matějka
- Moderator | 6445
@Croc nevznika, doctrine je jasna volba ;)
Jinak myslim, ze v tomhle pripade jsou filtry jeste OK
- Šaman
- Člen | 2666
No, nevím, v jakém stavu ten projekt je. Nebudeš kvůli tomu přepisovat
už hotový :)
Takže bych si do šablony předal jen ten objekt DateInterval (nebo ho
v nejhorším v té šabloně i vytvořil z dostupných dat) a ten pak při
výpisu prohnal filtrem. Ono se tomu říká filtry, ale ve skutečnosti jsou to
spíš formattery.
- Šaman
- Člen | 2666
Ještě než se na ni vrhneš, tak to ještě zvaž a přečti třeba tohle. Na malé projekty mi NDb stačí, na větší jsem doteď používal LeanMapper, ale už bych šel taky do Doctrine. Pravé entity jsou super. Ale je to hodně studia a práce a ladění navíc. Měl bys už předem vědět, proč ji chceš. Jinak na ni jen zanevřeš (jako už mnoho programátorů před tebou – i několikrát po sobě :) ).
- Croc
- Člen | 270
leninzprahy napsal(a):
filtr třeba…
$template->addFilter('age', function (\DateTime $date) { return floor((time() - $date->getTimestamp()) / (60 * 60 * 24 * 365.24219)); });
Díky za typ. Kde je nejlepší místo, kam tyto vlastní filtry umístit? A opravdu stačí jen uvedený kód na definici svého filtru?
- leninzprahy
- Člen | 150
Croc napsal(a):
Díky za typ. Kde je nejlepší místo, kam tyto vlastní filtry umístit? A opravdu stačí jen uvedený kód na definici svého filtru?
Nejjednodušší je v nějakém BasePresenteru (nebo BaseControl), přetížit metodu createTemplate()
protected function createTemplate() {
$template = parent::createTemplate();
$template->addFilter('age', function (\DateTime $date) {
return floor((time() - $date->getTimestamp()) / (60 * 60 * 24 * 365.24219));
});
return $template;
}
viz Šablony sekce Filtry
Pokud jich budeš mít víc, je asi lepší to dát do samostatného souboru, např Filters
namespace App;
class Filters {
public static function loader($filter) {
return method_exists(__CLASS__, $filter) ?
call_user_func_array([__CLASS__, $filter], array_slice(func_get_args(), 1)) : null;
}
public static function age(\DateTime $date) {
return floor((time() - $date->getTimestamp()) / (60 * 60 * 24 * 365.24219));
}
// ... další filtry
}
a zaregistrovat v configu
services:
latte.latteFactory:
setup:
- addFilter(null, [App\Filters(), loader])