<?php
|
|
|
|
namespace App\Menus;
|
|
|
|
use PhpSchool\CliMenu\MenuItem\StaticItem;
|
|
use Respect\Validation\Exceptions\NestedValidationException;
|
|
|
|
/**
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
class ItemValidator
|
|
{
|
|
// items from menu
|
|
private $items;
|
|
|
|
// current message
|
|
private $message;
|
|
|
|
// validator
|
|
private $validator;
|
|
|
|
/**
|
|
*
|
|
*
|
|
*/
|
|
public function __construct($validator)
|
|
{
|
|
$this->validator = $validator;
|
|
$this->message = new StaticItem(''); // must create to compare in items
|
|
}
|
|
|
|
/**
|
|
* remove all items from menu and save them
|
|
*
|
|
* @param [type] $menu
|
|
*
|
|
*/
|
|
private function clear(&$menu)
|
|
{
|
|
$this->items = $menu->getItems();
|
|
|
|
foreach($menu->getItems() as $item) {
|
|
$menu->removeItem($item);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* add staticItem after item
|
|
*
|
|
* @param [type] $menu
|
|
* @param [type] $after
|
|
* @param [type] $target
|
|
*
|
|
*/
|
|
private function addAfter(&$menu, $after, $target)
|
|
{
|
|
$this->clear($menu);
|
|
|
|
foreach($this->items as $item) {
|
|
$menu->addItem($item);
|
|
|
|
if ($after === $item) {
|
|
$menu->addItem($target, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* remove staticItem
|
|
*
|
|
*
|
|
* @param [type] $menu [description]
|
|
* @param [type] $target [description]
|
|
*
|
|
*/
|
|
private function remove(&$menu, $target)
|
|
{
|
|
$this->clear($menu);
|
|
|
|
foreach($this->items as $item) {
|
|
if ($item === $target) {
|
|
continue;
|
|
}
|
|
|
|
$menu->addItem($item);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* validate,
|
|
* if failed show staticItem with errors,
|
|
* if not remove staticItem if found
|
|
*
|
|
* @param [type] $menu
|
|
* @param [type] $item
|
|
* @param [type] $data
|
|
*
|
|
*/
|
|
public function validate(&$menu, $item, $data)
|
|
{
|
|
try {
|
|
$this->validator->assert($data);
|
|
} catch(NestedValidationException $exception) {
|
|
$errors = $exception->getMessages();
|
|
}
|
|
|
|
if (isset($errors)) {
|
|
|
|
// @TODO use ColorUtil
|
|
$this->message->setText("\033[33m"."\xE2\x9A\xA0 ".join(' ', $errors));
|
|
$this->addAfter($menu, $item, $this->message);
|
|
} else {
|
|
$this->remove($menu, $this->message);
|
|
}
|
|
}
|
|
}
|