outsourcing programistyczny

Outsourcing CakePHP polega na przejmowaniu części lub całości zlecenia Klienta...

Programowanie aplikacji webowych

Masz pomysł na start-up? Klienta ze zleceniem na którego wykonanie...

Hosting dedykowany dla aplikacji w CakePHP

Hostingi dostępne na naszym rynku nie spełniają Twoich oczekiwań? Nakładają...

2013-09-04 ⇔ 2019-08-20

  • 100%
    POMYSŁ
  • 100.00%
    THE END

Dobra lecimy z koksem... trudno określić się jednoznacznie z Html-tagami w CakePHP i zamknąć je w obu funkcjach helpera Html jakie wymieniłem w tytule, jakiś czas zastanawiałem się czy warto rozbić ten artykuł na kilka odrębnych części stanowiących o $this->Html->useTag() i tag() i podobnych, czy od razu wyłożyć w artykule te wymienione i te które są z nimi powiązane, zdecydowałem że wyłożę je razem, jednakże tutaj skupimy się wyłącznie na helperze dla części dokumentowej w arkuszach html.

W CakePHP nie ma potrzeby używania bezpośrednio języka Html i PHP, przeplatanie obu generuje bardzo nieczytelny kod, kod który w małych ilościach jest do ogarnięcia w obszerniejszym zakresie robi się mglisty i nieczytelny, w CakePHP zdecydowanie czytelniej jest używać html tag helperów.
Podstawowe html tag helpery którymi można opisać każdy tag w dokumencie jest uniwersalny

  • $this->Html->tag();

oraz wyznaczony do zadań niestandardowych (07 zgłoś się):

  • $this->Html->useTag();

w tym momencie pominiemy różnice, to później... w html tag helperze są jeszcze tagi wyspecjalizowane w zadaniach:

  • this->Html->div()
  • $this->Html->para()

Pozostałe takie jak meta, script, url, link, image to materiał na osobne artykuły, tu skupię się wyłącznie na tag() i powiązanych.

Do dzieła, zobaczmy do czego mogą się nam przydać te "wynalazki" z CakePHP

Poniżej przedstawiam 2 tak samo funkcjonujące fragmenty kodu, w pierwszym przypadku mamy przeplatanie Html i kodu wykonującego w PHP w bardzo prostej funkcji warunkowej IF

<?php if(isset($title) && !empty($title)): ?>    
    <div class="indent-bot-2 boxes-bg">
        <h2><?php echo $title; ?></h2>
    </div>
<?php else: ?>
    <div class="indent-bot-3 boxes-bg">
        <h2>No niema tytułu</h2>
    </div>
<?php endif; ?>

w drugim to samo ale z Html tagami

<?php
if(isset($title) && !empty($title)){
    echo $this->Html->div('indent-bot-2 boxes-bg', 
            $this->Html->tag('h2', $title)
            );
}else{
    echo $this->Html->div('indent-bot-3 boxes-bg', 
            $this->Html->tag('h2', 'No niema tytułu')
            );    
}
?> 

oba przykłady wydają się z pozoru układne i czytelne, ale... wyobraźmy sobie że rozwijamy ten kod o dodatkowe warunki i iteracje i w pierwszym przykładzie zaczynają się schody bo kod się gmatwa..

<?php if (isset($title) && !empty($title)): ?>    
    <div class="indent-bot-2 boxes-bg">
        <h2><?php echo $title; ?></h2>
    </div>
    <div class="content">
        <?php if (!empty($contents)): ?>
            <?php foreach ($contents as $content): ?>
                <ul>
                    <?php if ($content['type'] != 2): ?>
                        <li><?php echo $content; ?></li>
                    <?php else: ?>
                        <li>tajne przez poufne</li>
                    <?php endif; ?>
                </ul>
            <?php endforeach; ?>
        <?php endif; ?>
    </div>
<?php else: ?>
    <div class="indent-bot-3 boxes-bg">
        <h2>No niema tytułu</h2>
    </div>
    <div class="content">
        <p class="text">no treści też nie ma</p>
    </div>
<?php endif; ?>

to samo tylko z Html helperem w CakePHP:

<?php
if (isset($title) && !empty($title)) {
    echo $this->Html->div('indent-bot-2 boxes-bg', 
            $this->Html->tag('h2', $title)
    );
    echo $this->Html->useTag('tagstart', 'div', array('class' => 'content'));
    if(!empty($contents)){
        $lista = array();
        foreach ($contents as $content){
                $lista[] = $content['type'] != 2 ? $content['content'] : 'tajne przez poufne';
        }
        echo $this->Html->nestedList($lista);
    }
    echo $this->Html->useTag('tagend', 'div');
} else {
    echo $this->Html->div('indent-bot-3 boxes-bg', 
            $this->Html->tag('h2', 'No niema tytułu')
    );
    echo $this->Html->div('content', 
            $this->Html->para('text', 'no treści też nie ma')
    );
}
?>

te fragmenty są wyssane z palca, i dotyczą jakiegoś tam tytułu i jakiejś tam treści, kod jest niewielki i dotyczy zaledwie małego bloku tekstowego w dokumencie Html, wyobraźcie sobie jednak jak bardzo może się zagmatwać jeżeli obejmiemy takim PHPowo HTMLowym „szyciem” cały arkusz.

W tych przykładach starałem się użyć wszystkich html tag helperów które dotyczą tego artykułu, w ostatnim przykładzie użyłem $this->Html->nestedList() (opisany w innym artykule) oraz $this->Html->useTag() użyty trochę na siłę, bo zdecydowanie bardziej optymalnym byłby taki zapis:

<?php
if (isset($title) && !empty($title)) {
    echo $this->Html->div('indent-bot-2 boxes-bg', 
            $this->Html->tag('h2', $title)
    );
    if(!empty($contents)){
        $lista = array();
        foreach ($contents as $content){
                $lista[] = $content['type'] != 2 ? $content['content'] : 'tajne przez poufne';
        }
        echo $this->Html->div('content', $this->Html->nestedList($lista));
    }
} else {
    echo $this->Html->div('indent-bot-3 boxes-bg', 
            $this->Html->tag('h2', 'No niema tytułu')
    );
    echo $this->Html->div('content', 
            $this->Html->para('text', 'no treści też nie ma')
    );
}
?>

No dobra porównaliśmy sobie „przetykany” i „html helperowy” kod, sądzę że na „pierwszy rzut oka” widać różnicę, i zakładam że każdy przyszły CakePHP-owiec, studiujący te wypociny słusznie założy, że HtmlHelper to jego dobry „kumpel” w programowaniu :)

Zajmijmy się naszymi tagami...

CakePHP $this->Html->tag()

$this->Html->tag() umożliwia nam otworzenie i zamknięcie dowolnego tagu html oraz osadzenie w nim naszego materiału, o ile nie wymaga on dodatkowych atrybutów to możemy go używać zamiennie do ->useTag(), a konstruując nasz ->tag() musimy trzymać się zasad:

<?php
$this->Html->tag('nasz_tag_html', 'treść umieszczana w tagu', array(
    //tablica atrybutów: 
    'class'=>'klasa', 
    'style'=>'styl' 
    //itp.
    ));
?>

dla zobrazowania przykładu użyjmy takiego kodu html:

 <h1>nasz tytuł</h1>

Używając naszego ->tag() możemy w CakePHP zapisać to na kilka sposobów:

<?php
    echo $this->Html->tag('h1', 'nasz tytuł');
?>

<?php 
//otwierając i zamykając blok tagu html
    echo $this->Html->tag('h1'); ?>
    nasz tytuł
<?php echo $this->Html->tag('/h1'); ?>

<?php 
//otwierając i zamykając blok tagu html
    echo $this->Html->tag('h1');
    echo 'nasz tytuł';
    echo $this->Html->tag('/h1'); 
?>

OK. wiemy że używając CakePHP $this->Html->tag() możemy albo wpisać sobie w niego nasz materiał, albo użyć go do otwierania i zamykania bloków html... zaraz, zaraz... ktoś bystry zadał by pytanie: to po co nam ten opisany w tytule useTag()? Skoro samo tag robi to samo!
Otóż nie ->tag() otworzy i zamknie nam blok html pod warunkiem że w htmlu nie będzie miał on dodatkowych atrybutów. Rozważmy poniższy przykład:

 <h1 class="klasa tytułu">nasz tytuł</h1>

W Cake zapieszemy go w ten sposób:

<?php
    echo $this->Html->tag('h1', 'nasz tytuł', array('class'=>'klasa tytułu'));
?>

CakePHP $this->Html->useTag()

Ale chcąc już otworzyć lub zamknąć cały blok html użyjemy ->useTag(), w naszym przykładzie otwieranie i zamykanie bloków w przypadku 1 wiersza kodu jest oczywiście bezsensowne i niepraktyczne, ale to tylko przykład mający zobrazować jak to działa :) zobaczmy to z ->useTag:, a moment nie napisałem dlaczego nie możemy robić tego z ->tag(), konstrukcyjnie ->tag() ma zawierać wewnątrz blok html a nie otwierać i zamykać bloki, powyższy przykład to poniekąd wytrych dzięki temu że ->tag() obsługuje takie tagi html jak pojedyncze <br> <hr> :)

co w takim razie z tym ->useTag(), z punktu widzenia zaawansowanego kejkowca to niepraktyczne narzędzie którym można „tylnymi drzwiami” zastąpić większość wbudowanych Helperów dla widoku, z mojego punktu widzenia to najpraktyczniejsze narzędzie do otwierania i zamykania dużych bloków html, zakładam że jesteś początkujący dlatego ograniczę się do przedstawienia tylko mojego punktu widzenia w praktycznym przykładzie, a dociekliwych zapraszam do dokumentacji api CakePHP:

<?php 
//otwierając i zamykając blok tagu html
    echo $this->Html->useTag('tagstart', 'h1', array('class' => 'klasa tytułu'));
    echo 'nasz tytuł';
    echo $this->Html->useTag('tagend', 'h1');
?>

CakePHP $this->Html->para(), $this->Html->div()

\Właściwie to wyczerpaliśmy już temat tych dwóch narzędzi, ->tag() i ->useTag() mogą obsłużyć całość naszego arkusza html w widoku, jednakże dla czytelniejszego i łatwiejszego programowania powstały narzędzia bardziej wyspecjalizowane: ->div() i ->para(), oba konstrukcyjnie są tak samo zorganizowane, lecz odmiennie niż ->tag()

<?php 
$this->Html->div('klasa', 'zawartość tagu', array(
    //tablica atrybutów innych niż class:
    'id' => 'jakiś id',
    'style' => 'styl'
        //itp.
));
$this->Html->para('klasa', 'treść umieszczana w tagu', array(
    //tablica atrybutów innych niż class:
    'id' => 'jakiś id',
    'style' => 'styl'
        //itp.
));
?>

zobaczmy zastosowanie na przykładach:

<!-- przykład -->
<p>jakiś ciąg tekstu</p>

<?php 
//rozwiązanie
    echo $this->Html->para('jakiś ciąg tekstu');
?>

<!-- przykład z klasą-->
<p class="klasa">jakiś ciąg tekstu</p>

<?php 
//rozwiązanie
    echo $this->Html->para('klasa','jakiś ciąg tekstu');
?>

<!-- przykład z klasą i id-->
<p class="klasa" id="jakiś id">jakiś ciąg tekstu</p>

<?php 
//rozwiązanie
    echo $this->Html->para('klasa','jakiś ciąg tekstu', array('id'=>'jakiś id'));
?>

<!-- przykład z klasą i id i stylem-->
<p class="klasa" id="jakiś id" style="margin:0">jakiś ciąg tekstu</p>

<?php 
//rozwiązanie
    echo $this->Html->para('klasa','jakiś ciąg tekstu', array(
            'id'=>'jakiś id', 
            'style'=>'margin:0'
    ));
?>

absolutnie te same zasady tyczą się ->div() dlatego nie powielam powyższego przykładu i tym samym kończę ten artykuł i wszystkim początującym kejkowcom życzę przyjemnych eksperymentów z poznawaniem tego fantastycznego frameworka :)

(~BN) © cakephp.com.pl

przewiń do góry
Przetwarzanie... prosimy o cierpliwość.

Loading
(default) 12 queries took 3 ms
NrQueryErrorAffectedNum. rowsTook (ms)
1SELECT `Site`.`id`, `Site`.`type`, `Site`.`name`, `Site`.`slug`, `Site`.`hints`, `Site`.`title`, `Site`.`desc`, `Site`.`info` FROM `sql_cakephp`.`sites` AS `Site` WHERE `Site`.`slug` = 'cakephp-moje-przyklady' LIMIT 1110
2SELECT COUNT(*) AS `count` FROM `sql_cakephp`.`sites` AS `Site` WHERE `Site`.`id` IN (5, 2, 'moje Repo', 'cakephp-moje-przyklady', 7355, 'Przykłady uzycia kodu i rozwiązań w CakePHP 2+', 'Na tej stronie będę umieszczał kod po który muszę często sięgać i wklejać go w robione projekty, najczęściej poszukuję go w poprzednich pracach', '<p style=\"margin-bottom: 0cm;\">Na tej stronie będę umieszczał kod po kt&oacute;ry muszę często sięgać i wklejać go w robione projekty, najczęściej poszukuję go w poprzednich pracach co często mnie irytuje, zwłaszcza że to bardzo proste rozwiązania &ndash; ale być może skoncentrowanie ich w jednym miejscu i w formie kt&oacute;ra może przydać się początkującym CakePHP\'owcom &ndash; okaże się dla mnie doskonałym rozwiązaniem, będę starał się opisywać te kody tak aby przypadkowy poszukiwacz rozwiązań m&oacute;gł się jakoś w tym odnaleźć. Jakikolwiek podział na Widoki, Controllery czy Modele zrobię w miarę jak będzie przybywało rozwiązań i będę musiał je grupować.</p>')111
3SELECT `Article`.`id`, `Article`.`site_id`, `Article`.`showdate`, `Article`.`title`, `Article`.`active`, `Article`.`author`, `Article`.`slug`, `Article`.`hints`, `Article`.`content`, `Article`.`code`, `Article`.`idea`, `Article`.`database`, `Article`.`boulid`, `Article`.`backend`, `Article`.`frontend`, `Article`.`layout`, `Article`.`created`, `Article`.`modified`, `Site`.`id`, `Site`.`type`, `Site`.`name`, `Site`.`slug`, `Site`.`hints`, `Site`.`title`, `Site`.`desc`, `Site`.`info` FROM `sql_cakephp`.`articles` AS `Article` LEFT JOIN `sql_cakephp`.`sites` AS `Site` ON (`Article`.`site_id` = `Site`.`id`) WHERE `Article`.`slug` = 'this-Html-useTag-tag-latwe-i-bardzo-przydatne' AND `Article`.`site_id` = 5 AND `Article`.`active` = 1 ORDER BY `created` DESC111
4SELECT `Photo`.`id`, `ArticlesPhoto`.`photo_id`, `ArticlesPhoto`.`article_id` FROM `sql_cakephp`.`photos` AS `Photo` JOIN `sql_cakephp`.`articles_photos` AS `ArticlesPhoto` ON (`ArticlesPhoto`.`article_id` = 185 AND `ArticlesPhoto`.`photo_id` = `Photo`.`id`) 110
5SELECT `Addfile`.`id`, `Addfile`.`title`, `Addfile`.`name`, `Addfile`.`hints`, `Addfile`.`size`, `Addfile`.`type`, `AddfilesArticle`.`addfile_id`, `AddfilesArticle`.`article_id` FROM `sql_cakephp`.`addfiles` AS `Addfile` JOIN `sql_cakephp`.`addfiles_articles` AS `AddfilesArticle` ON (`AddfilesArticle`.`article_id` = 185 AND `AddfilesArticle`.`addfile_id` = `Addfile`.`id`) 000
6SELECT `Article`.`slug`, `Article`.`title`, `Site`.`id`, `Site`.`name`, `Site`.`slug` FROM `sql_cakephp`.`articles` AS `Article` LEFT JOIN `sql_cakephp`.`sites` AS `Site` ON (`Article`.`site_id` = `Site`.`id`) WHERE `Article`.`site_id` = 5 AND `Article`.`active` = 1 ORDER BY `created` ASC440
7SELECT `Article`.`id`, `Article`.`site_id`, `Article`.`showdate`, `Article`.`title`, `Article`.`active`, `Article`.`author`, `Article`.`slug`, `Article`.`hints`, `Article`.`content`, `Article`.`code`, `Article`.`idea`, `Article`.`database`, `Article`.`boulid`, `Article`.`backend`, `Article`.`frontend`, `Article`.`layout`, `Article`.`created`, `Article`.`modified`, `Site`.`id`, `Site`.`type`, `Site`.`name`, `Site`.`slug`, `Site`.`hints`, `Site`.`title`, `Site`.`desc`, `Site`.`info` FROM `sql_cakephp`.`articles` AS `Article` LEFT JOIN `sql_cakephp`.`sites` AS `Site` ON (`Article`.`site_id` = `Site`.`id`) WHERE `site_id` = 3 AND `active` = 1 ORDER BY rand() ASC LIMIT 3331
8SELECT `Photo`.`id`, `ArticlesPhoto`.`photo_id`, `ArticlesPhoto`.`article_id` FROM `sql_cakephp`.`photos` AS `Photo` JOIN `sql_cakephp`.`articles_photos` AS `ArticlesPhoto` ON (`ArticlesPhoto`.`article_id` IN (172, 176, 184) AND `ArticlesPhoto`.`photo_id` = `Photo`.`id`) 330
9SELECT `Addfile`.`id`, `Addfile`.`title`, `Addfile`.`name`, `Addfile`.`hints`, `Addfile`.`size`, `Addfile`.`type`, `AddfilesArticle`.`addfile_id`, `AddfilesArticle`.`article_id` FROM `sql_cakephp`.`addfiles` AS `Addfile` JOIN `sql_cakephp`.`addfiles_articles` AS `AddfilesArticle` ON (`AddfilesArticle`.`article_id` IN (172, 176, 184) AND `AddfilesArticle`.`addfile_id` = `Addfile`.`id`) 000
10UPDATE `sql_cakephp`.`articles` AS `Article` LEFT JOIN `sql_cakephp`.`sites` AS `Site` ON (`Article`.`site_id` = `Site`.`id`) SET `Article`.`hints` = Article.hints + 1 WHERE `Article`.`id` = 185110
11SELECT `Site`.`name`, `Site`.`slug` FROM `sql_cakephp`.`sites` AS `Site` WHERE 1 = 1660
12SELECT `Sitesetting`.`id`, `Sitesetting`.`top`, `Sitesetting`.`place`, `Sitesetting`.`adress`, `Sitesetting`.`worktime`, `Sitesetting`.`phone`, `Sitesetting`.`mobile`, `Sitesetting`.`email`, `Sitesetting`.`regon`, `Sitesetting`.`licencja`, `Sitesetting`.`nip` FROM `sql_cakephp`.`sitesettings` AS `Sitesetting` WHERE 1 = 1 LIMIT 1110