18.01.2016 | Tomáš Kocifaj
Na úvodní stránce nám chybí už jen vytvořit seznam referencí, které chceme prezentovat. K tomu budeme potřebovat vlastní post_type a některé klíčové nastavení, které z toho plyne. V dnešním díle si tedy ukážeme, jak pracovat s vlastním typem post_typu a potřebnými modely, prezentery a configy.
Zdroj šablony po dokončení pátého dílu
Protože se celý post_type a všechny věci kolem něj definují pouze pomocí pole, je to tedy velmi snadné a přímočaré. V rámci frameworku není vytvořeno nic speciálního. Bylo by to jako znovu vymýšlet kolo, které má plnit stejnou funkčnost jako to kolo, které známe. Jediné, co bychom měli správně dodržet je umístění souboru s definicí vlastního typu obsahu.
Všechny definice obsahu se ukládají na místo /yours/requires/definitions a bude se jmenovat jako námi potřebný typ obsahu – v našem případě kt_wpfw_reference_definitions.inc.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<?php add_action("init", "kt_fpfw_register_reference_post_type"); function kt_fpfw_register_reference_post_type() { $labels = array( "name" => __("Reference", KT_DOMAIN), "singular_name" => __("Reference", KT_DOMAIN), "add_new" => __("Přidat referenci", KT_DOMAIN), "add_new_item" => __("Přidat novou referenci", KT_DOMAIN), "edit_item" => __("Změnit referenci", KT_DOMAIN), "new_item" => __("Nová reference", KT_DOMAIN), "view_item" => __("Zobrazit reference", KT_DOMAIN), "all_items" => __("Všechny reference", KT_DOMAIN), "search_items" => __("Hledat reference", KT_DOMAIN), "not_found" => __("Žádné reference nenalezeny", KT_DOMAIN), "not_found_in_trash" => __("Žádné reference v koši", KT_DOMAIN), "menu_name" => __("Reference", KT_DOMAIN), ); $args = array( "labels" => $labels, "public" => true, "publicly_queryable" => true, "show_ui" => true, "show_in_menu" => true, "capability_type" => "post", "query_var" => true, "rewrite" => array("slug" => "reference", "with_front" => false), "has_archive" => true, "hierarchical" => true, "menu_position" => 6, "menu_icon" => "dashicons-testimonial", "supports" => array( KT_WP_POST_TYPE_SUPPORT_TITLE_KEY, KT_WP_POST_TYPE_SUPPORT_EDITOR_KEY, KT_WP_POST_TYPE_SUPPORT_THUMBNAIL_KEY, KT_WP_POST_TYPE_SUPPORT_PAGE_ATTRIBUTES_KEY, ), ); register_post_type(KT_WPFW_REFERENCE_KEY, $args); } |
V rámci registrace vznikla nová konstanta KT_WPFW_REFERENCE_KEY která bude uložené v souboru kt_init.inc.php pro náš projekt ve složce yours.
K této operaci asi není co psát. Je to běžná operace při zakládání nového typu obsahu. Nyní, když se podíváme do administrace našeho projektu, uvidíme v levém menu novou položku dle našeho pojmenování v proměnné $labels. Jediné, co stojí za pozornost je část v definici $args položka supports – Pro všechny typy post_type supports jsou na straně wpfw vytvořeny potřebné konstanty.
Protože chceme u post_typu využívat support pro práci s náhledovým obrázekm (KT_WP_POST_TYPE_SUPPORT_THUMBNAIL_KEY) je potřeba obrázky povolit v celé šabloně. Do souboru kt_theme_setup.inc.php ve složce yours/requires/common/ přidáme před metodu initialize() následující aktivaci.
|
1 2 3 |
// --- SUPPORT ------------------ $config->addThemeSupport(KT_WP_THEME_SUPPORT_POST_THUMBNAILS_KEY); |
Pokud máme vlastní typ obsahu, měli bychom myslet také na to, že dříve nebo později budeme potřebovat pracovat s jeho sadou dat, k tomu budeme potřebovat model. Mohli bychom využít obecný a používat přímo ten, ale je lepší mít logiku oddělenou, kdybychom narazili na případné odlišnosti od modelu výchozího. Nyní nás to bude stát trochu práce – přepisovat a upravovat projekt později může být mnohem náročnější proces.
Jako všechny ostatní modely i ten náš bude umístě v /yours/models/ a subour se bude jmenovat dle pravidel – kt_wpfw_reference_model.inc.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php class KT_WPFW_Reference_Presenter extends KT_WP_Post_Base_Presenter { /** * Konstruktor presenteru volaný při založení objektu * * @author Tomáš Kocifaj * * @param \WP_Post $item */ public function __construct(KT_WPFW_Reference_Model $model) { parent::__construct($model); } // --- gettery ------------------ /** * Vrátí model presenteru * * @author Tomáš Kocifaj * * @return \KT_WPFW_Reference_Model */ public function getModel(){ return parent::getModel(); } } |
Pro tuto chvíli je to vše co potřebujeme – definujeme vlastní model, který dědí všechny vlastnosti modelu obecného. Další funkce nepotřebujeme, budeme využívat převážně ty na obecném modelu.
Nyní, když budeme chtít pracovat s konkrétním záznamem v sekci reference, budeme využívat právě tento náš model.
Stejně jako bylo potřeba vytvořit model pro daný typ obsahu, bude dobré myslet i na to, že budeme potřebovat časem i detail daného záznamu (nebo jiným způsobem presentovat data). Ten obsluhuje presenter – pojďme ho tedy vytvořit.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php class KT_WPFW_Reference_Presenter extends KT_WP_Post_Base_Presenter { /** * Konstruktor presenteru volaný při založení objektu * * @author Tomáš Kocifaj * * @param \WP_Post $item */ public function __construct($item = null) { parent::__construct(new KT_WPFW_Reference_Model($item)); } // --- gettery ------------------ /** * Vrátí model presenteru * * @author Tomáš Kocifaj * * @return \KT_WPFW_Reference_Model */ public function getModel(){ return parent::getModel(); } } |
Prozatím nám opět postačí základní presenter, který dědí presenter obecný. Připíšeme navíc pouze jednu funkci a to metodu getModel() která vrátí model objektu rodičovského – důležité ale je, že v rámci komentářů definujeme, jaký typ objektu (modelu) nám funkce vrací. Ulehčí nám to v budoucnu spousty práce.
Nezapomeňte, že MODEL i PRESENTER mají jasné pravidla pro pojmenování souboru a třídy samotné. Bez správného názvosloví nebude framework schopen korektně načítat třídy.
Pokud již vše máme, zbývá nám model a presenter implementovat do naší úvodní stránky, kde je potřeba vypisovat poslední 4 reference, které jsme na náš web přidaly.
Napřed si musíme vytvořit loop soubor na základě HTML. Do složky /loops/ v rootu šablony vytvoříme nový soubor loop-reference.php. Pokud se podíváme do složky /partials/ najdeme zde soubor recent-works.php je to přesně ten soubor, který bude naše reference vypisovat. Přesně tam najdeme HTLM strukturu každé reference, která se v daném místě vypíše.
Náš soubor loop-reference.php bude vypadat nějak takto:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php $referencePresenter = new KT_WPFW_Reference_Presenter($referenceModel = new KT_WPFW_Reference_Model($post)); ?> <!-- Item Project and Filter Name --> <li class="col-lg-3 design" data-id="id-0" data-type="web"> <div class="item-thumbs"> <!-- Fancybox - Gallery Enabled - Title - Full Image --> <a class="hover-wrap fancybox" data-fancybox-group="gallery" title="<?= $referenceModel->getTitle(); ?>" href="<?= $referencePresenter->getThumbnailImagePermalink(KT_WP_IMAGE_SIZE_THUBNAIL); ?>"> <span class="overlay-img"></span> <span class="overlay-img-thumb font-icon-plus"></span> </a> <!-- Thumb Image and Description --> <img src="<?= $referencePresenter->getThumbnailImagePermalink(KT_WP_IMAGE_SIZE_THUBNAIL); ?>" alt="<?= $referenceModel->getContent(); ?>"> </div> </li> <!-- End Item Project --> |
V rámci definovaného HTML nám stačilo pouze osadit odkazy na náhledový obrázek (prozatím velikost ze strany WordPress – thumbnail) a dodat popisek naší reference. Vše nám snadno, rychle a efektivně dodá model a presenter.
Stejně jako v předchozí části šablony, i zde si nyní vytvoříme presenter, který nám vypíše potřebné data. Založíme si tedy nyní presneter, který pojmenujeme kt_wpfw_references_presenter.inc.php a umístíme ho do složky s ostatními presentery. Náš presenter bude dědit základní base. Jeho struktura bude vypadat takto:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<?php /** * Model pro obsluhu, resp. výpis referencí * * @author Tomáš Kocifaj * @link http://www.ktstudio.cz */ class KT_WPFW_References_Presenter extends KT_Presenter_Base { const DEFAULT_COUNT = 4; private $query; public function __construct() { parent::__construct(); } // --- getry & setry ------------------------------ /** * @return WP_Query */ public function getQuery() { if (KT::issetAndNotEmpty($this->query)) { return $this->query; } return $this->initQuery(); } // --- veřejné metody ------------------------------ /** * @return bool */ public function isQuery() { $query = $this->getQuery(); return KT::issetAndNotEmpty($query) && $query->have_posts(); } public function theQuery() { if ($this->isQuery()) { self::theQueryLoops($this->getQuery(), KT_WPFW_REFERENCE_KEY); } } // --- neveřejné metody ------------------------------ private function initQuery() { return $this->query = new WP_Query(array( "post_type" => KT_WPFW_REFERENCE_KEY, "post_status" => "publish", "posts_per_page" => self::DEFAULT_COUNT, "orderby" => "menu_order title", "order" => KT_Repository::ORDER_ASC, )); } } |
Protože náš presenter dědí základní base pro všechny presentery, máme k dispozici několik klíčových metod, které potřebujeme pouze trochu rozšířit.
getQuery()
Tato metoda nám vrátí objekt WP_Query, který obsahuje dotaz a data, která nám byla vrácena. S objektem WP_Query můžeme pak následně dle potřeby pracovat jak jsme z WordPressu naučení.
isQuery()
Metoda nám vrátí true / false pro případ, že byla WP_Query vytvořena a zároveň má nějaké data pro výpis.
theQuery()
Zde už probíhá trochu „magie“. Abychom nemuseli neustále psát běžnou WordPress loopu, framework má připravenou jednoduchou metodu právě na základním presneteru, která je statická a nazývá se theQueryLoops(). Ta na základě vytvořené query v objektu a předaného klíče post_typu provede celou loopu sama a korektně.
Zde si velmi dobře pamatujte, že soubor s loopou (loop-reference.php) musí mít stejný název jako klíč – v našem případně reference. Framework hledá ve složce /loop/ soubor loop-{post_type}.php
initQuery()
Metoda obstarává právě načtení a vytvoření WP_Query objektu dle našich požadavků a příslušné selekce dat. V našem případě jsme tedy definovali, že chceme pouze náš potřebný typ obsahu, výchozí počet a řazení.
Nyní nám už zbývá pouze osadit soubor ve složce /partials/ který jsme si pojmenovali jako recent-works.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php $referencesPresenter = new KT_WPFW_References_Presenter(); ?> <?php if ($referencesPresenter->isQuery()) : ?> <!-- Portfolio Projects --> <div class="row"> <div class="col-lg-12"> <h4 class="heading">Recent Works</h4> <div class="row"> <section id="projects"> <ul id="thumbs" class="portfolio"> <!-- Item Project and Filter Name --> <?php $referencesPresenter->theQuery(); ?> <!-- End Item Project --> </ul> </section> </div> </div> </div> <?php endif; ?> |
Jak vidíte, stačí již pouze zavolat presenter, zjistit, zda má co vypisovat pomocí metody isQuery() a následně použít vytvořenou metodu theQuery() která se postará o výpis.
V dnešním díle jsme si vytvořili potřebný model a presenter pro námi definovaný post_type – ukázali jsme si, jak se pracuje v případě jeho výpisu a co k tomu v rámci frameworku můžeme použít. Stačí si nyní založit několik referencí a hned uvidíme výsledek.
V dalším díle si ukážeme, jak definovat velikost vlastního obrázků, abychom docílili potřebného rozměru a začneme vytvářet detaily pro stránky.
To, proč jsme s tímto projektem začali, byl důvod, že jsme jednotlivé šablony pro WordPress chtěli vytvářet opravdu efektivně, kvalitně…
V minulém díle jsme provedli základní vytvoření kostry šablony, načetli jsme do FE externí zdroje, jako jsou obrázky, javascriptové a…
V minulém díle jsme naší šablonu zhotovili do stavu, kde již máme potřebné prvky ve WordPressu. Nyní bude potřeba zhotovit pro…
V minulém díle jsme si ukázali, jak vytvořit základní kostru šablonu společně s nainstalovaný KT Frameworkem. V dnešním díle bychom…
Odebírejte novinky z FW
Sledujte nás!
Follow @ktstudiocz!