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.
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.
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:
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.
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.
- Oficiální stránky
- Dokumentace
- Quick start
- Fórum
- Video PHP Seminář – Nette (27. 10. 2007)
- Video PHP frameworky jaro 2008 – Nette (12. 04. 2008)
- Školení Úvod do Nette Framework (ohlasy)
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ý CurlyBracketsFilter,
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.default.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.
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.
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.
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