/** * Action to show an overview of a folder * @param \ride\library\i18n\I18n $i18n Instance of I18n * @param \ride\library\orm\OrmManager $orm Instance of the ORM * @param string $locale Code of the content locale * @param string $folder Id of the folder to show, null for root folder * @return null */ public function indexAction(I18n $i18n, OrmManager $orm, $locale = null, $folder = null) { // force a locale if (!$locale) { $url = $this->getUrl('assets.overview.locale', array('locale' => $this->getContentLocale())); $this->response->setRedirect($url); return; } // check locale try { $locale = $i18n->getLocale($locale)->getCode(); } catch (LocaleNotFoundException $exception) { $this->response->setNotFound(); return; } $this->setContentLocale($locale); $folderModel = $orm->getAssetFolderModel(); $assetModel = $orm->getAssetModel(); // process arguments $embed = $this->request->getQueryParameter('embed', false); $selected = $this->request->getQueryParameter('selected'); $views = array('grid', 'list'); $view = $this->request->getQueryParameter('view', 'grid'); if (!in_array($view, $views)) { $view = 'grid'; } $limit = $this->request->getQueryParameter('limit', 24); $limit = $this->request->getBodyParameter('limit', $limit); if (!is_numeric($limit) || $limit < 1) { $limit = 24; } $limit = (int) $limit; $page = $this->request->getQueryParameter('page', 1); if (!is_numeric($page) || $page < 1) { $page = 1; } $page = (int) $page; $filter = array('type' => $this->request->getQueryParameter('type', 'all'), 'date' => $this->request->getQueryParameter('date', 'all'), 'query' => $this->request->getQueryParameter('query')); $isFiltered = $filter['type'] != 'all' || $filter['date'] != 'all' || $filter['query']; // create the form $translator = $this->getTranslator(); $types = $assetModel->getTypes($translator); $types = array('all' => $translator->translate('label.types.all'), 'folder' => $translator->translate('label.folder')) + $types; $months = $assetModel->getMonths(); $months = array('all' => $translator->translate('label.dates.all'), 'today' => $translator->translate('label.today')) + $months; $form = $this->createFormBuilder($filter); $form->setId('form-filter'); $form->addRow('type', 'select', array('options' => $types)); $form->addRow('date', 'select', array('options' => $months)); $form->addRow('query', 'string', array('attributes' => array('placeholder' => $translator->translate('label.search')))); $form->addRow('action', 'hidden', array()); $form->addRow('order', 'hidden', array()); $form->addRow('limit', 'hidden', array()); $form->addRow('assets', 'hidden', array('multiple' => true)); $form->addRow('folders', 'hidden', array('multiple' => true)); $form->addRow('submit', 'hidden', array()); $form = $form->build(); // handle form if ($form->isSubmitted()) { $url = $this->request->getUrl(); $data = $form->getData(); switch ($data['submit']) { case 'limit': $limit = $data['limit']; case 'filter': if ($folder) { $url = $this->getUrl('assets.folder.overview', array('locale' => $locale, 'folder' => $folder)); } else { $url = $this->getUrl('assets.overview.locale', array('locale' => $locale)); } $url .= '?view=' . $view . '&type=' . urlencode($data['type']) . '&date=' . urlencode($data['date']) . '&embed=' . ($embed ? 1 : 0) . '&limit=' . $limit . '&page=1'; if ($selected) { $url .= '&selected=' . $selected; } if ($data['query']) { $url .= '&query=' . urlencode($data['query']); } break; case 'bulk-action': if (!$this->processBulkAction($orm, $locale, $folder, $data)) { return; } break; case 'order': if (!$this->processSort($orm, $locale, $folder, $data)) { return; } break; } $this->response->setRedirect($url); return; } // fetch folder $folder = $folderModel->getFolder($folder, $locale, true); if (!$folder) { $this->response->setNotFound(); return; } $numFolders = $folderModel->countFolders($folder, $locale, true, $filter); $numAssets = $assetModel->countByFolder($folder, $locale, true, $filter); $numItems = $numFolders + $numAssets; $folders = $folderModel->getFolders($folder, $locale, true, $filter, $limit, $page); if (count($folders) < $limit) { $assetLimit = $limit; $assetPage = $page; $offset = 0; if ($folders) { $assetLimit -= count($folders); $assetPage = 1; } else { if ($numFolders) { $assetPage -= ceil($numFolders / $limit); } if ($page != 1 && $numFolders) { $offset = $limit - $numFolders % $limit; } } $assets = $assetModel->getByFolder($folder, $locale, true, $filter, (int) $assetLimit, (int) $assetPage, $offset); } else { $assets = array(); } $urlSuffix = '?view=' . $view . '&type=' . $filter['type'] . '&date=' . $filter['date'] . '&embed=' . ($embed ? 1 : 0) . '&limit=' . $limit . '&page=%page%'; if ($filter['query']) { $urlSuffix .= '&query=' . urlencode($filter['query']); } if ($selected) { $urlSuffix .= '&selected=' . $selected; } $urlPagination = $this->getUrl('assets.folder.overview', array('locale' => $locale, 'folder' => $folder->getId())) . $urlSuffix; $pages = ceil($numItems / $limit); $pagination = new Pagination($pages, $page); $pagination->setHref($urlPagination); $urlSuffix = str_replace('%page%', $page, $urlSuffix); // assign everything to view $view = $this->setTemplateView('assets/overview', array('form' => $form->getView(), 'folder' => $folder, 'folders' => $folders, 'assets' => $assets, 'numFolders' => $numFolders, 'numAssets' => $numAssets, 'numItems' => $numItems, 'limit' => $limit, 'pagination' => $pagination, 'page' => $page, 'pages' => $pages, 'breadcrumbs' => $folderModel->getBreadcrumbs($folder), 'view' => $view, 'filter' => $filter, 'isFiltered' => $isFiltered, 'embed' => $embed, 'selected' => $selected, 'urlSuffix' => $urlSuffix, 'locales' => $i18n->getLocaleCodeList(), 'locale' => $locale)); }
/** * Gets the view * @param array $result * @param \ride\web\cms\orm\ContentProperties $properties * @param \ride\library\form\view\FormView|null $searchForm * @param integer $numRows * @param integer $pages * @param integer $page * @param array $arguments * @return \ride\library\mvc\view\View */ private function setView(ContentProperties $contentProperties, array $result, $searchForm, $numRows, $pages = 1, $page = 1, array $arguments = array()) { $pagination = null; if ($contentProperties->willShowPagination()) { $query = null; $paginationUrl = $this->request->getUrl(); if (strpos($paginationUrl, '?') !== false) { list($paginationUrl, $query) = explode('?', $paginationUrl, 2); } $query = preg_replace('((\\?)?' . self::PARAM_PAGE . '=([0-9])*(&)?)', '', $query); $paginationUrl .= '?' . self::PARAM_PAGE . '=' . '%page%'; if ($query) { $paginationUrl .= '&' . $query; } $pagination = new Pagination($pages, $page); $pagination->setHref($paginationUrl); } $moreUrl = null; if ($contentProperties->willShowMoreLink()) { $nodeModel = $this->dependencyInjector->get('ride\\library\\cms\\node\\NodeModel'); $selfNode = $this->properties->getNode(); try { $node = $nodeModel->getNode($selfNode->getRootNodeId(), $selfNode->getRevision(), $contentProperties->getMoreNode()); $moreUrl = $this->request->getBaseScript() . $node->getRoute($this->locale); } catch (NodeNotFoundException $exception) { } } $filterUrl = str_replace($this->request->getQuery(), '', $this->request->getUrl()); foreach ($this->filters as $filterName => $filter) { $filter['filter']->setVariables($this->filters, $this->model, $filterName, $this->locale, $filterUrl); } $this->setContext('orm.overview.' . $this->id, $result); $this->setContext('orm.filters.' . $this->id, $this->filters); $this->setContext('orm.filters.' . $this->id . '.url', $filterUrl); $this->setContext('orm.search.' . $this->id, $searchForm); $this->setContext('orm.num.rows.' . $this->id, $numRows); $template = $this->getTemplate(static::TEMPLATE_NAMESPACE . '/block'); $variables = array('locale' => $this->locale, 'widgetId' => $this->id, 'result' => $result, 'numRows' => $numRows, 'properties' => $contentProperties, 'title' => $contentProperties->getTitle(), 'emptyResultMessage' => $contentProperties->getEmptyResultMessage(), 'filterUrl' => $filterUrl, 'filters' => $this->filters, 'searchForm' => $searchForm, 'arguments' => $arguments, 'pagination' => $pagination, 'moreUrl' => $moreUrl, 'moreLabel' => $contentProperties->getMoreLabel()); $view = $this->setTemplateView($template, $variables); $viewProcessor = $contentProperties->getViewProcessor(); if ($viewProcessor) { $viewProcessor = $this->dependencyInjector->get('ride\\web\\cms\\orm\\processor\\ViewProcessor', $viewProcessor); $viewProcessor->processView($view); } return $view; }