/** * @param Request $request * @return Response */ public function recordsAction(Request $request) { $fileCache = $this->get('file_cache'); $data = []; /** @var \Doctrine\ORM\EntityManager $em */ $em = $this->getDoctrine()->getManager(); $from = $request->get('from', false); $until = $request->get('until', false); $set = $request->get('set', false); $qb = $em->createQueryBuilder(); $qb->select("a")->from("OjsJournalBundle:Article", 'a'); $qb->andWhere('a.status = ' . ArticleStatuses::STATUS_PUBLISHED); if ($from) { $_from = new \DateTime(); $_from->setTimestamp(strtotime($from)); $qb->where($qb->expr()->gte('a.created', ':from'))->setParameter('from', $_from); } if ($until) { $_until = new \DateTime(); $_until->setTimestamp(strtotime($until)); $condition = $qb->expr()->lte('a.created', ':until'); if ($from) { $qb->andWhere($condition); } else { $qb->where($condition); } $qb->setParameter('until', $_until); } $currentPage = 1; if ($request->query->has('resumptionToken') && $fileCache->contains($request->get('resumptionToken'))) { $token = $fileCache->fetch($request->query->get('resumptionToken')); $currentPage = (int) $token['page']; $set = $token['set']; } if ($set) { $qb->join('a.journal', 'j', 'WITH'); $qb->andWhere($qb->expr()->eq('j.slug', ':slug'))->setParameter('slug', $set); } $paginator = $this->get('knp_paginator'); $records = $paginator->paginate($qb->getQuery(), $currentPage, 100); $data['records'] = $records; $key = md5(StringHelper::generateKey()); $fileCache->save($key, ['page' => $currentPage + 1, 'set' => $set], 60 * 60 * 24); $data['resumptionToken'] = $key; $data['isLast'] = $records->getTotalItemCount() >= $currentPage * 100 ? true : false; $data['currentPage'] = $currentPage; $data['metadataPrefix'] = $request->get('metadataPrefix', 'oai_dc'); $data['displayModes'] = IssueDisplayModes::getDisplayModes(); return $this->response('OjsOAIBundle:Default:records.xml.twig', $data); }