callback s dotazem v modelu

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

Dobrý den,
chtěl bych poprosit, ve starém nette jsem používal:

Model:

public static function initialize() {
    $dbConfig = Environment::getConfig('database');
    self::$connection = new Connection(
                    "{$dbConfig->driver}:host={$dbConfig->host};dbname={$dbConfig->database}",
                    $dbConfig->username,
                    $dbConfig->password
    );
}

 /**
 * Zjištění zda zadaný e-mail již neexistuje
 * @param  form $email vytažení hodntoy $email->value
 * @param int $id
 * @return boolean
 */
public static function findUserEmailCallbeckem($email, $id)
{
    $query = "SELECT email FROM " . self::TABLE_USERS ." WHERE email = ? AND id!=? LIMIT 1";
    $result = self::$connection->query($query, $email->value, $id);
    $row = $result->fetch();
    // pokud v DB existuje, vracím false na callback -> uživatel musí zadat novou hodnotu
    // pokud neexistuje, vracím true, uživatel zadal správnou hodnotu
    return ($row) ? false : true;
}

a u foruláře jsem pak měl nastavný callback:

$form->addText('email', 'E-mail')
    ->setEmptyValue('@')
    ->setOption('description', '(slouží k přihlášení)')
    ->addRule(Form::FILLED, 'Zadejte E-mail.')
    ->addRule(Form::EMAIL, 'Zadaná E-mailová adresa není platný E-mail')
    ->addRule(Form::MAX_LENGTH, 'E-mail je příliš dlouhý, maximálně %d znaků.', 50)
    ->addRule(callback('Model\UserModel', 'findUserEmailCallbeckem'), 'Zadaný e-mail již existuje, zvolte jiný e-mail.', $id);

Jak se k tomuto dopátrat když nyní mám připojený model:
neon:

	nette:
		database:
			default:
				dsn: '%database.driver%:host=%database.host%;dbname=%database.dbname%'
				user: %database.user%
				password: %database.password%


	services:
		database: @Nette\Database\Connection


		model: ShopModel( @database )

model:

class ShopModel extends Nette\object
{
    /**
     @var Nette\Database\Connection */
    public $database;

    const TABLE_USERS = 'users';

    /**
     * @param Nette\Database\Connection $database
     */
    public function __construct(Nette\Database\Connection $database)
    {
        $this->database = $database;
    }

Editoval tatyalien (21. 3. 2012 14:39)

mkoubik
Člen | 728
+
0
-

->addRule(callback($model, 'findUserEmailCallbeckem'), 'Zadaný e-mail již existuje, zvolte jiný e-mail.', $id);. Záleží, kde ten formulář vytváříš. V presenteru se k modelu dostaneš přes $this->context->model, do komponenty je lepší si ho předat konstruktorem.

tatyalien
Člen | 239
+
0
-

Formulář vytvářím v presenteru v továrničce, když dám takhle addRule, dostanu se do modelu, na findUserEmailCallbeckem, ale neprovede se dotaz.

když si přepíšu:
$result = self::$connection->query($query, $email->value, $id);
na nynější podobu:
$result = self::$database->query($query, $email->value, $id);
tak to hodí:
Access to undeclared static property: ShopModel::$database

Ono se to dostane do statické funkce, ale nemá to „připojenou“ dtb… Jako by to nebralo v potaz v callbacku

/**
 * @param Nette\Database\Connection $database
 */
public function __construct(Nette\Database\Connection $database)
{
    $this->database = $database;
}

Editoval tatyalien (21. 3. 2012 15:23)

mkoubik
Člen | 728
+
0
-

A proč to voláš staticky? Normálně tam dej $this->database->query(..) a vyhoď klíčové slovo static z deklarace metody, pokud tam je.

tatyalien
Člen | 239
+
0
-

Zkoušel jsem psí kusy a tohle ne ;)… díky už to fachá.