Skip to content

Commit

Permalink
initial search new filters
Browse files Browse the repository at this point in the history
  • Loading branch information
ahilles107 committed Feb 22, 2015
1 parent 3e37a6a commit 5c9be2b
Show file tree
Hide file tree
Showing 9 changed files with 182 additions and 2,759 deletions.
2,730 changes: 0 additions & 2,730 deletions newscoop/ChangeLog.txt

This file was deleted.

10 changes: 3 additions & 7 deletions newscoop/library/Newscoop/Article/SearchService.php
Original file line number Diff line number Diff line change
Expand Up @@ -219,9 +219,9 @@ public function getArticleSwitches($article)
}
}

public function searchArticles($language, $query = null, $publication = false, $issue = false, $section = false, $onlyPublished = true)
public function searchArticles($articleSearchCriteria, $onlyPublished = true)
{
$keywords = array_diff(explode(',', $query), array(''));
$keywords = array_diff(explode(',', $articleSearchCriteria->query), array(''));

$webcodeMatches = preg_grep("`^\s*[\+@]`", $keywords);
if (count($webcodeMatches)) {
Expand All @@ -235,11 +235,7 @@ public function searchArticles($language, $query = null, $publication = false, $

$articles = $this->em->getRepository('Newscoop\Entity\Article')
->searchArticles(
$language,
$keywords,
$publication,
$issue,
$section,
$articleSearchCriteria,
$onlyPublished
)
->getResult();
Expand Down
94 changes: 94 additions & 0 deletions newscoop/library/Newscoop/Criteria/ArticleSearchCriteria.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<?php
/**
* @author Paweł Mikołajczuk <pawel.mikolajczuk@sourcefabric.org>
* @package Newscoop
* @copyright 2015 Sourcefabric z.ú.
* @license http://www.gnu.org/licenses/gpl.txt
*/

namespace Newscoop\Criteria;

use Newscoop\Criteria;
use Symfony\Component\HttpFoundation\Request;

/**
* Available criteria for slideshows listing.
*/
class ArticleSearchCriteria extends Criteria
{
/**
* @var string
*/
public $query;

/**
* @var string
*/
public $publication;

/**
* @var string
*/
public $issue;

/**
* @var string
*/
public $section;

/**
* @var string
*/
public $language;

/**
* @var string
*/
public $article_type;

/**
* @var datetime
*/
public $publish_date;

/**
* @var datetime
*/
public $published_after;

/**
* @var datetime
*/
public $published_before;

/**
* @var int
*/
public $author;

/**
* @var int
*/
public $creator;

/**
* @var string
*/
public $status;

/**
* @var int
*/
public $topic;

/**
* @var array
*/
public $orderBy = array('id' => 'desc');

public function fillFromRequest(Request $request) {
foreach($this as $key => $value) {
$this->$key = $request->get($key, false);
}
}
}
1 change: 0 additions & 1 deletion newscoop/library/Newscoop/Criteria/SlideshowCriteria.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
namespace Newscoop\Criteria;

use Newscoop\Criteria;
use Newscoop\ListResult;

/**
* Available criteria for slideshows listing.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
namespace Newscoop\Criteria;

use Newscoop\Criteria;
use Newscoop\ListResult;

/**
* Available criteria for slideshows listing.
Expand Down
69 changes: 56 additions & 13 deletions newscoop/library/Newscoop/Entity/Repository/ArticleRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ public function getArticles($publication, $type = null, $language = null, $issue
*
* @return \Doctrine\ORM\Query
*/
public function searchArticles($language, $keywords = array(), $publication = false, $issue = false, $section = false, $onlyPublished = true)
//public function searchArticles($language, $keywords = array(), $publication = false, $issue = false, $section = false, $onlyPublished = true)
public function searchArticles($articleSearchCriteria, $onlyPublished = true)
{
$em = $this->getEntityManager();
$queryBuilder = $em->getRepository('Newscoop\Entity\ArticleIndex')->createQueryBuilder('a')
Expand All @@ -115,6 +116,7 @@ public function searchArticles($language, $keywords = array(), $publication = fa

$orX = $queryBuilder->expr()->orx();

$keywords = array_diff(explode(',', $articleSearchCriteria->query), array(''));
foreach ($keywords as $keyword) {
$orX->add($queryBuilder->expr()->like('k.keyword', $queryBuilder->expr()->literal("{$keyword}%")));
}
Expand All @@ -123,22 +125,22 @@ public function searchArticles($language, $keywords = array(), $publication = fa
$queryBuilder->andWhere($orX);
}

if ($publication) {
if ($articleSearchCriteria->publication) {
$queryBuilder->andWhere('a.publication = :publication')
->setParameter('publication', $publication);
->setParameter('publication', $articleSearchCriteria->publication);
}

if ($section) {
if ($articleSearchCriteria->section) {
$queryBuilder->andWhere('a.sectionNumber = :section')
->setParameter('section', $section);
->setParameter('section', $articleSearchCriteria->section);
}

if ($issue) {
if ($articleSearchCriteria->issue) {
$queryBuilder->andWhere('a.issueNumber = :issue')
->setParameter('issue', $issue);
->setParameter('issue', $articleSearchCriteria->issue);
}

$queryBuilder->setMaxResults(90);
$queryBuilder->setMaxResults(100);

$articleNumbers = $queryBuilder->getQuery()->getResult();
$tmpNumbers = array();
Expand All @@ -147,21 +149,20 @@ public function searchArticles($language, $keywords = array(), $publication = fa
}
$articleNumbers = $tmpNumbers;

$query = $this->getArticlesByIds($language, $articleNumbers, $onlyPublished);
$query = $this->getArticlesByIds($articleSearchCriteria, $articleNumbers, $onlyPublished);

return $query;
}

public function getArticlesByIds($language, $ids = array(), $onlyPublished = true)
public function getArticlesByIds($articleSearchCriteria, $ids = array(), $onlyPublished = true)
{
$em = $this->getEntityManager();

$languageId = $em->getRepository('Newscoop\Entity\Language')
->findOneByCode($language);
->findOneByCode($articleSearchCriteria->language);
if (!$languageId) {
throw new NotFoundHttpException('Results with language "'.$language.'" was not found.');
}
$language = $languageId;

$queryBuilder = $em->getRepository('Newscoop\Entity\Article')
->createQueryBuilder('a')
Expand All @@ -174,9 +175,51 @@ public function getArticlesByIds($language, $ids = array(), $onlyPublished = tru
->orderBy('field')
->setParameters(array(
'ids' => $ids,
'language' => $language
'language' => $languageId
));

if ($articleSearchCriteria->article_type) {
$queryBuilder->andWhere('a.type = :article_type')
->setParameter('article_type', $articleSearchCriteria->article_type);
}

if ($articleSearchCriteria->publish_date) {
$queryBuilder->andWhere('a.published = :publish_date')
->setParameter('publish_date', $articleSearchCriteria->publish_date);
}

if ($articleSearchCriteria->published_after) {
$queryBuilder->andWhere('a.published > :published_after')
->setParameter('published_after', $articleSearchCriteria->published_after);
}

if ($articleSearchCriteria->published_before) {
$queryBuilder->andWhere('a.published < :published_before')
->setParameter('published_before', $articleSearchCriteria->published_before);
}

if ($articleSearchCriteria->author) {
$queryBuilder->join('a.authors', 'au');
$queryBuilder->andWhere('au.id = :author')
->setParameter('author', $articleSearchCriteria->author);
}

if ($articleSearchCriteria->creator) {
$queryBuilder->andWhere('a.creator = :creator')
->setParameter('creator', $articleSearchCriteria->creator);
}

if ($articleSearchCriteria->status) {
$queryBuilder->andWhere('a.workflowStatus = :status')
->setParameter('status', $articleSearchCriteria->status);
}

if ($articleSearchCriteria->topic) {
$queryBuilder->join('a.topics', 'att');
$queryBuilder->andWhere('att.id = :topic')
->setParameter('topic', $articleSearchCriteria->topic);
}

if ($onlyPublished) {
$queryBuilder->andWhere('a.workflowStatus = :workflowStatus')
->setParameter('workflowStatus', Article::STATUS_PUBLISHED);
Expand Down
1 change: 1 addition & 0 deletions newscoop/library/Newscoop/Services/PlaylistsService.php
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ private function positionPlaylistArticle($playlist, $playlistArticle, $position)
$oldOrder = $playlistArticle->getOrder();
$playlistArticle->setOrder(0);
$this->em->flush();
// it's not new element and we need to pull down bigger elements on it place
if ($oldOrder > 0) {
// move all bigger than old position up (-1)
$this->em
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Newscoop\Criteria\ArticleSearchCriteria;

/**
* Articles controller
Expand Down Expand Up @@ -239,7 +240,16 @@ public function getArticlesAction(Request $request)
* {"name"="query", "dataType"="string", "required"=true, "description"="article serach query"},
* {"name"="publication", "dataType"="string", "required"=false, "description"="Filter by publication"},
* {"name"="issue", "dataType"="string", "required"=false, "description"="Filter by issue"},
* {"name"="section", "dataType"="string", "required"=false, "description"="Filter by section"}
* {"name"="section", "dataType"="string", "required"=false, "description"="Filter by section"},
* {"name"="language", "dataType"="string", "required"=false, "description"="Filter by language"},
* {"name"="article_type", "dataType"="string", "required"=false, "description"="Filter by article type"},
* {"name"="publish_date", "dataType"="string", "required"=false, "description"="Filter by publish date"},
* {"name"="published_after", "dataType"="string", "required"=false, "description"="Filter by published after date"},
* {"name"="published_before", "dataType"="string", "required"=false, "description"="Filter by published before date"},
* {"name"="author", "dataType"="integer", "required"=false, "description"="Filter by author"},
* {"name"="creator", "dataType"="integer", "required"=false, "description"="Filter by creator"},
* {"name"="status", "dataType"="string", "required"=false, "description"="Filter by status"},
* {"name"="topic", "dataType"="integer", "required"=false, "description"="Filter by topic"}
* }
* )
*
Expand All @@ -262,12 +272,15 @@ public function searchArticlesAction(Request $request)
}
} catch (\Newscoop\NewscoopException $e) {}

$articleSearchCriteria = new ArticleSearchCriteria();
$articleSearchCriteria->fillFromRequest($request);

if (!$articleSearchCriteria->language) {
$articleSearchCriteria->language = $publication->getLanguage()->getCode();
}

$articles = $articleSearch->searchArticles(
$request->get('language', $publication->getLanguage()->getCode()),
$request->query->get('query', null),
$request->get('publication', false),
$request->get('issue', false),
$request->get('section', false),
$articleSearchCriteria,
$onlyPublished
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,8 +125,16 @@ public function getPlaylistsArticlesAction(Request $request, $id)
throw new NotFoundHttpException('Result was not found.');
}

$onlyPublished = true;
try {
$user = $this->container->get('user')->getCurrentUser();
if ($user && $user->isAdmin()) {
$onlyPublished = false;
}
} catch (\Newscoop\NewscoopException $e) {}

$playlistArticles = $em->getRepository('Newscoop\Entity\Playlist')
->articles($playlist, null, true, null, null, true, true)->getResult();
->articles($playlist, null, true, null, null, true, $onlyPublished)->getResult();

$articles = array();
foreach ($playlistArticles as $playlistArticle) {
Expand Down

0 comments on commit 5c9be2b

Please sign in to comment.