%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/widgets/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/widgets/BaseStack.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2018 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/
namespace humhub\widgets;
use humhub\components\Widget;
use Yii;
/**
* StackWidget is a widget which can hold a set of subwidgets.
*
* This is mainly used to build e.g. sidebars.
* It allows adding or removing other widgets by events.
*
* @package humhub.widgets
* @since 0.5
* @author Luke
*/
class BaseStack extends Widget
{
const EVENT_INIT = 'init';
const EVENT_RUN = 'run';
/**
* Default value for the sort order if no sort order value is specified in the widget.
*/
const DEFAULT_SORT_ORDER = 9000;
/**
* Holds all added widgets
*
* Array
* [0] Classname
* [1] Params Arrays
* [2] Additional Options e.g. sortOrder (0-10000)
*
* @var array
*/
public $widgets = [];
/**
* Seperator HTML Code (glue)
*
* @var string
*/
public $seperator = '';
/**
* Template for output
* The placeholder {content} will used to add content.
*
* @var string
*/
public $template = '{content}';
/**
* Initializes the sidebar widget.
*/
public function init()
{
// Yii 2.0.11 introduced own init event
if (version_compare(Yii::getVersion(), '2.0.11', '<')) {
$this->trigger(self::EVENT_INIT);
}
parent::init();
}
/**
* Runs the Navigation
*/
public function run()
{
$this->trigger(self::EVENT_RUN);
$content = '';
$hasContent = false;
foreach ($this->getWidgets() as $widget) {
$widgetClass = $widget[0];
$out = $widgetClass::widget($widget[1]);
if (!empty($out)) {
if ($hasContent) {
$content .= $this->seperator;
}
$hasContent = true;
$content .= $out;
}
}
return str_replace('{content}', $content, $this->template);
}
/**
* Removes a widget from the stack
*
* @param string $className
*/
public function removeWidget($className)
{
foreach ($this->widgets as $k => $widget) {
if ($widget[0] === $className) {
unset($this->widgets[$k]);
}
}
}
/**
* Returns all widgets by sortorder
*
* @return array
*/
protected function getWidgets()
{
usort($this->widgets, function ($a, $b) {
$sortA = (isset($a[2]['sortOrder'])) ? $a[2]['sortOrder'] : static::DEFAULT_SORT_ORDER;
$sortB = (isset($b[2]['sortOrder'])) ? $b[2]['sortOrder'] : static::DEFAULT_SORT_ORDER;
if ($sortA == $sortB) {
return 0;
} elseif ($sortA < $sortB) {
return -1;
} else {
return 1;
}
});
return $this->widgets;
}
/**
* Adds a new widget
*
* @param string $className
* @param array $params widget definition
* @param array $options extra option array with e.g. "sortOrder"
*/
public function addWidget($className, $params = [], $options = [])
{
if (!isset($options['sortOrder'])) {
$options['sortOrder'] = static::DEFAULT_SORT_ORDER;
}
$this->widgets[] = [
$className,
$params,
$options
];
}
}