zacatecnik v Nette, par trivialnich dotazu

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

Zdravim,

v PHP prostredi pracuji jiz nekolik let, ale co se tyce Nette Frameworku sem zacal pracovat teprve tento tyden, tak bych se chtel zlehka zeptat na par veci, jestli je delam spravne.

Zajimalo by me, jestli je spravne mit v basePresenteru pripojeni k databazi pro vsechny ostatni prezentery, viz nize nebo je lepsi to mit v kazdem prezenteru zvlast? Popripade jestli to je jedno, dal jsem to do basePresenteru jenom z duvodu zbytecne se opakujiciho kodu.

namespace App;
use Nette, Model;

abstract class basePresenter extends Nette\Application\UI\Presenter
{
  const TABLE_CATEGORIES = "categories";

  protected $database;

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

  protected function beforeRender()
  {
    $this->template->menuCategories = $this->database->table( self::TABLE_CATEGORIES )->order("category_click ASC, category_name DESC");
  }
}

Dale by me zajimalo, nepodarilo se mi to nikde vygooglovat, jak zjistim treba rekneme ID prave zobrazovaneho clanku (viz priklad blog). Abych mohl treba pri zobrazeni clanku ulozit pocet shlednuti (priklad).

Dekuji

Šaman
Člen | 2666
+
0
-
  1. Je lepší, když v presenteru s databází nepracuješ a využíváš jen třídy modelu (které si samozřejmě o tu databaži řeknou, pokud ji potřebují). Pokud zatím model nevyužíváš, tak je načtení databáze v BasePresenteru v pohodě.
  2. To id článku znáš, ne? Nebo jak jsi ten článek načetl? (I pokud jsi ho nenašel podle id, tak společně s obsahem článku se ti v $row načetlo i id a ostatní sloupce.)
  3. Doporučuji dodržovat konvenci, že třídy začínají velkým písmenem. (A taky rozhranní a traity.) Takže BasePresenter. Proměnné a soubory šablon začínají malým, konstanty jsou celé velkými.

Editoval Šaman (10. 1. 2014 21:54)

Michalek
Člen | 211
+
0
-

Myslím, že u dvojky šlo o tohle…

// $router[] = new Route('/article/<id [0-9]+>-<seo>/', array(

function actionDefault($id, $seo) { // podle $nazevPromenna se predavaji hodnoty automaticky z routeru
 // $id = id clanku
 // $seo = seo link
}
ali
Člen | 342
+
0
-
  1. diky, model zatim opravdu jeste nevyuzivam
  2. tohle sem si vyresil, nevedel jsem ze parametr jde jednoduse takto ziskat $this->getParameter(‚id‘);
  3. ok, sice to bude nejakou dobu nezvyk ale pokusim se (zvyk ze vsechno u me zacinalo malym)

Tak sem se za tyden dostal k Autentizaci, takze muj BasePresenter vypada tedka takto:

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
  public function __construct( Nette\Database\Context $database )
  {
    $this->database = $database;
    $this->getUser();
  }

  ........
}

Mam v planu si napsat svuj vlastni autenticator propojeny s databazi, ale zaseknul jsem se snad na te nejtrivialnejsi veci, postupoval jsem podle tohoto navodu: https://doc.nette.org/…thentication

  1. Vytvoril jsem si soubor „MyAuthenticator.php“ s tridou MyAuthenticator z navodu
  2. Do configu jsem si pridal kod primo z navodu
common:
    services:
        authenticator: MyAuthenticator
  1. Pri spusteni aplikace mi to vypisuje chybu: Found sections ‚common‘ in configuration, but corresponding extensions are missing.

Osobne typuju ze to nemuze najit muj soubor s autenticatorem, zkousel jsem ho umistovat do ruznych slozek co mam v aplikaci, ruzne zkousel pridat cestu do configu, ale bezuspesne.

Šaman
Člen | 2666
+
0
-

Sekce jsou v Nette 2.1 defaultně vypnuté. Common, production, development, případně console zruš a přidej to jen do sekce services viz aktuální Sanbox.

ali
Člen | 342
+
0
-

Config upraven takto:

services:
	authenticator: MyAuthenticator
	- App\RouterFactory
	router: @App\RouterFactory::createRouter

A chyba je nyni tahle ta: Class MyAuthenticator used in service ‚authenticator‘ has not been found or is not instantiable.

Soubor mam ulozeny v aplikaci v adresari App\Model\MyAuthenticator.php

use Nette\Security as NS;

class MyAuthenticator extends Nette\Object implements NS\IAuthenticator
{
    public $database;

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

    function authenticate(array $credentials)
    {
        list($username, $password) = $credentials;
        $row = $this->database->table('users')
            ->where('username', $username)->fetch();

        if (!$row) {
            throw new NS\AuthenticationException('User not found.');
        }

        if ($row->password !== md5($password)) {
            throw new NS\AuthenticationException('Invalid password.');
        }

        return new NS\Identity($row->id, $row->role);
    }
}
Šaman
Člen | 2666
+
0
-

A používáš v něm Namespace? Jestli jo, musí být v tom configu uvedené.

Felix
Nette Core | 1247
+
0
-

Šaman napsal(a):

Sekce jsou v Nette 2.1 defaultně vypnuté. Common, production, development, případně console zruš a přidej to jen do sekce services viz aktuální Sanbox.

Fakt jsou vypnuty? Me docela pekne fungujou :-)

Šaman
Člen | 2666
+
0
-

Felix napsal(a):

Šaman napsal(a):

Sekce jsou v Nette 2.1 defaultně vypnuté. Common, production, development, případně console zruš a přidej to jen do sekce services viz aktuální Sanbox.

Fakt jsou vypnuty? Me docela pekne fungujou :-)

Fakt jsou vypnuté, dají se zapnout uvedením druhého parametru při načítání konfiguračních souborů.

ali
Člen | 342
+
0
-

Šaman napsal(a):

A používáš v něm Namespace? Jestli jo, musí být v tom configu uvedené.

namespace tam prave zadny nemam, zkousel jsem to snim i bez neho.. nemuze mit na to nejaky vliv nazev adresare/umisteni souboru?

*edit
tak kdyz sem tam dal puvodni UserManager kod ze sanboxu, tak to normalne funguje, tak si predelam tam ten k obrazu svemu

Editoval ali (20. 1. 2014 15:53)

David Matějka
Moderator | 6445
+
0
-

@ali: slozku app indexuje robot loader, ktery v ni hleda vsechny tridy a pak se stara o jejich nacitani. obcas z nejakyho duvodu nechce vzit tu tridu, muze pomoct smazani cache nebo znovu vytvoreni onoho souboru

ali
Člen | 342
+
0
-

@matej21: jo to sem si myslel ze takhle funguje, jen sem si nebyl jist :-)

Mensi dotaz ohledne nastavovani roli, nazvy roli a jejich dedice mam vlozene v tabulkach, jenze sem narazil na takovy neprijemny problem, ze kdyz chci pridat k roli dedice, tak pokud dana role jeste nebyla vytvorena tak to nahlasi chybu (Role ‚xxx‘ does not exist.). Priklad

roles table:
+---------+-----------+
| role_id | role_name |
+---------+-----------+

parets  table:
+---------+-----------+
| role_id | parent_id |
+---------+-----------+

$role->addRole("admin","supervisor");

Takze aby mohla role „admin“ dedit z role „supervisor“, musim nejprve vytvorit roli supervisor.

Napadlo me jedno reseni, a to ze prvni vytvorim vsechny role a pak k nim pridam dedice, ale to se mi nezda jako moc elegantni reseni, protoze vlastne budu mit zbytecne se opakujici kod..

..........
$role->addRole("admin");
$role->addRole("supervisor");
..........
$role->addRole("admin","supervisor");

Napada nekoho jine reseni?

Editoval ali (20. 1. 2014 22:06)