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
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)
- tatyalien
- Člen | 239
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)