Орла
Области
Компаний
Пользователи
Галерея
Фиксированные новости
Орла
Отзывы о фирмах
Тарифы
Пользователи
Области
Банкоматы
Торговые точки
Доска объявлений
Курсы валют
Скидки
организации Орла
организации области
товары
сайты
сайты Орел
Данные
Разделы
Поиск
Поиск запросы
Статистика
Показы каталога организаций
Статистика клиенты
Пользователи
Сайты
Управление сайтом
Анкета
Аптеки
Афиша
Афиша новая
Баннеры
Бизнес >
Викторина
Голосование
Гость на сайте
Истории
Календарь событий
Каталоги >
Конкурс красоты
Конкурс аудио
Консультации
Меню
Новое на сайте
Новости >
Организации >
Программа ТВ
Публикации
Разделы сайта
Рассылка
Рестораны
Секрет фирмы >
Сервисы >
Ссылки
Тесты
Файловый менеджер
Форум
Фотогалерея
Обратная связь
Недвижимость
Новый год
Тексты
Пользователи
Юридический рейтинг
Отзывы на товары
Бан пользователей
Жалобы
Новые тесты
Коронавирус
Файловый менеджер
Имя файла
ListBlock.php
Содержимое
<?php namespace Visitka\Blocks\Dto\Contracts; use app\core\models\QueryBuilder; use Visitka\Blocks\Dto\BaseBlock; use Visitka\Blocks\Items\Contracts\BaseListItem; abstract class ListBlock extends BaseBlock { private $items = []; /** * Функция должна вернуть название класса элемента списка * @return string */ abstract protected function getListItemClassName(); /** * Функция загружает данные из массива, к примеру из $_POST запроса. * @param array $block * @throws \Exception */ public function loadContentFromArray(array $block) { $items = isset($block['items']) && is_array($block['items']) ? $block['items'] : []; $listItemClassName = $this->getListItemClassName(); foreach ($items as $item) { /** @var BaseListItem $listItemClassName */ $this->addItem($listItemClassName::getInstance($item)); } } /** * В этом методе сохраняется каждый элемент блока и удаляются блоки, которых уже нет * @return bool|void */ public function save() { $this->validateOrFail(); parent::save(); // удалим пункты, которые уже не найдены $deletedItems = array_diff($this->findOldItemIds(), $this->getItemIds()); foreach ($deletedItems as $listItemId) { $this->deleteListItem($listItemId); } // сохраним каждый элемент foreach ($this->getItems() as $item) { $this->saveListItem($item); } } public function validateOrFail() { parent::validateOrFail(); // провалидируем каждый элемент списка foreach ($this->getItems() as $item) { $item->validateOrFail(); } } /** * Функция возвращает массив с элементами блока * @return array */ public function getItems() { return $this->items; } public function addItem(BaseListItem $item) { // проверим, что этот элемент блока принадлежит этому блоку if ($item->id > 0 && $this->isOwnerListItem($item->id) == false) { throw new \DomainException("Для одного из элементов доступ запрещен"); } $this->items[] = $item; return $this; } public function addItems(array $items) { foreach ($items as $item) { if ($item instanceof BaseListItem == false) { throw new \DomainException("Не удалось добавить один из элементов, так как класс не подходит"); } $this->addItem($item); } return $this; } public function loadContent() { $this->addItems($this->findAllListItems()); } /** * Фунция проверяет, является ли владельцем текущий класс для элемента списка $id * @param int $id * @return bool */ public function isOwnerListItem($id) { // сначала проверим в загруженных данных return \App::$command ->createCommand(" SELECT COUNT(*) as total FROM `". $this->getListItemTableName() ."` WHERE id = :id AND visitka_block_id = :visitka_block_id ") ->bindValue(':id', $id) ->bindValue(':visitka_block_id', $this->getVisitkaBlockId()) ->queryOne('total') > 0; } public function toArray() { $array = parent::toArray(); $array['items'] = []; foreach ($this->getItems() as $item) { $array['items'][] = $item->toArray(); } return $array; } private function deleteListItem($id) { $listItemClassName = $this->getListItemClassName(); return QueryBuilder::deleteById($listItemClassName::table(), $id); } private function saveListItem(BaseListItem $item) { $values = [ 'visitka_block_id' => $this->getVisitkaBlockId() ]; $mappedData = $item->mapping(); foreach ($mappedData as $keyFromClass => $keyFromDb) { $values[$keyFromDb] = $item->{$keyFromClass}; } if ($item->id > 0) { return QueryBuilder::updateById($item::table(), $item->id, $values); } $id = QueryBuilder::insert($item::table(), $values); $item->id = $id; return $id > 0; } private function findAllListItems() { $listItemClassName = $this->getListItemClassName(); $items = (new QueryBuilder()) ->from($this->getListItemTableName()) ->where([ 'visitka_block_id' => $this->getVisitkaBlockId() ]) ->all(); $result = []; foreach ($items as $item) { $result[] = $listItemClassName::getInstance($item); } return $result; } /** * Функция возвращает массив идентификаторов элементов, которые уже забиты * @return array */ private function findOldItemIds() { $items = \App::$command ->createCommand(' SELECT id FROM `'. $this->getListItemTableName().'` WHERE visitka_block_id = :visitka_block_id ') ->bindValue(':visitka_block_id', $this->getVisitkaBlockId()) ->queryAll(); $result = []; foreach ($items as $item) { $result[] = $item['id']; } return $result; } private function getListItemTableName() { $listItemClassName = $this->getListItemClassName(); return $listItemClassName::table(); } /** * Функция возвращает текущие идентификаторы элементов * @return mixed * @return int[] */ private function getItemIds() { $result = []; foreach ($this->items as $item) { $result[] = $item->id; } return $result; } }
/visitka/src/Blocks/Dto/Contracts/
Имя
Дата
Размер
..
2020-03-10
ListBlock.php
2020-03-10
7 кб.
/visitka/src/Blocks/Dto/Contracts
Загрузить файлы
Файл 1
Файл 2
Файл 3