Zend_Feed: получение URL изображения из ленты - PullRequest
1 голос
/ 11 декабря 2011

Как правильно выбрать элементы более чем на один уровень с библиотекой Zend_Feed?

Как следует читать строку кода от второй до последней?

require_once 'Zend/Feed/Rss.php';

$url = 'http://leo.am/podcasts/twit';
$c = new Zend_Feed_Rss($url);
$iu = $c->image()->url();
echo $iu;

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

Это было довольно интересно!

Ваш RSS-канал содержит два тега image:

<image>
    <url>http://leoville.tv/podcasts/coverart/twit144audio.jpg</url>
    <!-- ... more stuff ... -->
</image>
<!-- ... more stuff ... -->
<itunes:image href="http://leoville.tv/podcasts/coverart/twit600audio.jpg"/>

Первый image находится в пространстве имен по умолчанию и имеет дочерние узлы,это, вероятно, тот, который вы хотите.Второй, по-видимому, специфичен для iTunes и поэтому находится в пространстве имен itunes, а URL-адрес находится в атрибуте href.

Проблема в том, что $c->image возвращает оба элемента в массиве.Я не уверен, что это ошибка или она работает как задумано.

Так что вам нужно пройтись по каждому элементу и посмотреть, из itunes ли он или из rss.Этот код возвращает в массиве как itunes, так и URL-адрес изображения rss, если они определены.Если ничего не найдено, массив пуст:

require_once 'Zend/Feed/Rss.php';

// iTunes Namespace URI
define('RSS_NS_ITUNES', 'http://www.itunes.com/dtds/podcast-1.0.dtd');

function getImageFromElement(Zend_Feed_Element $elem) {
    $result = array();
    $elemDOM = $elem->getDOM();
    if(RSS_NS_ITUNES == $elemDOM->namespaceURI) {
        $result["itunes"] = $elemDOM->getAttribute('href');
    } else if("" == $elemDOM->namespaceURI) {
        $url = $elem->url();
        if($url)
            $result["rss"] = $url;
    }

    return $result;
}

function getFeedImages(Zend_Feed_Rss $feed) {
    $imgContent = $feed->image;
    $result = array();

    if(is_array($imgContent)) {
        // Multiple elements returned
        // check every element for valid URLs
        foreach($imgContent as $i) {
            $result = array_merge($result,
                getImageFromElement($i));
        }
    } else if($imgContent instanceof Zend_Feed_Element) {
        // Check the one element we've got
        $result = getImageFromElement($imgContent);
    }

    return $result;
}


// usage:
$url = 'http://leo.am/podcasts/twit';
$c = new Zend_Feed_Rss($url);
$imageUrls = getFeedImages($c);
var_dump($imageUrls);

Вывод выглядит следующим образом:

array(2) {
  ["rss"]=>
  string(53) "http://leoville.tv/podcasts/coverart/twit144audio.jpg"
  ["itunes"]=>
  string(53) "http://leoville.tv/podcasts/coverart/twit600audio.jpg"
}

Редактировать: Ну, есть краткая альтернатива, если вас не волнует iTunesURL:

$url = 'http://leo.am/podcasts/twit';
$c = new Zend_Feed_Rss($url);
$imgNoNs=":image";
echo $c->$imgNoNs->url();

Вывод:

http://leoville.tv/podcasts/coverart/twit144audio.jpg
0 голосов
/ 27 сентября 2012

Я делаю это так:

$feed = Zend_Feed::import('http://www.sports.ru/rss/all_news.xml');

$data = array();
foreach ($feed as $entry)
{
    $data[] = array(
        'title' => $entry->title(),
        'description' => $entry->description(),
        'image' => $entry->enclosure->getDom()->getAttribute('url'),
    );
}
...