RSS граббер

#
Re: RSS граббер
Подскажите, почему не вставляются дополнительные свойства. И как правильно их вставить?

<?php

// Идентификатор информационной системы, в которую помещаются элементы
$infsys_id = to_int($GLOBALS['LA']['InformationSystemID']);

// Группа, в которую помещается новый элемент
$infgroup_id = to_int($GLOBALS['LA']['InformationGroupID']);

// Список источников
$RssSourceTextList = to_str($GLOBALS['LA']['RssSourceTextList']);

// Разделяем на список источников
$array_RssSourceTextList = explode("\r\n", $RssSourceTextList);

$rss = new RssRead();

$InformationSystem = & singleton('InformationSystem');

$DateClass = new DateClass();

$count_import_item = 0;

// Получаем список тэгов
foreach ($array_RssSourceTextList as $url)
{
   $result = $rss->ReadRSS($url);
   
   /* Цикл по полученным элементам */
   for ($i = 0; $i < count($result['items']) - 1; $i++)
   {
      $count_result = $InformationSystem->GetExternalInformationSystemItem(array(
      'information_items_name' => $result['items'][$i]['title'],
      'information_systems_id' => $infsys_id));
      
      /* Если не найдено элементов с таким же именем */
      if (mysql_num_rows($count_result) == 0)
      {
         /* Формируем полный путь к источнику материала */
         $link = $result['items'][$i]['link'];

         /* Заголовок */
         $title = $result['items'][$i]['title'];
      
         /* Описание элемента */
         $desc = $result['items'][$i]['desc'];
         
         /* Тест элемента */
         $text = $result['items'][$i]['desc'] . "<p>Источник: <a href=\"{$url}\">$url</a>";

         /* Дата */
         $date = $DateClass->DateUnixToSQL (strtotime ($result['items'][$i]['pubdate']));

         if (!empty($title))
         {
            // Вставка элемента
            $InformationSystem->InsertInformationItems(0, 0, $infsys_id, $infgroup_id, $date, $title, $desc, 1, $text, '', 0, $_SERVER['REMOTE_ADDR'], '', 0);
            
            $count_import_item++;

            /* Идентификатор свойства информационной системы */
                  $information_propertys_id = 19;

                 /* Вставка ПОЛНОГО ПУТИ в дополнительные свойства */
                 $InformationSystem->InsertInformationPropertysItems(0, 0, $information_propertys_id, $information_items_id, $link);
         }
      }
   }
}
?>
<h1>Импорт информационных элементов</h1>
<p>Проимпортировано <?=$count_import_item?> элементов</p>
#
Re: RSS граббер
См. API. Метод InsertInformationPropertysItems используется верно. Распечатайте что он возвращает.
#
Re: RSS граббер
Ошибка была в $information_items_id
Вместо $InformationSystem->InsertInformationItems(0, 0, $infsys_id, $infgroup_id, $date, $title, $desc, 1, $text, '', 0, $_SERVER['REMOTE_ADDR'], '', 0);
надо
$information_items_id = $InformationSystem->InsertInformationItems(0, 0, $infsys_id, $infgroup_id, $date, $title, $desc, 1, $text, '', 0, $_SERVER['REMOTE_ADDR'], '', 0);
#
Re: RSS граббер
<?php

// Идентификатор информационной системы, в которую помещаются элементы
$infsys_id = to_int($GLOBALS['LA']['InformationSystemID']);

// Группа, в которую помещается новый элемент
$infgroup_id = to_int($GLOBALS['LA']['InformationGroupID']);

// Список источников
$RssSourceTextList = to_str($GLOBALS['LA']['RssSourceTextList']);

// Разделяем на список источников
$array_RssSourceTextList = explode("\r\n", $RssSourceTextList);

$rss = new RssRead();

$InformationSystem = & singleton('InformationSystem');

$DateClass = new DateClass();

$count_import_item = 0;

// Получаем список тэгов
foreach ($array_RssSourceTextList as $url)
{
   $result = $rss->ReadRSS($url);
  
   /* Цикл по полученным элементам */
   for ($i = 0; $i < count($result['items']) - 1; $i++)
   {
      $count_result = $InformationSystem->GetExternalInformationSystemItem(array(
      'information_items_name' => $result['items'][$i]['title'],
      'information_systems_id' => $infsys_id));
      
      /* Если не найдено элементов с таким же именем */
      if (mysql_num_rows($count_result) == 0)
      {
         /* Формируем полный путь к источнику материала */
         $link = $result['items'][$i]['link'];

         /* Заголовок */
         $title = $result['items'][$i]['title'];
      
         /* Описание элемента */
         $desc = $result['items'][$i]['desc'];
        
         /* Тест элемента */
         $text = $result['items'][$i]['desc'] . "<p>Источник: <a href=\"{$url}\">$url</a>";

         /* Дата */
         $date = $DateClass->DateUnixToSQL (strtotime ($result['items'][$i]['pubdate']));

         if (!empty($title))
         {
            // Вставка элемента
            $information_items_id = $InformationSystem->InsertInformationItems(0, 0, $infsys_id, $infgroup_id, $date, $title, $desc, 1, $text, '', 0, $_SERVER['REMOTE_ADDR'], '', 0);
            
            $count_import_item++;

            /* Идентификатор свойства информационной системы */
                  $information_propertys_id = 19;

                 /* Вставка ПОЛНОГО ПУТИ в дополнительные свойства */
                 $InformationSystem->InsertInformationPropertysItems(0, 0, $information_propertys_id, $information_items_id, $link);
         }
      }
   }
}
?>
<h1>Импорт информационных элементов</h1>
<p>Проимпортировано <?=$count_import_item?> элементов</p>


Как реализовать в 5-ой версии, хранение определенного кол-ва импортированных элементов и удаления старых? Вопрос рассматривался для 4-ой версии и опирался на id в SQL базе, а как теперь?
#
Re: RSS граббер
Теперь можно использовать тот же код, но в нем в SQL-запросах заменить везде information_blocks_id на information_systems_id
#
Re: RSS граббер
Вернулись к старой проблеме, все равно удаляет новые импортированные новости, а старые оставляет, даже если ASC LIMIT или DESC LIMIT.


$mysql = new MySQL();

$query = "SELECT count(*) as count FROM information_items_table WHERE information_groups_id = $infgroup_id";

$rez = $mysql->select($query);

if ($row = mysql_fetch_assoc($rez))
{

   echo $count = $row['count']; //общее количество всех элементов
   echo $count_del = $count - 100; /* кол-во удаляемых минус 100, которые оставляем */

   if($count_del > 0)
      {
      $query = "DELETE FROM information_items_table WHERE information_groups_id = $infgroup_id ORDER BY 'information_items_date' ASC LIMIT $count_del";
      $mysql->query($query);
      }
}
#
Re: RSS граббер
CCron, попробуйте выполнить запрос на выборку аналогичный запросу на удаление. Что он возвращает?
В базе данных у элементов даты различаются?
#
Re: RSS граббер
при запуске скрипта внешнего(с вашим кодом, я его назвал rssread.php) новости загружаются и размещаются, но они дублируются и появляются ошибки:
в  error_log
[08-Sep-2008 15:45:41] PHP Warning:  mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/***************/rssread.php on line 34

просто на странице ошибки при загрузке rssread

Ошибка выполнения запроса! - Unknown column 'information_blocks_id' in 'where clause'
Невозможно создать log файл по адресу: /home/************/logs/10_09_2008.log.csv
Проверьте наличие указанной директории и установите необходимые права доступа для нее (например CHMOD 777)(на этой дир. стоят права 777)

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/***********/rssread.php on line 34
Ошибка выполнения запроса! - Unknown column 'information_blocks_id' in 'where clause'

в логе самой cms
10.09.2008 00:00:32,"SYSTEM","Ошибка выполнения запроса: Unknown column 'information_blocks_id' in 'where clause'. Запрос: SELECT * FROM information_items_table  where`information_items_name` = 'Север избавят от энергодефицита' and`information_blocks_id` = '16'","4","-","http://-","IP не определен"
#
Re: RSS граббер
kos, для решения проблемы в коде RSS-граббера(т.е. в файле rssread.php) везде вместо information_blocks_xxx используйте information_systems_xxx
#
Re: RSS граббер
у меня такая проблема, import-RSS живёт какой-то своей жизнью. Импорт вставлен в crontab:
0 */1 * * * /usr/local/php5-clicgi-so/bin/php-cli -q /home/u29959/images.lab-pribor.ru/www/cron/import-rss.php > /dev/null 2>&1

но... Импорт новостей происходит с неопределёнными промежутками времени. Проверял по выдаче получается, что он то новые новости удаляет, то старые и в какой именно момент времени (точнее день) определить не возможно, и, тем более, по какой причине. Новости с сайта, с которого беру RSS добавляются каждый день, лимит сохранения 100 элементов. Код php:
<?php

ini_set('display_errors', 1);

/* Подключаем основные классы */
require_once(dirname(__FILE__) . '/../' . 'main_classes.php');

/* Загружаем модули */
$GLOBALS['kernel']->LoadModules();

// Идентификатор информационной системы, в которую помещаются элементы
$infsys_id = 32;

// Группа, в которую помещается новый элемент
$infgroup_id = 738;

// Список источников
$RssSourceTextList = 'http://www.i-mash.ru/rss.xml';

// Разделяем на список источников
$array_RssSourceTextList = explode("\n", $RssSourceTextList);

$rss = new RssRead();

$InformationSystem = & singleton('InformationSystem');

$DateClass = new DateClass();

$kernel = & singleton('kernel');

$count_import_item = 0;

$image_url = '';

$infsys_row = $InformationSystem->GetInformationSystem($infsys_id);

// Получаем список тэгов
foreach ($array_RssSourceTextList as $url)
{
   $result = $rss->ReadRSS($url);

   /* Цикл по полученным элементам */
   for ($i = 0; $i < count($result['items']) - 1; $i++)
   {
      $count_result = $InformationSystem->GetExternalInformationSystemItem(array(
      'information_items_name' => $result['items'][$i]['title'],
      'information_systems_id' => $infsys_id));

      /* Если не найдено элементов с таким же именем */
      if (mysql_num_rows($count_result) == 0)
      {
         /* Формируем полный путь к источнику материала */
         $link = $result['items'][$i]['link'];

         /* Заголовок */
         $title = $result['items'][$i]['title'];

         $title_target = substr($title, 0, 60)."...";

         /* Описание элемента */
         $desc = $result['items'][$i]['desc'];
         
         preg_match("!<img[^>]*\ssrc=[\"']?([^>\"'#\s]+)[\"']?[^>]*>!is",$desc,$matches);

         preg_match("/ThumbBegin/is",$desc,$check);

         if(!empty($check))
            {
               $desc = preg_replace('/<!--ThumbBegin(.*)ThumbEnd-->/is','',$desc);
            }else
            {
               $desc = str_replace(to_str($matches[0]),'',$desc);
            }

         $image_url = to_str($matches[1]);
            

         /* Тест элемента */
         $text = $desc . "<p>Источник: <a target=\"_blank\" href=\"$link\">$title_target</a>";

         /* Дата */
         $date = $DateClass->DateUnixToSQL (strtotime ($result['items'][$i]['pubdate']));

         if (!empty($text))
         {
            // КОД ДЛЯ ЗАГРУЗКИ ИЗОБРАЖЕНИЙ
            $information_item_small_image = '';
            $information_item_image = '';

            if (isset($image_url))
            {
               $img = to_str($image_url);

               $temp_file = tempnam(TMP_DIR, "TMP_");

               if (@copy($img, $temp_file))
               {
                  chmod($temp_file, CHMOD_FILE);
                  
                  $param_img = array();

                  /* ---------------------------------- */
                  // Определяем расширение файла
                  $exp = strtolower($kernel->GetExtension($img));

                  $name = 'information_items_' . time() . $count_import_item . '.' . $exp;

                  $information_item_image = CMS_FOLDER . UPLOADDIR . 'news/world/big/' . $name;
                  $information_item_small_image = CMS_FOLDER . UPLOADDIR . 'news/world/small/' . 'small_' . $name;

                  // Путь к файлу-источнику большого изображения;
                  $param['path_source_big_image'] = $temp_file;

                  // Путь к файлу-источнику малого изображения;
                  $param['path_source_small_image'] = $temp_file;

                  //Оригинальное имя файла большого изображения
                  $param['original_file_name_big_image'] = '';

                  // Путь к создаваемому файлу большого изображения
                  $param['path_target_big_image'] = $information_item_image;

                  // Путь к создаваемому файлу малого изображения;
                  $param['path_target_small_image'] = $information_item_small_image;

                  // Оригинальное имя файла малого изображения
                  $param['original_file_name_small_image'] = $name;
                  
                  // Использовать большое изображение для создания малого (true - использовать (по умолчанию), false - не использовать)
                  $param['use_big_image'] = true;

                  // Значение максимальной ширины большого изображения
                  $param['max_width_big_image'] = $infsys_row['information_systems_image_big_max_width'];

                  // Значение максимальной высоты большого изображения
                  $param['max_height_big_image'] =   $infsys_row['information_systems_image_big_max_height'];

                  // Значение максимальной ширины малого   изображения;
                  $param['max_width_small_image'] = $infsys_row['information_systems_image_small_max_width'];

                  // Значение максимальной высоты малого   изображения;
                  $param['max_height_small_image'] = $infsys_row['information_systems_image_small_max_height'];

                  // Путь к файлу с "водяным знаком"
                  $param['watermark_file_path'] = '';

                  $result_img = $kernel->AdminLoadFiles($param);

                  if ($result_img['big_image'])
                  {
                     $information_item_image = basename($param['path_target_big_image']);
                  }

                  if ($result_img['small_image'])
                  {
                     $information_item_small_image = basename($param['path_target_small_image']);
                  }

                  @unlink($temp_file);
               }
            }

            // Вставка элемента
            $InformationSystem->InsertInformationItems(0, 0, $infsys_id,
            $infgroup_id, $date, $title, $desc, 1, $text, $information_item_image, 0,
            $_SERVER['REMOTE_ADDR'], '', 1, '', '', '', -1, array('information_items_small_image' =>
            $information_item_small_image));

            $count_import_item++;
         }
      }
   }
}

$mysql = new MySQL();

$query = "SELECT count(*) as count FROM information_items_table WHERE information_groups_id = $infgroup_id";

$rez = $mysql->select($query);

if ($row = mysql_fetch_assoc($rez))
{
   $count = $row['count']; // общее количество всех элементов
   $count_del = $count - 100; // кол-во удаляемых минус 100, которые оставляем
   
   echo "Общее количество всех элементов = ".$count = $row['count']."<br/>";
   if($count < 100)
   {
      echo "Нет элементов для удаления!";
   }else
   {
      echo "Удалено = ".$count_del = $count - 100;
   }

   if($count_del > 0)
   {
      $query = "SELECT * FROM information_items_table WHERE information_groups_id = $infgroup_id ORDER BY information_items_date ASC LIMIT $count_del";
      $result_to_del = $mysql->query($query);

      $path_item_image = CMS_FOLDER . UPLOADDIR;

      while($row_to_del = mysql_fetch_assoc($result_to_del))
      {
         
         if(file_exists($path_item_image . $row_to_del['information_items_image']))
         {
            unlink($path_item_image . $row_to_del['information_items_image']);
         }
         else{
            unlink($path_item_image . 'news/world/big/' . $row_to_del['information_items_image']);
         }

         if(file_exists($path_item_image . $row_to_del['information_items_small_image']))
         {
            unlink($path_item_image . $row_to_del['information_items_small_image']);
         }
         else{
            unlink($path_item_image . 'news/world/small/' . $row_to_del['information_items_small_image']);
         }

         $query = "DELETE FROM information_items_table WHERE information_items_id = $row_to_del['information_items_id']";
         $mysql->query($query);
      }
   }
}

$query = "SELECT * FROM information_items_table WHERE information_groups_id = $infgroup_id";
$rez = $mysql->select($query);
$fakeTAGS = array("\n","\r","<br />");

while($row=mysql_fetch_assoc($rez))
        {
            $text = str_replace($fakeTAGS, "",$row['information_items_description']);
            $text1 = str_replace($fakeTAGS, "",$row['information_items_text']);
         
         $itemsID = $row['information_items_id'];
         $itemsName = $row['information_items_name'];
            
         if(strpos($text,'<br />'))
            {
               $trans = array("<br />" => "");
               $translate = strtr($text, $trans);
               $translate1 = strtr($text1, $trans);
               
               mysql_query("UPDATE information_items_table SET information_items_description='$translate', information_items_text='$translate1' WHERE information_items_id='$itemsID' AND information_items_name='$itemsName'");
            }
            
        }

?>
<h1>Импорт информационных элементов</h1>
<p>Проимпортировано <?php echo $count_import_item?> элементов</p>
Авторизация