Nette předání parametru presenteru do komponenty

Zde jen symbolická připomínka:

Dávat si pozor jestli parametry předávám ve správné Action!!!

Vyzkoušel jsem několik postupů jak vložit parametr do komponenty, ale žádný mi nechtěl fungovat. Po několika hodinách revize kódu jsem si všiml, že jsem “jen” špatně pojmenoval action a místo actionArticle jsem nechal název z jednoho návodu actionDefault. Tak příště na to pozor.

Problém fulltextovým vyhledáváním

Při pokusu implementovat fulltextové vyhledávání via MySQL InnoDB jsem narazil na problém. Vyhledávání se aplikovalo pouze na jeden sloupec databáze.

Má funkce v modelu, kterou jsem udělal podle návodu od Martina Zlámala vypadá takto:

public function search($search)
{
$where = "";
//$ft_min_word_len = mysql_result(mysql_query("SHOW VARIABLES LIKE 'ft_min_word_len'"), 0, 1);
$ft_min_word_len = 4;
preg_match_all("~[\\pL\\pN_]+('[\\pL\\pN_]+)*~u", stripslashes($search), $matches);
foreach ($matches[0] as $part) {
    if (iconv_strlen($part, "utf-8") < $ft_min_word_len) {
        $regexp = "REGEXP '[[:<:]]" . addslashes(strtoupper($part)) . "[[:>:]]'";
        $where .= " OR (title $regexp OR content $regexp)";
    }
}
 
return $this->database->table('articles')
->where("MATCH(title, content) AGAINST (? IN BOOLEAN MODE)$where", $search)
->order("5 * MATCH(title) AGAINST (?) + MATCH(content) AGAINST (?) DESC", $search, $search)
->limit(50);
}

Řešení:

Problém byl ,že jsem měl nastavené pouze FULLTEXTOVÉ klíče “title” a “content”. Po přidání FULLTEXTOVÉHO klíče “title, content” byl problém vyřešen.

Nette – přístup k databázi bez PDO

Určitě nebudu sám, koho štvou nejrůznější komplikace při přesunu projektu z localu na hosting.
Rád bych se zde podělil o jednu zkušenost, která snad někomu usnadní práci a případně někdo poradí, jak a co udělat lépe.

Tedy problém byl, že na hostingu nebyla knihovna php_pdo_mysql. Na locale ,kde tuto knihovnu mám, mi vše s NetteDatabase jelo v pohodě, ale na locale jsem se nemohl k DB připojit.

Něco jsem pročetl na fórech a zjistil jsem, že snad s dibi by neměl být problém.

Tedy jsem si config.neon a authenticator musel přepsat pro dibi. Zde jsou:

config.neon

common:
    php:
        date.timezone: Europe/Prague
 
    services:
        database:
            class: DibiConnection
            arguments: [ {driver: %database.driver%, charset: utf8, hostname: %database.host%, username: %database.user%, password: %database.password%, database: %database.dbname%, persistent: true, lazy: true} ]
 
        authorizator:
            class: AclProjSecurityAcl
 
        authenticator:
            class: AclProjSecurityAuthenticator
            arguments: [@database, %security.salt%]
 
development < common:
    parameters:
        database:
            driver : mysql
            host : localhost
            dbname : ...
            user : ...
            password: ...
 
        security:
            salt: zb1g7IHt1I
 
production < common:
    parameters:
        database:
            driver : mysql
            host : localhost
            dbname : ...
            user : ...
            password: ...
 
        security:
            salt: zb1g7IHt1I

Authenticator.php

db = $dbConnection;
        $this->passwordSalt = $salt;
    }
 
    public function authenticate(array $credentials)
    {
        $email    = $credentials[self::USERNAME];
        $password = sha1($credentials[self::PASSWORD] . $this->passwordSalt);
 
        $user = $this->db
                ->select('*')
                ->from('user')
                ->where('email=%s', $email)
                ->fetch();
 
        if (!$user) {
            throw new AuthenticationException("User with login email '$email' not found", self::IDENTITY_NOT_FOUND);
        }
        if ($user->password != $password) {
            throw new AuthenticationException('Wrong password', self::INVALID_CREDENTIAL);
        }
 
        $identity = new Identity($user->id, $user->role);
        $identity->name = $user->name;
        $identity->email = $user->email;
 
        return $identity;
    }
 
}

Snad to pomůže, nakopne, inspiruje a hlavně zkrátí někomu dalšímu ztracený čas. Musel jsem také upravovat všechny dotazy na DB v modelu pro dibi. Nonaštěstí jsem toho neměl moc.

Moc se v tomto neorientuji, tak budu rád za jakoukoliv dobrou radu do budoucna a případnou debatu na toto téma.