public function getArticlesByCriteria($articleSearchCriteria, $ids = array(), $onlyPublished = true, $order = 'desc')
{
$em = $this->getEntityManager();
$queryBuilder = $em->getRepository('Newscoop\\Entity\\Article')->createQueryBuilder('a')->select('a, FIELD(a.number, :ids) as HIDDEN field', 'l', 'u', 'ap', 'p', 'aa', 'au', 't')->andWhere('a.number IN (:ids)')->leftJoin('a.issue', 'i')->leftJoin('a.section', 's')->leftJoin('a.packages', 'p')->leftJoin('a.language', 'l')->leftJoin('a.lockUser', 'u')->leftJoin('a.publication', 'ap')->leftJoin('a.attachments', 'aa')->leftJoin('a.authors', 'au')->leftJoin('a.topics', 't')->orderBy('field')->setParameters(array('ids' => $ids));
if ($articleSearchCriteria->language) {
$languageId = $em->getRepository('Newscoop\\Entity\\Language')->findOneByCode($articleSearchCriteria->language);
if ($languageId) {
$queryBuilder->andWhere('a.language = :language')->setParameter('language', $languageId);
}
}
if ($articleSearchCriteria->article_type) {
$queryBuilder->andWhere('a.type = :article_type')->setParameter('article_type', $articleSearchCriteria->article_type);
}
if ($articleSearchCriteria->publish_date) {
$startDate = new \DateTime($articleSearchCriteria->publish_date);
$endDate = new \DateTime($articleSearchCriteria->publish_date);
$endDate->modify('+ 1 day');
$queryBuilder->andWhere('a.published >= :publish_date_start')->setParameter('publish_date_start', $startDate);
$queryBuilder->andWhere('a.published < :publish_date_end')->setParameter('publish_date_end', $endDate);
}
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->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->andWhere('t.id = :topic')->setParameter('topic', $articleSearchCriteria->topic);
}
if ($onlyPublished) {
$queryBuilder->andWhere('a.workflowStatus = :workflowStatus')->setParameter('workflowStatus', Article::STATUS_PUBLISHED);
}
if ($order != false) {
$queryBuilder->orderBy('a.uploaded', $order);
}
$countQueryBuilder = clone $queryBuilder;
$query = $queryBuilder->getQuery();
$query->setHint('knp_paginator.count', $countQueryBuilder->select('COUNT(a)')->orderBy('a.number')->getQuery()->getSingleScalarResult());
return $query;
}