local/modules/HookAdminHome/Hook/AdminHook.php line 65
<?php
/*
* This file is part of the Thelia package.
* http://www.thelia.net
*
* (c) OpenStudio <info@thelia.net>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace HookAdminHome\Hook;
use HookAdminHome\HookAdminHome;
use Symfony\Component\Cache\Adapter\AdapterInterface;
use Thelia\Core\Event\Hook\HookRenderBlockEvent;
use Thelia\Core\Event\Hook\HookRenderEvent;
use Thelia\Core\Hook\BaseHook;
/**
* Class AdminHook.
*
* @author Gilles Bourgeat <gilles@thelia.net>
*/
class AdminHook extends BaseHook
{
protected $theliaCache = null;
public function __construct(AdapterInterface $theliaCache = null)
{
$this->theliaCache = $theliaCache;
}
public function blockStatistics(HookRenderEvent $event): void
{
if (1 == HookAdminHome::getConfigValue(HookAdminHome::ACTIVATE_STATS, 1)) {
$event->add($this->render('block-statistics.html'));
}
$event->add($this->render('hook-admin-home-config.html'));
}
public function blockStatisticsJs(HookRenderEvent $event): void
{
if (1 == HookAdminHome::getConfigValue(HookAdminHome::ACTIVATE_STATS, 1)) {
$event->add($this->render('block-statistics-js.html'));
}
}
public function blockSalesStatistics(HookRenderBlockEvent $event): void
{
if (1 == HookAdminHome::getConfigValue(HookAdminHome::ACTIVATE_SALES, 1)) {
$content = trim($this->render('block-sales-statistics.html'));
if (!empty($content)) {
$event->add([
'id' => 'block-sales-statistics',
'title' => $this->trans('Sales statistics', [], HookAdminHome::DOMAIN_NAME),
'content' => $content,
]);
}
}
}
public function blockNews(HookRenderBlockEvent $event): void
{
if (1 == HookAdminHome::getConfigValue(HookAdminHome::ACTIVATE_NEWS, 1)) {
$content = trim($this->render('block-news.html'));
if (!empty($content)) {
$event->add([
'id' => 'block-news',
'title' => $this->trans('Thelia Github activity', [], HookAdminHome::DOMAIN_NAME),
'content' => $content,
]);
}
}
}
public function blockTheliaInformation(HookRenderBlockEvent $event): void
{
$releases = $this->getGithubReleases();
if (1 == HookAdminHome::getConfigValue(HookAdminHome::ACTIVATE_INFO, 1)) {
$content = trim(
$this->render(
'block-thelia-information.html',
[
'latestStableRelease' => $releases['latestStableRelease'],
'latestPreRelease' => $releases['latestPreRelease'],
]
)
);
if (!empty($content)) {
$event->add([
'id' => 'block-thelia-information',
'title' => $this->trans('Thelia news', [], HookAdminHome::DOMAIN_NAME),
'content' => $content,
]);
}
}
}
private function getGithubReleases(): array
{
$cachedReleases = $this->theliaCache->getItem('thelia_github_releases');
if (!$cachedReleases->isHit()) {
try {
$resource = curl_init();
curl_setopt($resource, \CURLOPT_URL, 'https://api.github.com/repos/thelia/thelia/releases');
curl_setopt($resource, \CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, \CURLOPT_HTTPHEADER, ['accept: application/vnd.github.v3+json']);
curl_setopt($resource, \CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
$results = curl_exec($resource);
curl_close($resource);
$theliaReleases = json_decode($results, true);
$publishedAtSort = function ($a, $b) {return (new \DateTime($a['published_at'])) < (new \DateTime($b['published_at'])); };
$stableReleases = array_filter($theliaReleases, function ($theliaRelease) { return !$theliaRelease['prerelease']; });
usort($stableReleases, $publishedAtSort);
$latestStableRelease = $stableReleases[0] ?? null;
$preReleases = array_filter($theliaReleases, function ($theliaRelease) { return $theliaRelease['prerelease']; });
usort($preReleases, $publishedAtSort);
$latestPreRelease = $preReleases[0] ?? null;
// Don't display pre-release if they are < than stable release
if (version_compare($latestPreRelease['tag_name'], $latestStableRelease['tag_name'], '<')) {
$latestPreRelease = null;
}
} catch (\Exception $exception) {
$latestPreRelease = null;
$latestStableRelease = null;
}
$cachedReleases->expiresAfter(3600);
$cachedReleases->set(
[
'latestStableRelease' => $latestStableRelease,
'latestPreRelease' => $latestPreRelease,
]
);
$this->theliaCache->save($cachedReleases);
}
return $cachedReleases->get();
}
}