jak na vlstní funkce a callback?
- tatyalien
- Člen | 239
Ahoj,
mám dotaz, kam mám ukládat pomocné funkce? Mám na to vytvořit
v libs/moje_slozka/moje_funkce.php třídu?
<?php
class MyClass extends Nette\NObject
{
public static function moje_testovaci_trida($hodnota) {
}
}
?>
Nebo se to má dávat někam jinám?
Druhá otázka je, pokud bych si takhle někdě udělal testovací třídy (například, zda už email, není v db…), jak to pak zapojit do ověřování formulářů? Každý radí callbacky zde na fóru, ale nějak jsem se nedočetl jak na ně…
<?php
$form->addText('name', 'Jméno:')
->addRule(NForm::FILLED, 'Prosím zadajte jméno.')
//->addRule(array('CustomFormValidators','isInDatabase'), "Zadejte unikátní e-mail")
->addRule(NForm::MIN_LENGTH, 'Jméno musí mít minimálně %d znaků', 4);
// jak ho zapojit?
?>
Jak tam dodat aby použil moje_testoavci_trida()?
A poslední otázka, když v BasePresenter si nastavím po přihlášení proměné (z acl), jak tyto hodnoty dostanu v final class Admin_EditUserPresenter extends Admin_SecuredPresenter v továrčničce jako předvyplněné údaje?
BasePresenter :
<?php
$this->template->loggedUser = $user;
// pokud je uživatel přihlášený, dodám si údaje
if ($user->isLoggedIn()) {
$userPole = $user->getIdentity()->getData();
$this->template->user_id = $user->getIdentity()->getId();
$this->template->user_name = $userPole[0];
$this->template->user_email = $userPole[1];
$this->template->user_password = $userPole[2];
} else {
$this->template->user_id = '';
$this->template->user_name = '';
$this->template->user_email = '';
$this->template->user_password = '';
}
?>
Admin_EditUserPresenter:
<?php
protected function createComponentEditName($name)
{
$msg = 'Jméno musí obsahovat VELKÁ a malá písmena a číslice!';
$form = new NAppForm($this, $name);
/* nastaveni identifikace ve form */
$form->getElementPrototype()->id = 'editace-jmena';
$form->addText('name', 'Jméno:') // jak sem dostat jméno předvyplněné?
->addRule(NForm::FILLED, 'Prosím zadajte jméno.')
//->addRule(array('CustomFormValidators','isInDatabase'), "Zadejte unikátní e-mail")
->addRule(NForm::MIN_LENGTH, 'Jméno musí mít minimálně %d znaků', 4)
->addRule(NForm::REGEXP, $msg, '/[A-Z]+/')
->addRule(NForm::REGEXP, $msg, '/[a-z]+/');
$form->addProtection('Prosím odešlet přihlašovací údaje znovu (vypršela platnost tzv. bezpečnostního tokenu).');
$form->addSubmit('send', 'Uložit');
$form->onSubmit[] = array($this, 'editNameSubmitted');
}
?>
Za lamovost se předem omlouvám :(
- tatyalien
- Člen | 239
Tak jsem tady přelouskal pár věcí, a rozjel jen:
model: (class UserModel extends BaseModel)
<?php
public static function existujeEmail($email)
{
$row = dibi::select('*')
->from('users')
->where('email=%s', $email->value)
->fetch();
// pokud je vrácený řádek, tak email existuje
return ($row) ? false : true;
}
?>
A v presenteru:
<?php
protected function createComponentEditName($name)
{
$msg = 'Jméno musí obsahovat VELKÁ a malá písmena a číslice!';
$form = new NAppForm($this, $name);
$form->addText('email', 'E-mail')
->addRule(NForm::FILLED, 'Vyplňte svůj email')
->addRule(NForm::EMAIL, 'Vyplňte platný email')
->addRule(callback('app\models\UserModel', 'existujeEmail'), 'Tento e-mail je již registrován');
...
?>
Je to takto správně, nebo se má postupovat jinak? Abych si neosvojil blbosti…
- bojovyletoun
- Člen | 667
myslím, že je to dobré.
Kdybych šel do extrému, tak by tvorba formulářů, rsp jejich validační
pravidla byly přímo součást UsersModel.
PS: tohle je možná zajímavé na čtení:toto
- tatyalien
- Člen | 239
Oki, a ještě dotaz na ty defaultní hodnoty, dočetl jsem se tady, že se to má nastavovat přez:
<?php
$form = new AppForm();
$form->addText('my-input-name', 'Text:');
$form->setDefaults(array(
'my-input-name' => 'Default text',
));
?>
Mám ale získání dat dát do presenteru, nebo to cpát do základního modelu? Protože v MVP má mít práci s DB na starosti model ne?
- bojovyletoun
- Člen | 667
MVP neplatí všechno na 100% . Zas tolik tomu nerozumím, takže to jsou
spíš moje názory. Řídil bych se pravidlem, že obvykle první, řešení,
které napadne je dobé a nebo když to jde jednoduše
($form->values
),tak je to lepší než vymýšlet nějaké
složitosti nebo něco ‚nového‘.
2.Protože v MVP má mít práci s DB na starosti model ne?
To jo, myslím, že správné ale je, že presenter si data vyžádá od
modelu(nebo mu je dává) ( protože presenter je ten, které spojuje, řídí),
takže „Model by o presenteru neměl vědět“ (tohle je tuším ta
slavná věta).
Pokud je noc dlouhá, přečti si toto
- tatyalien
- Člen | 239
Ještě asi blbej dotaz, ale jak mám nacpat ještě další parametr do callbacku (viz vejš):
<?php
protected function createComponentEditName($name)
{
$msg = 'Jméno musí obsahovat VELKÁ a malá písmena a číslice!';
$form = new NAppForm($this, $name);
$form->addText('email', 'E-mail')
->addRule(NForm::FILLED, 'Vyplňte svůj email')
->addRule(NForm::EMAIL, 'Vyplňte platný email')
->addRule(callback('app\models\UserModel', 'existujeEmail'), 'Tento e-mail je již registrován');
...
?>
Potřeboval bych tam docpat ještě jednu hodnotu kterou mám v továrničce createComponentEditName, ale za živého boha nedokážu dostat do callbacku další vstupní hodnotu :(
Samozřejmně jsem si upravil public static function existujeEmail($email, $dalsiHodnota)
Editoval tatyalien (12. 1. 2011 15:09)
- Filip Procházka
- Moderator | 4668
$formControl->addRule(callback('cooool'), "Chybová hláška", $parametr);
public function cooool($formControl, $parametr)
{
// ...
}
Editoval HosipLan (12. 1. 2011 16:00)