Moduly, dve otazky (include parent v sablone a stara + nova struktura)

Notice: This thread is very old.
luky84
Member | 16
+
0
-

Ahoj,

mam Nette Sandbox a prave jsem si vyzkousel vytvorit modul. Nechtelo mi to najit presenter modulu, dokud jsem nesmazal z neonu mapping: *: App*Module\Presenters*Presenter, tim ale prestaly fungovat stare nemodularni routy.

Takze otazka 1) (jen ze zvedavosti) je mozne pohromade mit starou a novou modularni strukturu, tj aby fungovaly stare i nove modularni routy a slozkova struktura pohromade?

  1. Pro svuj modul jsem zkopiroval sablonu ze sandboxu ze slozky presenters/templates/Homepage/default.latte a umistil do slozky meho modulu Test, ale problem je ten, ze to haze chybu:
	Cannot include undefined parent block 'scripts'.

Kdyz se podivam do te sablony tak tam je toto:

{block scripts}
{include parent}
<script src="http://jush.sourceforge.net/jush.js"></script>
<script>
	jush.create_links = false;
	jush.highlight_tag('code');
	$('code.jush').each(function(){ $(this).html($(this).html().replace(/\x7B[/$\w].*?\}/g, '<span class="jush-latte">$&</span>')) });

	$('a[href^=#]').click(function(){
		$('html,body').animate({ scrollTop: $($(this).attr('href')).show().offset().top - 5 }, 'fast');
		return false;
	});
</script>
{/block}

Dokud nesmazu to {include parent} tak to proste nefunguje, a s tim souvisi i dotaz, co vlastne dela to include parent, nechapu to, ani z dokumentace mi to neni jasny. A proc to haze tu chybu? Je to ta sama sablona ktera ve stare nemodularni slozce normalne funguje..

Btw treti problem, sice mi to najde a nacte muj modularni presenter, ale treba to nezobrazuje zpravy z this->flashMessages, predpokladam ze to mozna souvisi s tim {include parent}, tezko rict..

Diky za rady

Last edited by luky84 (2015-07-20 13:11)

David Matějka
Moderator | 6340
+
0
-
  1. nevim, co myslis “starymi nemodularnimi routami”
  2. Vlozi to blok scripts z layoutu (ktery tedy musi existovat, kdyz neexistuje, tak to hazi tu chybu), viz

https://github.com/…layout.latte#…
a https://github.com/…efault.latte#…

luky84
Member | 16
+
0
-

kdyz si stahnes sandbox tak mas (starou) nemodularni strukturu app/presenters, pozdeji se pridala i podpora modulu app/TestModul/… to myslim tim stare nove.

Last edited by luky84 (2015-07-20 14:20)

David Matějka
Moderator | 6340
+
0
-
  1. k scripts bloku – ty v te sablone prepises ten blok a chces do nej vlozit rodicovsky, je to i popsane v doc, viz https://latte.nette.org/cs/macros#…. Pokud je v layoutu a hazi to tu chybu, tak je to divne…
  2. k flash zpravam: vykreslujes je? https://github.com/…layout.latte#L20
  3. a k modulum: asi budes muset rozepsat, jak mas konkretne moduly, routy, mapping a jakou chybu to hazi. Takhle nedokazu rict, kde je problem. Ale pokusim se to objasnit:
  • mapping slouzi k prevodu nazvu presenteru na nazev tridy, pokud mas treba Front:User (tedy User presenter ve Front module) tak dle tech pravidel to prevede na spravny nazev tridy – napriklad ten mapping, co to smazal, by to prevedl na App\FrontModule\Presenters\UserPresenter
  • routy slouzeji k prepisu URL na aplikacni pozadavek (jehoz soucasti je i nazev presenteru), v pripade, ze pouzivas moduly, je nejvhodnejsi vyuzit route list – ukazka pouziti treba tady nebo ruzne na foru
luky84
Member | 16
+
0
-

omlouvam se za predchozi dlouhy comment uz jsem to zredukoval ale ty jsi odpovedel mezi tim, diky moc.

problem s includem parent, a i s flash messages, se vyresil, jakmile jsem presunul layout ze slozky

/app/TestModul/@layout.latte

do

/app/TestModul/templates/@layout.latte

nevim proc jsem to daval primo do slozky modulu je to nesmysl, ale s tim souvisi ma otazka, jak tedy nacist z modulu obecny layout, ve starych slozkach je to tenhle /app/presenters/templates/@layout.latte

diky

Last edited by luky84 (2015-07-20 14:29)

luky84
Member | 16
+
0
-

ten dotaz na routy/strukturu je jednoduchy, v podstate kdyz vezmes nette sandbox, tak ti tam funguje nejaka (nemodularni) struktura ze ano (treba nemodularni Homepage presenter). Tedka – vytvoris si modul, ale ten nefunguje (rika to class not found), dokud neupravis neon mapping viz vyse, kdyz ho ale upravis, tj smazes to tam, tak funguje rout na ten novy modul, ale zas nefungujou routy na ty stare nemodularni presentery a slozky. tak jestli je to takhle srozumitelne

Last edited by luky84 (2015-07-20 14:26)

David Matějka
Moderator | 6340
+
0
-

Sablony (jak layout, tak konkretni) mohou byt defaultne ve slozce “templates”, ktera je bud na stejne urovni, jako slozka “presenters”, nebo uvnitr teto slozky (abych byl presnejsi, odvozuje se to od pozice presenteru). Je tedy mozne pouzivat bud:

app
	presenters
		templates
			User
				detail.latte
			@layout.latte
		UserPresenter.php

nebo i

app
	presenters
		UserPresenter.php
	templates
		User
			detail.latte
		@layout.latte

(a podobne s modulem, jen to bude cele zanoreno ve slozce treba FrontModule)

Jakou strukturu si vyberes je na tobe, muze byt dokonce i rozdilna v ramci ruznych modulu, ale v ramci jednoho modulu davej sablony do jedne slozky

David Matějka
Moderator | 6340
+
+1
-

Mapping mazat nemusis, jen musis dodrzovat jeho pravidla (tedy dat presenter do spravneho namespace)

A routy musis nakonfigurovat tak, jak chces aby vypadaly – viz ten odkaz vyse a viz spousta prispevku na foru

luky84
Member | 16
+
0
-

Diky za odpoved. Ale ja ho mel ve spravnem NS a presto to nefungovalo (tedy s puvodni konfiguraci mappingu v neonu)

soubor /app/TestModule/presenters/HomepagePresenter.php:

namespace TestModule;

use Nette,
	App\Model,
  Tracy\Debugger,
  Nette\Application\UI;


class HomepagePresenter extends BasePresenter {
.
.
}

soubor /app/TestModule/presenters/BasePresenter.php:

namespace TestModule;

use Nette,
	App\Model;

abstract class BasePresenter extends \Nette\Application\UI\Presenter
{
}

soubor /app/router/RouterFactory.php:

namespace App;

use Nette,
	Nette\Application\Routers\RouteList,
	Nette\Application\Routers\Route,
	Nette\Application\Routers\SimpleRouter;


class RouterFactory
{

	/**
	 * @return \Nette\Application\IRouter
	 */
	public static function createRouter()
	{
		$router = new RouteList();
		$router[] = new Route('test', 'Test:Homepage:default');
/*
	toto je totez viz vyse predpokladam:
    $router[] = new Route('test', array(
        'module' => 'Test',
        'presenter' => 'Homepage',
        'action' => 'default',
        'id' => NULL,
    ));
*/
		$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
		return $router;
	}

}

Pokud otevru url /test vyhodi to exceptionu 404 s hlaskou

Cannot load presenter ‘Test:Homepage’, class ‘App\TestModule\Presenters\HomepagePresenter’ was not found.

Ale /app/TestModule/presenters/HomepagePresenter.php existuje.

Nebo ta struktura modulu by musela byt jina? Diky

jiri.pudil
Nette Blogger | 956
+
+2
-

Namespace !== umístění ve filesystému. Soubor app/TestModule/presenters/HomepagePresenter.php sice existuje, ale NS v něm máš jenom TestModule.

Matey
Member | 141
+
+1
-

ahoj, podľa všetkého si mýliš NS (namespace v php) s umiestnením súboru vo filesysteme.

Je jedno kde budeš mať umiestnený ten HomepagePresenter. Dôležité je aby ti pasoval NS.

Tvoj HomepagePresenter je v NS TestModule\HomepagePresenter.

Aplikácia ho hľadá úplne inde, podľa tej chybovej hlášky, takže úprav mapovanie v configu alebo NS v presenteroch.

luky84
Member | 16
+
0
-

Ahoj vsem, ano ja vim ze NS neni umisteni souboru, ale NS TestModule jsem povazoval za spravny NS viz https://doc.nette.org/…4/presenters#…

Omlouvam se ze mi asi neco unika, ale opravdu nevim jak to zapasovat s tim mapingem. (Krom toho, kdyz se ten mapping smaze, tak to funguje – ten novy modul, ale je fakt ze ted se bavime o te stare konfiguraci – kdyz se mapping nemaze ale zachova).

Aha- tak uz jsem se dovtipil, takrka metodou pokus omyl..

Toto funguje:

namespace App\TestModule\Presenters;

Diky vsem za reakce, ale fakt neni lehky se v tom zorientovat kdyz to clovek vubec nezna. (A v dokumentaci je treba uvedeno NS TestModule)

Last edited by luky84 (2015-07-21 12:49)

David Matějka
Moderator | 6340
+
+1
-

uz jsem psal, ze mapping nemusis smazat, ale musis ho dodrzet – s tim uvedenym mappingem by byl NS App\TestModule\Presenters

luky84
Member | 16
+
0
-

David Matějka wrote:

uz jsem psal, ze mapping nemusis smazat, ale musis ho dodrzet – s tim uvedenym mappingem by byl NS App\TestModule\Presenters

Ano, diky moc za tvou radu..

luky84
Member | 16
+
0
-

Muzu jeste posledni otazku k tomu obecnemu layoutu? Existuje soubor /app/presenters/templates/@layout.latte to je obecny layout. Ale ted je problem ze ten presenter modulu Test si tento layout neumi najit, a prijde mi to o to divnejsi, ze jsem si prave “vytisknul” obsah pole co vraci metoda formatLayoutTemplateFiles() na tom presenteru modulu Test, a vraci mi tam toto:

array (4)
0 => "C:\projektX\app\TestModule/templates/Homepage/@layout.latte" (67)
1 => "C:\projektX\app\TestModule/templates/Homepage.@layout.latte" (67)
2 => "C:\projektX\app\TestModule/templates/@layout.latte" (58)
3 => "C:\projektX\app/templates/@layout.latte" (47)

Jinymi slovy, zda se ze ta vychozi metoda formatLayoutTemplateFiles() je ochotna hledat ten nejobecnejsi layout viz klic 3, a ackoliv tento layout existuje (a ty layouty predchozich klicu ne), tak stejne ho nenacte a hodi to chybu ze “Cannot include undefined parent block ‘scripts’” coz je chyba o ktere jsme se bavili, tedy ze to nemuze najit layout.

Dotaz tedy je, jak nacitat pro moduly (ci presentery modulu) obecny layout typu /app/templates/@layout.latte, obzvlast kdyz se zda ze aplikace by ho tam mela hledat a nedela to?

Diky, a pak uz vam dam na chvili snad pokoj (ikdyz ucim se, tak za to nerucim :))

Last edited by luky84 (2015-07-21 14:18)

David Matějka
Moderator | 6340
+
+1
-

jak pises, mas to v souboru app/presenters/templates/@layout.latte, ale to bohuzel nette nedokaze najit a hleda to v app/templates/@layout.latte skoro bych rekl, ze je to chyba v nette, ale asi bude tezky to opravit…

luky84
Member | 16
+
0
-

ajo mas pravdu, super diky moc

David Matějka wrote:

jak pises, mas to v souboru app/presenters/templates/@layout.latte, ale to bohuzel nette nedokaze najit a hleda to v app/templates/@layout.latte skoro bych rekl, ze je to chyba v nette, ale asi bude tezky to opravit…