silverstripe-reports/code/ReportAdmin.php

253 lines
7.6 KiB
PHP
Raw Normal View History

2013-01-17 01:22:13 +01:00
<?php
2016-06-16 07:06:51 +02:00
namespace SilverStripe\Reports;
use SilverStripe\Admin\LeftAndMain;
use SilverStripe\Control\Controller;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\GridField\GridFieldConfig;
use SilverStripe\Forms\GridField\GridFieldToolbarHeader;
use SilverStripe\Forms\GridField\GridFieldSortableHeader;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\Forms\GridField\GridFieldFooter;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\HTMLEditor\HTMLEditorConfig;
use SilverStripe\i18n\i18n;
2016-06-16 07:06:51 +02:00
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\SS_List;
use SilverStripe\Security\Member;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
2016-06-16 07:06:51 +02:00
2013-01-17 01:22:13 +01:00
/**
* Reports section of the CMS.
2016-06-16 07:06:51 +02:00
*
2013-01-17 01:22:13 +01:00
* All reports that should show in the ReportAdmin section
* of the CMS need to subclass {@link SS_Report}, and implement
* the appropriate methods and variables that are required.
*/
2015-12-15 23:06:45 +01:00
class ReportAdmin extends LeftAndMain implements PermissionProvider
{
private static $url_segment = 'reports';
2016-06-16 07:06:51 +02:00
2015-12-15 23:06:45 +01:00
private static $menu_title = 'Reports';
2016-06-16 07:06:51 +02:00
2015-12-15 23:06:45 +01:00
private static $template_path = null; // defaults to (project)/templates/email
2016-09-09 08:11:38 +02:00
private static $tree_class = 'SilverStripe\\Reports\\Report';
2015-12-15 23:06:45 +01:00
private static $url_handlers = array(
'show/$ReportClass/$Action' => 'handleAction'
2015-12-15 23:06:45 +01:00
);
/**
2016-06-16 07:06:51 +02:00
* Variable that describes which report we are currently viewing based on
2015-12-15 23:06:45 +01:00
* the URL (gets set in init method).
*
* @var string
*/
protected $reportClass;
/**
2016-09-09 08:11:38 +02:00
* @var Report
*/
2015-12-15 23:06:45 +01:00
protected $reportObject;
2016-06-16 07:06:51 +02:00
private static $required_permission_codes = 'CMS_ACCESS_ReportAdmin';
2015-12-15 23:06:45 +01:00
public function init()
{
parent::init();
// Set custom options for TinyMCE specific to ReportAdmin
HTMLEditorConfig::get('cms')->setOption('content_css', project() . '/css/editor.css');
HTMLEditorConfig::get('cms')->setOption('Lang', i18n::get_tinymce_lang());
2015-12-15 23:06:45 +01:00
// Always block the HtmlEditorField.js otherwise it will be sent with an ajax request
Requirements::block(FRAMEWORK_DIR . '/javascript/HtmlEditorField.js');
Requirements::javascript(REPORTS_DIR . '/javascript/ReportAdmin.js');
}
/**
* Does the parent permission checks, but also
* makes sure that instantiatable subclasses of
* {@link Report} exist. By default, the CMS doesn't
* include any Reports, so there's no point in showing
*
* @param Member $member
* @return boolean
*/
public function canView($member = null)
{
if (!$member && $member !== false) {
$member = Member::currentUser();
}
if (!parent::canView($member)) {
return false;
}
foreach ($this->Reports() as $report) {
if ($report->canView($member)) {
return true;
}
}
return false;
}
/**
* Return a SS_List of SS_Report subclasses
* that are available for use.
*
* @return SS_List
*/
public function Reports()
{
$output = new ArrayList();
2016-09-09 08:11:38 +02:00
/** @var Report $report */
foreach (Report::get_reports() as $report) {
2015-12-15 23:06:45 +01:00
if ($report->canView()) {
$output->push($report);
}
}
return $output;
}
2016-07-29 00:44:00 +02:00
public function handleAction($request, $action)
{
$this->reportClass = $this->unsanitiseClassName($request->param('ReportClass'));
// Check report
if ($this->reportClass) {
2016-09-09 08:11:38 +02:00
$allReports = Report::get_reports();
if (empty($allReports[$this->reportClass])) {
return $this->httpError(404);
}
$this->reportObject = $allReports[$this->reportClass];
}
// Delegate to sub-form
return parent::handleAction($request, $action);
}
/**
* Unsanitise a model class' name from a URL param
*
* @param string $class
* @return string
*/
protected function unsanitiseClassName($class) {
return str_replace('-', '\\', $class);
}
2015-12-15 23:06:45 +01:00
/**
* Determine if we have reports and need
* to display the "Reports" main menu item
* in the CMS.
*
* The test for an existance of a report
* is done by checking for a subclass of
* "SS_Report" that exists.
*
* @return boolean
*/
public static function has_reports()
{
2016-09-09 08:11:38 +02:00
return sizeof(Report::get_reports()) > 0;
2015-12-15 23:06:45 +01:00
}
/**
* Returns the Breadcrumbs for the ReportAdmin
2016-08-11 04:29:53 +02:00
*
* @param bool $unlinked
2015-12-15 23:06:45 +01:00
* @return ArrayList
*/
public function Breadcrumbs($unlinked = false)
{
$items = parent::Breadcrumbs($unlinked);
2016-06-16 07:06:51 +02:00
2015-12-15 23:06:45 +01:00
// The root element should explicitly point to the root node.
// Uses session state for current record otherwise.
$items[0]->Link = singleton('SilverStripe\\Reports\\ReportAdmin')->Link();
2015-12-15 23:06:45 +01:00
if ($this->reportObject) {
//build breadcrumb trail to the current report
$items->push(new ArrayData(array(
'Title' => $this->reportObject->title(),
'Link' => Controller::join_links($this->Link(), '?' . http_build_query(array('q' => $this->request->requestVar('q'))))
)));
2015-12-15 23:06:45 +01:00
}
return $items;
}
/**
* Returns the link to the report admin section, or the specific report that is currently displayed
*
* @param string $action
* @return string
2015-12-15 23:06:45 +01:00
*/
public function Link($action = null)
{
if ($this->reportObject) {
return $this->reportObject->getLink($action);
2015-12-15 23:06:45 +01:00
}
// Basic link to this cms section
return parent::Link($action);
2015-12-15 23:06:45 +01:00
}
public function providePermissions()
{
return array(
"CMS_ACCESS_ReportAdmin" => array(
2016-08-11 04:29:53 +02:00
'name' => _t('CMSMain.ACCESS', "Access to '{title}' section", array(
'title' => static::menu_title()
)),
2015-12-15 23:06:45 +01:00
'category' => _t('Permission.CMS_ACCESS_CATEGORY', 'CMS Access')
)
);
}
public function getEditForm($id = null, $fields = null)
{
$report = $this->reportObject;
if ($report) {
$fields = $report->getCMSFields();
} else {
// List all reports
$fields = new FieldList();
$gridFieldConfig = GridFieldConfig::create()->addComponents(
new GridFieldToolbarHeader(),
new GridFieldSortableHeader(),
new GridFieldDataColumns(),
new GridFieldFooter()
);
$gridField = new GridField('Reports', false, $this->Reports(), $gridFieldConfig);
2016-08-11 04:29:53 +02:00
/** @var GridFieldDataColumns $columns */
$columns = $gridField->getConfig()->getComponentByType('SilverStripe\\Forms\\GridField\\GridFieldDataColumns');
2015-12-15 23:06:45 +01:00
$columns->setDisplayFields(array(
'title' => _t('ReportAdmin.ReportTitle', 'Title'),
));
$columns->setFieldFormatting(array(
2016-07-11 08:01:50 +02:00
'title' => '<a href=\"$Link\" class=\"grid-field__link-block\">$value ($Count)</a>'
2015-12-15 23:06:45 +01:00
));
$gridField->addExtraClass('all-reports-gridfield');
$fields->push($gridField);
}
$actions = new FieldList();
$form = new Form($this, "EditForm", $fields, $actions);
$form->addExtraClass('cms-edit-form cms-panel-padded center ' . $this->BaseCSSClasses());
$form->loadDataFrom($this->request->getVars());
$this->extend('updateEditForm', $form);
return $form;
}
}