Timestamp do formátu např "před 5 minutami "

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Fyasko
Člen | 106
+
0
-

Ahoj, kdysi jsem si koupil knihu od Jakuba Vrány(1001 triků a tipů pro PHP) ve které jsem narazil na fci která mi čas převede do stejného formátu jako teď vidíte u mého příspěvku resp. Před jakou dobou jsem toto napsal. No k věci. Nemůžu přijít na to jakým způsobem tuto fci použít. Mam model → z něj volám např seznam jmen a timestamp do presenteru → z presenteru do layoutu.. Může někdo poradit jak vytáhnout z query ten timestamp a jeho formát před renderem změnit tou mou fcí?

David Klouček
Člen | 57
+
+1
-

Stáhneš si tenhle helper https://github.com/…/Helpers.php, v presenteru zaregistruješ:

$this->template->registerHelper('timeAgoInWords', 'Helpers::timeAgoInWords');

A normálně v šabloně uděláš např.:

{$row->last_activity|timeAgoInWords}

Editoval David Klouček (18. 8. 2014 20:56)

Fyasko
Člen | 106
+
0
-

Super, děkuji ti

Editoval Fyasko (18. 8. 2014 21:06)

David Kudera
Člen | 455
+
0
-

Jen pozor, od nette 2.2 je to trochu jinak

Šaman
Člen | 2635
+
0
-

Tenhle doplněk používám už dlouho, teď jsem aktualizoval projekt na nové Nette 2.2 a funguje v pohodě.

Editoval Šaman (18. 8. 2014 21:50)

David Kudera
Člen | 455
+
0
-

Jo tak to je fajn :-) možná to bylo problémový jen u loaderů , kde jsem to musel předělat. A nebo možná nemusel a jenon mi vadilo, že mi PhpStorm nadával, že je to deprecated? Přesně si už nepamatuju, každopádně je ale asi dobrý přepsat si deprecated věci

Editoval David Kudera (18. 8. 2014 22:12)

Šaman
Člen | 2635
+
0
-

Aha, tak já to dělám v BasePResenteru a BaseControl v metodě CreateTemplate:

<?php
/**
 * @return ITemplate
 */
protected function createTemplate()
{
	$template = parent::createTemplate();

	$template->registerHelper('md', 'Annivers\Helpers::md');
	$template->registerHelper('daysTo', 'Annivers\Helpers::daysTo');

	return $template;
}
?>
kloban
Člen | 123
+
0
-

David Klouček napsal(a):

Stáhneš si tenhle helper https://github.com/…/Helpers.php, v presenteru zaregistruješ:

$this->template->registerHelper('timeAgoInWords', 'Helpers::timeAgoInWords');

A normálně v šabloně uděláš např.:

{$row->last_activity|timeAgoInWords}

Ahoj, chcu se zeptat kam mám v adresářové struktuře nette tento helper nahrát aby se mi načetl?
Díky Dan

iguana007
Člen | 970
+
0
-

kloban napsal(a):
Ahoj, chcu se zeptat kam mám v adresářové struktuře nette tento helper nahrát aby se mi načetl?
Díky Dan

Tam kde ti prochází kód RobotLoader ;)

kloban
Člen | 123
+
0
-

Dík. :-) Dal jsem to prostě vedle prezenteru… Já taky myslel jestli na to není nějaký „vhodný“ místo, nebo jestli si to každej dělá podle sebe.

iguana007
Člen | 970
+
0
-

Já na tyto drobné pomocné třídy používám adresář /app/libs/… doplňkové addony, knihovny co tahám přes composer jsou potom v adresáři /vendor/ v kořenové složce projektu, stejně jako /app/

wicked
Člen | 290
+
0
-

kloban napsal(a):

Dík. :-) Dal jsem to prostě vedle prezenteru… Já taky myslel jestli na to není nějaký „vhodný“ místo, nebo jestli si to každej dělá podle sebe.

Já osobně bych to svihl do basepresenteru a hotovo

Fyasko
Člen | 106
+
0
-

Tak s příchodem nette 2.3 se vracím k nastavení helperů. Zdá se, že tak jak se to nastavovalo v předchozí verzi, to zde nejde. Četl jsem a čtu už několik hodin na internetu, zkouším různé varianty, ale helper ne a ne rozchodit. „Filter ‚md5‘ is not defined.“ dál se nikdy nedostanu. Nemá zde někdo funkční návod jak na to? Předem díky ;)

Mysteria
Člen | 797
+
0
-

Tohle používám od 2.2. a i ve 2.3 mi to funguje…

Jeden helper:

$this->template->addFilter('number', function($s, $d = 0) { return number_format($s, $d, ',', "\xe2\x80\x87"); });

Více helperů:

$this->template->addFilter(NULL, ['\Utils\Helpers', 'loader']);

class Helpers extends \Nette\Object {
	const DATE_NORMAL = 1, DATE_BEFORE = 2, DATE_AFTER = 3;

	public static function loader($helper) {
		if (method_exists(__CLASS__, $helper)) return call_user_func_array("\Utils\Helpers::$helper", array_slice(func_get_args(), 1));
	}

	public static function dateString($date, $mode = self::DATE_NORMAL, $precision = 3) {
		...
	}
}
Fyasko
Člen | 106
+
0
-

třída BasePresenter:

namespace FrontModule

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
	function beforeRender()
	{
		$this->template->addFilter(NULL, ['Helpers\Helpers', 'loader']);
	}
}

třída Helpers:

namespace Helpers;

class Helpers extends \Nette\Object
{
	public static function loader($helper)
	{
	    if (method_exists(__CLASS__, $helper)) return call_user_func_array("Helpers\Helpers::$helper", array_slice(func_get_args(), 1));
	}

	public static function md5($value)
	{
	    return md5($value);
	}
}

template:

{$value|md5}

Asi jsem to nepochopil správně.. Dřív mi stačil jeden řádek a bylo hotovo.. teď v tom strašně plavu :/

David Grudl
Nette Core | 8147
+
0
-

Dřív:

$this->template->registerHelper('md5', 'md5');

Dnes:

$this->template->registerHelper('md5', 'md5');
// a nebo
$this->template->addFilter('md5', 'md5');
Fyasko
Člen | 106
+
0
-

Né že bych nevěřil slovům člověka vašeho formátu, ale mě to prostě nešlape :D .. Co jste napsal jako dřív mi opravdu jelo ve verzi 2.2 .. Okopčil jsem si své helpery z webu na verzi 2.2 do nového na 2.3 a Vidím celý den jen Filter „md5“ is not defined :/

David Grudl
Nette Core | 8147
+
0
-

A vola se to nastaveni filtru vubec?

Mysteria
Člen | 797
+
0
-

Tohle ti i tak píše chybu, že neexistuje?

// BasePresenter.php:
$this->template->addFilter('md5', function($s) { return md5($s); });

// @layout.latte:
{var $test = 'test'}
{$test|md5}

// Výsledek na webu:
098f6bcd4621d373cade4e832627b4f6
Fyasko
Člen | 106
+
0
-

David: No zřejmě se volá, protože když změním jmenný prostor tak to nenajde co hledá a řve to.
Mysteria: Toto funguje.

Asi mě to jen nemá rádo :D

David Grudl
Nette Core | 8147
+
0
-

Žádný jmenný prostor tam nemám.

Fyasko
Člen | 106
+
0
-

Ale já ve třídě s helpers ano

Mysteria
Člen | 797
+
0
-

Tak jsem u sebe zkusil tvůj kód a normálně mi to taky šlape. Výpis v šabloně stejný jako u inline loadingu filtrů.

$this->template->addFilter(NULL, ['Helpers\Helpers', 'loader']);
<?php namespace Helpers;
class Helpers extends \Nette\Object {
	public static function loader($helper) {
		if (method_exists(__CLASS__, $helper)) return call_user_func_array("Helpers\Helpers::$helper", array_slice(func_get_args(), 1));
	}

	public static function md5($value) {
        return md5($value);
    }
}
David Grudl
Nette Core | 8147
+
0
-

Pak si nerozumíme. „Co jste napsal jako dřív mi opravdu jelo ve verzi 2.2“ – chápal jsem to tak, že ve 2.3 to nejede.

Fyasko
Člen | 106
+
0
-

Žiju ve světě plném překvapení.. Včera jsme před odchodem do práce vypnul pc s tím že to nerozjedu. Dnes ráno přijdu, zapnu stroj, zkusím a jsem udiven. Funguje to. Teď už by mě možná jen zajímalo jak je to možné. Každopádně všem zúčastněným děkuji za čas a ochotu.

Fyasko
Člen | 106
+
0
-

Neuvěřitelné. Přijdu si už jak idiot. Zkopíroval jsem celý projekt včetně funkčních Helperů s loaderem. V originále helpery fungují, ale v kopii ne.Opět jsem projel toto vlákno a vyzkoušel vše co tu bylo psáno. Ani jedno mi opět nefunguje :D .

Milo
Nette Core | 1283
+
0
-

Nemáš zapnutou nějakou agresivní OPcache?

Fyasko
Člen | 106
+
0
-

To nemám.. Možná jsem na něco zapomněl, ale v takovéto situaci to funguje v originálním projektu a v jeho kopii nikoliv.

Base presenter

<?php
namespace FrontModule;

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
	function beforeRender()
	{
		$this->template->addFilter(NULL, ['Helpers\Helpers', 'loader']);
	}
}
?>

Soubor s helperama

<?php
namespace Helpers;

class Helpers extends \Nette\Object
{
	public static function loader($helper)
	{
	    if (method_exists(__CLASS__, $helper)) return call_user_func_array("Helpers\Helpers::$helper",
		array_slice(func_get_args(), 1));
	}

	public static function md5($value)
	{
	    return md5($value);
	}
}
?>

Podle mě je to stejně jako se zde píše :D už vážně nevím proč jednou ano a podruhé ne :)

Btw chyba LogicException: Filter ‚md5‘ is not defined.

Editoval Fyasko (17. 8. 2015 22:29)