'icinga-form icinga-controls']; /** @var (Traversable&Countable)|array */ protected $objects; /** @var bool */ protected $isApiTarget = false; /** * Whether an error occurred while sending the command * * Prevents the success message from being rendered simultaneously * * @var bool */ protected $errorOccurred = false; /** * Set the objects to issue the command for * * @param (Traversable&Countable)|array $objects A traversable that is also countable * * @return $this */ public function setObjects($objects): self { $this->objects = $objects; return $this; } /** * Get the objects to issue the command for * * @return (Traversable&Countable)|array */ public function getObjects() { return $this->objects; } /** * Set whether this form is an API target * * @param bool $state * * @return $this */ public function setIsApiTarget(bool $state = true): self { $this->isApiTarget = $state; return $this; } /** * Get whether this form is an API target * * @return bool */ public function isApiTarget(): bool { return $this->isApiTarget; } /** * Create and add form elements representing the command's options * * @return void */ abstract protected function assembleElements(); /** * Create and add a submit button to the form * * @return void */ abstract protected function assembleSubmitButton(); /** * Get the commands to issue for the given objects * * @param Iterator $objects * * @return Traversable */ abstract protected function getCommands(Iterator $objects): Traversable; protected function assemble() { $this->assembleElements(); if (! $this->isApiTarget()) { $this->assembleSubmitButton(); $this->addElement($this->createCsrfCounterMeasure(Session::getSession()->getId())); } } protected function onSuccess() { $objects = $this->getObjects(); if (is_array($objects)) { $objects = new ArrayIterator($objects); } else { $objects = new IteratorIterator($objects); } $errors = []; foreach ($this->getCommands($objects) as $command) { try { $this->sendCommand($command); } catch (Exception $e) { Logger::error($e->getMessage()); $errors[] = $e->getMessage(); } } if (! empty($errors)) { if (count($errors) > 1) { Notification::warning( t('Some commands were not transmitted. Please check the log. The first error follows.') ); } $this->errorOccurred = true; Notification::error($errors[0]); } } /** * Transmit the given command * * @param IcingaCommand $command * * @return void */ protected function sendCommand(IcingaCommand $command) { (new CommandTransport())->send($command); } }