Mapa stránek a rss

Rudolf Svátek 2016-08-03 15:07

Vytvořit mapu stránek tak, aby jí rozuměl vyhledávací robot nemusí být nijak obtížné. Je to vlastně XML soubor s danou strukturou. Také se očekává, že se bude jmenovat sitemap.xml. Není to sice poviiné pravidlo, ale vyplatí se ho dodržovat. S RSS kanály je to podobné. Opět jde o XML soubor s danou strukturou.

Mapa stránek

Uvažujme tak, že mapa stránek by měla ležet v rootu našeho webu. Pokud vezmu třeba tento svůj web, má mapa stránek adresu:

http://rudolfsvatek.cz/sitemap.xml

A teď můžeme přemýšlet, jak docílit toho, aby na dané adrese byla vždy aktuální mapa stránek. Čili nebudeme tam mít opravdový soubor s názvem sitemap.xml. Nabízí se přesměrovat takovou adresu na nějaký presenter, který mapu stránek vytvoří a zobrazí. Tak třeba HomepagePresenter.php. V něm vznikne nějaká metoda, která odchytí danou akci, získá seznam všech aktivních stránek, vytvoří a zobrazí XML. Pracujeme se stránkami, tak použijeme PagesMapper a PagesRepository

Tak nejdřív v HomepagePresenteru doplníme metodu:

	public function actionSitemap() {
		$this->getTemplate()->pages = $this->pagesRepository->getFrontAll();
	}

Metoda má za úkol najít všechny aktivní stránky. Pokud je navíc uživatel, který chce vidět sitemap, přihlášený, doplní se i stránky, které jsou nepřihlášenému uživateli nepřístupné. Další věc, kterou potřebujeme, je šablona. Bude ležet ve složce presenters\templates\Homepage\sitemap.latte:

{contentType application/xml}
<?xml version="1.0" encoding="UTF-8"?>

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
	<url>
		<loc>{link //:Front:Homepage:default}</loc>
	</url>
{foreach $pages as $page}
	<url>
		<loc>{link //:Front:Pages:view $page->id}</loc>
	</url>
{/foreach}

Má trošku jinou strukturu než normální šablony, protože jde o xml dokument.

Jako poslední musíme ještě upravit router. Přidej do RouterFactory.php řádek:

$router[] = $frontRouter = new RouteList('Front');
$frontRouter[] = new Route("sitemap.xml", 'Homepage:sitemap');

Měl by ležet nahoře, jelikož je celkem přesně definovaný a nechceme, aby se o přesměrování snažil jiný presenter.

A to je vše.

RSS kanály

Tady je to podobné. Zase získáme potřebné stránky a zobrazíme je. Jen tady chceme vybírat konkrétní stránky a ne všechny. Musíme tedy upravit mapper i repositář, abychom dostali to, co chceme. Třeba 10 naposledy upravovaných stránek řazených podle aktuálnosti.

Tak tedy mapper:

	/**
	 * @param $rowInRss
	 * @return \Dibi\Fluent
	 */
	public function getRss($rowInRss) {
		return $this->db->select('*')
						->from($this->tableName)
						->where('active = %i', 1)
						->orderBy(['upDate' => 'DESC'])
						->limit($rowInRss);
	}

A v repository už to jen zavoláme:

	/**
	 * @param $rowInRss
	 * @return array
	 */
	public function getRss($rowInRss) {
		return $this->mapper->getRss($rowInRss);
	}

Jestli chceš, klidně si to uprav tak, abys zase zoblednil přihlášeného uživatele. Já si ale říkám, že jelikož se nepřihlášený uživatel na samotnou stránku stejně nepodívá, tak není na škodu mu občas říct, že kdyby se registroval a přihlásil, tak dostane něco navíc :-)

Metoda v HomepagePresenteru vypadá takto:

	public function actionRss() {
		$this->getTemplate()->pages = $this->pagesRepository->getRss($this->settings['rowInRss']);
		$this->getTemplate()->title = $this->settings['siteName'];
	}

Šablona v tomto případě vypadá třeba takto:

{contentType application/xml}
<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0">
	<channel>
		<title>{$title}</title>
		<link>{plink //:Front:Homepage:default}</link>
		<description>Nejnovější články.</description>
		<language>cs</language>

		<item n:foreach="$pages as $page">
			<title>{$page->name}</title>
			<lnk>{plink //:Front:Pages:view $page->id}</lnk>
			<description>{$page->text|striptags|truncate:400}</description>
		</item>
	</channel>
</rss>

Pak už jen zbývá doplnit další řádek do routeru:

$router[] = $frontRouter = new RouteList('Front');
$frontRouter[] = new Route("sitemap.xml", 'Homepage:sitemap');
$frontRouter[] = new Route("rss.xml", 'Homepage:rss');

A to je vše.

Příště seriál dokončím zmínkou o Cookies.

Redakční systém RS::RS Předchozí kapitola

Uživatelsky přívětivá URL

Redakční systém RS::RS Celý seriál

Vývoj redakčního systému v PHP

Redakční systém RS::RS Následující kapitola

Souhlas s Cookies

Komentáře (0)

Přidej svůj komentář

O mně

Jmenuji se Rudolf Svátek. Jsem lektor výpočetní techniky a PHP programátor. Stavím firemní stránky a eshopy. Aby se mi to dělalo pohodlně, vytvořil jsem redakční systém RS::RS, který ti tu nabízím k použití.

Rychlý kontakt na mně

  • Rudolf Svátek
  • Telefon:
    +420 777 828 353
  • Email:
  • Adresa:
    Josefa Hory 1097/5
    736 01 Havířov
    ČR



Tyto stránky používají Cookies. Používáním stránek s tím souhlasíte Další informace