<?php
namespace App\DataProvider;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryResultCollectionExtensionInterface;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGenerator;
use ApiPlatform\Core\DataProvider\ContextAwareCollectionDataProviderInterface;
use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
use ApiPlatform\Core\Exception\RuntimeException;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use App\Entity\Api\Search as Search;
use DateTime;
use Score\BaseBundle\Services\SeoUrl;
final class SearchCollectionDataProvider implements ContextAwareCollectionDataProviderInterface, RestrictedDataProviderInterface
{
private $collectionExtensions;
private $managerRegistry;
public function __construct(ManagerRegistry $managerRegistry, iterable $collectionExtensions = [])
{
$this->managerRegistry = $managerRegistry;
$this->collectionExtensions = $collectionExtensions;
}
public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
{
return Search::class === $resourceClass;
}
public function getCollection(string $resourceClass, string $operationName = null, array $context = []): iterable
{
$seoUrlManager = new SeoUrl();
$slug =$context['filters']['keyword'];
$siteQuery = '';
if(array_key_exists('site',$context['filters']))
{
$siteQuery = ' AND s.site_id = '.intval($context['filters']['site']);
}
$types = ['event','article','page','document'];
if(array_key_exists('type',$context['filters']))
{
$types = str_replace(' ','',$context['filters']['type']);
$types = explode(',',$types);
}
$result = [];
$ratedResult = [];
$con = $this->managerRegistry->getManagerForClass($resourceClass)->getConnection();
if ($slug && $seoUrlManager->createSlug($slug)) {
$seoSlug = $seoUrlManager->createSlug($slug);
//$con = $this->getDoctrine()->getManager()->getConnection();
$rawData = [];
//$rawData['page'] = $con->fetchAllAssociative('SELECT p.title as name , p.content , p.seo_id as slug, p.icon as icon, p.edited_at as edit FROM cms_page p');
$rawData['page'] = $con->fetchAllAssociative('SELECT p.created_at, p.id,s.site_id, p.title as name , p.content as content , substring(p.content,0,200) as teaser, p.seo_id as slug, p.icon as icon, p.edited_at as edit FROM cms_page p left join cms_site_items s on p.id =s.item_id and s.item_type = \'page\' WHERE p.seo_id NOT IN (?, ?, ?)'.$siteQuery, ["as", "error", "homepage"]);
$rawData['article'] = $con->fetchAllAssociative('SELECT a.created_at, a.id,s.site_id, a.name as name, a.teaser, a.body as content, a.author, a.slug as slug, a.icon as icon, a.edited_at as edit FROM cms_article a left join cms_site_items s on a.id =s.item_id and s.item_type = \'article\'');
$rawData['event'] = $con->fetchAllAssociative('SELECT e.created_at, e.id,s.site_id, e.name as name, e.content as content, e.teaser, e.organizer, e.contact_person, e.slug as slug, e.icon as icon, e.edited_at as edit FROM cms_event e left join cms_site_items s on e.id =s.item_id and s.item_type = \'event\'');
$rawData['document'] = $con->fetchAllAssociative('SELECT d.id, d.name as name, d.description as content, \'\' as teaser, \'\' as slug, d.created_at as created_at FROM document d');
$skip = false;
foreach ($rawData as $type => $rows) {
if(in_array($type,$types))
{
foreach ($rows as $row) {
$skip = false;
if(strpos($seoUrlManager->createSlug($row['name']), $seoSlug) !== false or strpos($seoUrlManager->createSlug($row['content']), $seoSlug) !== false or strpos($seoUrlManager->createSlug($row['teaser']), $seoSlug) !== false)
{
$ratingCriteria = ['name' =>100000,'teaser' =>10000, 'content' => 1000];
$rating = 0;
if(strpos($seoUrlManager->createSlug($row['name']), $seoSlug) !== false)
{
$rating += $ratingCriteria['name'];
}
if(strpos($seoUrlManager->createSlug($row['teaser']), $seoSlug) !== false)
{
$rating += $ratingCriteria['teaser'];
}
if(strpos($seoUrlManager->createSlug($row['content']), $seoSlug) !== false)
{
$rating += $ratingCriteria['content'];
}
$index = $rating;
if(array_key_exists($index,$result))
{
$index += $row['id'];
}
$result[$index] = [
"id" => $type.'_'.$row['id'],
"type" => $type,
"data" => [
"id" => $row['id'],
"title" => $row['name'],
'teaser' => $row['teaser'],
"slug" => $row['slug'],
"rating" => $rating,
'created_at' => $row['created_at']
]
];
//var_dump( $result);
krsort($result);
$ratedResult = array_values($result);
//var_dump( $result);
/*
$ratedResult = $result;
$ratedResult = [];
foreach($result as $r)
{
//echo $r['id'];
$ratedResult[] = $r;
}
*/
/*
foreach($result as $res)
{
$ratedResult[] = [
"id" => $type.'_'.$row['id'],
"type" => $type,
"data" => [
"id" => $row['id'],
"title" => $row['name'],
'teaser' => $row['teaser'],
"slug" => $row['slug'],
"rating" => $rating,
'created_at' => $row['created_at']
]
];
}
*/
}
/*
foreach($row as $col => $value) {
if ( $skip === false && $value && $col !== "edit" && strpos($seoUrlManager->createSlug($value), $seoSlug) !== false) {
$rating =
$skip = true;
var_dump($col);
$ratingCriteria = ['title' =>1,'teaser' => 0.7, 'body' => 0.5];
//$rating
//$rating =
$result[] = [
"id" => $type.'_'.$row['id'],
"type" => $type,
"data" => [
"id" => $row['id'],
"title" => $row['name'],
'teaser' => $row['teaser'],
"slug" => $row['slug']
]
];
}
}
*/
}
}
}
/*
usort($result, function ($item1, $item2) {
return $item2['edited'] <=> $item1['edited'];
});
*/
}
return $ratedResult;
}
}