Initial Upload
This commit is contained in:
167
lib/Listener/MenuBoardProviderListener.php
Normal file
167
lib/Listener/MenuBoardProviderListener.php
Normal file
@@ -0,0 +1,167 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (C) 2023 Xibo Signage Ltd
|
||||
*
|
||||
* Xibo - Digital Signage - https://xibosignage.com
|
||||
*
|
||||
* This file is part of Xibo.
|
||||
*
|
||||
* Xibo is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* any later version.
|
||||
*
|
||||
* Xibo is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with Xibo. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace Xibo\Listener;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
||||
use Xibo\Event\MenuBoardCategoryRequest;
|
||||
use Xibo\Event\MenuBoardModifiedDtRequest;
|
||||
use Xibo\Event\MenuBoardProductRequest;
|
||||
use Xibo\Factory\MenuBoardCategoryFactory;
|
||||
use Xibo\Factory\MenuBoardFactory;
|
||||
use Xibo\Support\Exception\NotFoundException;
|
||||
|
||||
/**
|
||||
* Listener for dealing with a menu board provider
|
||||
*/
|
||||
class MenuBoardProviderListener
|
||||
{
|
||||
use ListenerLoggerTrait;
|
||||
|
||||
private MenuBoardFactory $menuBoardFactory;
|
||||
|
||||
private MenuBoardCategoryFactory $menuBoardCategoryFactory;
|
||||
|
||||
public function __construct(MenuBoardFactory $menuBoardFactory, MenuBoardCategoryFactory $menuBoardCategoryFactory)
|
||||
{
|
||||
$this->menuBoardFactory = $menuBoardFactory;
|
||||
$this->menuBoardCategoryFactory = $menuBoardCategoryFactory;
|
||||
}
|
||||
|
||||
public function registerWithDispatcher(EventDispatcherInterface $dispatcher): MenuBoardProviderListener
|
||||
{
|
||||
$dispatcher->addListener(MenuBoardProductRequest::$NAME, [$this, 'onProductRequest']);
|
||||
$dispatcher->addListener(MenuBoardCategoryRequest::$NAME, [$this, 'onCategoryRequest']);
|
||||
$dispatcher->addListener(MenuBoardModifiedDtRequest::$NAME, [$this, 'onModifiedDtRequest']);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function onProductRequest(MenuBoardProductRequest $event): void
|
||||
{
|
||||
$this->getLogger()->debug('onProductRequest: data source is ' . $event->getDataProvider()->getDataSource());
|
||||
|
||||
$dataProvider = $event->getDataProvider();
|
||||
$menuId = $dataProvider->getProperty('menuId', 0);
|
||||
if (empty($menuId)) {
|
||||
$this->getLogger()->debug('onProductRequest: no menuId.');
|
||||
return;
|
||||
}
|
||||
|
||||
// Sorting
|
||||
$desc = $dataProvider->getProperty('sortDescending') == 1 ? ' DESC' : '';
|
||||
$sort = match ($dataProvider->getProperty('sortField')) {
|
||||
'name' => '`name`' . $desc,
|
||||
'price' => '`price`' . $desc,
|
||||
'id' => '`menuProductId`' . $desc,
|
||||
default => '`displayOrder`' . $desc,
|
||||
};
|
||||
|
||||
// Build a filter
|
||||
$filter = [
|
||||
'menuId' => $menuId,
|
||||
];
|
||||
|
||||
$categoryId = $dataProvider->getProperty('categoryId');
|
||||
$this->getLogger()->debug('onProductRequest: $categoryId: ' . $categoryId);
|
||||
if ($categoryId !== null && $categoryId !== '') {
|
||||
$filter['menuCategoryId'] = intval($categoryId);
|
||||
}
|
||||
|
||||
// Show Unavailable?
|
||||
if ($dataProvider->getProperty('showUnavailable', 0) === 0) {
|
||||
$filter['availability'] = 1;
|
||||
}
|
||||
|
||||
// limits?
|
||||
$lowerLimit = $dataProvider->getProperty('lowerLimit', 0);
|
||||
$upperLimit = $dataProvider->getProperty('upperLimit', 0);
|
||||
if ($lowerLimit !== 0 || $upperLimit !== 0) {
|
||||
// Start should be the lower limit
|
||||
// Size should be the distance between upper and lower
|
||||
$filter['start'] = $lowerLimit;
|
||||
$filter['length'] = $upperLimit - $lowerLimit;
|
||||
|
||||
$this->getLogger()->debug('onProductRequest: applied limits, start: '
|
||||
. $filter['start'] . ', length: ' . $filter['length']);
|
||||
}
|
||||
|
||||
$products = $this->menuBoardCategoryFactory->getProductData([$sort], $filter);
|
||||
|
||||
foreach ($products as $menuBoardProduct) {
|
||||
$menuBoardProduct->productOptions = $menuBoardProduct->getOptions();
|
||||
$product = $menuBoardProduct->toProduct();
|
||||
|
||||
// Convert the image to a library image?
|
||||
if ($product->image !== null) {
|
||||
// The content is the ID of the image
|
||||
try {
|
||||
$product->image = $dataProvider->addLibraryFile(intval($product->image));
|
||||
} catch (NotFoundException $notFoundException) {
|
||||
$this->getLogger()->error('onProductRequest: Invalid library media reference: ' . $product->image);
|
||||
$product->image = null;
|
||||
}
|
||||
}
|
||||
$dataProvider->addItem($product);
|
||||
}
|
||||
|
||||
$dataProvider->setIsHandled();
|
||||
}
|
||||
|
||||
public function onCategoryRequest(MenuBoardCategoryRequest $event): void
|
||||
{
|
||||
$this->getLogger()->debug('onCategoryRequest: data source is ' . $event->getDataProvider()->getDataSource());
|
||||
|
||||
$dataProvider = $event->getDataProvider();
|
||||
$menuId = $dataProvider->getProperty('menuId', 0);
|
||||
if (empty($menuId)) {
|
||||
$this->getLogger()->debug('onCategoryRequest: no menuId.');
|
||||
return;
|
||||
}
|
||||
$categoryId = $dataProvider->getProperty('categoryId', 0);
|
||||
if (empty($categoryId)) {
|
||||
$this->getLogger()->debug('onCategoryRequest: no categoryId.');
|
||||
return;
|
||||
}
|
||||
|
||||
$category = $this->menuBoardCategoryFactory->getById($categoryId)->toProductCategory();
|
||||
// Convert the image to a library image?
|
||||
if ($category->image !== null) {
|
||||
// The content is the ID of the image
|
||||
try {
|
||||
$category->image = $dataProvider->addLibraryFile(intval($category->image));
|
||||
} catch (NotFoundException $notFoundException) {
|
||||
$this->getLogger()->error('onCategoryRequest: Invalid library media reference: ' . $category->image);
|
||||
$category->image = null;
|
||||
}
|
||||
}
|
||||
$dataProvider->addItem($category);
|
||||
|
||||
$dataProvider->setIsHandled();
|
||||
}
|
||||
|
||||
public function onModifiedDtRequest(MenuBoardModifiedDtRequest $event): void
|
||||
{
|
||||
$menu = $this->menuBoardFactory->getById($event->getDataSetId());
|
||||
$event->setModifiedDt(Carbon::createFromTimestamp($menu->modifiedDt));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user