Google Calendar XML-Feed einbinden / magpie RSS

Fragen/Tipps allgemeiner Art.

Google Calendar XML-Feed einbinden / magpie RSS

Beitragvon cukabeka » 9. Dez 2009, 15:32

hi!

ich möchte gerne den veranstaltungskalender etwas komfortabler machen und dazu google calendar verwenden.

Ziel ist etwa so etwas:
http://drupal.org/project/gcal_events

Anscheinend gibt es dazu schon eine grundlegende lösung, nämlich diese hier:
http://james.cridland.net/code/google-calendar.html
leider basiert diese auf simplepie. das gibt es aber noch nicht für redaxo. hat jemand eine idee, oder einen tipp, wie man simplepie auf redaxo portieren kann? wie mache ich daraus ein addon? tipps, hinweise etc immer willkommen..;)

grüße
Benutzeravatar
cukabeka
 
Beiträge: 633
Registriert: 30. Mai 2006, 23:01
Wohnort: Aschaffenburg

Beitragvon darwin » 10. Dez 2009, 08:40

HI,
ich hab das Ganze mal als Modul gestrickt und simplepie einfach
in das redaxo/include/ mitreingepackt.

Eingabe:
Code: Alles auswählen
<?php
/**
*==================================================
* REDAXO-Modul: RSS-Feed einfuegen
* Bereich: Eingabe
* Version: 0.2
* Redaxo Version: 4.1
*
* Einstellungs Moeglichkeiten
* - Link zu externen RSS-Feed
* - Titel des RSS
* - Anzahl der anzuzeigenden RSS-Feeds
*
* Erforderliche Addons/Scripts:
* http://simplepie.org/
*
* API-Referenz
* http://simplepie.org/wiki/reference/simplepie/start
*
* Install:
* /redaxo/include/simplepie/
*
*================================================== */
?>

<strong>Link zum RSS-Feed:</strong><br />
<input type=text size=80 name=VALUE[1] value="REX_VALUE[1]"><br /><br />
<strong>Überschrift im Artikel:</strong><br />
<input type=text size=80 name=VALUE[2] value="REX_VALUE[2]"><br /><br />
<strong>Anzahl der Artikel pro Seite:</strong><br />
<input type=text size=4 name=VALUE[3] value="REX_VALUE[3]">


Ausgabe:
Code: Alles auswählen
<?php
/**
*==================================================
* REDAXO-Modul: RSS-Feed einfuegen
* Bereich: Ausgabe
* Version: 2
* Redaxo Version: 4.1
*
* Erforderliche Addons/Scripts:
* http://simplepie.org/
*
* API-Referenz
* http://simplepie.org/wiki/reference/simplepie/start
*
* Install:
* /redaxo/include/simplepie/
*
*================================================== */

// ini_set('zend.ze1_compatibility_mode', 0);
include_once($REX['INCLUDE_PATH'].'/simplepie/simplepie.inc');


$feedurl   = "REX_VALUE[1]";
$feedtitel   = "REX_VALUE[2]";
$artPerSite = "REX_VALUE[3]";


////////////////////////////////////////////////////////////////
if (!function_exists('returnImage')) {
   function returnImage ($text)
   {
      $text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
      $pattern = "/<img[^>]+\>/i";
      preg_match($pattern, $text, $matches);
      $text = $matches[0];
   
      return $text;
   }
}

if (!function_exists('scrapeImage')) {
   function scrapeImage($text)
   {
      $pattern = '/src=[\'"]?([^\'" >]+)[\'" >]/';
      preg_match($pattern, $text, $link);
      $link = $link[1];
      $link = urldecode($link);
   
      return $link;
   }
}

if (!function_exists('microtime_float')) {
   function microtime_float()
   {
      if (version_compare(phpversion(), '5.0.0', '>='))
      {
         return microtime(true);
      }
      else
      {
         list($usec, $sec) = explode(' ', microtime());
         return ((float) $usec + (float) $sec);
      }
   }
}

$start = microtime_float();
////////////////////////////////////////////////////////////////


// Create a new instance of the SimplePie object
$feed = new SimplePie();
$feed->set_feed_url($feedurl);
$feed->set_cache_location($REX['INCLUDE_PATH'].'/simplepie/cache');
$feed->set_output_encoding('ISO-8859-1');
// $feed->handle_content_type();

$feed->init();

// If we have an error, display it.
if ($feed->error())
{
   echo '<div class="sp_errors">' . "\r\n";
   echo '<p>' . htmlspecialchars($feed->error()) . "</p>\r\n";
   echo '</div>' . "\r\n";
}

// Set our paging values
$start = (isset($_GET['start']) && !empty($_GET['start'])) ? $_GET['start'] : 0; // Where do we start?
$length = (isset($_GET['length']) && !empty($_GET['length'])) ? $_GET['length'] : $artPerSite; // How many per page?
$max = $feed->get_item_quantity();

$out = '';
$out .= '<div class="RSS_Feed_extern">'. "\n";
$out .= '<h1 class="RSS_Titel">'.$feedtitel.'</h1>';

if ($feed->data) {
   foreach($feed->get_items($start, $length) as $item):
      
      $feed = $item->get_feed();
      
      // Nur erstes Bild
      $image    = returnImage($item->get_content());
      $image    = scrapeImage($image);
      
      
      $title    = $item->get_title();
      $link    = $item->get_permalink();
      $desc   = $item->get_description();
      $date   = $item->get_date("d.m.Y");
   
      // $item->get_content();
      
      // leere Bilder rausfiltern
      if($image != "") {
         $image   = '<img src="'.$image.'" alt="'.$title.'" title="'.$title.'" width="100" height="85" />';
      } else {
         $image = '';
      }
      
      
      $out .= '<div class="RSS_Box">' . "\n";
      
      if($image != '') {
         $out .= '  <div class="RSS_Bild" style="width:'.$bildW.'px;">' . "\n";
         $out .= '    <a href="'.$link.'" target="_blank" title="'.$title.'">'.$image.'</a>' . "\n";
         $out .= '  </div>' . "\n";
      }
            
      if($image == '') {
         $out .= '  <div class="RSS_Bild" style="width:'.$bildW.'px; border: 0px;">' . "\n";
         $out .= '  </div>' . "\n";
      }
      
      $out .= '  <div class="RSS_TextBox" style="width:'.$txtW.'px;">' . "\n";
      $out .= '    <p class="Datum">'.$date.'</p>';
      $out .= '    <p class="Titel"><a href="'.$link.'" target="_blank" title="'.$title.'">'.$title.'</a></p>' . "\n";
      $out .= '    <p class="Desc">'.$desc.'</p>' . "\n";
      $out .= '   </div>' . "\n";
      $out .= '</div>' . "\n";
      $out .= '<div class="clear"></div>'. "\n";
      
            
   endforeach;
} else {
   $out .= '<em>Kein Zugriff auf den RSS-Feed: '.$feedurl.' zur Zeit möglich!</em>';
}

$out .= '</div>' . "\n";
$out .= '<div class="clear"></div>'. "\n";

// Frontend
if (!$REX['REDAXO']) {
   print $out;
}


// Navigation / Pagination
$next = (int) $start + (int) $length;
$prev = (int) $start - (int) $length;
      
// NEXT link
$nextlink = '<a href="'.rex_getUrl($articleId).'?start=' . $next . '&amp;length=' . $length . '">N&auml;chste Seite &raquo;</a>';
if ($next >= $max)
{
   $nextlink = '<span style="color: #CCC;">N&auml;chste Seite &raquo;</span>';
}
      
// PREVIOUS link
$prevlink = '<a href="'.rex_getUrl($articleId).'?start=' . $prev . '&amp;length=' . $length . '">&laquo; Vorherige Seite</a>';
if ($prev < 0 && (int) $start > 0)
{
   $prevlink = '<a href="'.rex_getUrl($articleId).'?start=0&amp;length=' . $length . '">&laquo; Vorherige Seite</a>';
}
else if ($prev < 0)
{
   $prevlink = '<span style="color: #CCC;">&laquo; Vorherige Seite</span>';
}
      
// Numbers
$begin = (int) $start + 1;
$end = ($next > $max) ? $max : $next;

$navOut = '';
$navOut .= '<hr/>';
$navOut .= '<p style="float: left; width: 235px;">Feed '.$begin.' &ndash '.$end.' ('.$max.')</p>';
$navOut .= '<p style="float: right; width: 235px;">'.$prevlink.' | '.$nextlink.'</p>';
$navOut .= '<div class="clear"></div>'. "\n";
/*
$navOut .= '<a href="'.rex_getUrl($articleId).'?start='.$start.'&amp;length=5">5</a>, ';
$navOut .= '<a href="'.rex_getUrl($articleId).'?start='.$start.'&amp;length=10">10</a>, ';
$navOut .= 'or <a href="'.rex_getUrl($articleId).'?start='.$start.'&amp;length=20">20</a>';
*/
      
// Frontend
if (!$REX['REDAXO']) {
   print $navOut;
}
   
?>


sollte laufen ... ;)

ansonsten einfach mal simplepie genauer ansehen:
http://simplepie.org/
http://simplepie.org/wiki/reference/simplepie/start

grz. Chris
Zuletzt geändert von darwin am 11. Dez 2009, 09:04, insgesamt 1-mal geändert.
Benutzeravatar
darwin
 
Beiträge: 1232
Registriert: 2. Jan 2007, 16:10
Wohnort: LA

Beitragvon cukabeka » 10. Dez 2009, 19:55

Wow, großartig, das löst mein Kalenderproblem. Werde ich mir mal anschauen. Vielen Dank!
Benutzeravatar
cukabeka
 
Beiträge: 633
Registriert: 30. Mai 2006, 23:01
Wohnort: Aschaffenburg

Beitragvon darwin » 11. Dez 2009, 09:02

joa,
berichte uns doch dann obs funktioniert ;) ...
ich nochwas daran geändert, da noch nein paar
"unwichtige" Abfragen drin waren ... ist oben bereits geändert !! ..

Danke. grz. Chris
Benutzeravatar
darwin
 
Beiträge: 1232
Registriert: 2. Jan 2007, 16:10
Wohnort: LA

Beitragvon Sabse » 15. Dez 2009, 12:47

Hallo Chris,

das ist das erste RSS-Auslesemodul das keine Fehlermeldungen im Backend verursacht, schon mal vielen Dank dafür.

Ich habe aber leider damit das Problem, dass der Pfad zu dem Feed, mit der ich es ausprobieren wollte, ein "=" enthält, dieses wird in "%3D" umgewandelt, und die Datei wird dann logischerweise nicht gefunden.
Kann man da irgendwas machen?

Feeds ohne "=" funktionieren, es sei denn sie sind nicht utf-8 codiert, dann werden die Umlaute nicht angezeigt.

Gruß, Sabrina
Sabse
 
Beiträge: 88
Registriert: 1. Apr 2008, 14:51
Wohnort: Wörth am Rhein

Beitragvon darwin » 15. Dez 2009, 13:16

Hallo Sabse,
schick mir den Link doch per PM, damit ich diesen testen kann.
Sollte eigentlich so funktionieren.

grz. Chris
Benutzeravatar
darwin
 
Beiträge: 1232
Registriert: 2. Jan 2007, 16:10
Wohnort: LA

Beitragvon Sabse » 15. Dez 2009, 22:15

Darwin hat mir per PM Lösungsmöglichen geschickt, hier das Ergebnis:


Der folgende Hinweis hilft, wenn man einen ISO-kodierten Feed in einer UTF-8 kodierten Seite anzeigen möchte:

Code: Alles auswählen
$feed->set_output_encoding('ISO-8859-1');


ändern in

Code: Alles auswählen
$feed->set_output_encoding('UTF-8');



Das andere Problem bekomme ich nicht gelöst. Ich habe das Modul auch mal in die ISO-kodierte Redaxo-Demo Installation eingebaut, da passiert genau das gleiche.

Das Problem tritt anscheinend auf, wenn man versucht, einen Feed von einer Wordpress Seite auszulesen, bei der kein URL-rewriting verwendet wird (?feed=rss2). Andere Feeds mit "=" funktionieren nämlich, z.B. von Blogspot-Seiten, die haben das Format "default?alt=rss".

Vielleicht hilft diese Erkenntnis ja irgendwie weiter.

Gruß, Sabrina.
Sabse
 
Beiträge: 88
Registriert: 1. Apr 2008, 14:51
Wohnort: Wörth am Rhein


Zurück zu Allgemeines [R4]

Wer ist online?

Mitglieder in diesem Forum: Markus.Lorch und 0 Gäste