Aktuální uživatel v modelu

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

Dobrý den,

mám tu takovýto databázový model a každá tabulka, kterou mám v databázi má sloupeček user_id podle kterého z ní potřebuji tahat data, jak se prosím dostanu k aktuálně přihlášenému uživateli, abych podle toho mohl filtrovat data z tabulky?

Předem moc děkuji za odpovědi! :-)

Mějte se a smějte se! :-)
Petr Hošek

use Nette\Security as NS,
	Nette\Database\Connection,
	Nette\Object;

class Database extends Object
{
	/**
	 * Spojení s databází
	 */
	public $database;

	public function __construct(Connection $database)
    	{
        	$this->database = $database;
    	}

	public function $table() {
		return $this->database->table('table')->where('user_id', ???);
	}

}
Melmen
Člen | 132
+
0
-

ID přihlášeného uživatele zjistíš přes $this->getUser()->getId()

Editoval Melmen (21. 3. 2012 23:01)

HosekPetr
Člen | 31
+
0
-

@Melmen Ne tak docela! Díky tomu, že třída dědí od Object, není k tomu takto lehce přístup!

Otázka pro zkušenejší zní: „Neprzním“ tím nějak nette a myšlenku MVC?

Děkuji všem! :-)

use Nette\Environment,
	Nette\Database\Connection,
	Nette\Object;

class Database extends Object
{
	/**
	 * Spojení s databází
	 */
	public $database;

	private $user;

	private $userId;

	public function __construct(Connection $database)
    	{
        	$this->database = $database;
        	$this->user = Environment::getUser();
        	if ($this->user->isLoggedIn()) {
        		$this->userId = $this->user->getIdentity()->getId();
        	} else {
        		$this->userId = null;
        	}
    	}

	public function table() {
		return $this->database->table('table')->where('user_id', $this->userId);
	}

}
Melmen
Člen | 132
+
0
-

A co když to upravíš takhle nějak?

public function table($userId = NULL) {
                if($userId){
		return $this->database->table('table')->where('user_id', $userId);
        }
.....atd..
		}

A pak v presenteru doplníš UserId…
Akorát se mi to nelíbí, nebylo by lepší v presenteru něco na způsob

$this->db->table('tabulka')->where('user_id', $this->getUser()->getId());

???

HosekPetr
Člen | 31
+
0
-

Také jsem nad tím přemýšlel, ale nechci to zadávat v každém presenteru!
A pak jednou na to někde zapomeneš a uživatelé uvidí data svá i ostatních uživatelů a nebudou to data pro zvědavá očka!

HosekPetr
Člen | 31
+
0
-

Model je tu od toho, aby mi usnadnil psaní! Kdybych u každé tabulky musel zadávat něco takového, místo přístupu do modelu.

$this->db->table('tabulka')->where('user_id', $this->getUser()->getId());

Tak tu v podstatě nemusí být ani frameworky. Neber to nijak špatně!

22
Člen | 1478
+
0
-

no no, je takový problém si v tom modelu udělat setter nebo si usera poslat do konstruktoru toho modelu?

HosekPetr
Člen | 31
+
0
-

@22 Pro mě to je celkem problém, když s tím vším začínám! Budu rád, když poradíš, jak to udělat a né co udělat! ;-)

voda
Člen | 561
+
0
-

Stejně jako máš v konstruktoru Connection, tak si tam přidej User. Pokud máš službu modelu nadefinovanou v konfigu, tak se Nette o doplnění parametrů postará samo.

HosekPetr
Člen | 31
+
0
-

Mohu poprosit o příklad? Já potřebuji vše bohužel názorně! :-( Omlouvám se!

voda
Člen | 561
+
0
-

Není na tom nic složitého:

use Nette\Security\User;

public function __construct(Connection $database, User $user) {
	$this->database = $database;
	$this->user = $user;
}
HosekPetr
Člen | 31
+
0
-

@voda velice děkuji!

Ascaria
Člen | 187
+
0
-

Můj postup, který mě jednou napadl a používám ho je následující:

<?php
    private $inTransaction;

    /**
     * Uživatel, který insertuje či edituje facilitu
     * @var \Nette\Http\User
     */
    private $user = null;

    /**
     * Iniciuje vkládání zařízení do databáze
     * @param \Nette\Http\User $user Uživatel který akci provádí
     */
    public function TransactionBegin(\Nette\Http\User $user)
        {
        $this->user = $user;
        $this->inTransaction = true;
        $this->connection->begin();
        }

    /**
     * Ukončí vkládání zařízení do databáze
     */
    public function TransactionCommit()
        {
        $this->user = null;
        $this->inTransaction = false;
        $this->connection->commit();
        }

    /**
     * Rollbackne vkládání zařízení do databáze
     */
    public function TransactionRollback()
        {
        $this->user = null;
        $this->inTransaction = false;
        $this->connection->rollback();
        }

    /**
     * Uloží facilitu do databáze
     * @param Int|Null $facility_parent
     * @param Array $data
     * @return Int ID vytvořeného záznamu
     */
    public function InsertFacility($facility_parent, Array $data)
        {
        if(!$this->inTransaction)
            throw new \Nette\InvalidStateException('Not in transaction, use TransactionBegin first.');
        // Doplníme data...
        // Vložíme facilitu do databáze ...
        // Vrátíme auto_increment id
        return $this->connection->insertId;
        }
?>