Připojení do databáze a vypsání dat
- hubipe
- Člen | 26
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
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
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
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
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)