Vlastna adresarova struktura

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

Zdar,

pre moj projekt mi pride adresarova struktura strasne neprehladna, preto by som chcel svoju. Mala by vapadat nejak takto klasicky v App by bol proste priecinok podla presentera teda nejak takto

Presenter1
	Presenter1.php
	Templates
		Template1.latte
		Template2.latte
	Models
		Model1.php
		Model2.php

Ako toho docielit? Viem ze Presenter aj Model si robotLoader najde vsade, len tie tempplaty neviem takto urobit aby mohli byt… :/

Editoval Raiper34 (25. 8. 2015 14:04)

chemix
Nette Core | 1310
+
+3
-

Ahoj, osobně bych u struktury zůstal, ze začátku jsem měl také snahu to nějak ohýbat, ale pak jsem se poddal a jsem rád že jsem nevymýšlel kola (nebo hovadiny) a čas věnoval něčemu užitečnějšímu. Ale chápu, že můžou být komplikovanější dohledávácí postupy pro šablony.

Ale tak jako tak, v presenteru je metoda co dohledává šablony

/**
	 * Formats view template file names.
	 * @return array
	 */
	public function formatTemplateFiles()
	{
		$name = $this->getName();
		$presenter = substr($name, strrpos(':' . $name, ':'));
		$dir = dirname($this->getReflection()->getFileName());
		$dir = is_dir("$dir/templates") ? $dir : dirname($dir);
		return array(
			"$dir/templates/$presenter/$this->view.latte",
			"$dir/templates/$presenter.$this->view.latte",
		);
	}

plus ještě formatLayoutTemplateFiles

Šaman
Člen | 2666
+
+3
-

Modely nepatří pod presenter! Modely (přesněji modelové třídy – model bývá jen jeden a není to kus kódu, ale logická vrstva aplikace) si dej ideálně někam zcela mimo presentery a šablony.

Co se šablon týče, tak ty se dohledávají relativně k presenteru pomocí metod presenteru formatTemplateFiles a formatLayoutTemplateFiles pro layouty.
Používám tohle nastavení, šablony se pak hledají přímo v adresáři presenteru, pak v podadresáři /templates a když se tam nenajdou, tak kvůli kompatibilitě se ještě hledají podle původního algoritmu Nette. Stejnou strukturu mám i u šablon komponent a je to krásně přehledné, dokud na tom dělá jen programátor. Problém bude, pokud bys celý projekt dal kodérovi – pak má šablony roztahané po celém projektu.

<?php
    // BasePresenter.php

	public function formatTemplateFiles()
	{
		$name = $this->getName();
		$presenter = substr($name, strrpos(':' . $name, ':'));
		$dir = dirname($this->getReflection()->getFileName());
		$templateFiles = [
			"$dir/$this->view.latte",
			"$dir/templates/$this->view.latte",
			"$dir/$presenter.$this->view.latte",
			"$dir/templates/$presenter.$this->view.latte",
		];

		$originalTemplateFiles = parent::formatTemplateFiles();
		return array_merge($templateFiles, $originalTemplateFiles);
	}


	public function formatLayoutTemplateFiles()
	{
		$layoutFiles = [];

		$reflection = $this->getReflection();
		while( $reflection->getName() !== 'Nette\Application\UI\Presenter' )
		{
			$dir = dirname($reflection->getFileName());
			$layoutFiles[] = "$dir/@layout.latte";
			$layoutFiles[] = "$dir/templates/@layout.latte";

			$reflection = $reflection->getParentClass();
		}

		$originalLayoutFiles = parent::formatLayoutTemplateFiles();
		return array_merge($layoutFiles, $originalLayoutFiles);
	}
?>
Raiper34
Člen | 65
+
0
-

Diky nakoniec som to iba trochu pozmenil radcej a nechal tak :-D

Raiper34
Člen | 65
+
0
-

Diky :)

yrow
Člen | 12
+
0
-

zdravím, vadí nečemu když jsem do této metody přidat označený řadek?

public function formatLayoutTemplateFiles()
	{
		$name = $this->getName();
		$presenter = substr($name, strrpos(':' . $name, ':'));
		$layout = $this->layout ? $this->layout : 'layout';
		$dir = dirname($this->getReflection()->getFileName());
		$dir = is_dir("$dir/templates") ? $dir : dirname($dir);
		$list = array(
			"$dir/templates/$presenter/@$layout.latte",
			"$dir/templates/$presenter.@$layout.latte"
		);
		do {
			$list[] = "$dir/templates/@$layout.latte";
			**$list[] = "$dir/presenters/templates/@$layout.latte";** // nové kdyžtak odmazat
			$dir = dirname($dir);
		} while ($dir && ($name = substr($name, 0, strrpos($name, ':'))));
		return $list;
	}

Editoval yrow (28. 8. 2015 10:06)