Newscoop\Services\RelatedArticlesService::positionRelateArticle PHP Method

positionRelateArticle() private method

private positionRelateArticle ( $relatedArticles, $relatedArticle, $position )
    private function positionRelateArticle($relatedArticles, $relatedArticle, $position)
    {
        if ($position == false) {
            return;
        }
        $this->initOrderOnRelatedArticles($relatedArticles);
        try {
            $this->em->getConnection()->exec('LOCK TABLES context_articles WRITE, context_articles as c0_ WRITE;');
            // check if position isn't bigger that max one;
            $maxPosition = $this->em->createQuery('SELECT COUNT(r) FROM Newscoop\\Entity\\RelatedArticle r WHERE r.articleListId = :articleListId AND r.order > 0 ORDER BY r.order ASC')->setParameter('articleListId', $relatedArticles->getId())->getSingleScalarResult();
            if ($position > (int) $maxPosition) {
                $position = (int) $maxPosition;
            }
            // get article - move to position 0
            $oldOrder = $relatedArticle->getOrder();
            $relatedArticle->setOrder(0);
            $this->em->flush();
            // move all bigger than old position up (-1)
            $this->em->createQuery('UPDATE Newscoop\\Entity\\RelatedArticle r SET r.order = r.order-1 WHERE r.order > :oldPosition')->setParameter('oldPosition', $oldOrder)->execute();
            // move all bigger than new position down (+1)
            $this->em->createQuery('UPDATE Newscoop\\Entity\\RelatedArticle r SET r.order = r.order+1 WHERE r.order >= :newPosition')->setParameter('newPosition', $position)->execute();
            // move changed element from position 0 to new position
            $relatedArticle->setOrder($position);
            $this->em->flush();
            $this->em->getConnection()->exec('UNLOCK TABLES;');
        } catch (\Exception $e) {
            $this->em->getConnection()->exec('UNLOCK TABLES;');
        }
    }