cube = $cube;
return $this;
}
public function createElements(array $formData)
{
$cube = $this->cube;
$dimensions = $cube->listDimensions();
$cnt = count($dimensions);
if ($cnt < 3) {
$allDimensions = $cube->listAdditionalDimensions();
$this->addElement('select', 'addDimension', [
'multiOptions' => [null => $this->translate('+ Add a dimension')] + $allDimensions,
'decorators' => ['ViewHelper'],
'class' => 'autosubmit'
]);
}
$pos = 0;
foreach ($dimensions as $dimension) {
$this->addDimensionButtons($dimension, $pos++, $cnt);
}
foreach ($cube->getSlices() as $key => $value) {
$this->addSlice($this->cube->getDimension($key), $value);
}
$this->addAttribs(['class' => 'icinga-controls']);
}
protected function addSlice(Dimension $dimension, $value)
{
$view = $this->getView();
$sliceId = sha1($dimension->getName());
$this->addElement('button', 'removeSlice_' . $sliceId, [
'label' => $view->icon('cancel'),
'decorators' => ['ViewHelper'],
'value' => $dimension->getName(),
'type' => 'submit',
'escape' => false,
'class' => 'dimension-control'
]);
$label = $view->escape(
sprintf(
'%s: %s = %s',
$view->translate('Slice/Filter'),
$dimension->getLabel(),
$value
)
);
$this->addElement('note', 'slice_' . $sliceId, [
'class' => 'dimension-name',
'value' => '' . $label . '',
'decorators' => ['ViewHelper']
]);
$this->addDisplayGroup(
[
'removeSlice_' . $sliceId,
'slice_' . $sliceId,
],
$dimension->getName(),
[
'class' => 'dimensions',
'decorators' => [
'FormElements',
'Fieldset'
]
]
);
}
protected function addDimensionButtons(Dimension $dimension, $pos, $total)
{
$view = $this->getView();
$dimensionId = sha1($dimension->getName());
$this->addElement('note', 'dimension_' . $dimensionId, [
'class' => 'dimension-name',
'value' => '' . $view->escape($dimension->getLabel()) . '',
'decorators' => ['ViewHelper']
]);
$this->addElement('button', 'removeDimension_' . $dimensionId, [
'label' => $view->icon('cancel'),
'decorators' => ['ViewHelper'],
'title' => sprintf($this->translate('Remove dimension "%s"'), $dimension->getLabel()),
'value' => $dimension->getName(),
'type' => 'submit',
'escape' => false,
'class' => 'dimension-control'
]);
if ($pos > 0) {
$this->addElement('button', 'moveDimensionUp_' . $dimensionId, [
'label' => $view->icon('angle-double-up'),
'decorators' => ['ViewHelper'],
'title' => sprintf($this->translate('Move dimension "%s" up'), $dimension->getLabel()),
'value' => $dimension->getName(),
'type' => 'submit',
'escape' => false,
'class' => 'dimension-control'
]);
}
if ($pos + 1 !== $total) {
$this->addElement('button', 'moveDimensionDown_' . $dimensionId, [
'label' => $view->icon('angle-double-down'),
'decorators' => ['ViewHelper'],
'title' => sprintf($this->translate('Move dimension "%s" down'), $dimension->getLabel()),
'value' => $dimension->getName(),
'type' => 'submit',
'escape' => false,
'class' => 'dimension-control'
]);
}
$this->addDisplayGroup(
[
'removeDimension_' . $dimensionId,
'moveDimensionUp_' . $dimensionId,
'moveDimensionDown_' . $dimensionId,
'dimension_' . $dimensionId,
],
$dimensionId,
[
'class' => 'dimensions',
'decorators' => [
'FormElements',
'Fieldset'
]
]
);
}
public function onSuccess()
{
$url = $this->getRequest()->getUrl();
if ($dimension = $this->getValue('addDimension')) {
$url->setParam('dimensions', DimensionParams::fromUrl($url)->add($dimension)->getParams());
Notification::success($this->translate('New dimension has been added'));
} else {
$updateDimensions = false;
foreach ($this->cube->listDimensions() as $name => $_) {
$dimensionId = sha1($name);
switch (true) {
case ($el = $this->getElement('removeDimension_' . $dimensionId)) && $el->isChecked():
$this->cube->removeDimension($name);
$updateDimensions = true;
break 2;
case ($el = $this->getElement('moveDimensionUp_' . $dimensionId)) && $el->isChecked():
$this->cube->moveDimensionUp($name);
$updateDimensions = true;
break 2;
case ($el = $this->getElement('moveDimensionDown_' . $dimensionId)) && $el->isChecked():
$this->cube->moveDimensionDown($name);
$updateDimensions = true;
break 2;
}
}
if ($updateDimensions) {
$dimensions = array_merge(array_keys($this->cube->listDimensions()), $this->cube->listSlices());
$url->setParam('dimensions', DimensionParams::update($dimensions)->getParams());
} else {
foreach ($this->cube->listSlices() as $slice) {
$sliceId = sha1($slice);
if (($el = $this->getElement('removeSlice_' . $sliceId)) && $el->isChecked()) {
$url->getParams()->remove(rawurlencode($slice));
}
}
}
}
$this->setRedirectUrl($url);
}
}