Symfony2 — Счетчик просмотра страниц

#symfony #doctrine-orm #count #counter #pageviews

#symfony #doctrine-orm #количество #счетчик #просмотры страниц

Вопрос:

Я пытаюсь добавить счетчик просмотров страниц для сообщений, которые наиболее просматриваются пользователем. Я добавил свойство $viewCount, которое является целым числом, в мой объект Post.

Я хочу, чтобы это учитывалось каждый раз, когда пользователь нажимает на страницу показа для определенного сообщения.

Чтобы пройти через весь процесс, мне нужно настроить счетчик, добавлять 1 при каждом его просмотре, сохранить это в базе данных, запросить для этого, а затем передать это обратно в Twig.

2 части, которые я не знаю, как сделать после поиска hrs, это:

1) Как добавлять каждый раз, когда пользователь просматривает страницу (я знаю, что вы хотите как-то использовать 1)

2) Как запросить наибольшее количество просмотров страниц для передачи контроллеру и twig

showAction

 /**
 * Show Post
 *
 * @param $slug
 * @throws SymfonyComponentHttpKernelExceptionNotFoundHttpException
 * @return array
 *
 * @Route("/post/{slug}", name="acme_demo_show")
 * @Template("AcmeDemoBundle:Page:show.html.twig")
 */
public function showPostAction($slug)
{
    $article = $this->getDoctrine()->getRepository('AcmeBundle:Post')
        ->findOneBy(array(
            'slug' => $slug
        ));

    if (null === $article) {
        throw $this->createNotFoundException('Post was not found');
    }

    // Increment views each time user clicks on an article
    $em = $this->getDoctrine()->getManager();
    $views = $article->getViews();
    $article->setViews($views   1);
    $em->flush();

    return array(
        'article' => $article,
    );
}
 

действие боковой панели

 public function sidebarAction()
{
    $em = $this->getDoctrine()->getManager();

    $post = $em->getRepository('AcmeDemoBundle:Article')
        ->getMostRecentArticles(5);

    if (!$post) {
        throw $this->createNotFoundException('No posts were found');
    }

    $articles = $this->getDoctrine()->getRepository('AcmeDemoBundle:Article')
        ->findBy(array(
            array(
                'views' => 'ASC'
            )
        ));

    return array(
        'post' => $post,
        'articles' => $articles
    );
}
 

Twig

 <h3>Most Popular Articles</h3>
    {% for article in articles %}
        <a href="{{ path('acme_demo_article_show', { slug: article.slug }) }}" class="anchor" style="text-decoration: none">{{ article.title }}</a><br>
    {% endfor %}
 

Ответ №1:

Если вы хотите увеличить счетчик, когда пользователь нажимает на ссылку, вам понадобится javascript с AJAX. В качестве альтернативы вы могли бы сделать это в контроллере вашего post на чистом php с помощью чего-то вроде:

 $views = $article->getViews();
$article->setViews($views   1);
$em->persist($article);
$em->flush();
 

Наилучшей практикой является добавление increment() метода к вашей Article сущности.

Затем для запроса статей по представлениям:

  $articles = $this->getDoctrine()->getRepository('AcmeBundle:Post')
        ->findBy(array(), array('views' => 'ASC'));
 

Но лучше всего написать собственный метод в репозитории объекта.

Обновить:

Репозиторий

 public function getMostPopularArticles()
{
    return $this->createQueryBuilder('article')
        ->select('article')
        ->orderBy('article.views', 'DESC')
        ->getQuery()
        ->execute();

}
 

Комментарии:

1. Ему также потребуется принудительно заблокировать таблицу / строку, иначе он не сможет гарантировать правильность приращения

2. @jperovic Как вы применяете блокировку таблицы / строки?

3. Поскольку вы используете doctrine, об этом есть статья: docs.doctrine-project.org/en/2.0.x/reference /…

4. Ваша ошибка возникает из-за метода findBy. Используйте тот же синтаксис, что и я. Первый массив мы можем оставить пустым, поскольку мы не ищем конкретное значение поля, второй массив — это предложение orderby . И @jperovic абсолютно прав.

5. Ссылка на документы в комментарии выше теперь не работает, для тех, кто еще прибывает сюда: doctrine-orm.readthedocs.org/en/latest/reference /…