Struktura adresářů a volání models TodoManager.php
- KillPrd
- Začátečník | 110
Ahoj,
dělám web s FrondModule a s AdminModule strukturou a dostal jsem se do fáze
kdy chci získat data z databáze funkci na to mám v modulu todoManager.php
ve složce modules.Samozřejmě že to nefunguje a ted hledám zda mám mít ve
složce models další složku FrontModule a AdminModule kam soubor
TodoManager.php nakopíruji. nebo jsou modely na přímo ve složce models?
další věc je jak upravit dotaz abych se na samotný model dostal:
$this->template->todos = $this->model->findAllTodos($order = array(
'id' => 'ASC',
), $where = NULL
,$offset = NULL,
$limit = NULL,
$tabulky = '[nabidka]');
jedná se o tenhle kousek kodu zřejmě
$this->model->findAllTodos
a nevím jak bych ho správně měl napsat aby jsem se odkazal na
daný model…
Děkuji
- westrem
- Člen | 398
Adresar /models
je nezavisly na modularnej strukture.
Chyba je na 99% v tom ci RobotLoader loader prehladava tvoju zlozku
/models
alebo v tom ako plnis
premennu $this->model
Pre istotu teda sa pozri ci mas v config.ini
nasledovne:
<?php
service.Nette-Loaders-RobotLoader.factory = Nette\NConfigurator::createRobotLoader
service.Nette-Loaders-RobotLoader.option.directory[] = %appDir%
service.Nette-Loaders-RobotLoader.option.directory[] = %libsDir%
service.Nette-Loaders-RobotLoader.run = TRUE
?>
Ak by chyba pretrvavala tak skus poslat viac kodu (ako premennu inicializujes), adresarovu strukturu apod.
- KillPrd
- Začátečník | 110
Tak to nepomohlo tak zasílám
config.ini
;
; SECURITY WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
;
; If you don't protect this directory from direct web access, anybody will be able to see your passwords.
; https://nette.org/en/security-warning
;
[common]
; PHP configuration
php.date.timezone = "Europe/Prague"
php.iconv.internal_encoding = "UTF-8"
php.mbstring.internal_encoding = "UTF-8"
;php.default_charset = "UTF-8"
; variables
variable.lang = en
variable.tempDir = %appDir%/temp
variable.logDir = %appDir%/log
; services
service.Nette-Security-IAuthenticator = UsersModel
service.Nette-Loaders-RobotLoader.factory = Nette\Configurator::createRobotLoader
service.Nette-Loaders-RobotLoader.option.directory[] = %appDir%
service.Nette-Loaders-RobotLoader.option.directory[] = %libsDir%
service.Nette-Loaders-RobotLoader.run = TRUE
[production < common]
[development < common]
bootstrap
<?php
/**
* My Application bootstrap file.
*
* @copyright Copyright (c) 2010 John Doe
* @package MyApplication
*/
// Step 1: Load Nette Framework
// this allows load Nette Framework classes automatically so that
// you don't have to litter your code with 'require' statements
require LIBS_DIR . '/Nette/loader.php';
// Step 2: Configure environment
// 2a) enable Debug for better exception and error visualisation
Debug::enable();
// 2b) load configuration from config.ini file
Environment::loadConfig();
// Step 3: Configure application
// 3a) get and setup a front controller
$application = Environment::getApplication();
$application->errorPresenter = 'Error';
//$application->catchExceptions = TRUE;
// Step 4: Setup application router
$router = $application->getRouter();
$router[] = new Route('admin/<presenter>/<action>/<id>', array(
'module' => 'Admin',
'presenter' => 'Default',
'action' => 'default',
'id' => NULL
));
$router[] = new Route('<presenter>/<action>/<id>', array(
'module' => 'Front',
'presenter' => 'Default',
'action' => 'default',
'id' => NULL
));
// Step 5: Run the application!
$application->run();
presenters> Frontmodule>DefaultPresenter:
<?php
class Front_DefaultPresenter extends BasePresenter
{
public function actionDefault()
{
$this->template->todo = $this->model->findAllTodos($order = array(
'id' => 'ASC',
), $where = 'podsekce = 0'
,$offset = NULL,
$limit = NULL,
$tabulky = '[kategorie]');
}
}
?>
app>modules>TodoManager:
class TodoManager
{
public function findAllTodos($order = NULL, $where = NULL, $offset = NULL, $limit = NULL,$tabulky = '[tasks]')
{
return dibi::query(
'SELECT * FROM '.$tabulky.'',
'%if', isset($where), 'WHERE %and', isset($where) ? $where : array(), '%end',
'%if', isset($order), 'ORDER BY %by', $order, '%end',
'%if', isset($limit), 'LIMIT %i %end', $limit,
'%if', isset($offset), 'OFFSET %i %end', $offset
)->setRowClass('Todo');
}
}
Jen tedy dodám že tento zpusob byl funkční jen jsem změnil adresářovou strukturu a změnil názvy souboru tak se mi to zdá divné…
- KillPrd
- Začátečník | 110
PHP programuji dost dlouho a na nette přecházím teprve ted je pravda že jisté mezery mám ale tohle jsou rady k pohledání stejně jako vygoogluj si to a tak proto tady rozhodně není forum.jde mi o logičnost a pochopení nette které se kolikrát z manuálu nevyčte pak stačí jedna věta a je ti vše jasny. Díky
- Petr Stribny
- Člen | 16
Ve svém Presenteru používáš $this->model, přičemž nikde nevidím, že bys tam ten model měl definovaný a inicializovaný. Pokud ho teda nemáš už definovaný v BasePresenteru, tak bych začal tímto.
- srigi
- Nette Blogger | 558
Chyba je v tomto riadku v Presenteri:
$this->template->todo = $this->model->findAllTodos(...
$this->model
musis nejako naplnit (priradit instanciu
TodoManager
). Bud ho instanciuj, alebo metodu
findAllTodos
preved na staticku a ten riadok prepis na:
$this->template->todo = TodoManager::findAllTodos(...
A BTW v Presenteri nemas nadefinovanu premennu pre
$this->model
. Su to naozaj zaklady.
- KillPrd
- Začátečník | 110
Děkuji všem za pomoc, pomohla varianta
TodoManager::findAllTodos
která je jasná a srozumitelná. z nějakého duvodu se mi nepodařilo
sprovoznit předchozí verzy
$this->model->findAllTodos ikdyž jí mám sprovozněnou v jiném
příklady jestli se nemílím inicializuje se přes tento kod:
public function getModel() {
if(!isset($this->todoManager))
$this->todoManager = new TodoManager;
return $this->todoManager;
}
Děkuji