Konverze z PHP 5.3 na PHP 5.2 – Nette v2.0

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

Zdarvim,
chci se zeptat, momentálně jsem dělal projekt pro PHP 5.3, bohužel teď jsem zjistil, že musím použít v5.2. Naštěstí projekt není nijak velký, takže neměl být problém změnit názvy tříd apod.. Ale problém je, že se v tom moc nevyznám. Když jsem např. používal toto:

use Nette\Application\UIPresenter,
	Nette\Utils\Strings,
	Nette\Utils\Html,
  Nette\Applicaton\Routers;

Jak by to mělo správně vypadat pro PHP 5.2?
Myslel jsem něco takového, ale asi to mám špatně:

use NApllicationUIPresenter
....

Dále když mi to vyhodí chybu unexpected T_Function:

  'rowRenderer' => function($row) {
33:                        return Html::el('tr')->class($row->id);
34:                    }

Tak jsem si zjistil, že toto asi nejde použít ve php verzi 5.2 Je to možný nějak nahradit, nebo takovou to funkci můžu použít až ve verzi 5.3?
Děkuji za odpověď

Editoval Prochy (8. 5. 2012 14:55)

nanuqcz
Člen | 822
+
0
-

Ahoj,
u prefixované verze se vezme vždy název třídy (bez namespace) a přidá se před něj písmeno „N“. Tedy:

# Nette pro PHP 5.3               Nette pro PHP 5.2 prefixed
Nette\Application\UI\Presenter => NPresenter
Nette\Utils\Strings            => NStrings
Nette\Utils\Html               => NHtml
Nette\Applicaton\Routers       => NRouters

Jediná vyjímka byla myslím u Nette\Forms\Form a Nette\Application\UI\Form (ve verzi pro PHP 5.2: NForm a NAppForm, jestli si správně pamatuju)

'rowRenderer' => function($row) {
                     return Html::el('tr')->class($row->id);
                 }

Html přepiš na NHtml ;-)

Prochy
Člen | 91
+
0
-

Díky za odpověd,
ale to NHtml nic neřeší, křičí to na tom řádku

'rowRenderer' => function($row) {

celý zápis je potom následovně

	$grid = new Tabella(array(
		'context'     => $this->context,
		'source'  => $this->klienti->source(),
		'order'       => 'date_reg',
	'offset'  =>1,
	        'limit'=>30,
	        'sorting'=>'DESC',
		'rowRenderer' => function($row) {
					return NHtml::el('tr')->class($row->id);
		}
		));

Myslim si, že to je takzvaná lambda funkce, která je podporována až ve verzi 5.3 (více zde https://phpfashion.com/…e-a-closures)

nanuqcz
Člen | 822
+
0
-

Jo omlouvám se, máš pravdu. Můžeš místo toho použít Nette callback, to by myslím mělo fungovat (akorát tu funkci budeš muset zabalit do nějaké třídy)

Prochy
Člen | 91
+
0
-

Mohu se zeptat, jak by to mělo přibližně vypadat? Pravda je taková, že s callbackama nemám zkušenosti a využívám je prakticky jen při formuláři událost onclick na tlačítku. Dík

jtousek
Člen | 951
+
0
-

V PHP 5.2 nejsou anonymní funkce (function beze jména). Tzn. když chceš někde použít callback tak musíš tu funkci mít někde pojmenovanou a jako callback předat její název.

//...
'rowRenderer' => array('Trida', 'metoda'), //místo array asi lze použít Nette funkci callback
//...
Trida {
	function metoda($row) {
		return NHtml::el('tr')->class($row->id);
	}
}

Editoval jtousek (8. 5. 2012 20:15)