src/Controller/RdResourceController.php line 22

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Pimcore\Controller\FrontendController;
  4. use Pimcore\Model\Element\Tag\Listing;
  5. use Pimcore\Model\DataObject;
  6. use Pimcore\Model\DataObject\RdResourceItem;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  10. use Symfony\Component\HttpFoundation\JsonResponse;
  11. use App\Website\LinkGenerator\RdResourceLinkGenerator;
  12. use App\Website\Navigation\BreadcrumbHelperService;
  13. use Knp\Component\Pager\PaginatorInterface;
  14. use Pimcore\Twig\Extension\Templating\HeadTitle;
  15. use Pimcore\Twig\Extension\Templating\Placeholder;
  16. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use Elasticsearch\Client;
  19. class RdResourceController extends BaseController
  20. {
  21.     const RDRESOURCE_DEFAULT_DOCUMENT_PROPERTY_NAME 'rdresource_default_document';
  22.     /**
  23.      * @param Request $request
  24.      *
  25.      * @return Response
  26.      *
  27.      * @throws \Exception
  28.      */
  29.     public function listingAction(Request $requestPaginatorInterface $paginator)
  30.     {
  31.         $contributor $request->query->get('contributor');
  32.         $project $request->query->get('project');
  33.         $tree $request->query->get('tree');
  34.         $rtag $request->query->get('tag');
  35.         $filterquery "";
  36.         $filters = [];
  37.         $contributorsquery "";
  38.         $projectsquery "";
  39.         $typesquery "";
  40.         $stquery "";
  41.         $valuequery = [];
  42.         $sort $request->query->get('sort');
  43.         $st $request->query->get('st');
  44.         $keywords $request->query->get('keywords');
  45.         $type $request->query->get('type');
  46.         parse_str($_SERVER['QUERY_STRING'], $qsarr);
  47.         $qslink "";
  48.         if ($qsarr) {
  49.             foreach ($qsarr as $k => $v) {
  50.                 if ($k != "tree" && $k != "page" && $k != "rtag") {
  51.                     $qslink .= "&" $k "=" $v;
  52.                 }
  53.             }
  54.         }
  55.         // TAG LIST FOR STRUCTURE (TOPIC) BROWSING
  56.         // Get structure tags
  57.         $tagList = new \Pimcore\Model\Element\Tag\Listing();
  58.         //select parent node for tags or use all root tags.
  59.         $tagList->setCondition("parentId = 9");
  60.         $tagList->setOrderKey("name");
  61.         $tags = [];
  62.         $nodes = [];
  63.         $nodes[] = 9;
  64.         foreach ($tagList->load() as $tag) {
  65.             $tags[] = $this->convertTagToArray($tag$nodes);
  66.         }
  67.         // STANDARD FILTER/SEARCH QUERIES
  68.         $rdResourceListing = new RdResourceItem\Listing();
  69.         if ($sort == "date ASC") {
  70.             $rdResourceListing->setOrderKey('registered_date');
  71.             $rdResourceListing->setOrder('ASC');
  72.         } elseif ($sort == "title") {
  73.             $rdResourceListing->setOrderKey('title');
  74.             $rdResourceListing->setOrder('ASC');
  75.         } else {
  76.             $rdResourceListing->setOrderKey('registered_date');
  77.             $rdResourceListing->setOrder('DESC');
  78.         }
  79.         if ($st) {
  80.             $valuequery[":st"] = "%" $st "%";
  81.             $stquery "(contributors LIKE :st ";
  82.             $stquery .= " OR title LIKE :st";
  83.             $stquery .= " OR author LIKE :st";
  84.             $stquery .= " OR resource_format LIKE :st";
  85.             $stquery .= " OR user_institutions LIKE :st";
  86.             $stquery .= " OR contributors LIKE :st";
  87.             $stquery .= " OR other_contributors LIKE :st";
  88.             $stquery .= " OR project LIKE :st";
  89.             $stquery .= " OR licence LIKE :st";
  90.             $stquery .= " OR resource_usage LIKE :st";
  91.             $stquery .= " OR interoperability LIKE :st";
  92.             $stquery .= " OR standards LIKE :st";
  93.             $stquery .= " OR description LIKE :st";
  94.             $stquery .= ")";
  95.             $filters["st"] = $stquery;
  96.         }
  97.         if ($keywords) {
  98.             /*
  99.             $valuequery[":kw"] = "%;" . $keywords . ";%";
  100.             $kwquery = "(CONCAT(';',REPLACE(keywords, '; ', ';'),';') LIKE :kw)";
  101.             $filters["keywords"] = $kwquery;
  102.             */
  103.         }
  104.         if ($contributor) {
  105.             $contributorsquery .= "(contributors LIKE :contributors)";
  106.             $valuequery[":contributors"] = "%" $contributor "%";
  107.             $filters["contributors"] = $contributorsquery;
  108.         }
  109.         if ($project) {
  110.             $projectsquery .= "(project LIKE :projects)";
  111.             $valuequery[":projects"] = "%" $project "%";
  112.             $filters["projects"] = $projectsquery;
  113.         }
  114.         if ($type) {
  115.             $typesquery .= "(resource_type LIKE :type)";
  116.             $valuequery[":type"] = "%" $type "%";
  117.             $filters["types"] = $typesquery;
  118.         }
  119.         $filterquery implode(" AND "$filters);
  120.         // print_r($filterquery);
  121.         //print_r($valuequery);
  122.         // print_r($stquery);
  123.         //  $rdResourceListing->setCondition("topics LIKE :topics1 OR topics LIKE :topics2", ["topics1" => "%Data management%", "topics2" => "%Data discovery%"]);
  124.         if ($filterquery != "") {
  125.             $rdResourceListing->setCondition($filterquery$valuequery);
  126.         }
  127.         // Filter by tags
  128.         $treevalues $request->get('tree');
  129.         $treevalues is_array($treevalues) ? $treevalues explode(','$treevalues);
  130.         $rtagname="";
  131.         if ($treevalues) {
  132.             $conditionParts = [];
  133.             foreach ($treevalues as $tagId) {
  134.                 $tag \Pimcore\Model\Element\Tag::getById($tagId);
  135.                 if ($tag) {
  136.                     //get ID path of tag or filtering the child tags
  137.                     $tagPath $tag->getFullIdPath();
  138.                     $conditionParts[] = "o_id IN (
  139.                     SELECT cid FROM tags_assignment INNER JOIN tags ON tags.id = tags_assignment.tagid 
  140.                     WHERE 
  141.                         ctype = 'object' AND 
  142.                         (tags.id = " $tagId " OR tags.idPath LIKE '" $tagPath "%'))";
  143.                 }
  144.             }
  145.         }
  146.         $rtag $request->get('rtag');
  147.         if ($rtag) {
  148.             $conditionParts = [];
  149.            
  150.                 $tag \Pimcore\Model\Element\Tag::getById($rtag);
  151.                 if ($tag) {
  152.                     //get ID path of tag or filtering the child tags
  153.                     $rtagid $tag->getId();
  154.                     $conditionParts[] = "o_id IN (
  155.                     SELECT cid FROM tags_assignment INNER JOIN tags ON tags.id = tags_assignment.tagid 
  156.                     WHERE 
  157.                         ctype = 'object' AND 
  158.                         tags.id = " $rtagid ")";
  159.                 }
  160.                 $rtagname $tag->getName();
  161.            
  162.         }
  163.         if (count($conditionParts) > 0) {
  164.             $condition implode(" AND "$conditionParts);
  165.             $rdResourceListing->addConditionParam($condition);
  166.         }
  167.         $paginator $paginator->paginate(
  168.             $rdResourceListing,
  169.             $request->get('page'1),
  170.             10
  171.         );
  172.         // END STANDARD FILTER/SEARCH QUERIES
  173.         // FILTER OPTIONS
  174.         $sampleresource = new RdResourceItem();
  175.         $availableFilters = [];
  176.         $contributorsDef $sampleresource->getClass()->getFieldDefinition("contributors");
  177.         $contributorsOptions $contributorsDef->getOptions();
  178.         $projectsDef $sampleresource->getClass()->getFieldDefinition("project");
  179.         $projectsOptions $projectsDef->getOptions();
  180.         $typesDef $sampleresource->getClass()->getFieldDefinition("resource_type");
  181.         $typesOptions $typesDef->getOptions();
  182.         $pqListing = new RdResourceItem\Listing();
  183.         $contributorsFinalOptions = [];
  184.         $projectsFinalOptions = [];
  185.         $typesFinalOptions = [];
  186.         foreach ($contributorsOptions as $contributorsOption) {
  187.             $pqListing->setCondition("contributors LIKE :contribs", ["contribs" => "%" $contributorsOption["value"] . "%"]);
  188.             if (count($pqListing)) {
  189.                 $contributorsFinalOptions[] = $contributorsOption;
  190.             }
  191.         }
  192.         foreach ($projectsOptions as $projectsOption) {
  193.             $pqListing->setCondition("project LIKE :projects", ["projects" => "%" $projectsOption["value"] . "%"]);
  194.             if (count($pqListing)) {
  195.                 $projectsFinalOptions[] = $projectsOption;
  196.             }
  197.         }
  198.         foreach ($typesOptions as $typesOption) {
  199.             $pqListing->setCondition("resource_type LIKE :type", ["type" => "%" $typesOption["value"] . "%"]);
  200.             if (count($pqListing)) {
  201.                 $typesFinalOptions[] = $typesOption;
  202.             }
  203.         }
  204.         // END FILTER OPTIONS
  205.         // PREQUERIES FOR FACETTED SEARCH
  206.         //$qb = $entityManager->createQueryBuilder();
  207.         //$qb->select('count(account.id)');
  208.         //$qb->from('ZaysoCoreBundle:Account','account');
  209.         // END PREQUERIES FOR FACETTED SEARCH
  210.         return $this->render('rdresource/listing.html.twig', [
  211.             'rdResourceListing' => $paginator,
  212.             'paginationVariables' => $paginator->getPaginationData(),
  213.             'topics' => $request->query->get('topics'),
  214.             'keywords' => $request->query->get('keywords'),
  215.             'contributorsvalues' => $request->query->get('contributor'),
  216.             'typesvalues' => $request->query->get('type'),
  217.             'projectsvalues' => $request->query->get('project'),
  218.             'st' => $request->query->get('st'),
  219.             'sort' => $sort,
  220.             'rtag' => $rtag,
  221.             'rtagname' => $rtagname,
  222.             'contributors_options' => $contributorsFinalOptions,
  223.             'types_options' => $typesFinalOptions,
  224.             'projects_options' => $projectsFinalOptions,
  225.             'tags' => $tags,
  226.             'treevalues' => $request->query->get('tree'),
  227.             'qs' => $_SERVER['QUERY_STRING'],
  228.             'qslink' => $qslink
  229.         ]);
  230.         //  return $this->render('resource/listing.html.twig', ['rdResourceListing' => $rdResourceListing]);
  231.     }
  232.     /**
  233.      * @Route("{path}/{rdresourcetitle}-crdr-{rdresource}", name="rdresource-detail", defaults={"path"=""}, requirements={"path"=".*?", "rdresourcetitle"="[\w-]+", "rdresource"="\d+"})
  234.      *
  235.      * @param Request $request
  236.      * @param HeadTitle $headTitleHelper
  237.      * @param Placeholder $placeholderHelper
  238.      * @param RdResourceLinkGenerator $rdResourceLinkGenerator
  239.      * @param BreadcrumbHelperService $breadcrumbHelperService
  240.      *
  241.      * @return Response
  242.      */
  243.     public function detailAction(Request $requestHeadTitle $headTitleHelperPlaceholder $placeholderHelperRdResourceLinkGenerator $rdResourceLinkGeneratorBreadcrumbHelperService $breadcrumbHelperService)
  244.     {
  245.         $rdresource RdResourceItem::getById($request->get('rdresource'));
  246.         if (!($rdresource instanceof RdResourceItem && ($rdresource->isPublished() || $this->verifyPreviewRequest($request$rdresource)))) {
  247.             throw new NotFoundHttpException('Resource not found.');
  248.         }
  249.         $breadcrumbHelperService->enrichRdResourcePage($rdresource);
  250.         $resourcetags \Pimcore\Model\Element\Tag::getTagsForElement('object'$rdresource->getId());
  251.         $rtags = array();
  252.         foreach ($resourcetags as $rtag) {
  253.             if ($rtag->getParentId() == 10) {
  254.                 $rtags[] = $rtag;
  255.             }
  256.         }
  257.         $placeholderHelper('canonical')->set($rdResourceLinkGenerator->generate($rdresource, ['document' => $this->document->getProperty(self::RDRESOURCE_DEFAULT_DOCUMENT_PROPERTY_NAME)]));
  258.         $headTitleHelper($rdresource->getTitle());
  259.         $contributorOptions DataObject\Service::getOptionsForMultiSelectField($rdresource"contributors");
  260.         return $this->render('rdresource/detail.html.twig', [
  261.             'rdresource' => $rdresource,
  262.             'tags' => $rtags,
  263.             'qs' => $_SERVER['QUERY_STRING'],
  264.             'contributorOptions' => $contributorOptions
  265.         ]);
  266.     }
  267.     /**
  268.      *  Function to convert tags to an array that is expected by bootstrap tree view
  269.      */
  270.     protected function convertTagToArray(\Pimcore\Model\Element\Tag $tag$assignedTagIds)
  271.     {
  272.         $tagArray = [
  273.             "id" => $tag->getId(),
  274.             "path" => $tag->getIdPath(),
  275.             "fullpath" => $tag->getFullIdPath(),
  276.             "parentid" => $tag->getParentId(),
  277.             "text" => $tag->getName()
  278.         ];
  279.         $state = [];
  280.         $state["checked"] = array_search($tag->getId(), $assignedTagIds) !== false;
  281.         $tagArray["state"] = $state;
  282.         $children $tag->getChildren();
  283.         foreach ($children as $child) {
  284.             $childrenNodes $this->convertTagToArray($child$assignedTagIds);
  285.             if ($this->hasCheckedNodes($childrenNodes)) {
  286.                 $tagArray["state"]["expanded"] = true;
  287.             }
  288.             $tagArray['nodes'][] = $childrenNodes;
  289.         }
  290.         return $tagArray;
  291.     }
  292.     protected function hasCheckedNodes($nodesArray)
  293.     {
  294.         $it = new \RecursiveIteratorIterator(
  295.             new \ParentIterator(new \RecursiveArrayIterator($nodesArray)),
  296.             \RecursiveIteratorIterator::SELF_FIRST
  297.         );
  298.         foreach ($it as $key => $value) {
  299.             if ($key == 'state' && $value['checked']) {
  300.                 return true;
  301.             }
  302.         }
  303.         return false;
  304.     }
  305. }