Redakční systém NORS

Pro svou bakalářskou práci, kterou jsem obhajoval loni na jaře, jsem si zvolil téma "vývoj redakčního systému NORS". Pojďme se společně podívat, jaké výhody, fičurky a vlastnosti tato kompaktní aplikace přináší.

Důvod vzniku

Jelikož je NORS napsán pro PHP/MySQL, bude vhodné začít tím, proč jsem se vůbec do vývoje "dalšího" redakčního systému pouštěl. Dnešní standard pro psaní webových aplikací zahrnuje použití OOP a některé z osvědčených softwarových architektur (např. MVC, MVP, three-tier atd.). Tyto dva požadavky ale bohužel žádný z dnes rozšířených redakčních systémů nesplňuje. Značná část projektů je psána neobjektově (Wordpress, Drupal, PHP-Nuke) a pokud už objektově psány jsou, pak postrádají rozdělení do vrstev (Joomla, Nucleus, Typo3).

Snahou projektu NORS je tedy přinést aplikaci, která bude nejen dobře vypadat, ale v jejímž kódu se vyzná i někdo jiný, než jen prase :)

Vlastnosti

Projekt bohužel vznikal ještě v době, kdy neexistoval žádný tomuto projektu dobře padnoucí framework. Dnes už ale takový existuje - Nette - a je v plánu pro něj časem aplikaci přepsat.

Architektura

Softwarová architektura není žádným překvapením - použito bylo MVC s Front Controller návrhovým vzorem.

ORM Persistence

Jako ORM persistence byl použit návrhový vzor Active Record, přičemž informace o schématu tabulek databáze nejsou nikde natvrdo zadrátovány v kódu, nýbrž jsou pouze v konfiguračních souborech.

Cachování

Projekt klade silný důraz na vysoký výkon aplikace. Toho je dosahováno např. možností zapnout cachování výstupu (HTML). V případě platnosti cache se pak vůbec nevolá Action Controller, čímž razantně narůstá rychlost zpracování požadavku.

Routing

V aplikaci je programátor zcela odstíněn od formátu URL adres. Napříč aplikací se pracuje pouze s vnitřním požadavkem, který je pomocí routeru překládán na URL a opačně. Tento mechanizmus umožňuje velmi snadno zcela změnit formát URL bez zásahu do kódu.

Lokalizace

Aplikaci je možné přidáním jediného souboru lokalizovat do dalšího jazyka. V plánu je také podpora Gettextu.

Konfigurace

Konfigurace se zapisuje v čistém textu a má syntaxi podobnou jazyku YAML. Jedná se o key-value slovníky, kdy hodnotou může být buď řetězec nebo slovník (důležité je pak odsazení).

style: default
upload_dir: upload
timezone: Europe/Prague
db: 
	connector: mysql
	user: root
	password: xxxx

Takto vytvořené konfigurační soubory se velmi snadno převádějí na PHP pole, která se pak dají serializovat a cachovat. V aplikaci pak programátor ke konfiguraci přistupuje jako k objektům ($config->db->user).

Scaffolding

Scaffolding je technika, kdy programátor pouze popíše jakým způsobem se má pracovat s databází a aplikace si pak sama s pomocí této specifikace vygeneruje potřebné třídy (např. CRUD).

Programátor tedy např. napíše specifikaci (schéma) tabulky pro ukládání článků:

table: post
fields:
	-id_post: int
	+name: string
	-id_user: table
	id_category: table
	text: html
	date: datetime
	active: bool
	comments_allowed: bool
	-karma: double
	-evaluated: int
	-seen: int
	photo: file
ids: id_post
indexes:
	active_date: active, date
	category: id_category

Pokud se pak v kódu pokusí vytvořit instanci třídy ActiveRecord_Post, podívá se aplikace, jestli náhodou nemá k této třídě specifikaci. Pokud ji najde, "zkompiluje" si ji, vytvoří potřebné třídy (ActiveRecord_Post a Table_Post) a pokud odpovídající tabulku nenajde v databázi, tak ji podle specifikace vytvoří.

Schéma tabulky neslouží ale jen pro tvorbu tříd. S pomocí těchto informací dokáže aplikace vytvořit i HTML tabulky a formuláře pro práci se záznamy v databázi. Symboly plus a mínus před názvy sloupců jsou potřebné právě pro tuto činnost. Symbol mínus znamená, že položka nebude ve formuláři zobrazena, plus značí povinnou položku.

Závěr

Přestože se zatím jedná spíše o akademický projekt a s žádným závratným rozšířením nepočítám, některé vlastnosti aplikace určitě stojí za pozornost. Osobně používám NORS jako základ pro vývoj všech webových aplikací. Zejména jeho genericky vytvářená administrace mi během vývoje šetří neuvěřitelné množství času.

Stránky projektu: norsphp.com
Demo (heslo: test, heslo: test): demo.norsphp.com
Bakalářská práce: Vývoj redakčního systému NORS

Hodnocení

Komentáře

[1] Shabbi
2010-01-14 18:08:30

Jedním slovem - paráda! ;-)

Současný stav volně dostupných RSU vidím naprosto stejně a taky dost vážně přemýšlím o redakčním systému jako téma BP. Chtěl bych ale stavět na Nette, které se snad do té doby stihne vyvinout do stabilní verze 1.0 (v čemž držím Davidovi maximálně palce).

Samotný systém a PDFko jsem jen zběžně prolétl a velice se mi to líbí, doufám že si brzo najdu čas na nahlédnutí do zdrojáků :)

Já sám bych asi jen vynechal scaffolding a získaný čas bych využil na vymakání rozšířitelnosti. Ze zkušenosti si totiž troufám tvrdit že většina programátorů raději použije vlastní řešení, než aby si nechali něco jen tak vygenerovat. Navíc nevím na jaké úrovni lze využít scaffolding ke složitějším dotazům (vidím tam něco jako foreign indexy).

I tak ale velice chválím za skvěle odvedenou práci a nemít už vlastní systém, rozhodně bych se nebál začít stavět právě na tom tvém ;-)

Na tento komentář odpověděl [2] Dundee
[2] Dundee
2010-01-14 18:39:36

#1 Shabbi: NORS bohužel vznikal ještě v době, kdy Nette nebylo veřejně vydané, jinak bych do něj určitě taky šel.

Ten scaffolding není nijak vynucený. Človek jej nemusí používat vůbec a když jej použije, může si následně třídy podle libosti upravit. Scaffolding změny nepřepíše - používá se jen, když třída úplně chybí.

Vytváří to v podstatě jen prázdné třídy, které všechnu funkcionalitu dědí z předka.

class Table_Group extends Core_Table
{
	public function __construct()
	{
		parent::__construct('group');
	}
}

Kdo by chtěl tyhle kostry pokaždé opisovat, že? :)

Na rozšiřitelnosti to určitě bude chtít zapracovat. Zatím tam neexistuje žádné API pro pluginy.

2010-01-15 11:57:46

Mám jen jednu maličkost. Active Record není ORM.

ORM je objektově - relační mapování. Tedy máš objektový model a databázové schéma, které může a nemusí být stejné. ORM by mělo být schopné mapovat libovolné objektové schéma na libovolné relační schéma.

Active Record umí jen mapování 1:1. Z návrhových vzorů ORM nejlépe popisuje vzor Data Mapper.

Na tento komentář odpověděl [5] Dundee
[4] Aichi
2010-01-15 14:00:46

Zajímá mě proč lidé vymýšlejí pořád kolo, ale budiž. Nicméně věta:

Projekt bohužel vznikal ještě v době, kdy neexistoval žádný tomuto projektu dobře padnoucí framework. Dnes už ale takový existuje - Nette - a je v plánu pro něj časem aplikaci přepsat.

mě popíchla k tomu abych se u vás zastavil na delší čas. Přišlo mi divné proč zrovna Nette a jenom Nette, tak jsem otevřel PDF, abych se dozvěděl jaký jsou kritéria dobře padnoucího frameworku.

Nejspíš neumíte moc dobře anglicky a proto jste nehledal za humny (viz. str. 10 - cathegory), protože čím jsou frameworky Prado, Symphony, Yii, Zend horší než Nette?

Str. 13:[i]
Bohuºel v dob¥ vytvá°ení návrhu aplikace neexistoval ºádný framework, který by vyhovoval
nárok·m a poºadavk·m aplikace. Frameworky byly bu¤ p°íli² komplexní a m¥li vysokou reºii,
nebo neobsahovaly dostate£né odstín¥ní od HTTP protokolu a nebo byly psány pro PHP 4.
Proto bylo nutné napsat framework vlastní.[/i]

Moje doměnka potvrzena, žádné objektivný důvody.

View

Zajímavě odbyto, takže místo šablon se použije PHP, ne nadarmo se říká, že PHP je pouze šablonovací systém :) Zase žádné důvody nezmíněny. Např. co mě vadí na některých RS je, že pro generování HTML, žádné šablony nevyužívají, pak člověk musí znát celý RS (objekty, metody, funkce), aby si mohl něco v šablonách upravit.

A dostaváme se k zhodnocení. Jak se říká, věřme pouze té statistice, kterou si zfalšujeme. Je NORS framework, nebo RS? Jednou to a jednou ono, alespoň podle textu. Takže je otázka s čím by se měl porovnávat.

Na tento komentář odpověděl [5] Dundee
[5] Dundee
2010-01-15 21:22:30

#3 Jiří Knesl: Jasně, není to klasické ORM (typu Doctrine). Jak jinak ale jednou větou popsat popsat, co tento návrhový vzor dělá? Umožňuje přeci pracovat se záznamy relační databáze jako s objekty, takže označení Object-relational mapper není úplně mimo.

#4 Aichi: Rešerše existujících frameworků by vydala na samostatnou diplomovou práci. Požadavky byly celkem prosté: Chtěl jsem velmi rychlý, malý framework s nízkými paměťovými nároky, který by nabízel dobré odstínění od URL. A nenašel jsem. Nette se mi v tomto jeví opravdu jako jediný vhodný kandidát.

Rozhodnutí ohledně šablon opravdu nebylo moc dobré a dnes bych to asi už udělal jinak.

NORS je redakční systém, který ale vzhledem ke svému návrhu a koncepci lze použít i jako framework pro stavbu jiné webové aplikace. Je to ostatně napsané i v té práci:

"Cílem bakalářské práce je vyvinout kompaktní redakční systém určený pro dvě cílové skupiny:
nenáročné uživatele a programátory. Nenáročným uživatelům bude systém umožňovat velice
snadnou publikaci na internetu bez nutnosti znát webové technologie. Programátorům pak systém zajistí dobrý základ pro vývoj slooitějších aplikací na míru."

Pokud máte k aplikaci výhrady, budu rád, když se do projektu zapojíte a přispějete svým talentem a znalostmi k jeho zlepšení.

Na tento komentář odpověděl [6] Jiří Knesl
2010-01-18 16:08:25

#5 Dundee: Tak tam napiš místo ORM "persistence" a budeš to mít přesně a pravdivě. :)

Na tento komentář odpověděl [7] Dundee
[7] Dundee
2010-01-18 17:06:17
[8] sNop
2010-02-07 23:43:54

Cau,

> Tyto dva požadavky ale bohužel žádný z dnes rozšířených redakčních systémů nesplňuje.

uz splnuje MODx Revolution, uz je prvni RC, zaklad xPDO a JS knihovna ExtJS, podle mne nejlepsi open source CMS na netu

[9] Carlos
2010-08-29 22:04:40

Dneškem jsem si přečetl celou Bc. práci a docela se mi líbí a myslím, že je koncepčně dobře FW řešen. Demo vypadá také dobře. Asi ho vyzkouším. Chybělo by mi sice implementace google analytics a manulání vkládání do kódu, ale to celkem nevadí.
Já jsem zvyklý na framework Code Igniter, ten by ti nevyhovoval? Má ceslkem slušnou komunitu a je na netu i celkem dost návodů a nechybí dokumetace. Nicméně uvažuji na minisites použít tvůj NORS. Koneckonců člověk by měl pořád něco zkoušet, jlk být ve stereotypu je občas nuda a vede to občas k neobezřetnosti v psaní atd

Na tento komentář odpověděl [10] Dundee
2010-08-31 11:19:48

#9 Carlos: NORS sám na minisity také používám. Je hodně mocný, co se týče rychlosti tvorby administrace a jednoduchých modelů (úprava yml souboru). Zpětně je mi ale líto, že jsem nepoužil žádný framework. Jestli se někdy dokopu k dalšímu přepsání kódu, postavím to na Nette.

Komentáře již nelze přidávat