Я нахожусь в процессе создания блога для кого-то. Они хотят собрать много данных и довольно плотно интегрировать их в дизайн, поэтому стандартные виджеты - нет-нет. Это было хорошо до сих пор.
У них есть общедоступный Календарь Google с различными событиями на нем, и я хочу получить следующие 5 событий (начиная с «сейчас») и отобразить заголовок события, когда этот экземпляр события начинается, его местоположение и ссылку в Гкал.
Из того, что я вижу, есть три варианта захвата каналов gcal: XML, ical или HTML (содержащие некоторые действительно отличные JSON). XML кажется логичным выбором, верно?
Что ж, XML-фид (после описания фида атомов) на самом деле просто бесполезный HTML. Синтаксический анализ этого возможен, но это огромная боль сзади, потому что повторяющиеся события (которых в календаре несколько) показывают только первый экземпляр этого события и (по-видимому) никакой информации о том, когда следующий экземпляр.
Так я просто немного хладнокровен? Есть ли способ показать, что я хочу, просто взломав XML API?
Или мне лучше повезет через iCal? Я никогда не делал iCal с PHP, поэтому, если у вас есть, пожалуйста, предложите какие-нибудь библиотеки, которые вы использовали, чтобы упростить себе задачу.
Редактировать: благодаря ответу я скачал пакет Zend Gdata (который, к счастью, является отдельным от остальной части Zend Framework). Делать то, что мне нужно, было так просто:
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata');
Zend_Loader::loadClass('Zend_Gdata_HttpClient');
Zend_Loader::loadClass('Zend_Gdata_Calendar');
$service = new Zend_Gdata_Calendar();
$query = $service->newEventQuery();
$query->setUser('your_user@googlemail.com');
$query->setVisibility('public');
$query->setProjection('full');
$query->setStartMin(date('Y-n-j'));
$query->setStartMax(date('Y-n-j', time() + (60*60 *24*8)));
$query->setOrderby('starttime');
try { $eventFeed = $service->getCalendarEventFeed($query); }
catch (Zend_Gdata_App_Exception $e) { return; }
foreach ($eventFeed as $event)
echo $event; // do something real here
Это должно дать вам количество событий в неделю (да, setStartMax является эксклюзивным, поэтому в будущем потребуется установить его на 8 дней).
Надеюсь, это поможет кому-то еще в будущем.