EasyRSS

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Foowie
Člen | 269
+
0
-

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 a skipDays 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 i DibiDataSource
  • Změna konstruktoru RssSqlContainer

Editoval Foowie (28. 8. 2009 17:17)

Honza Marek
Člen | 1664
+
0
-

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.

Blizzy
Člen | 149
+
0
-

Vypadá to užitečně a použitelně.

Podle mě by bylo lepší použít DibiDataSource, RssSqlResource a RssSqlContainer se mě osobně moc nelíbí, ale naštěstí je to přes interface (IRssResource) a rozšířitelné ;-).

Foowie
Člen | 269
+
0
-

Blizzy napsal(a):

Vypadá to užitečně a použitelně.

Podle mě by bylo lepší použít DibiDataSource, RssSqlResource a RssSqlContainer 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
+
0
-

Já místo toho mám array, to není tak hrozné :-D

Honza Marek
Člen | 1664
+
0
-

Takže slíbená konkurence k EasyRss se jmenuje prostě RssControl a je dostupná v extras.