createWidget()` is all one has to do in * order to create a new widget. * * @api since Piwik 3.0.0 */ class ReportWidgetFactory { /** * @var Report */ private $report = null; /** * Generates a new report widget factory. * @param Report $report A report instance, widgets will be created based on the data provided by this report. */ public function __construct(Report $report) { $this->report = $report; } /** * Creates a widget based on the specified report in {@link construct()}. * * It will automatically use the report's name, categoryId, subcategoryId (if specified), * defaultViewDataTable, module, action, order and parameters in order to create the widget. * * @return ReportWidgetConfig */ public function createWidget() { $widget = new ReportWidgetConfig(); $widget->setName($this->report->getName()); $widget->setCategoryId($this->report->getCategoryId()); if ($this->report->getDefaultTypeViewDataTable()) { $widget->setDefaultViewDataTable($this->report->getDefaultTypeViewDataTable()); } if ($this->report->getSubcategoryId()) { $widget->setSubcategoryId($this->report->getSubcategoryId()); } $widget->setModule($this->report->getModule()); $widget->setAction($this->report->getAction()); $orderThatListsReportsAtTheEndOfEachCategory = 100 + $this->report->getOrder(); $widget->setOrder($orderThatListsReportsAtTheEndOfEachCategory); $parameters = $this->report->getParameters(); if (!empty($parameters)) { $widget->setParameters($parameters); } return $widget; } /** * Creates a new container widget based on the specified report in {@link construct()}. * * It will automatically use the report's categoryId, subcategoryId (if specified) and order in order to * create the container. * * @param string $containerId eg 'Products' or 'Contents' see {Piwik\Widget\WidgetContainerConfig::setId()}. * Other reports or widgets will be able to add more widgets to this container. * This is useful when you want to show for example multiple related widgets * together. * @return WidgetContainerConfig */ public function createContainerWidget($containerId) { $widget = new WidgetContainerConfig(); $widget->setCategoryId($this->report->getCategoryId()); $widget->setId($containerId); if ($this->report->getSubcategoryId()) { $widget->setSubcategoryId($this->report->getSubcategoryId()); } $orderThatListsReportsAtTheEndOfEachCategory = 100 + $this->report->getOrder(); $widget->setOrder($orderThatListsReportsAtTheEndOfEachCategory); return $widget; } /** * Creates a custom widget that doesn't use a viewDataTable to render the report but instead a custom * controller action. Make sure the specified `$action` exists in the plugin's controller. Otherwise * behaves as {@link createWidget()}. * * @param string $action eg 'conversionReports' (requires a method `public function conversionReports()` in * the plugin's controller). * @return ReportWidgetConfig */ public function createCustomWidget($action) { $widget = $this->createWidget(); $widget->setDefaultViewDataTable(null); $widget->setAction($action); return $widget; } }