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.

Drobky k prototypování v Axure

Logibox – přidání volby scénáře pro kliknutí na tlačítko login.

Na tlačítko se přidá onClick událost Case 1 a Case 2, pojmenujeme je např. If login succedds a If login fails. V každé akci přidáme link na příslušnou stránku (If login fails bude stená s tím, že se otevře dialog s hláškou).

Prozkoumat zajímavou akci bring to Front

Možná vyřeší problém s krytím modálních oken v prototypu.

Změna v selectboxu a navázaná akce

http://www.axure.com/learn/advanced/conditional-logic/droplist-selection-tutorial

Zpráva validace formu – vyžadováná pole k vyplnění

http://www.axure.com/learn/advanced/conditional-logic/required-fields-tutorial

Ghost text – mizení textu po kliku např. v search boxu

http://www.axure.com/learn/advanced/set-widget-values/click-to-clear-tutorial

WordPress – datum ve smyčce

Pokud chcete zobrazovat datum u příspěvku a použijete v šabloně následující kod:

the_date();

pak se Vám u některých článků datum nezobrazí.

ŘEŠENÍ
Je lepší využít funkce the_time():

the_time('F j, Y');

Modifikace wp_list_categories

Často potřebuji upravovat některé funkce z jádra wordpressu. Není dobré upravovat přímo funkce v jádru, po aktualizaci se Vám změny pravděpodobně ztratí.

Ideální je funkce jádra modifikovat v šabloně a to v souboru function.php.

Níže uvádím ukázku odstranění atributů v kategoriích:

 

<?php
function categories_without_title_attribute() {
$categories = wp_list_categories('echo=0');
$categories = preg_replace('/title="(.*?)"/','',$categories);
echo $categories;
}
?>

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 &lt; common:
    parameters:
        database:
            driver : mysql
            host : localhost
            dbname : ...
            user : ...
            password: ...
 
        security:
            salt: zb1g7IHt1I
 
production &lt; common:
    parameters:
        database:
            driver : mysql
            host : localhost
            dbname : ...
            user : ...
            password: ...
 
        security:
            salt: zb1g7IHt1I

Authenticator.php

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

Užitečné tipy pro wordpress

Seznam užitečných tipů, které usnadní práci a vývoj v redakčním systému wordpress:

Shortcode
Lze využít pro uživatelské vkládání nejrůznějšího obsahu přímo do postu, stránek.
Nejdříve si v souboru function.php vytvoříme a zaregistrujeme libovolnou funkci, kterou chceme aplikovat a vložit do článku.

function hello() {
    return 'Hello, World!';
}
 
add_shortcode('nase_fce', 'hello');

Následně můžeme naši fci volat při tvorbě příspěvku:

[nase_fce]

Interakce s DB

Získání záznamů:

<!--?php    $posts = $wpdb--->get_results("SELECT ID, post_title FROM wp_posts WHERE post_status = 'future'
   AND post_type='post' ORDER BY post_date ASC LIMIT 0,4")
 
   // Echo the title of the first scheduled post
   echo $posts[0]-&gt;post_title;
?&gt;

Získání řádku:

<!--?php    $posts = $wpdb--->get_row("SELECT ID, post_title FROM wp_posts WHERE post_status = 'publish'
   AND post_type='post' ORDER BY comment_count DESC LIMIT 0,1")
 
   // Echo the title of the most commented post
   echo $posts-&gt;post_title;
?&gt;

Získání sloupce:

<!--?php    $posts = $wpdb--->get_col("SELECT ID FROM wp_posts WHERE post_status = 'publish'
   AND post_type='post' ORDER BY comment_count DESC LIMIT 0,10")
 
   // Echo the ID of the 4th most commented post
   echo $posts[3]-&gt;ID;
?&gt;

Získání konkrétní hodnoty:

<!--?php    $email = $wpdb--->get_var("SELECT user_email FROM wp_users WHERE user_login = 'danielpataki' ")
 
   // Echo the user's email address
   echo $email;
?&gt;

Vložení dat do DB:

$wpdb-&gt;insert( $table, $data, $format);

Vložení dat do DB ukázka:

<!--?php    $wpdb--->insert($wpdb-&gt;usermeta, array("user_id" =&gt; 1, "meta_key" =&gt; "awesome_factor", "meta_value" =&gt; 10), array("%d", %s", "%d"));
 
   // Equivalent to:
   // INSERT INTO wp_usermeta (user_id, meta_key, meta_value) VALUES (1, "awesome_factor", 10);
?&gt;

Update dat v DB

$wpdb-&gt;update( $table, $data, $where, $format = null, $where_format = null );

Update dat v DB ukázka:

$wpdb-&gt;update( $wpdb-&gt;posts, array("post_title" =&gt; "Modified Post Title"), array("ID" =&gt; 5), array("%s"), array("%d") );

Vložení vlastního loga na loginpage

add_action( 'login_head', 'ilc_custom_login');
function ilc_custom_login() {
	echo '<style type="text/css">
	h1 a { background-image:url('. get_stylesheet_directory_uri() . '/images/login-logo.png' . ') !important; margin-bottom: 10px; }
	padding: 20px;}
	</style>
	<script type="text/javascript">window.onload = function(){document.getElementById("login").getElementsByTagName("a")[0].href = "'. home_url() . '";document.getElementById("login").getElementsByTagName("a")[0].title = "Go to site";}</script>';
}

Změna počtu skov v excerpt funkci

add_filter('excerpt_length', 'ilc_excerpt_length');
function ilc_excerpt_length( $length ){
	return 10;
}