#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 /…