Kroužek PHP

Třináctý kroužek (18. května)

Třináctý kroužek proběhl 18. května v 16 hodin. V jeho průběhu jsme si napsali vlastní router pro uživatelsky přívětivé URL.

Podklady ke stažení

Dvanáctý kroužek (4. května)

Dvanáctý kroužek proběhl 4. května v 16 hodin.

Dokončili jsme správu zabezpečení a napsali jsme jednoduchý model pro správu článků.

Podklady ke stažení | Hotová práce

První nettecast

Dneska vyšla pre-beta verze nettecastu (více info). Není dokonalá a plánuje se nová lepší verze, ale zatím je to lepší než nic.

Ke shlédnutí a ke stažení na adrese http://tomik.jmx.cz/nettecast.

Jedenáctý kroužek (23. března 2009)

Jedenáctý kroužek proběhl 23. března v 16 hodin. Pokračovali jsme na vylepšování našeho systému na správu článků. Tentokrát jsme se podívali, jak se v Nette pracuje s přihlašováním.

Stáhnout podklady k práci

Seriál Začínáme s Nette Framework

Všem doporučuji přečíst si seriál Začínáme s Nette Framework, který začal nedávno vycházet na Zdrojáku. Zatím (ke dni 18. března) vyšly dva díly:

  1. Nette Framework: Zvyšte svoji produktivitu,
  2. Nette Framework: Odvšivujeme,

ale v plánu je jich mnohem víc a postupně by měli sloužit, jako další oficiální zdroj informací o Nette vedle dokumentace a fóra.

Desátý kroužek (9. března 2009)

Desátý kroužek proběhl 9. března v 16 hodin. Přidali jsme možnost editovat a smazat stávající články.

Stáhnout hotovou práci

Devátý kroužek (2. března 2009)

Devátý kroužek proběhl 2. března 2009 v 16 hodin. Začali jsme psaním jednoduché aplikace pro administraci článků, ve které budeme příště pokračovat.

Stáhnout podklady pro práci | Stáhnout hotovou práci z konce lekce

Osmý kroužek (16. února 2009)

Osmý kroužek proběhl 16. února v 16 hodin.

Stáhnout podklady pro práci | Stáhnout hotovou práci z konce lekce

Nette Framework

Nette Framework open-source knihovna pro PHP využívající architektury MVP. Je napsán objektově a využívá nových vlastností PHP 5.3. Důležitým rysem celého frameworku je velká nezávislost jednotlivých tříd, takže lze velmi snadno používat jen jeho části.

Adresářová struktura

Základní adresářová struktura vypadá takto (lze ji samozřejmě přizpůsobit).

skeleton/
    app/
        models/          Složka pro modely („M“ v MVP)
        presenters/      Složka pro presentery („P“ v MVP)
        temp/            Složka pro cache (musí mít právo k zápisu)
        templates/       Složka pro šablony („V“ v MVP)
        bootstrap.php    Soubor s bootovací sekvencí pro aplikaci
    document_root/
        index.php        Deklarace cest ke složkám a načtení bootovací sekvence
        css/
        images/
    libs/                Složka s knihovnami
        Nette/
        dibi/

Nás bude zajímat hlavně adresář app, který obsahuje presentry, šablony a bootstrap.php. Ale ještě předtím je potřeba mít správně nastavený index.php ve složce document_root.

index.php

<?php
// absolutní cesta k rootu webu (toho, co je dostupné z prohlížeče)
define('WWW_DIR', dirname(__FILE__));

// absolutní cesta k aplikaci (složka s presentry a šablonami)
define('APP_DIR', WWW_DIR . '/../app');

// absolutní cesta ke knihovnám
define('LIBS_DIR', WWW_DIR . '/../libs');

// načtení bootovací sekvence
require APP_DIR . '/bootstrap.php';

bootstrap.php

Úloha souboru index.php končí tím, že spustí bootovací sekvenci uloženou v souboru bootstrap.php. Pro naše potřeby si zatím vystačíme s velmi zjednodušenou­ verzí.

<?php
// Krok 1: Načíst Nette Framework
// Načtení souboru loader.php umožní Nette načítat třídy automaticky,
// takže není potřeba je načítat ručně pomocí 'require'.
require_once LIBS_DIR . '/Nette/loader.php';

// Krok 2: Zapnout Nette\Debug
// pro hezké zobrazování chyb a vyjímek
Debug::enable();

// Krok 3: Získat front controller
$application = Environment::getApplication();

// Krok 4: Spusť aplikaci!
$application->run();

Bootovací sekvence pak končí tím, že předá řízení aplikaci (objektu Application). Aplikace pak s pomocí Routeru vybere správný Presenter. Protože jsme v bootstrapu řádný router dedefinovali, tak se automaticky použil výchozí.

$router = new SimpleRouter(array(
    'presenter' => 'Default',
    'action' => 'default',
));

Z definice lze i bez znalosti SimpleRouteru snadno usoudit, že výchozí presenter je DefaultPresenter a výchozí akce je default.

DefaultPresenter

Nejjednodušší podoba DefaultPresenteru je prázdná třída, který dědí od třídy Presenter. My do ní ale vložíme metody pro registraci filtrů a předání proměnných šabloně. Třídu je nutno uložit do složky app/presenters/ pod názvem DefaultPresenter.php.

class DefaultPresenter extends Presenter
{
    protected function beforeRender()
    {
        $this->template->registerFilter('CurlyBracketsFilter::invoke');
    }

    public function renderDefault()
    {
        $this->template->titulek = 'Úvodní stránka';
    }

    public function renderKuk()
    {
        $this->template->titulek = 'Kukací stránka';
    }
}

Šablony

Šablony sídlí ve složce app/templates/ a mají koncovku phtml. Ve všech šablonách bude používat zapnutý CurlyBracketsFil­ter, pro snažší syntaxi. Layout se jmenuje @layout.phtml a může vypadat třeba takto.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Kroužek PHP: {$titulek}</title>
    <link rel="stylesheet" href="{$baseUri}css/screen.css" type="text/css">
</head>

<body>
    {include $content}
    <img src="{$baseUri}images/nette-powered.gif" alt="Nette Framework powered" title="Běží na Nette">
</body>
</html>

Dále pak vytvořím soubor Default.default.phtml.

<h1>{$titulek}</h1>
<p>Lorem ipsum dolor sit amet, ...</p>

A nakonec vytvoříme i soubor Default.kuk.phtml.

<h1>{$titulek}</h1>
<p>...</p>

Do obou souborů doplníme vzájemné odkazy.

Default.defau­lt.phtml

<h1>{$titulek}</h1>
<a href="{plink Default:kuk}">Kuk!</a>
<p>...</p>

Default.kuk.phtml

<h1>{$titulek}</h1>
<a href="{plink Default:default}">Zpět na úvod</a>
<p>...</p>

Sedmý kroužek (26. 1. 2009)

Sedmý kroužek proběhl 26. ledna 2009 v 16 hodin. Dokončili jsme jednoduchý MVC framework, se kterým jsme minule začali.

Stáhnout hotový framework

Dnes kroužek odpadá

Dnešní kroužek (19. ledna) odpadá, protože bych tam byl se Slávkem sám. Tak si aspoň zopakujte na příště.

Šestý kroužek (5. ledna 2009)

Šestý kroužek proběhl 5. ledna 2009 v 16 hodin.

Začali jsme psát jednoduchý MVC frameworku, ve kterém budeme příště pokračovat.

Přečtěte si: Architektura aplikace od Honzy Tichého

Stáhnout hotovou práci z šestého kroužku.

Pátý kroužek (15. prosince 2008)

Pátý kroužek proběhl 15. prosince v 16 hodin. V průběhu kroužku jsme vytvořily základ pro jednoduchou třídu na posílání emailů.

Každý e-mail potřebuje nějaké obecné informace:

  • Kódování
  • Je text zprávy HTML?
  • E-mailová adresa odesílatele
  • Jméno odesílatele
  • Předmět
  • Text zprávy
  • Pole příjemců
  • Pole přídavných hlaviček

Všechny tyto informace se zpracují funkcí send(), která k odeslání používá klasickou funkci mail. Právě proto je její hlavní částí připravit parametry pro tuto funkci tak, aby splňovali odpovídající normy.

Pole příjemců stačí spojit čárkou.

// Příjemce
$to = implode(', ', $this->recipients);

S předmětem je problémů mnohem více, protože musí být v dost specifickém tvaru. Pokud je k dispozici standartní rozšíření mbstring, tak je situace o dost jednodušší, protože stačí využít funkcí, které nabízí.

if (extension_loaded('mbstring')) {
    mb_internal_encoding($this->charset);
    $subject = mb_encode_mimeheader($this->subject, $this->charset, 'B', "\r\n");
}

Pokud mbstring k dispozici není, lze ho dost krkolomě nahradit.

else {
    $subject = "=?" . $this->charset . "?B?" . base64_encode($this->subject) . "?=\n";
}

Pro text zprávy zase platí, že délka jednoho řádku nesmí přesáhnout 70 znaků. Nejjednoduší je využít vestavěné funkce wordwrap.

// Zpráva
$message = wordwrap($this->message, 70);

Aby správně fungovalo kódování stránky a případné HTML, tak je potřeba poslat korektní hlavičky.

// set Content type
$headers .= 'MIME-Version: 1.0' . "\r\n";
if ($this->isHtml) {
    $headers .= 'Content-type: text/html; charset=' . $this->charset . "\r\n";
} else {
    $headers .= 'Content-type: text/plain; charset=' . $this->charset . "\r\n";
}

Stejně tak je potřeba doplnit i hlavičku pro odesílatele.

// set from
if (!empty($this->fromName)) {
    $headers .= 'From: ' . $this->fromName . ' <' . $this->from . '>' . "\r\n";
} else {
    $headers .= 'From: ' . $this->from . "\r\n";
}

Na závěr připojíme uživatelské hlavičky.

foreach ($this->additionalHeaders as $header) {
    $headers .= $header . "\r\n";
}

Po jednoduchých kontrolách už stačí e-mail jen odeslat.

return @mail($to, $subject, $message, $headers);

Hotovou třídu Mail si můžete stáhnout.

Čtvrtý kroužek (1. 12. 2008)

Čtvrtý kroužek proběhl 1. 12. 2008 v 16.00.

Stáhnout podklady

Poznámka: Nezapomeňte si dodělat úkol z předminule, ať se procvičíte

Třetí kroužek (24. 11. 2008)

Kroužek proběhl 24. listopadu v 16 hodin.

Stáhnout podklady

Poznámka: Nezapomeňte si dodělat úkol z minule, ať se procvičíte

Druhý kroužek (3. 11 .2008)

Úkol

Upravte třídu Osoba tak, aby plně podporovala práci s příjmením. Tzn. přijímalo ho v konstruktoru, podporovala k němu přístup přes getter a setter, přes magický getter a setter a vypisovala ho v magické metodě __toString().

Zobrazit příklady | Stáhnout příklady

První kroužek (13. 10. 2008)

Zobrazit příklady | Stáhnout příklady


Navigace


Kontakt

Jan Tvrdík
ICQ: 238-999-481
MSN: jan.tvrdik@live.com