jak na vlstní funkce a callback?

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-
$formControl->addRule(callback('cooool'), "Chybová hláška", $parametr);

public function cooool($formControl, $parametr)
{
	// ...
}

Editoval HosipLan (12. 1. 2011 16:00)

tatyalien
Člen | 239
+
0
-

HosipLan: Díky, fachá a je to ono ;)