abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
dnes 09:44 | Upozornění

Byly zveřejněny videozáznamy přednášek z konference LinuxDays 2019, která proběhla 5. a 6. října v Praze. Odkazy na videa společně s prezentacemi naleznete v programu, případně můžete jít rovnou na stránku video. Záznamy pořizovalo Audiovizuální centrum SiliconHill.

Petr Krčmář | Komentářů: 10
včera 18:55 | Nová verze

Bylo vydáno OpenBSD 6.6. Opět bez oficiální písně. Z novinek lze zmínit například sysupgrade(8).

Ladislav Hagara | Komentářů: 5
včera 08:36 | Nová verze

Vyšla nová verze monitorovacího řešení Centreon 19.10.0. Novinek je spousta (realtime API, podpora JIRA, vylepšený systém notifikací...), ale těmi nejdůležitějšími je pro mnohé uživatele podpora nové verze rrdtool 1.7.x a php 7.2. Systém tak půjde bez problémů provozovat na jiných distribucích než CentOS 7. Kompletní přehled novinek v seznamu změn. Předpřipravená appliance i samotné části jsou k dispozici na oficiálních stránkách.

Max | Komentářů: 0
včera 01:00 | Komunita

Dnes vyjde Ubuntu 19.10 s kódovým názvem Eoan Ermine. Přehled novinek v poznámkách k vydání. Ubuntu 20.04 LTS bude Focal Fossa.

Ladislav Hagara | Komentářů: 9
16.10. 22:11 | Zajímavý projekt

Padesátiny Unixu lze oslavit také hrou The Unix Game aneb na unixové roury pomocí Scratche.

Ladislav Hagara | Komentářů: 1
16.10. 21:44 | Komunita

Vývojáři svobodného 3D softwaru Blender oznámili, že nejnovějším firemním sponzorem Blenderu je společnost Adidas. Jedná se o úroveň Corporate Silver, tj. 12 tisíc eur ročně.

Ladislav Hagara | Komentářů: 16
16.10. 18:22 | Komunita

V září proběhla každoroční konference Akademy komunity KDE. Nyní jsou záznamy přednášek dostupné online. Témata se dotýkají aplikací a knihoven KDE, jejich adaptaci pro různá speciální použití (vestavěná zařízení či rozšířená realita) i obecně vývoje a distribuce softwaru.

Fluttershy, yay! | Komentářů: 0
16.10. 09:11 | Zajímavý článek

Mozilla.cz informuje o vylepšování vlastních about: stránek Firefoxu, konkrétně o odstraňování volání funkce eval() z těchto stránek. Tyto stránky mají přístup k interním součástem Firefoxu, ale protože jsou napsané v HTML a JavaScriptu, mohou být cílem podobných útoků jako webové stránky zobrazované v prohlížeči (např. vložení cizího kódu nebo obsahu), jen s potenciálně závažnějším dopadem. Pokud by se někomu skutečně povedlo kód do

… více »
Ladislav Hagara | Komentářů: 3
16.10. 08:55 | Zajímavý projekt

Uživatel GitHubu joeycastillo představil The Open Book Project, jehož cílem je vytvořit open-source čtečku elektronických knih. Projekt se zatím nachází v rané fázi vývoje, už nyní ale obsahuje použitelný návrh hardware prototypu „Feather Wing“, jehož cílem má být ověření konceptu na 4,2palcovém displeji. Tento koncept je postaven na kitu Adafruit Feather M4 Express, který ovládá hlavní desku s displeji a tlačítky. Po úspěšném ověření

… více »
Bystroushaak | Komentářů: 41
16.10. 05:00 | Nová verze

Byla vydána verze 5.0.0 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata (Wikipedie). Přehled novinek v oficiálním oznámení a v aktualizované dokumentaci.

Ladislav Hagara | Komentářů: 0
Kdy jste naposledy viděli počítač s připojeným běžícím CRT monitorem?
 (20%)
 (4%)
 (11%)
 (39%)
 (24%)
 (2%)
Celkem 418 hlasů
 Komentářů: 22, poslední 23.9. 08:36
Rozcestník

www.AutoDoc.Cz

CakePHP: tvoríme CMS - 5 (Controller a View)

1. 8. 2008 | Tibor Piňo | Programování | 7516×

V predchádzajúcej časti seriálu sme si navrhli a vytvorili databázu, ku každej databázovej tabuľke sme si vytvorili model a veľmi stručne sme si predstavili controller. V dnešnej časti sa budeme controlleru venovať podrobne a predstavíme si taktiež ďalšiu časť architektúry MVC, a to konkrétne view.

Ako som už spomínal, v predchadzajúcej časti seriálu sme si controller stručne predstavili, v tomto prípade sme si ukázali použitie tzv. scaffolding. V tejto časti si controller predstavíme podrobne.

URL ako rozhranie aplikácie

Controller je tá časť aplikácie, ktorá ako prvá prichádza do styku s požiadavkami, ktoré prichádzajú do našej aplikácie z vonkajšieho sveta. Najčastejším prípadom takéhoto požiadavku z vonkajšieho sveta je URL adresa. Ak teda budeme pristupovať k našej aplikácii prostredníctvom URL, potrebujeme nejaký mechanizmus, ktorý nám na základe tejto URL určí, že aplikácia „pozná“, na aké prvky aplikácie má smerovať dané požiadavky. Takýto mechanizmus sa nazýva routing.

V minulosti sa formátu URL adresy veľká pozornosť nevenovala. Často sme boli svedkami podobných URL ako môžeme vidieť na ukážke

http://www.example.com/index.php?action=list&template=comments&page=2&order=DESC

URL adresa v takomto tvare bola možno jednoduchá pre programátora, určite však nie pre užívateľa. V súčasnosti je trend iný a hlavne moderné frameworky sa snažia vytvárať a používať tzv. user friendly URL. Príklad takejto adresy môžeme vidieť na ukážke

http://www.example.com/articles/mvc-model-view-controller-v-cakephp

Určite nám je jasné, že takáto adresa je oveľa viac čitateľnejšia a zrozumiteľnejšia nie len pre užívateľa. Bližšie štúdium o tejto problematike ponechám na samotných čitateľov, pretože by to presahovalo záber tohto článku. Avšak výhody takýchto URL sú nespochybniteľné. Ako sme už určite vytušili, CakePHP používa taktiež user friendly URL. Poďme sa teda bližšie pozrieť, akým spôsobom pristupujeme v CakePHP k našej aplikácii prostredníctvom URL

cakephp 05 url

V našom prípade by URL adresa pre zobraznie článku v aplikácii v CakePHP mohla vyzerať tak, ako môžeme vidieť na obrázku vyššie. Z URL nám môže byť napríklad hneď jasné, že sa bude jednať o zobrazenie určitého článku. Obrázok taktiež demonštruje fungovanie routingu v samotnom CakePHP. Prvá časť adresy označená zelenou farbou nám určuje konkrétny controller v našej aplikácii, druhá časť označená červenou farbou nám určuje konkrétnu akciu v controlleri a posledná časť označená modrou farbou nám určuje parameter vkladaný do tejto akcie. Aby sme si vedeli túto situáciu predstaviť konkrétne, pozrime sa na nasledovný kód, ktorý by bol vykonaný pri použití URL adresy z obrázku:

class ArticlesController extends AppController{
     var $name="Articles";
     function show($id){
           $this>set("article",$this>Article>findById($id));

     }
}

Mechanizmus routingu by zabezpečil, že by sa zavolala metóda show triedy ArticlesController a zároveň by bol metóde predaný parameter s hodnotou 43.

URL 100× inak

CakePHP nám v súvislosti s routingom ponúka ešte jednú veľmi užitočnú vlastnosť, a to sú tzv. routovacie pravidlá. Na základe týchto pravidiel môžeme ovplyvňovať samotné routovanie a v neposlednom rade nás routovacie pravidlá zbavujú povinnosti ručne modifikovať súbory .htaccess, čím nám značne uľahčujú prácu, pretože používajú oveľa prehľadnejšiu syntaxu. Treba však poznamenať, že routavacie pravidlá zďaleka nenahradzajú možnosti súboru .htaccess, pretože to nie je ani ich cieľom. Ich cieľom je poskytnúť z jednodušenú syntaxu pri pravidlách, ktoré sa týkajú routovania a spracovávania samotných URL adries.

Samotné routovacie pravidlá sa definujú v súbore app/config/routes.php. Pozrime sa na ukážkový kód

Router::connect('/sites/*', array('controller' => 'articles', 'action' => 'index'));
Router::connect('/', array('controller' => 'articles', 'action' => 'index'));

Pomocou vyššie uvedených pravidiel sme určili, že URL v tvare www.example.com/sites/* (kde znak * značí ľubovoľný tvar zvyšku adresy) bude routovaná na controller articles a že sa bude v tomto controlleri volať metóda index. Taktiež sme určili, že URL v tvare www.example.com bude routovaná na vyšie spomínaný controller articles a jeho metódu index. Podrobné vysvetlenie všetkých možností použitia routovacích pravidiel je nad rámec tohto článku, ale určite v budúcnosti pripravím článok, ktorý vás kompletne prevedie svetom routovacích pravidiel v CakePHP.

Na záver tejto časti pripomeniem, že celý mechanizmus spracovávania požiadavku v CakePHP som rozoberal v článku MVC model view controller v CakePHP.

Vytvárame controller

Od minulého článku máme vytvorené jednotlivé controllere, a to konkrétne ArticlesController, UsersController, CommentsController a TagsController. Avšak ako môžeme vidieť, naše controllere neobsahujú žiadne metódy resp. akcie, ktoré sú potrebné na správne fungovanie aplikácie tak, ako sme to spomínali v časti preberanej vyššie (aplikácia nám samozrejme fungovala aj tak, pretože sme využili scaffolding). Poďme si preto jednotlivé metódy vytvoriť a pripraviť si tak pôdu pre ich zobrazenie vo view.

V controlleri ArticlesController si vytvoríme dve metódy index a view, kde prvá bude reprezentovať akciu zobrazenie všetkých článkov a druhá bude reprezentovať akciu zobrazenie konkrétneho článku. Kód bude vyzerať následovne

class ArticlesController extends AppController {

        var $name = 'Articles';
        var $helpers = array('Html', 'Form');

        function index() {
                $this->set('articles', $this->paginate());
        }

        function view($id = null) {
                if (!$id) {
                        $this->Session->setFlash(__('Invalid Article.', true));
                        $this->redirect(array('action'=>'index'));
                }
                $this->set('article', $this->Article->read(null, $id));
        }
}

V controlleri CommentsController si vytvoríme 3 metódy, kde metóda index sa bude starať o zobrazenie všetkých komentárov, druhou metódou bude metóda view, ktorá sa bude starať o zobrazenie konkrétneho komentára a poslednou treťou metódou bude metóda add, ktorá nám pridá nový komentár. Kód bude vyzerať následovne:

class CommentsController extends AppController {

        var $name = 'Comments';
        var $helpers = array('Html', 'Form');

        function index() {
                $this->Comment->recursive = 0;
                $this->set('comments', $this->paginate());
        }

        function view($id = null) {
                if (!$id) {
                        $this->Session->setFlash(__('Invalid Comment.', true));
                        $this->redirect(array('action'=>'index'));
                }
                $this->set('comment', $this->Comment->read(null, $id));
        }

        function add() {
                if (!empty($this->data)) {
                        $this->Comment->create();
                        if ($this->Comment->save($this->data)) {
                                $this->Session->setFlash(__('The Comment has been saved', true));
                                $this->redirect(array('action'=>'index'));
                        } else {
                                $this->Session->setFlash(__('The Comment could not be saved. Please, try again.', true));
                        }
                }
                $articles = $this->Comment->Article->find('list');
                $this->set(compact('articles'));
        }
}

Posledným upravovaným controllerom bude controller TagsController, ktorému pre jednoduchosť vytvoríme len dve metódy, metóda index ktorá nám zobrazí všetky dostupné tagy a metóda view, ktorá nám zobrazí všetky články prislúchajúce k danému tagu. Kód bude vyzerať následovne:

class TagsController extends AppController {

        var $name = 'Tags';
        var $helpers = array('Html', 'Form');

        function index() {
                $this->Tag->recursive = 0;
                $this->set('tags', $this->paginate());
        }

        function view($id = null) {
                if (!$id) {
                        $this->Session->setFlash(__('Invalid Tag.', true));
                        $this->redirect(array('action'=>'index'));
                }
                $this->set('tag', $this->Tag->read(null, $id));
        }
}

K vyššie uvedeným kódom bližšie vysvetlím význam niektorých použitých metód, ktoré majú pre správne pochopenie celého mechanizmu zásadný význam.

Metódou set() posielame dáta do view. Metóda prijíma dva parametre, kde prvý označuje názov premennej vo view a druhý parameter sú samotné dáta uložené do premennej s názvom určenom v prvom parametri (bližšie si túto časť vysvetlíme neskôr, kedy budeme dáta zobrazovať).

Metóda paginate() sa nám stará o stránkovanie veľkého množstva dát (túto vlastnosť si predstavíme v niektorej z ďalších častí nášho seriálu).

Metóda Session->setFlash() nám nastaví chybovú hlášku pre layout, ktorú môžeme jednoducho v našom layoute zobraziť na mieste, kde budeme chcieť.

Metóda redirect() sa postará o presmerovanie behu našej aplikácie buď pomocou zadanej URL adresy alebo pomocou určenia controllera a akcie.

Premenná $this->data reprezentuje dáta odoslané formulárom z view.

Určite vás napadlo, že sme v našich controlleroch nikde neuvádzali akcie pre pridanie článku, pridanie tagu, administrácie užívateľov atď. Je to náš zámer, pretože dané akcie patria do administračného rozhrania, ktorému sa budeme venovať v nasledujúcej časti seriálu.

Zobrazujeme dáta

Už sme si spomenuli metódu, ktorá nám posiela dáta do view pochádzajúce z našich modelov. Správne tušíte, že sa jedná o metódu set() a pochopenie jej práce je pre ďalšie časti kľúčové. Ako som spomenul, príjíma dva parametre, prvý parameter je názov premennej vo view a druhým parametrom sú samotné dáta, ktoré sa vložia do premennej s názvom určenom v prvom parametri. Aby sme neostali len pri teórii, poďme si ich význam ukázať na príklade.

Zoberme kód nášho controllera ArticlesController a jeho metódu view, ktorá reprezentuje akciu pre zobrazenie konkrétneho článku. Užívateľ zadá do prehliadača URL www.example.com/articles/view/1, čím určí, že chce zobraziť článok s id 1. Mechanizmus routingu správne vyhodnotí URL a určí, že sa vykoná metóda view v controlleri ArticlesController. Táto metóda najprv otestuje, či sme zadali nejaké id článku. Ak áno, pomocou modelu vyberie dáta z tabuľky articles ($this->Article->read(null, $id)) a následne ich vloží do view pod premennou article ($this->set(‚article‘, $this->Article->read(null, $id))). Potom už je naša práca veľmi jednoduchá a dáta možeme zobraziť.

Súbory s našimi šablónami sa ukladajú do adresára app/views. V našom prípade pre zobrazenie článku to bude adresár app/views/articles/view.ctp. Náš súbor view.ctp, ktorý zobrazuje konkrétny článok, by mohol vyzerať následovne:

<div class="articles view">
<h2><?php  __('Article');?></h2>
        <dl><?php $i = 0; $class = ' class="altrow"';?>

                <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Id'); ?></dt>
                <dd<?php if ($i++ % 2 == 0) echo $class;?>>
                        <?php echo $article['Article']['id']; ?>
                        &nbsp;
                </dd>

                <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Title'); ?></dt>
                <dd<?php if ($i++ % 2 == 0) echo $class;?>>
                        <?php echo $article['Article']['title']; ?>
                        &nbsp;
                </dd>

                <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Text'); ?></dt>
                <dd<?php if ($i++ % 2 == 0) echo $class;?>>
                        <?php echo $article['Article']['text']; ?>
                        &nbsp;
                </dd>

                <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('User'); ?></dt>
                <dd<?php if ($i++ % 2 == 0) echo $class;?>>
                        <?php echo $html->link($article['User']['id'], array('controller'=> 'users', 'action'=>'view', $article['User']['id'])); ?>

                        &nbsp;
                </dd>
                <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Created'); ?></dt>
                <dd<?php if ($i++ % 2 == 0) echo $class;?>>
                        <?php echo $article['Article']['created']; ?>

                        &nbsp;
                </dd>
        </dl>
</div>

Teraz nám už je jasné, akým spôsobom zobraziť dáta vo view. V controlleri sme si vložili do view dáta pod premennou article a vo view sme na základe tejto premennej dáta jednoducho zobrazovali (napr. $article[‚Article‘][‚title‘] zobrazí titulok článku). Ešte poznamenám, že nám nemusí byť jasné, aký význam má metóda __(‚Created‘). Táto metóda súvisí s internacionalizáciou stránky a CakePHP na toto myslí už od počiatku vývoja aplikácie. Bližšie sa o internacionalizácii môžete dočítať v článku Viacjazyčný web v cakePHP.

Formát zobrazovaných dát

Už vieme, ako vložiť dáta do view. Poďme sa pozrieť nato, v akom formáte sa nám dáta z modelu do view dostávajú. Model všeobecne mapuje dáta do viacrozmerných polí. V podstate nám nastávajú dve možnosti pri vkladaní dát z modelu do view. Prvou možnosťou je, že nám model vráti jeden záznam, a druhou možnosťou je, že nám model vráti viac záznamov. Obidva prípady si ukážeme priamo na príklade.

Pozrime sa na situáciu, kedy nám model vráti jeden záznam. Predstavme si, že chceme zobraziť jeden článok, formát dát bude nasledovný:

Array
(
    [Article] => Array
        (
            [id] => 46
            [seo_link] => 5-tvorime-cms-s-cakephp-controller-a-view
            [title] => 5. Tvoríme CMS s CakePHP - Controller a View
            [intro_text] => V predchádzajúcej časti seriálu sme si navrhli a vytvorili databázu...
        )
)

Ako môžeme vidieť vyššie, model nám vratil dvojrozmerné pole, kde prvý index je názov modelu, z ktorého data pochádzajú, a druhý index je názov stĺpca v databázovej tabuľke.

Odlišná situácia nastane, keď nám model vracia viac záznamov. Predstavme si, že chceme zobraziť zoznam článkov, formát dát bude nasledovný

Array
(
    [0] => Array
        (
            [Article] => Array
                (
                    [id] => 46
                    [seo_link] => 5-tvorime-cms-s-cakephp-controller-a-view
                    [title] => 5. Tvoríme CMS s CakePHP - Controller a View
                    [intro_text] => V predchádzajúcej časti seriálu sme si navrhli a vytvorili databázu...
                 )
         )
    [1] => Array
        (
            [Article] => Array
                (
                    [id] => 41
                    [seo_link] => ako-poslat-email-s-prilohou
                    [title] => Ako poslať email s prílohou
                    [intro_text] => Nedávno som v jednom z mojich projektov riešil situáciu, kedy bolo potrebné k odosielanému emailu pripojiť aj prílohu...
                 )
         )
)

Ako môžeme vidieť vyššie, model nám vrátil trojrozmerné pole, kde prvý index určuje index záznamu v poli v rozmädzí od [0;n-1], kde n-1 je počet vrátených záznamov. Druhý index je názov modelu, z ktorého dáta pochádzajú, a posledný tretí index je názov stĺpca v databázovej tabuľke.

Treba ešte poznamenať, že model nám môže vrátiť aj zložitejšie štruktúry, avšak práca s nimi je obdobná. Keď si nebudeme istý formátom dát vo view, môžeme použiť metódu var_dump() resp. pri zapnutom debug móde metódu debug() priamo z CakePHP.

Záver

Týmto je táto časť nášho seriálu u konca. Jej cieľom bolo pochopenie základných princípov archiktúry MVC, a to konkrétne controller a view. Nedotkli sme sa niektorých tém, ktoré s danými časťami súvisia, akú sú napr. helpery, komponenty atď. Nemusíte sa obávať, určite sa k nim dostaneme v niektorej z ďalších častí.

Rád uvítam vaše námety a pripomienky k článku.

       

Hodnocení: 100 %

        špatnédobré        

Nástroje: Tisk bez diskuse

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Vložit další komentář

31.7.2008 07:24 nigol
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Nic proti CakePHP, ale... Připadá mi to jako Ruby on Rails přepsané do PHP. Tím ztrácím největší výhodu - jazyk Ruby. Co tedy vývojářům přinese použití CakePHP?
31.7.2008 14:07 Jirka | skóre: 36
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Možnost provozu na (téměř) jakémkoliv webhostingu. U RoR je přeci jen menší výběr.
31.7.2008 15:24 nigol
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
No budiž, i když dnes to už zdaleka není problém. RoR hostingů se objevuje čím dál víc a není problém si nějaký obstarat. Pro mne osobně by to nebyl argument, ale veřím, že pro někoho ano.
1.8.2008 13:25 Tibor Piňo | skóre: 26 | blog: Iron_Maiden
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
No ja sa nato pozeram trochu inak. Urcite za najvacsiu vyhodu RoR nepovazujem len samotny jazyk Ruby. RoR priniesol do programovania podla mna nove principy, ktore robia vyvoj rychlejsi a zabavnejsi a je postaveny na agilnych principoch. A toto vsetko, a nie len to, chcu tvorcovia CakePHP preniest do sveta PHP.
Daniel Kvasnička ml. avatar 2.8.2008 20:00 Daniel Kvasnička ml. | skóre: 52 | blog: The Joys and Sorrows of Being an IT Freak | Ostrava
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
AFAIK to vyvojari Cake i verejne priznavaji, ze je to v podstate pokus o RoR v PHP.
FSF: “screw you for not wanting the stuff we produce”, People: “screw you for not producing the stuff we want."
3.8.2008 08:37 nigol
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Jasně, já to chápu a beru to. Spíš mi není jasné, proč to dělají. Jako důvod beru, že PHP je na hostingu rozšířenější (i když vybírat si jazyk pro projekt jenom podle tohoto kritéria, je zvláštní), ale jinak to opravdu moc nechápu. AFAIK mi jazyk PHP těžko nabídne proti Ruby nějakou přidanou hodnotu.
Daniel Kvasnička ml. avatar 3.8.2008 11:30 Daniel Kvasnička ml. | skóre: 52 | blog: The Joys and Sorrows of Being an IT Freak | Ostrava
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Ono to neni tak jednoduchy. Casto je to proste pozadavek klienta, ze to v PHP chce. A taky rozdil v cene oproti hostingu pro Ruby/Python/Javu je jeste stale docela signifikantni a ne kazdemu klientovi lze vysvetlit, ze stoji za to to platit.

PHP tu proste s nama jeste nejakou dobu bude a proto stoji za to si vyvoj v nem zprijemnit nastroji, ktere z nej delaji alespon trochu rozumnou platformu (pro me to jsou Kohana, Propel, PHPTAL, Zend Framework, Addendum a dalsi...).
FSF: “screw you for not wanting the stuff we produce”, People: “screw you for not producing the stuff we want."
Milan Vít avatar 31.7.2008 14:22 Milan Vít | skóre: 23 | blog: about:linux | Orlová
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Poněkud nadčasový článek… :-)
„There is no dark side of the Moon really… as a matter of fact it's all dark.“
1.8.2008 15:52 LesTR | skóre: 17 | Plzeň
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Po shlednuti, ze ve tridach pouzivate deprecated klicove slovo "var" a nepouzivate viditelnosti u metod, jsem clanek dal ani necetl.
Nic ve zlem, ale tohle neni php5 oop kod, tohle je s prominutim bastl hodny php4.
Kazdopadne stejne zustanu u Zend Frameworku : )
Save The World - http://www.worldcommunitygrid.org/ LesTR
2.8.2008 09:52 ...
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
$i % 2

Modulus by mel byt nahrazen logickym and pro zvyseni vykonu, konkretne if ($i & 1) bude testovat prvni bit (majici hodnotu 2) a ten se meni zaroven s tim, zda cislo je sude, nebo liche.
3.8.2008 21:27 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Toto je naprosto bezpředmětná optimalizace pro tento typ jazyka. Něco podobného je dobré po C/C++, ale i tam je překladač schopný si to domyslet;)
8.8.2008 11:55 --==[FReeZ]==--
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Kompilator neni schopny si to domyslet. Ani v C++ shl neni mul. shr neni div a v PHP tato optimalizace neni bezpredmetna !
Prvy test - bitova rotace
echo 8 >> 2
2
Branch analysis from position: 0
Return found
filename:       Command line code
function name:  (null)
number of ops:  4
compiled vars:  none
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   1     0  SR                                               ~0      8, 2
         1  ECHO                                                     ~0
         2  RETURN                                                   null
         3* ZEND_HANDLE_EXCEPTION                                    
Druhy test - deleni
echo 8 / 4
2
Branch analysis from position: 0
Return found
filename:       Command line code
function name:  (null)
number of ops:  4
compiled vars:  none
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   1     0  DIV                                              ~0      8, 4
         1  ECHO                                                     ~0
         2  RETURN                                                   null
         3* ZEND_HANDLE_EXCEPTION                                    
Pokud by optimalizace byla bezpredmetna, PHP by v prvem pripade nepouzilo shift right, ale div a pokud by si to kompilator umel domyslet, v druhem pripade by byl SR (Shift Right) a ne DIV, takze laskave prestante sirit bludy, pane __dark__
8.8.2008 12:01 --==[FReeZ]==--
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Treti test - modulus
echo 7 % 2
1
Branch analysis from position: 0
Return found
filename:       Command line code
function name:  (null)
number of ops:  4
compiled vars:  none
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   1     0  MOD                                              ~0      7, 2
         1  ECHO                                                     ~0
         2  RETURN                                                   null
         3* ZEND_HANDLE_EXCEPTION                                    

Ctvrty test - and
echo 7 & 1
1
Branch analysis from position: 0
Return found
filename:       Command line code
function name:  (null)
number of ops:  4
compiled vars:  none
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   1     0  BW_AND                                           ~0      7, 1
         1  ECHO                                                     ~0
         2  RETURN                                                   null
         3* ZEND_HANDLE_EXCEPTION                                    
8.8.2008 20:56 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Aha, takže mi chcete říct, že stráky, které potřebují desítky SQL dotazů pro zobrazení zachrání nějaké & 1 místo % 2 ?

To co tu ukazujete je low level optimalizace, kterou znají hlavně programátoři C a asm, ale uplatňovat podobné postupy v php ? Mnohem víc zabere zvolený algoritmus, dobře napsaný SQL dotaz nebo třeba o jeden SQL dotaz míň.

Pokud to berete tak vážně, tak si pište stránky v C a budete je mít super rychlé
8.8.2008 23:44 --==[FReeZ]==--
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Aha, takže mi chcete říct, že stráky, které potřebují desítky SQL dotazů pro zobrazení zachrání nějaké & 1 místo % 2 ?
Nic takoveho jsem nikde nepsal, pouze uvadim, ze tato optimalizace neni bezpredmetna. To co tu ukazujete je low level optimalizace, kterou znají hlavně programátoři C a asm, ale uplatňovat podobné postupy v php ?
Logicke operace patri mezi naprosty zaklad, vyucuji se jiz na SS v predmetu cislicova technika, kdo je nezna, nemuze byt programator. Pouzivat by se mely vzdy, pokud je to mozne. Pro vasi informaci jsou o vice nez 100% vykonnejsi, nez obycejne operace s cisly. Pokud to berete tak vážně, tak si pište stránky v C a budete je mít super rychlé
Mozna vam uniklo, ze PHP uziva Zend Engine a sadu extensionu, pokud tedy potrebuji mit urcitou cast super rychlou, napr. generovani XHTML, mohu si v C napsat PECL extension, kterym do PHP pridam tridu ci funkce, pote v PHP naprogramuji potrebnou logiku. Psat webove stranky cele v C se vetsinou nevyplati, jinak by to pozadoval kazdy zakaznik =) Reaguji predevsim proto, ze by kod mel byt tak, jak uvadim - s logickymi funkcemi.
Josef Kufner avatar 9.8.2008 11:01 Josef Kufner | skóre: 69
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Aha, takže mi chcete říct, že stráky, které potřebují desítky SQL dotazů pro zobrazení zachrání nějaké & 1 místo % 2 ?
Nic takoveho jsem nikde nepsal, pouze uvadim, ze tato optimalizace neni bezpredmetna.
A protože jsi to nepsal, tak jedna promarněná instrukce na 0.00005 ms je vedle zbytečného SQL dotazu na 10 ms opravdu bezpředmětná je.

Takovouto optimalizací snižuješ čitelnost kódu, takže tím plýtváš čas programátora, který je nesrovnatelně dražší než dva takty procesoru 3× za sekundu.

Souhlasím s tím, že kód by se měl být slušně napsaný a efektivní, ale všeho s mírou. Občas je prostě lepší zvolit postup, který není úplně nejefektivnější, ale je čitelnější a lépe udržovatelný.
Hello world ! Segmentation fault (core dumped)
9.8.2008 17:38 --==[FReeZ]==--
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
__dark__: logicky and je rychlejsi nez modulus v naprosto kazdem jazyce, praseni kodu je tyto operace vynechat, delaji to jen amateri, staci nahlednout do zdrojovych kodu nekoho, kdo programuje alespon 10 let a ihned uvidite, jak to ma vypadat.

Je spatne, kdyz neznate nikoho kdo pise extensiony do PHP, protoze PHP je Zend Engine a sada extensionu, nic jineho. Pokud si chcete nejake 3rd party extensiony stahnout, hlavni repozitar je na http://pecl.php.net a tutorial pro novacky, kteri si chteji jistou cast projektu napsat v C, tedy vytvorit svuj extension, je na devzone.zend.com, konkretne http://devzone.zend.com/node/view/id/1021

Josef Kufner: Nauc se nejprve programovat, pises naproste hlouposti. Na rozdil od tebe vim, ze kazda optimalizace, ktera si nevyzada neprimerene mnoho casu na realizaci se vzdy musi pouzit. V pripade mod i and se jedna pouze o jeden znak na klavesnici, zabere mi stejne casu pouzit o vice nez 100% vykonnejsi variantu, ovsem spatny programator, aneb. script kiddie ci code monkey to samozrejme neresi a necha tam to, u ceho nemusi premyslet. Takovy clovek by mel radeji zustat u HTML a CSS, tam staci jen zbouchat tupy kod a logickou cast zcela vynechat.

Jestli nekdy budes na stejne ci vyssi urovni nez jsem ja, muzes poucovat o casu programatora a citelnosti kodu. Po-Pa 8 hodin denne ten kod totiz programuji a ctu, protoze se tim zivim, tak vim velice dobre, o cem mluvim. Radeji mi uz nic o programovani nepis, protoze me nezajima co si nekde prectes, ohledne asm - zaklady zakladu asm na dnes velmi zastaralem typu procesoru neznamenaji, ze umis asm a pokud bys jej umel doopravdy (5 az 10 let praxe v enterprise prostredi), myslim ze by jsi netravil cas na abclinuxu a radeji programoval Nvidia GPU za v preproctu ~100 tis. mesicne.
10.8.2008 01:13 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Tady je rozpor v tom, co mě baví dělat, a v tom, čím se živím.

Pokud mě něco baví, neznamená to, že se tím chci živit. Mám rád optimalizace, mmx a sse intrinsics, takže čistě v asm už neprogramuju, ale má to celkem blízko (tak jako C/C++ samotné, aspoň pro mě).

K PHP. Pokud se bavíme o CakePHP, tak ta databázová vrstva je věc, která zpomalí mnohem víc než nějaký operátor u výpisu z tabulky. Pokud jste tedy dobrý programátor, nepoužijete to (jenže nežijeme věčně, že, takže proč si vývoj neusnadnit) a nebudete se k takové blbosti ani vyjadřovat - to bylo asi vaší řečí;-)

Ještě k těm překladačům C jazyka:
unsigned int a;

a /= 8;
Toto si překladač zcela jistě upraví na bitovou operaci.
11.8.2008 16:51 --==[FReeZ]==--
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Osobne v PHP uzivam PDO a vlastni tiny wrapper + oddeleny soubor pro kazdou DB pro pripad, kdy je potreba pristupovat k vice odlisnym db simultane, napr. PgSQL + MySQL v totoznem projektu. CakePHP nepouzivam, zkousim moznosti ostatnich frameworku, pouzivam vsak vlastni. Nerekl bych, ze se dobry ci spatny programator pozna podle neceho jineho, nez jeho zdrojovych kodu a znalosti z danne oblasti. Vami uvedeny priklad se v C samozrejme optimalizuje. Rad bych ovsem pridal priklad z praxe, ve ktere casto pouze clovek muze vedet, zda je a vzdy mocnina 2, ci neni. int some_func(int x) {
int y;
...
x /= y;
...
return x;
}

Kompilator pouzil imul, protoze nezjistuje vsechny zaslane argumenty funkci.
12.8.2008 00:36 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
No ale to je zcela jiná liga :-)

Ve vašem případě je to logické, protože překladač nezná Y, ale pokud bude Y konstanta, dobrý překladač udělá co je v jeho silách, aby se vyhl případnému dělení, násobení, atd :)

Takovéto věci se mi vypláci například u počítačové grafiky, jenže tento obor asi nelze srovnat s výpisem tabulky v PHP ;-)

Josef Kufner avatar 10.8.2008 21:40 Josef Kufner | skóre: 69
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
A na jaké úrovni jsi ty? Představ se nám trošku, ať víme, s kým máme tu čest...

Programováním se zabývám něco přes deset let (povětšinou C a v poslední době PHP), takže už o tom taky něco vím ;-).

Zpět k tématu: Základem úspěchu při optimalizaci je vědět, kdy je to potřeba je a kdy není. Kdykoliv jsem měl někdy potíže s výkonem, tak to nikdy nebylo kvůli takovýmto detailům, ale kvůli nadměrné složitosti algoritmu. Ať už kvůli zapomenutému strlen() nebo kvůli tomu, že jsem vzal co bylo poruce a soustředil se na důležitější části.

Napsat '&' místo '%' size je jen jeden znak, ale jakmile chci změnit '2' za '3', tak už to je trošku pracnější...

A co se týče rychlosti samotných instrukcí, záleží i na instrukcích předcházejících, a následujících, na konkrétním typu procesoru, na optimalizacích, které provádí, jak se mu zrovna povedou a dalších věcech, takže ta ztráta nakonec nemusí být tak velká, jak píšeš.
Hello world ! Segmentation fault (core dumped)
11.8.2008 17:00 --==[FReeZ]==--
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
A na jaké úrovni jsi ty? Představ se nám trošku, ať víme, s kým máme tu čest...
Ocekaval jsem, ze navstivis google.cz a napises tam "freez", asi jsem ocekaval prilis.
Napsat '&' místo '%' size je jen jeden znak, ale jakmile chci změnit '2' za '3', tak už to je trošku pracnější...
Pri detekci zda je cislo sude ci liche neexistuje zadne "jakmile chci zmenit 2 za 3...", v ostatnich pripadech plati pravidlo neprve vse promyslet, pote zvolit optimalni algoritmus, nikoliv upravovat a upravovat, dokud to nebude vypadat, ze to nejak funguje.
"A co se týče rychlosti samotných instrukcí, záleží i na instrukcích předcházejících, a následujících, na konkrétním typu procesoru"
Diskutuje se zde specificky o x86 a x86_64, pricemz tam je v tomto pripade vzdy rychlejsi logicka operace a nezalezi na poradi instrukci.
Josef Kufner avatar 11.8.2008 22:06 Josef Kufner | skóre: 69
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Ocekaval jsem, ze navstivis google.cz a napises tam "freez", asi jsem ocekaval prilis.
Přišlo mi zbytečné prolistovávat se katalogem mrazáků ;-)
Pri detekci zda je cislo sude ci liche neexistuje zadne "jakmile chci zmenit 2 za 3...", v ostatnich pripadech plati pravidlo neprve vse promyslet, pote zvolit optimalni algoritmus, nikoliv upravovat a upravovat, dokud to nebude vypadat, ze to nejak funguje.
Tohle nevysvětluj mě, ale zákazníkům.
Diskutuje se zde specificky o x86 a x86_64, pricemz tam je v tomto pripade vzdy rychlejsi logicka operace a nezalezi na poradi instrukci.
PHP funguje i na jiných architekturách. Proč se omezovat zrovna na tu, co máš na stole ty?

ps: Tvůj blog jsem našel.
Hello world ! Segmentation fault (core dumped)
12.8.2008 09:22 --==[FReeZ]==--
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Nasel jsem tve programy, dlouho jsem se tak nenasmal. Mel by ses naucit alespon 1 jazyk poradne, a ne podradne. Tve znalosti PHP jsou tristni, vubec se nedivim tvym reakcim, kdyz vidim jake zdrojove kody jsi zvykly produkovat. Jmena tvych programu take vypovidaji o ledascem.

Tohle nevysvětluj mě, ale zákazníkům.
To bys mel vedet ty, ne zakaznik.

PHP funguje i na jiných architekturách. Proč se omezovat zrovna na tu, co máš na stole ty?
Vetsina web serveru ma tutez architekturu
...Ze ja s nekym takovym vubec ztracim cas. Ten omozenec to proste nedokaze pochopit.
Josef Kufner avatar 12.8.2008 09:56 Josef Kufner | skóre: 69
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Hmm, asi bych tam měl to datum umístit trochu viditelněji...

Btw, podle čeho jsi posuzoval mé znalosti PHP, když mám na webu v PHP jen jednu věc, která je stará asi 5 let (zveřejněna byla o dost později)?
Tohle nevysvětluj mě, ale zákazníkům.
To bys mel vedet ty, ne zakaznik.
Pokud jsi někdy viděl zákazníka, který ví co chce a nemění požadavky častěji než ponožky, celkem ti závidím. Jinak prostě nezbývá, než psát tak, aby se to dalo lehce upravovat i za cenu, že to nebude nejoptimálnější.
Hello world ! Segmentation fault (core dumped)
9.8.2008 15:02 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
OK, v php je rychlejší napsat & 1. Umím asm, takže vím, že logické operace jsou rychlejší (sice moc nechápu, že si takto někdo prasí kód, ale to je na jinou debatu :) )

Ale když si představím, jaká mašinerie se musí odehrát k provedení blbého SQL dotazu (a ten dotaz není jeden), tak si stojím za svým, že to je bezpředmětné.

Pokud se vrátíme k tématu. CakePHP používá nějakou DB vrstvu (nestudoval jsem, ale pokud se jedná o orm, tak je to další zpomalení), a mluvilo se o výpisu tabulky (to znamená každá položka se musí tahat z db, namapovat na instanci). Tady nás nějake % 2 nebo & 1 prostě nezachrání, nikdy...

PS: v PHP už nedělám a zend neznám, takže k tomu se nemůžu vyjádřit, ale osobně neznám nikoho, kdo by si něco do php naprogramoval v C:)
Daniel Kvasnička ml. avatar 2.8.2008 20:03 Daniel Kvasnička ml. | skóre: 52 | blog: The Joys and Sorrows of Being an IT Freak | Ostrava
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Zend je fajn, ale IMHO ne jako zaklad. Super na nem je, ze se z nej daji pouzit jen casti a tak zakladni MVC triadu muze zajistovat neco jineho a kousky Zendu se pak staraji o ruzne specificke ukoly.
FSF: “screw you for not wanting the stuff we produce”, People: “screw you for not producing the stuff we want."
3.8.2008 11:29 Tibor Piňo | skóre: 26 | blog: Iron_Maiden
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
No CakePHP je PHP4 kompatibilný, takže dodržujem konvencie CakePHP...
2.8.2008 10:41 alexovi
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Vypadať => Vyzerať

Skutocne mi to trha zrak.
2.8.2008 11:18 alexovi
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
No tak ono je toho este viacej.

"Kód bude vypadať následovne" -- sa v texte nachadza 3x a navyse dost blizko seba,

Miesanie cestiny a slovenciny nie je vhodne. Preferujem ked je clanok napisany v jednom jazyku.
Už sme si spomenuli metódu, ktorá nám posiela dáta do view pochádzajúce z našich modelov. Správne tušíte, že sa jedná o metódu set() a pochopenie jej práce je pre ďalšie časti kľúčové.
Podstatna je informacia, ze metoda set() je pre dlasie pokracovanie klucova. Nie je potreba spominat, ze sme si ju o 10 riadkov vyssie popisaly (vyznam by to malo, keby sa o danej metode pisalo v starsom clanku).

Podobne "navraty" sa vo vasich clankoch objavuju viackrat. Neviem mozno ste platey za pocet slov ale takto zbytocne znizujete kvalitu svojho clanku, ktory je o zaujimavej teme.

Prosim neberte si moju krityku zle. Snazim sa Vam ukazat, kde robite najvecsie (okate) chyby, aby boli Vase clanky kvalitnejsie. Mozno by sa hodilo, keby niekto zo starsich a skusenejsich prispievatelov obcas presiel clanky inych autorov a zkrityzoval ich (Alebo vytvorit bokom nieaku stranku, ktora by obsahovala veci, ktorym sa pri tvorbe technickeho clanku vyhnut??)

PS :: Nie som novinar ani spisovatel a tak je mozne, ze sa mylim. Len sa pokusam zdoraznit vecy v textu ktore ma vyrusuju od citania.
3.8.2008 11:37 Tibor Piňo | skóre: 26 | blog: Iron_Maiden
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Dakujem za upozornenie. Novinar nie som ani ja a snazim sa pisat clanky zrozumitelne, tak aby to kazdy pochopil, nic viac, nic menej. Pripomienky typu
mozno ste platey za pocet slov
si prosim vas odpuste, je to trapne. Ja rad privitam namety a pripomienky, takze sa budem snazit z vasich pripomienok poucit.

A na abclinuxu je predsa email konferencia, kde si mozes precitat clanky este pred vydanim a napisat k nim svoje pripomienky.
3.8.2008 23:10 alexovi
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Pripomienky typu

mozno ste platey za pocet slov

si prosim vas odpuste, je to trapne.
Ospravedlnujem sa. nemyslel som to v zlom.
4.8.2008 12:07 Robert Krátký | skóre: 94 | blog: Robertův bloček
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
A na abclinuxu je predsa email konferencia, kde si mozes precitat clanky este pred vydanim a napisat k nim svoje pripomienky.
To je sice pravda, ale tato konference je pouze pro aktivní autory.
Luboš Doležel (Doli) avatar 3.8.2008 22:32 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Nahradil jsem to.
Neviem mozno ste platey za pocet slov
Délka sice roli hraje, ale kvalita samozřejmě také.
19.5.2013 08:52 jirka
Rozbalit Rozbalit vše Re: CakePHP: tvoríme CMS - 5 (Controller a View)
Díky za článek, mrkněte na http://cakemag.cz

Založit nové vláknoNahoru

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.