Парсинг RSS и создание новых ресурсов
Написал сниппет для парсинга RSS-ленты местного новостного сайта с созданием ресурсов. Сделал проверку по дате публикации, чтобы существующий ресурс в базе MODX не создавался снова, но проблема в том, что создается только один ресурс с последней новостью из RSS, а при появлении новой новости в RSS новый ресурс в базе MODX не создается. Помогите, пожалуйста, найти ошибку.
Код:
Код:
$path = 'http://www.amur.info/index.rss';
$ctx = stream_context_create(array('http' => array('timeout' => 6)));
$file = file_get_contents($path, 0, $ctx);
if ($file) {
$rss = simplexml_load_string($file);
$i = 0;
foreach ($rss->channel->item as $item){
$namespaces = $item->getNameSpaces(true);
$yandex = $item->children($namespaces['yandex']);
$full_text = (string)$yandex->{'full-text'}; //полный текст статьи
$title = $item->title; //заголовок статьи
$pubdate = $item->pubDate; //дата публикации
$link = $item->link; //ссылка на новость
echo '<b>'. $title. '</b></br>';
//проверка
$docfind = $modx->getObject('modResource',array('parent' => '19','longtitle' => $pubdate));
if($docfind) {
echo '<i>Документ с такой датой публикации уже есть </i></br>';
}
else {
//создаем ресурсы
$response = $modx->runProcessor('resource/create', array(
'pagetitle' => $title,
'longtitle' => $pubdate,
'description' => $link,
'introtext' => '',
'content' => $full_text,
'template' => $template,
'hidemenu' => 1,
'published' => 1,
'parent' => '19'
));
}
$i++;
if ($i == 3) break;
}
}
Поблагодарить автора
Отправить деньги
Комментарии: 4
На вскидку:
if($docfind instanceof modResource) {
continue;
}
А этот modstore.pro/packages/import-and-export/xparser не подходит потому что платный?
Он очень продуманный, удобный, все есть- крон и т.п. Создает обычные ресурсы или тикеты.
Он очень продуманный, удобный, все есть- крон и т.п. Создает обычные ресурсы или тикеты.
Согласен, отличный мощный компонент для реализации сильных проектов. В моем случае стоит задача спарсить лишь одну ленту с десятью новостями и создать ресурсы, задача на первый взгляд простая и есть инетерес написать сниппет самим.
Сделал вот так. Работает.
//собираем заголовки из категории ресурсов
$docfind = $modx->getCollection('modResource',array('parent' => '19'));
foreach ($docfind as $k => $res) {
$title_m = $res->get('pagetitle');
$titles[] = $title_m;
}
$path = 'http://www.amur.info/index.rss';
$ctx = stream_context_create(array('http' => array('timeout' => 6)));
$file = file_get_contents($path, 0, $ctx);
if ($file) {
$rss = simplexml_load_string($file);
$i = 0;
foreach ($rss->channel->item as $item){
$namespaces = $item->getNameSpaces(true);
$yandex = $item->children($namespaces['yandex']);
$full_text = (string)$yandex->{'full-text'}; //полный текст статьи
$title = $item->title; //заголовок статьи
$pubdate = $item->pubDate; //дата публикации
$link = $item->link; //ссылка на новость
//создаем ресурсы в MODX, если ресурсов с такими заголовками еще нет
if (in_array($title, $titles) == false) {
$response = $modx->runProcessor('resource/create', array(
'pagetitle' => $title,
'longtitle' => $pubdate,
'description' => $link,
'introtext' => '',
'content' => $full,
'template' => $template,
'hidemenu' => 1,
'published' => 1,
'parent' => '19'
));
}
$i++;
if ($i == 5) break;
}
}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.