EasyRSS
- Foowie
- Člen | 269
Taková menší komponenta na ulehčení generování RSS kanálů.
Komponenta ke stažení (Revize 6 ze dne 28.08.2009)
Příklad použití:
Presenter:
<?php
class RssPresenter extends Presenter
{
public function startup() {
parent::startup();
Debug::disableProfiler(); // Kvůli validitě výsledného XML dokumentu
//EasyRss::$formatResult = true; // Odkomentovat, pokud se má dokument formátovat
}
public function renderClanky() {
$rss = $this->getComponent("easyRss");
$rss->setTitle("Články webu xyz"); // Nadpis RSS
$rss->setLink("http://www.xyz.cz/clanky/"); // Link RSS
$rss->setDescription("Články webu zajímající se o ...."); // Popis RSS
$rss->setLimit(5); // Celkový počet záznamů k vypsání
$rss->setExpirationTime(3600); // Jak často se má RSS přegenerovávat? (V mezičase se obsah sosá z cache), nastaví se i TTL
$rss->resource->setResources("clanky"); // Jaké zdroje se mají použít?
}
public function renderVse() {
$rss = $this->getComponent("easyRss");
$rss->setTitle("Web xyz");
$rss->setLink("http://www.xyz.cz/");
$rss->setDescription("Web zajímající se o ....");
$rss->setLimit(20);
$rss->setExpirationTime(3600);
$rss->resource->setResources("clanky", "aktuality", "sekce");
}
public function createComponentEasyRss($name) {
// Nejdříve vytvoříme kontejner pro rss zdroje.
// První parametr je callback na factory, druhý je seřazení
// Pokud používate výhradně RssSqlResource, pak je efektivnější použít RssSqlContainer !
// $container = new RssSqlContainer(array($this, "rssResourcesFactory"), "pubDate", "DESC");
$container = new RssContainer(array($this, "rssResourcesFactory"), RssSort::$pubDateSort);
$rss = new EasyRss($container);
$rss->setLanguage("cs"); // Nastavíme jazyk RSS
return $rss;
}
/**
* Zde se vytváří zdroje pro rss
*/
public function rssResourcesFactory($name) {
switch($name) {
case("clanky"): {
// Jméno zdroje, Dibi-SQL dotaz (string/array), nepovinně callback který se provede nad každým výsledným řádkem
// SQL dotaz by měl být seřazen !
return new RssSqlResource($name, "SELECT * FROM [rss_clanky] ORDER BY [pubDate] DESC", array($this, "rssCallback"));
} break;
case("aktuality"): {
$dibiDataSource = dibi::dataSource("SELECT [datum] AS [pubDate], [nadpis] AS [title], CONCAT(SUBSTR([obsah], 1, 100), '...') AS [description], [autor] AS [author] FROM [aktuality] ORDER BY [pubDate] DESC");
return new RssSqlResource($name, $dibiDataSource, array($this, "rssCallback"));
} break;
case("sekce"): {
$data = array(
array("title"=>"Sekce 1", "link"=>"http://web.cz/sekce1", "pubDate"=>"2008-02-03 11:10:00"),
array("title"=>"Sekce 2", "link"=>"http://web.cz/sekce2", "pubDate"=>"2008-02-04 12:11:04"),
);
// Jméno zdroje, data, callback na sortovací metodu, callback který se provede nad každým výsledným řádkem
return new RssArrayResource($name, $data, RssSort::$pubDateSort, array($this, "rssCallback"));
}
default:
return null;
}
}
// Zde pro každý řádek výsledku upravíme výsledná data dle požadavku.
public function rssCallback($data) {
$data["link"] = "http://www.mujweb.cz/".$data["link"].; // Například správně zformátujeme odkaz
return $data;
}
}
?>
Všechny tagy RSS kanálu a jejich položek je v odkazu níže…
Template:
<?php
{control easyRss}
?>
Template by neměl obsahovat na začátků žádné zbytečné mezery. Některé čtečky pak protestují :p
Pokud je ve zdrojích tag, který obsahuje atribut, tento atribut se zapisuje
jako tag_atribut
.
Například
<source url="http://web.cz">Můj web</source>
se
zapíše (např. v sql dotazu)
jako SELECT [zdroj_popis] AS [source], [zdroj_odkaz] AS [source_url] ...
Kompletní popis RSS můžete nalést na adrese http://cyber.law.harvard.edu/rss/rss.html
Omezení:
- pouze jeden výskyt
category
v záznamu skipHours
askipDays
nelze použít
Novinky revize 3:
- Datumy se automaticky převádí na správný formát
- Callback již parametr nepředává odkazem,
$data
se musí vrátit v returnu RssSqlResource
příjmá jako parametr iDibiDataSource
- Změna konstruktoru
RssSqlContainer
Editoval Foowie (28. 8. 2009 17:17)
- Honza Marek
- Člen | 1664
Heh… byl jsem předběhnut. Taky mám něco podobného. Chtěl jsem to jen otestovat a hodit do extras. Asi to stejně udělám, protože trocha konkurence nikdy neuškodí. Nemluvě o tom, že tohle nejde stáhnout.
- Foowie
- Člen | 269
Blizzy napsal(a):
Vypadá to užitečně a použitelně.
Podle mě by bylo lepší použít
DibiDataSource
,RssSqlResource
aRssSqlContainer
se mě osobně moc nelíbí, ale naštěstí je to přes interface (IRssResource
) a rozšířitelné ;-).
Hmmm … to mě nějak netrklo =) Mrknu na to a nějak to poupravím…
(Je pravda, že na RssSqlContainer
je cosi tajemného a
nepěkného :D)
Editoval Foowie (23. 8. 2009 20:36)
- Honza Marek
- Člen | 1664
Takže slíbená konkurence k EasyRss se jmenuje prostě RssControl a je dostupná v extras.