.htaccess a Rewrite na gigaserveru („Cannot load presenter ‚Post‘“)

EvaJ
Člen | 6
+
0
-

Dobrý den,

možná kladu už omílaný dotaz, chtěla bych ale poprosit o polopatickou radu na míru…

Snažím se zprovoznit nette na svém hostingu na gigaserveru (kam mám přístup pouze vzdáleně, nemám tam composer ani tracy). Postupuji podle návodu v quickstartu, vše fungovalo až do kroku, kde se na zvláštní stránce pomocí PostPresenteru zobrazuje jednotlivý příspěvek. Odkazy z úvodní stránky se netvoří správně a v logu najdu:
PHP User Warning: Invalid link: Cannot load presenter ‚Post‘, class ‚App\Presenters\PostPresenter‘ was not found.

Vzhledem k tomu, že soubory mám přesně podle návodu, soudím, že problém bude s nastavením .htaccess. Momentálně je takovýto:

# Apache configuration file (see https://httpd.apache.org/docs/current/mod/quickreference.html)
Require all granted

# enable cool URL
<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteBase /

	# use HTTPS
	# RewriteCond %{HTTPS} !on
	# RewriteRule .? https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

	# prevents files starting with dot to be viewed by browser
	RewriteRule /\.|^\.(?!well-known/) - [F]

	# front controller
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteRule !\.(pdf|js|mjs|ico|gif|jpg|jpeg|png|webp|svg|css|rar|zip|7z|tar\.gz|map|eot|ttf|otf|woff|woff2)$ index.php [L]
</IfModule>

# enable gzip compression
<IfModule mod_deflate.c>
	<IfModule mod_filter.c>
		AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json application/xml image/svg+xml
	</IfModule>
</IfModule>

Moje adresářová struktura, jak vidím přes FTP na hostingu:

mojedomena.cz/  - tam je momentálně funkční web, který s nette nesouvisí
test.mojedomena.cz/ - tam se snažím rozchodit nette
  www/ - to je tedy ten veřejný adresář a tam je taky dotyčný .htaccess.

Nemám problém s tím, že se musí přípisovat do URL to „www“. Ale odkazy, které mají vést na jednotlivé příspěvky, vypadají takhle, což je jistě chyba:

http://test.mojedomena.cz/www/#

Děkuji, pěkný den,
Eva

Editoval EvaJ (12. 12. 2020 10:01)

Ondřej Kubíček
Člen | 494
+
0
-

to nemá s htaccessem nic společného, autoload ti nenaloadoval ten presenter, otázka je proč. U sebe na lokálu ti to všechno funguje, pak to celý nahraješ na server a nejde to?

EvaJ
Člen | 6
+
0
-

Ondřej Kubíček napsal(a):

to nemá s htaccessem nic společného, autoload ti nenaloadoval ten presenter, otázka je proč. U sebe na lokálu ti to všechno funguje, pak to celý nahraješ na server a nejde to?

U sebe lokálně jsem to nezkoušela, neběží mi tu PHP server atd. Doufala jsem, že to nebudu potřebovat, ale asi to jinak nepůjde :(

Šaman
Člen | 2668
+
0
-

Rozhodně to odlaď nejprve na localu. Nainstaluj si třeba XAMPP, tam je všechno potřebné a je to odzkoušené.

EvaJ
Člen | 6
+
0
-

Tak už mám lokálně Apache, PHP, MySQL, instalaci web-project pomocí composeru, do které jsem dokopírovala soubory podle návodu.
A dopracovala jsem se ke stejné chybě „Invalid link: Cannot load presenter ‚Post‘, class ‚App\Presenters\PostPresenter‘ was not found.“ :(

Soubor app/Presenters/PostPresenter.php:

namespace App\Presenters;

use Nette;
use Nette\Application\UI\Form;


class PostPresenter extends Nette\Application\UI\Presenter
{
	/** @var Nette\Database\Context */
	private $database;

	public function __construct(Nette\Database\Context $database)
	{
		$this->database = $database;
	}

	public function renderShow(int $postId): void
	{
		$post = $this->database->table('posts')->get($postId);
		if (!$post) {
			$this->error('Stránka nebyla nalezena');
		}

		$this->template->post = $post;
	}

	protected function createComponentCommentForm(): Form
	{
	$form = new Form; // means Nette\Application\UI\Form

	$form->addText('name', 'Jméno:')
		->setRequired();

	$form->addEmail('email', 'E-mail:');

	$form->addTextArea('content', 'Komentář:')
		->setRequired();

	$form->addSubmit('send', 'Publikovat komentář');

	return $form;
	}
}

A soubor app/Presenters/Templates/Post/show.latte:

{block content}

<p><a n:href="Homepage:default">← zpět na výpis příspěvků</a></p>

<div class="date">{$post->date_internal|date:'F j, Y'}</div>

<h1 n:block="title">{$post->title}</h1>

<div class="post">{$post->content}</div>
Šaman
Člen | 2668
+
0
-

Můžeš celý projekt nahrát třeba na GitHub ? V tom co jsi poslala chybu nevidím. (Hádám, že někde bude překlep, ale název třidy i namespace je dobře… ještě mě napadá taková blbost, jestli ten soubor s presenterem má za začátku značku <?php. Používáš nějaký editor, který by tě na takové základní syntaktické chyby upozornil? Prostě budeme v celém projektu hledat kde je nějaká skrytá chyba. Věci, které posíláš jsou řekl bych v pohodě a s htaccess to nejspíš souviset nebude.)

P.S. Jen podotýkám, že to nemůže najít třídu a že Nette má v základním nastavení Robot Loader, který prochází všechny soubory ve složce /app a podsložkách. Takže ten soubor by mohl být i jinde, nebo být špatně pojmenovaný, dokonce může být i více tříd v jednom php souboru. Klíčové je jen to, aby existoval někde pod /app, měl příponu .php a obsahoval validní třídu ve správném namespace.

Pokud nasdílíš ten projekt, můžeme ti zkontrolovat i jestli máš dobře nastavený robot loader.

Editoval Šaman (14. 12. 2020 15:25)

dakur
Člen | 493
+
0
-

Nebo v ZIPu na nějaké uloz.to, pokud je github příliš velká bariéra. :-)

EvaJ
Člen | 6
+
0
-

Šaman napsal(a):

ještě mě napadá taková blbost, jestli ten soubor s presenterem má za začátku značku <?php.

Jé, tak to je vtipné, problém vyřešen. Moc děkuju.
Samozřejmě to tam nebylo, zkopírovala jsem doslova to, co bylo na stránce https://doc.nette.org/…/single-post, jak je tam psáno „PostPresenter by mohl tedy vypadat takto“ :-) Zdá se, že návod není dost blbuvzdorný :-)

Děkuji ještě jednou, Eva

Šaman
Člen | 2668
+
+1
-

No, jako… je to návod na framework, nikoliv na první krůčky v PHP :)

Ale obecně doporučuji nějaký editor, který umí alespoň obarvovat syntax, v lepším případě i nějakou základní analýzu kódu. Ten druhý by asi dal vědět, že tam chybí značka (tedy že se nejedná o PHP kód). Kromě toho i jednoduché editory umí obarvovat klíčová slova a párovat závorky, což se hodí proti překlepům.