/**
  * Transforms an object to a string (id).
  *
  * @param  Publication|null $publication
  * @return string
  */
 public function transform($publication)
 {
     if (null === $publication) {
         return '';
     }
     return $publication->getId();
 }
Example #2
0
    /**
     * Находим рекомендуемые к просмотру публикации
     * @param Publication $publication
     * @param bool $includeRestricted
     * @param int $limit
     * @return array
     */
    public function findReadAlso($publication, $includeRestricted = false, $limit = 4)
    {
        $em = $this->getEntityManager();
        $id = $publication->getId();
        $publications = array();
        $restrictedCategoriesDQL = $includeRestricted ? '' : ' AND c.public = 1';
        # получаем идентификаторы тегов публикации
        foreach ($publication->getSearchTags() as $tag) {
            $tagIds[] = $tag->getId();
        }
        # берем публикации по этим тегам (до лимита)
        if (!empty($tagIds)) {
            $publications = $em->createQuery('SELECT p
				FROM EvrikaMainBundle:Publication p
				LEFT JOIN p.searchTags s
				LEFT JOIN p.category c
				WHERE s.id IN(:tagIds)
					AND p.id != :id AND p.enabled = TRUE AND p.created < CURRENT_TIMESTAMP() ' . $restrictedCategoriesDQL . ' GROUP BY p.id' . ' ORDER BY p.created DESC					')->setParameters(array('id' => $id, 'tagIds' => $tagIds))->setMaxResults((int) $limit / 2)->getResult();
        }
        # получаем идентификаторы найденных публикаций, чтоб не повторяться с последующей выборкой
        $dqlNotIn = '';
        if (!empty($publications)) {
            $publicationIds = [];
            foreach ($publications as $p) {
                $publicationIds[] = $p->getId();
            }
            $publicationIdsStr = implode(',', $publicationIds);
            $dqlNotIn = empty($publicationIds) ? '' : " AND p . id NOT IN({$publicationIdsStr})";
        }
        # получаем идентификаторы специальностей публикации
        foreach ($publication->getSpecialties() as $specialty) {
            $specialtyIds[] = $specialty->getId();
        }
        # берем пару последних публикаций по этим специальностям
        if (!empty($specialtyIds)) {
            $publicationsBySpecialty = $em->createQuery('SELECT p
				FROM EvrikaMainBundle:Publication p
				LEFT JOIN p.specialties s
				LEFT JOIN p.category c
				WHERE s.id IN(:specialtyIds) AND
					p.id != :id AND
					p.enabled = TRUE AND
					p.created < CURRENT_TIMESTAMP()' . $dqlNotIn . $restrictedCategoriesDQL . 'GROUP BY p.id
				 ORDER BY p.created DESC')->setParameters(array('id' => $id, 'specialtyIds' => $specialtyIds))->setMaxResults($limit - count($publications))->getResult();
            $publications = array_merge($publications, $publicationsBySpecialty);
        }
        # если мы до сих пор не собрали нужное количество (limit) - добираем последними публикациями
        if (count($publications) < $limit) {
            # получаем идентификаторы найденных публикаций, чтоб не повторяться с последующей выборкой
            $dqlNotIn = '';
            if (!empty($publications)) {
                $publicationIds = [];
                foreach ($publications as $p) {
                    $publicationIds[] = $p->getId();
                }
                $publicationIdsStr = implode(',', $publicationIds);
                $dqlNotIn = empty($publicationIds) ? '' : " AND p . id NOT IN({$publicationIdsStr})";
            }
            $publicationsByDate = $em->createQuery('SELECT p
				FROM EvrikaMainBundle:Publication p
				LEFT JOIN p.category c
				WHERE p.id != :id AND
					p.id != :id AND
					p.enabled = TRUE
					AND p.created < CURRENT_TIMESTAMP() ' . $dqlNotIn . $restrictedCategoriesDQL . ' ORDER BY p.created DESC')->setParameter('id', $id)->setMaxResults($limit - count($publications))->getResult();
            $publications = array_merge($publications, $publicationsByDate);
        }
        return $publications;
    }