Source of file SitewideContentReport.php
Size: 11,984 Bytes - Last Modified: 2021-12-23T10:34:31+00:00
/var/www/docs.ssmods.com/process/src/src/SitewideContentReport.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 | <?php namespace SilverStripe\SiteWideContentReport; use Page; use SilverStripe\AssetAdmin\Controller\AssetAdmin; use SilverStripe\Assets\File; use SilverStripe\Assets\Folder; use SilverStripe\CMS\Controllers\CMSPageEditController; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Control\Controller; use SilverStripe\Forms\DropdownField; use SilverStripe\Forms\FieldList; use SilverStripe\Forms\GridField\GridField; use SilverStripe\Forms\GridField\GridFieldButtonRow; use SilverStripe\Forms\GridField\GridFieldComponent; use SilverStripe\Forms\GridField\GridFieldConfig; use SilverStripe\Forms\GridField\GridFieldDataColumns; use SilverStripe\Forms\GridField\GridFieldExportButton; use SilverStripe\Forms\GridField\GridFieldPaginator; use SilverStripe\Forms\GridField\GridFieldPrintButton; use SilverStripe\Forms\GridField\GridFieldSortableHeader; use SilverStripe\Forms\GridField\GridFieldToolbarHeader; use SilverStripe\Forms\HeaderField; use SilverStripe\Reports\Report; use SilverStripe\SiteWideContentReport\Form\GridFieldBasicContentReport; use SilverStripe\Subsites\Model\Subsite; use SilverStripe\Versioned\Versioned; use SilverStripe\View\Requirements; /** * Content side-report listing all pages and files from all sub sites. * * Class SitewideContentReport * @package SilverStripe\SiteWideContentReport */ class SitewideContentReport extends Report { /** * @return string */ public function title() { return _t(__CLASS__ . '.Title', 'Site-wide content report'); } /** * @return string */ public function description() { if (class_exists(Subsite::class)) { return _t(__CLASS__ . '.DescriptionIncludingSubsites', 'All pages and files across all Subsites'); } else { return _t(__CLASS__ . '.Description', 'All pages and files across the system'); } } /** * Returns an array with 2 elements, one with a list of Page on the site (and all subsites if * applicable) and another with files. * * @param array $params * @return array */ public function sourceRecords($params = []) { if (class_exists(Subsite::class) && Subsite::get()->count() > 0) { $origMode = Versioned::get_reading_mode(); Versioned::set_reading_mode('Stage.Stage'); $items = [ 'Pages' => Subsite::get_from_all_subsites(SiteTree::class), 'Files' => Subsite::get_from_all_subsites(File::class), ]; if (array_key_exists('AllSubsites', $params)) { $items['Pages'] = $items['Pages']->filter(['SubsiteID' => $params['AllSubsites']]); $items['Files'] = $items['Files']->filter(['SubsiteID' => [0, $params['AllSubsites']]]); } Versioned::set_reading_mode($origMode); return $items; } return [ 'Pages' => Versioned::get_by_stage(SiteTree::class, 'Stage'), 'Files' => File::get(), ]; } public function getCount($params = array()) { $records = $this->sourceRecords(); return $records['Pages']->count() + $records['Files']->count(); } /** * Returns columns for the grid fields on this report. * * @param string $itemType (i.e 'Pages' or 'Files') * * @return array */ public function columns($itemType = 'Pages') { $columns = [ 'Title' => [ 'title' => _t(__CLASS__ . '.Name', 'Name'), 'link' => true, ], 'Created' => [ 'title' => _t(__CLASS__ . '.Created', 'Date created'), 'formatting' => function ($value, $item) { return $item->dbObject('Created')->Nice(); }, ], 'LastEdited' => [ 'title' => _t(__CLASS__ . '.LastEdited', 'Date last edited'), 'formatting' => function ($value, $item) { return $item->dbObject('LastEdited')->Nice(); }, ], ]; if ($itemType === 'Pages') { // Page specific fields $columns['i18n_singular_name'] = _t(__CLASS__ . '.PageType', 'Page type'); $columns['StageState'] = [ 'title' => _t(__CLASS__ . '.Stage', 'Stage'), 'formatting' => function ($value, $item) { // Stage only if (!$item->isPublished()) { return _t(__CLASS__ . '.Draft', 'Draft'); } // Pending changes if ($item->isModifiedOnDraft()) { return _t(__CLASS__ . '.PublishedWithChanges', 'Published (with changes)'); } // If on live and unmodified return _t(__CLASS__ . '.Published', 'Published'); }, ]; $columns['RelativeLink'] = _t(__CLASS__ . '.Link', 'Link'); $columns['MetaDescription'] = [ 'title' => _t(__CLASS__ . '.MetaDescription', 'Description'), 'printonly' => true, ]; } else { // File specific fields $columns['FileType'] = [ 'title' => _t(__CLASS__ . '.FileType', 'File type'), 'datasource' => function ($record) { // Handle folders separately if ($record instanceof Folder) { return $record->i18n_singular_name(); } return $record->getFileType(); } ]; $columns['Size'] = _t(__CLASS__ . '.Size', 'Size'); $columns['Filename'] = _t(__CLASS__ . '.Directory', 'Directory'); } $this->extend('updateColumns', $itemType, $columns); return $columns; } /** * @return FieldList */ public function getCMSFields() { Requirements::css('silverstripe/sitewidecontent-report: css/sitewidecontentreport.css'); $fields = parent::getCMSFields(); $fields->push(HeaderField::create('FilesTitle', _t(__CLASS__ . '.Files', 'Files'), 3)); $fields->push($this->getReportField('Files')); return $fields; } /** * Creates a GridField for pages and another one for files with different columns. * Grid fields have an export and a print button. * * @param string $itemType (i.e 'Pages' or 'Files') * * @return GridField */ public function getReportField($itemType = 'Pages') { $params = isset($_REQUEST['filters']) ? $_REQUEST['filters'] : array(); $items = $this->sourceRecords($params, null, null); $gridField = new GridFieldBasicContentReport('Report-' . $itemType, false, $items[$itemType]); $gridFieldConfig = GridFieldConfig::create()->addComponents( new GridFieldToolbarHeader(), new GridFieldSortableHeader(), new GridFieldDataColumns(), new GridFieldPaginator(), new GridFieldButtonRow('after'), $printButton = new GridFieldPrintButton('buttons-after-left'), $exportButton = $this->getExportButton() ); $gridField->setConfig($gridFieldConfig); /* @var $columns GridFieldDataColumns */ $columns = $gridField->getConfig()->getComponentByType(GridFieldDataColumns::class); $exportFields = []; $displayFields = []; $fieldCasting = []; $fieldFormatting = []; $dataFields = []; // Parse the column information foreach ($this->columns($itemType) as $source => $info) { if (is_string($info)) { $info = ['title' => $info]; } if (isset($info['formatting'])) { $fieldFormatting[$source] = $info['formatting']; } if (isset($info['casting'])) { $fieldCasting[$source] = $info['casting']; } if (isset($info['link']) && $info['link']) { $fieldFormatting[$source] = function ($value, &$item) { if ($item instanceof Page) { return sprintf( "<a href='%s'>%s</a>", Controller::join_links(singleton(CMSPageEditController::class)->Link('show'), $item->ID), $value ); } return sprintf( '<a href="%s" target="_blank" rel="noopener">%s</a>', Controller::join_links( singleton(AssetAdmin::class)->Link('EditForm'), 'field/File/item', $item->ID, 'edit' ), $value ); }; } // Set custom datasource if (isset($info['datasource'])) { $dataFields[$source] = $info['datasource']; } // Set field name for export $fieldTitle = isset($info['title']) ? $info['title'] : $source; // If not print-only, then add to display list if (empty($info['printonly'])) { $displayFields[$source] = $fieldTitle; } // Assume that all displayed fields are printed also $exportFields[$source] = $fieldTitle; } // Set custom evaluated columns $gridField->addDataFields($dataFields); // Set visible fields $columns->setDisplayFields($displayFields); $columns->setFieldCasting($fieldCasting); $columns->setFieldFormatting($fieldFormatting); // Get print columns, and merge with print-only columns $printExportColumns = $this->getPrintExportColumns($gridField, $itemType, $exportFields); $printButton->setPrintColumns($printExportColumns); $exportButton->setExportColumns($printExportColumns); return $gridField; } /** * Returns the columns for the export and print functionality. * * @param GridField $gridField * @param string $itemType (i.e 'Pages' or 'Files') * @param array $exportColumns * * @return array */ public function getPrintExportColumns($gridField, $itemType, $exportColumns) { // Swap RelativeLink for AbsoluteLink for export $exportColumns['AbsoluteLink'] = _t(__CLASS__ . '.Link', 'Link'); unset($exportColumns['RelativeLink']); $this->extend('updatePrintExportColumns', $gridField, $itemType, $exportColumns); return $exportColumns; } public function parameterFields() { if (!class_exists(Subsite::class)) { return null; } $subsites = Subsite::all_sites()->map()->toArray(); // Pad the 0 a little so doesn't get treated as the empty string and remove the original $mainSite = ['000' => $subsites[0]]; unset($subsites[0]); $subsites = $mainSite + $subsites; $header = HeaderField::create('PagesTitle', _t(__CLASS__ . '.Pages', 'Pages'), 3); $dropdown = DropdownField::create('AllSubsites', _t(__CLASS__ . '.FilterBy', 'Filter by:'), $subsites); $dropdown->addExtraClass('subsite-filter no-change-track'); $dropdown->setEmptyString(_t(__CLASS__ . '.ALL_SUBSITES', 'All Subsites')); return FieldList::create($header, $dropdown); } /** * @return GridFieldComponent|GridFieldExportButton */ protected function getExportButton() { $exportButton = new GridFieldExportButton('buttons-after-left'); $this->extend('updateExportButton', $exportButton); return $exportButton; } } |