Дата публикации : 2024.01.04
Автор: Виноградов Александр

Интеграция с api Bidzaar на ModX

Шаг 1. Создаем чанк

Создаем чанк под названием bidzaar, в котором будем выводить наши снипеты apiBidzaar, printBidzaarTeders

<div>
[[!apiBidzaar]]
[[!printBidzaarTeders]]
</div>

Шаг 2. Создаем снипет apiBidzaar

Именно этот снипет будет подключаться к api 

Название фирмы нужно заменить на Ваше, поиск в файле json, который располагается по адресу https://bidzaar.com/api/integration/integration/procedures идет по нему.  Найдите в этом файле как называется Ваша фирма.

<?php
$updateTime 
3600/*в секундах*/


/*id контейнера в котором хранятся тендеры*/

/*
удаление из бд ресурса
$resource = $modx->getObject('modResource', 0); // Получаем документ
$resource->remove();
*/

$bidzarContainerId $modx->runSnippet('getBidzaarContainerId');
//echo $bidzarContainerId;

if($bidzarContainerId==null){return;}

/*контейнер в котором хранятся тендеры*/
$bidzarContainer $modx->getObject('modResource'$bidzarContainerId);
/*дата последней загрузки из bizaar*/
$lastUdate strtotime($bidzarContainer->get('publishedon'));
/*кол-во секунд прошедших после загрузки тендеров */
$lastUdateDiff = (time() - $lastUdate);
//echo '<br>'.$lastUdateDiff.'<br>';

if($lastUdateDiff $updateTime and !isset($_GET['updatetenders'])){return;} 



if(isset(
$_GET['updatetenders'])){echo "<h1 style='color:red;text-align:center;'>Обновление завершено</h1>";} 


 
$data json_decode(file_get_contents("https://bidzaar.com/api/integration/integration/procedures"));
  
if( 
$data!=null )
{


/*счетчик удалений*/
$countDelete 0;

foreach (
$data as  $item):
if (
$item->publisherName == 'Название фирмы')
{
   
    
         
$pubDate explode'T'$item->publishDate );
         
$item->publishDateDate=$pubDate[0] ?? null
         
$item->publishDateTime=explode('.',$pubDate[1])[0] ?? null
         
$tags =  $item->tags[0] ?? 'Название фирмы';
         
//$date_parced = date_parse($item->publishDateDate." ".$item->publishDateTime);
         //$date_nix = mktime( $date_parced['hour'] , $date_parced['minute'] , $date_parced['second'], $date_parced['month'] , $date_parced['day'], $date_parced['year']);

         /*echo '<pre>';
         var_dump($item);
         echo '</pre>';*/
         
         
          
if($countDelete == and isset($item->name) and $item->name!='')
         {
         
/*удаляем старые записи тендеров, только в случае наличия хотя бы 1 записи*/
        
$modx->runSnippet('deleteBidzaarResourse');
        
$countDelete++; 
        }

         
$object $modx->newObject('modResource');
         
$object->set('pagetitle'$item->name); // заголовок
         
$object->set('parent'$bidzarContainerId); // Под какого родителя поместить
         
$object->set('description'$item->name); /*не помещается в pagetitle*/
         
$object->set('content_type'7); // json
         
$object->set('introtext'$tags); // тег
         
$object->set('longtitle'$item->link); // ссылка
         
$object->set('publishedon'$item->publishDateDate.' '.$item->publishDateTime ); // последнее обновление api и дата публикации
         
$object->set('alias''bidzaar'.$item->number ); // алиас
         
$object->set('template'); // шаблон
         
$object->set('richtext'); // без html редактора
         
$object->set('published'); // опубликован
         
$object->setContent(json_encode($item));
         
$object->save();
}
endforeach;

 
$bidzarContainer->set('publishedon'date('Y-m-d H:i'));
$bidzarContainer->save();


}

Шаг 3. Создаем снипет countBidzaarTenders

Этот снипет возвращает кол-во тендеров, уже занесенных в нашу базу 

<?php
$bidzarContainerId 
$modx->runSnippet('getBidzaarContainerId');


if(!
$docs $modx->getCollection'modResource', array(
   
'parent'=>$bidzarContainerId
))){return 0;}

return 
count($docs);

Шаг 4. Создаем снипет deleteBidzaarResourse

Удаляем ресурсы с родительского контейнера, в который грузили тендеры

<?php
$bidzarContainerId 
$modx->runSnippet('getBidzaarContainerId');
if(
$bidzarContainerId==or !isset($bidzarContainerId)){return;}


if(!
$docs $modx->getCollection'modResource', array(
   
'parent'=>$bidzarContainerId
))){return;}

foreach( 
$docs as $doc )
{
$id $doc->get('id');
$resource $modx->getObject('modResource'$id); // Получаем документ
$resource->remove();
}

Шаг 5. Создаем снипет getBidzaarContainerId

Получаем значение id контейнера в котором хранятся тендеры Bidzaar. Поиск идет по [pagetitle=>Bidzaar]. Здесь можно просто вернуть id нужного контейнера.

<?php
if(!$resBidzar $modx->getObject('modResource',['pagetitle'=>'Bidzaar'])){return null;}
$bidzarContainerId=$resBidzar->get('id');
return 
$bidzarContainerId;

Шаг 6. Создаем снипет printBidzaarTeders

Этот снипет отвечает за вывод наших тендеров и пагинации для них

<?php
/*id контейнера в котором хранятся тендеры*/
$bidzarContainerId $modx->runSnippet('getBidzaarContainerId');

if(
$bidzarContainerId==null){return;}

/*кол-во тендеров*/
$countBidzaarTenders $modx->runSnippet('countBidzaarTenders');
/*кол-во тендеров на страницу*/
$resPerPage=5;
/*кол-во страниц (- 1) так как с 0 считаем*/
$countPages = ($countBidzaarTenders) ? ceil( ($countBidzaarTenders $resPerPage)  ) - 
/*текущая страница*/
$currentPage =  preg_replace("/[^\d]/"""$_GET['page']); 


$query $modx->newQuery('modResource');
$query->where(array('parent' => $bidzarContainerId));
$query->sortby('publishedon','DESC' /*ASC*/);
/* limit ($limit, $offset) */
// $limit - число, ограничивающее количество записей
// $offset (не обязательный аргумент) - число, задающее смещение (т.е. какое количество записей необходимо пропустить сначала)
$query->limit($resPerPage, ($resPerPage $currentPage) );

$docss $modx->getCollection('modResource',$query);

foreach( 
$docss as $doc )
{

$content =  json_decode($doc->get('content'));
$publishedon  $doc->get('publishedon');
/*убираем часы секунды*/
$publishedon_date = (explode(' ',$publishedon)[0]) ?? date('Y.m.d');
/*точка вместо тире*/
$publishedon_date str_replace('-''.' ,$publishedon_date);
/*переворачиваем дату зеркало*/
$publishedon_date implode'.' ,array_reverse(explode('.',$publishedon_date)));

$tagName $doc->get('introtext');
$tagName mb_strtoupper(mb_substr($tagName01)) . mb_substr($tagName1); 

$name =  $doc->get('description');
$link $doc->get('longtitle');

echo 
"<div class='tenderCard' >";

//var_dump($content);

   
echo "<div class='tenderData' >";
      echo  
$publishedon_date;
   echo 
"</div>";



   echo 
"<div  class='tenderContent' >";

      echo 
"<div  class='tenderTag' >";
        echo 
$tagName;
      echo 
"</div>";

      echo 
"<div  class='tenderName' >";
         echo 
$name;
      echo 
"</div>";

      echo 
"<div  class='gotoTender' >";
           echo 
"<a target='_blank'  href=".$link.">К тендеру</a>";
      echo 
"</div>";

   echo 
"</div>";


echo 
'</div>';

}

echo 
$modx->runSnippet('paginationBidzaar' ,['resPerPage'=>$resPerPage,'countPages'=>$countPages,'currentPage'=>$currentPage ] );

Шаг 7. Создаем снипет paginationBidzaar

Здесь будет выводиться наша кастомная пагинация, можете поменять на свою или стандартную

<?php
//var_dump($scriptProperties);
//$countPages;
if($countPages==0){return;}

$nextPage =  ($currentPage == $countPages) ? $currentPage $currentPage ;
$prevPage =  ($currentPage == 0) ? $currentPage $currentPage 1;

$pageId $modx->resource->get('id');

$fillSvgPrev =  ($currentPage==0) ? '#b3c2d0' '#003362';
$srcSvgPrev  =  ($currentPage==0) ? 'javascript:void(0)' $modx->makeUrl($pageId'', array('page' => $prevPage));

$fillSvgNext =  ($currentPage >= $countPages  ) ? '#b3c2d0' '#003362';
$srcSvgNext  =  ($currentPage >= $countPages  )  ? 'javascript:void(0)' $modx->makeUrl($pageId'', array('page' => $nextPage));

//echo '<br> nextPage '.$nextPage.' prevPage '.$prevPage;

echo "<div id='pagin' >";

echo 
"<a  href='".$srcSvgPrev."'>Пред</a> ";


echo 
"<div>" .($currentPage )."</div>";

echo 
"<div>" . ($countPages ) ."</div>";


echo 
"<a  href='".$srcSvgNext."'></a>";

echo 
"</div>";

Вид в закладке «Элементы»

Интеграция с api Bidzaar на ModX

Вид в закладке «Ресурсы»

Ресурс Bidzaar с id=18 и есть тот контейнер, в который грузим тендеры

Вид в закладке «Элементы» ModX

Комментарии
Наверх страницы