Připojení do databáze a vypsání dat

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

Dobrý den,
začínám s Nette a pročítám fórum a dokumentaci, ale nemůžu se dobrat výsledku. Jak můžu vypsat obsah nějaké tabulky v databázi?

V neonu ze sandboxu mám toto:

common:
	parameters:
		database:
			driver: mysql
			host: 127.0.0.1
			dbname: dbname
			user: user
			password: psw


	php: # PHP configuration
		date.timezone: Europe/Prague
		# session.save_path: "%tempDir%/sessions"
		# zlib.output_compression: yes

	services:
		database:
			class: Nette\Database\Connection
			arguments: ['%database.driver%:host=%database.host%;dbname=%database.dbname%', %database.user%, %database.password%, ..., Nette\Database\Reflection\DiscoveredReflection()]
			setup:
				- setCacheStorage()

		model:
			class: Model

		authenticator:
			factory: @model::createAuthenticatorService

production < common:

development < common:
	parameters:
		database:
			dbname: dbname_local
			user: user_local
			password: psw_local


console < common:

Pak mám soubor app/presenters/PagePresenter.php

class PagePresenter extends BasePresenter {

    public function renderDefault($url = '') {
        if (empty($url)) {
            $url = 'index';
        }

	$zaznam = // ???

        $this->template->title = $zaznam['url'];
        $this->template->hlavniNadpis = $zaznam['hlavniNadpis'];
        $this->template->obsah = $zaznam['obsah'];
    }
}

a taktéž soubor app/models/Page.php

class Page extends Model {

    public function getPage($url){
	// ??????????
        return $this->database->table('html')->where('url', $url);
    }

}

Mohli byste mi tedy poradit, co mám napsat místo otazníčků, abych mohl získat do proměnné $zaznam řádek tabulky?

Děkuji mnohokráte

Editoval hubipe (14. 12. 2011 18:06)

Fanda
Člen | 39
+
0
-
class PagePresenter extends BasePresenter {

    public function renderDefault($url = '') {
        if (empty($url)) {
            $url = 'index';
        }

        $zaznam = $this->context->database->query('...'); // nebo jiný způsob práce s db

        $this->template->title = $zaznam['url'];
        $this->template->hlavniNadpis = $zaznam['hlavniNadpis'];
        $this->template->obsah = $zaznam['obsah'];
    }
}

Službu database vytvoří nette z configu (services: database…). Stejně si můžeš registrovat i další služby, které potom najdeš v context pod stejným jménem.

Je to spíš takový nakopnutí, budeš si to už muset vyladit… ;-)

JuniorJR
Člen | 181
+
0
-

Však si to napsal téměř celé

class PageModel extends Model
{
    public function getPage($url = NULL)
    {
        if ($url === NULL) {
            return NULL; // tohle pro případ, kdy se url nezadá
        }
        return $this->database->table('html')->where('url', $url)->fetch();
    }
}
class PagePresenter extends BasePresenter
{
    public function renderDefault($url = '')
    {
        if (empty($url)) {
            $url = 'index';
        }

        // předpokládá existenci služby 'pageModel',
        // kterou si zaregistruješ obdobně jako službu 'Model' (tu už tam máš)
        $zaznam = $this->pageModel->getPage($url);

        $this->template->title = $zaznam['url'];
        $this->template->hlavniNadpis = $zaznam['hlavniNadpis'];
        $this->template->obsah = $zaznam['obsah'];
    }
}
services:
	database:
		class: Nette\Database\Connection
                arguments: ['%database.driver%:host=%database.host%;dbname=%database.dbname%', %database.user%, %database.password%, ..., Nette\Database\Reflection\DiscoveredReflection()]
                setup:
                	- setCacheStorage()

         model:
		class: Model

         pageModel:
		class: PageModel

Editoval JuniorJR (14. 12. 2011 21:07)

hubipe
Člen | 26
+
0
-

JuniorJR napsal(a):

Však si to napsal téměř celé

A službu PageModel vytvořím v neonu prostým vložením

PageModel:
        class: PageModel

za

		Model:
			class: Model

?

hubipe
Člen | 26
+
0
-

Aha, už to vidím, omlouvám se a děkuju

hubipe
Člen | 26
+
0
-

Tak ještě jednou děkuji, funguje to, akorát místo $this->pageModel musím použít $this->context->pageModel.

To je chybka na mojí straně a nebo se to tak má používat?

JuniorJR
Člen | 181
+
0
-

A máš tu službu zaregistrovanou pod správným jménem? Pokud vím, tak by to mělo chodit právě i přes tento zkrácený zápis…

hubipe
Člen | 26
+
0
-

Přikládám aktuální znění config.neon

services:
    database:
        class: Nette\Database\Connection
        arguments: ['%database.driver%:host=%database.host%;dbname=%database.dbname%', %database.user%, %database.password%, null, Nette\Database\Reflection\DiscoveredReflection()]
        setup:
            - setCacheStorage()

    model:
        class: Model

    pageModel:
        class: PageModel

    authenticator:
        factory: @model::createAuthenticatorService

    cache:
        class: Nette\Caching\Cache

a hlásím, že $this->pageModel vyhazuje

Nette\MemberAccessException
Cannot read an undeclared property PagePresenter::$pageModel.
JuniorJR
Člen | 181
+
0
-

Ještě jsem zapomněl dodat, že musís mít definovaný getter. Pak budeš moci používat právě zmíněnou zkratku $this->pageModel. Reálně se pak zavolá metoda $this->getPageModel(), toto chování je dáno implementací magické metody &__get v Nette\Object;

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
    /**
     * Gets PageModel service.
     *
     * @return PageModel
     */
    final protected function getPageModel()
    {
        return $this->context->pageModel;
    }
}

Editoval JuniorJR (14. 12. 2011 21:44)