. */ namespace SP\Mvc\View\Components; use RuntimeException; use SP\Core\Exceptions\SPException; use SP\Domain\Common\Out\DataModelInterface; use SP\Http\Json; /** * Class SelectItemAdapter * * @package SP\Mvc\View\Components */ final class SelectItemAdapter implements ItemAdapterInterface { protected array $items; public function __construct(array $items) { $this->items = $items; } public static function factory(array $items): SelectItemAdapter { return new SelectItemAdapter($items); } /** * Returns an array of ids from the given array of objects */ public static function getIdFromArrayOfObjects(array $items): array { $ids = []; foreach ($items as $item) { if (is_object($item) && null !== $item->id) { $ids[] = $item->id; } } return $ids; } /** * Returns a JSON like collection of items for a select component * * @throws SPException */ public function getJsonItemsFromModel(): string { $out = []; foreach ($this->items as $item) { if (!$item instanceof DataModelInterface) { throw new RuntimeException(__u('Wrong object type')); } $out[] = ['id' => $item->getId(), 'name' => $item->getName()]; } return Json::getJson($out); } /** * Returns a collection of items for a select component * * @throws SPException */ public function getJsonItemsFromArray(): string { $out = []; foreach ($this->items as $key => $value) { $out[] = ['id' => $key, 'name' => $value]; } return Json::getJson($out); } /** * Returns a collection of items for a select component and set selected ones from an array * * @param array $selected * @param string|int|null $skip * * @return SelectItem[] */ public function getItemsFromModelSelected( array $selected, $skip = null ): array { $items = $this->getItemsFromModel(); foreach ($items as $item) { if ($skip !== null && $item->getId() === $skip) { $item->setSkip(true); } if (in_array($item->getId(), $selected, false)) { $item->setSelected(true); } } return $items; } /** * Returns a collection of items for a select component * * @return SelectItem[] */ public function getItemsFromModel(): array { $out = []; foreach ($this->items as $item) { if (!$item instanceof DataModelInterface) { throw new RuntimeException(__u('Wrong object type')); } $out[] = new SelectItem( $item->getId(), $item->getName(), $item ); } return $out; } /** * Returns a collection of items for a select component and set selected ones from an array * * @return SelectItem[] */ public function getItemsFromArraySelected( array $selected, bool $useValueAsKey = false ): array { $items = $this->getItemsFromArray(); foreach ($items as $item) { $value = $useValueAsKey ? $item->getName() : $item->getId(); if (in_array($value, $selected, false)) { $item->setSelected(true); } } return $items; } /** * Returns a collection of items for a select component * * @return SelectItem[] */ public function getItemsFromArray(): array { $out = []; foreach ($this->items as $key => $value) { $out[] = new SelectItem($key, $value); } return $out; } }