O RSS vyšlo na Intervalu už několik článků. Tentokrát si můžete přečíst, jak se dá RSS generovat pomocí PHP. Při tvorbě budeme využívat třídu c_xml_generator, kterou jsme si popsali v článku o tvorbě XML výstupu v PHP – aby bylo snadnější RSS implementovat do různých projektů, vytvoříme si generátor RSS jako objekt.

Vkládání dat

Vlastní data se ukládají do proměnné chanel, což je pole obsahující jednotlivé kanály. Každý kanál je asociativním polem, obsahujícím parametry kanálu, jako jsou například title, description či link, které už obsahují konkrétní data. Může také obsahovat prvek image, který obsahuje jednotlivé parametry obrázku. A samozřejmě prvek item, který obsahuje pole s jednotlivýmy položkami RSS kanálu.

Protože přímý přístup k vlastnostem třídy je v rozporu se zásadami OOP a také abyste se nemuseli zabývat strukturou uložení dat, obsahuje třída dvě metody pro vládaní dat.

Vytvoření kanálu

Každé RSS může obsahovat více kanálů, tato třída to také umožňuje. Nový kanál vytvoříte pomocí metody add_chanel:

function add_chanel($name, $param) {
  $this->chanel[$name] = $param;
  $this->chanel[$name][‚.content‘] = array();
}

Metoda obsahuje dva parametry. První určuje vnitřní označení kanálu, které se nedostane do výsledného RSS, ale používá se při vkládání jednotlivých položek typu item. Tento parametr je datového typu int nebo string. Druhý parametr je typu array a obsahuje parametry kanálu. Pole musí obsahovat prvky title, description, language a link, protože tyto parametry jsou povinné pro definici kanálu. Dále může obsahovat nepovinné parametry, jako jsou image nebo copyright. V případě prvků image nebo textInput je obsah prvku typu array s dalšímy parametry. V opačném případě je nutné použít skalárních typů.

Níže vidíte ukázku kódu pro vložení kanálu, v níž předpokládáme, že proměnná $rss obsahuje instanci třídy c_rss_generátor:

$rss->add_chanel(‚interval‘,
  array(
    ‚title’=>’Interval.cz‘,
    ‚description’=>’Denně o tvorbě webu a e-komerci‘,
    ‚link’=>’http://www.interval.cz‘,
    ‚language’=>’cs‘,
    ‚image’=>array(
      ‚title’=>’Interval logo‘,
      ‚url’=>’http://www.interval.cz/images/logo.gif‘,
      ‚link’=>’http://www.interval.cz‘,
      ‚width’=>’60‘,
      ‚height’=>’60‘,
      ‚description’=>’Interval – o webu a e-komerci‘,
    )
  )
);

Vložení položky item do kanálu

Pro tuto operaci použijeme metodu add_item:

function add_item($chanel_name, $param) {
  $this->chanel[$chanel_name][‚.item‘][] = $param;
}

První parametr $chanel_name obsahuje vnitřní označení kanálu, zadejte tedy stejnou hodnotu jako při vytváření kanálu. Parametr $param je typu array a obsahuje parametry kanálu.

Následuje ukázka kódu pro vložení položky do kanálu, v níž opět předpokládáme, že proměnná $rss obsahuje instanci třídy c_rss_generátor:

$rss->add_item(‚interval‘,
  array(
    ‚title’=>’Název článku‘,
    ‚description’=>’Popis článku, pár slov na úvod, jen pár, ne zbytečně moc‘,
    ‚link’=>’http://www.interval.cz/clanek_1.html‘,
  )
);

Generování RSS kódu

Generování RSS kódu provádí metoda create_rss(). Metoda nemá žádné parametry a jejím výsledkem je kompletní kód RSS kanálu.

function create_rss() {
  // vytvoří a nastaví instanci třídy c_xml_generator
  $xg = new c_xml_generator();
  $xg->xml_encoding = $this->rss_encoding;
  // vytvoří nejvyšší xml element rss a nastaí verzi rss
  $x_rss = $xg->add_node(0, ‚rss‘,
    array(‚version’=>$this->rss_version)
  );
  // postupně prochází pole $chanel
  foreach($this->chanel as $chanel) {
    // vloží element chanel
    $x_chanel = $xg->add_node($x_rss, ‚chanel‘);
    // prochází jednotlivé parametry kanálu
    foreach($chanel as $param_name => $param_value) {
      // pokud je parametr ‚image‘ nebo ‚textInput‘ projde a vloží jeho parametry
      if (($param_name == ‚image‘) || ($param_name == ‚textInput‘)) {
        $x_image = $xg->add_node($x_chanel, $param_name);
        foreach($param_value as $image_param_name => $image_param_value) {
          $xg->add_node_cdata($x_image, $image_param_name, $image_param_value);
        };
      // pokud je parametr ‚item‘ – jednotliv0 položky kanálu, projde a vloží je
      } elseif ($param_name == ‚.item‘) {
        foreach($chanel[‚.item‘] as $item) {
          // pro každou položku vyvtoří element item
          $x_item = $xg->add_node($x_chanel, ‚item‘);
          // projde a vloží jednotlivé parametry
          foreach($item as $item_param_name => $item_param_value) {
            // pokud je parametr ‚image‘ nebo ‚textInput‘ projde a vloží jeho parametry
            if (($item_param_name == ‚image‘) || ($item_param_name == ‚textInput‘)) {
              $x_image = $xg->add_node($x_item, $item_param_name);
              foreach($item_param_value as $image_param_name => $image_param_value) {
                $xg->add_node_cdata($x_image, $image_param_name, $image_param_value);
              };
            // pokud jde o jiný parametr vloží jeho hodnotu
            } else {
              $xg->add_node_cdata($x_item, $item_param_name ,$item_param_value);
            };
          };
        };
      // pokud jde o jiný parametr vloží jeho hodnotu
      } else {
        $xg->add_node_cdata($x_chanel, $param_name ,$param_value);
      };
    };
  };
  // nakonec vygeneruje a vrátí výsledné XML
  return($xg->create_xml());
}

Pro generování XML používáme třídu c_xml_generátor, o které si můžete přečíst v článku Tvorba XML výstupu v PHP.

Ukázka použití

Příklad ukazuje kompletní kód, potřebný k tvorbě RSS kanálu. Ukázkový skript a třídy pro tvorbu RSS si můžete také stáhnout a testovat je lokálně na svých počítačích nebo použít ve svých aplikacích.

<?php
// vložení potřebných tříd
include ‚rss_generator.class.php‘;
include ‚xml_generator.class.php‘;
include ‚xmysql.class.php‘;
// pomocí hlavičky nastvíme content-type¨na XML
header(‚Content-type: text/xml‘);
// vytvoření a nastavení třídy pro databázi
$sql = new tMysql;
$sql->dbName = ‚TEST‘;
$sql->dbHost = ‚localhost‘;
$sql->dbUser= “;
$sql->dbPassword= “;
// připojení k db
$sql->connect();
// provedení sql dotazu
$sql->query(‚rss‘,
  ‚SELECT id, author, title, description,  pub_time ‚.
  ‚FROM articles ORDER BY pub_time DESC‘
);
// vytvoření instance třídy c_rss_generátor
$rss = new c_rss_generator;
// vytvoření kanálu
$rss->add_chanel(‚jedenmujweb‘,
  array(
    ‚title’=>’neco.nekde.cz‘,
    ‚description’=>’Denně o kočikách, pejscích, myších a krysách.‘,
    ‚link’=>’http://neco.nekde.cz‘,
    ‚language’=>’cs‘,
    ‚image’=>array(
      ‚title’=>’neco.nekde.cz logo‘,
      ‚url’=>’http://neco.nekde.cz/images/logo.gif‘,
      ‚link’=>’http://neco.nekde.cz‘,
      ‚width’=>’60‘,
      ‚height’=>’60‘,
      ‚description’=>’Denně o kočikách, pejscích, myších a krysách.‘,
    )
  )
);
// procházení výsledků dotazu a vkládání do kanálu
while($row = $sql->fetch_assoc(‚rss‘)) {
  $rss->add_item(‚jedenmujweb‘,
    array(
      ‚title‘ => $row[‚title‘],
      ‚description‘ => $row[‚description‘],
      ‚author‘ => $row[‚author‘],
      ‚link‘ => ‚http://neco.nekde.cz/read.php?id=’$row[‚id‘],
      // prevod z timestampu na požadovaný fromát
      ‚pubDate‘ => gmdate(‚D, d M Y H:i:s‘, $row[‚pub_time‘]).‘ GMT‘
    )
  );
};
// vytvoření rss a odeslání na výstup
echo $rss->create_rss();
?>

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět