Cockpit integration

This commit is contained in:
Adrian Rauth 2024-11-07 21:34:32 +01:00
parent d3eccf99f0
commit a4b336b3fd
8 changed files with 153 additions and 41 deletions

2
.idea/phpunit.xml generated
View File

@ -9,8 +9,8 @@
<option value="$PROJECT_DIR$/classes/external/fakerphp/faker/tests" />
<option value="$PROJECT_DIR$/classes/external/guzzlehttp/promises/tests" />
<option value="$PROJECT_DIR$/classes/external/guzzlehttp/psr7/tests" />
<option value="$PROJECT_DIR$/classes/external/bramus/router/tests" />
<option value="$PROJECT_DIR$/classes/external/scssphp/server/tests" />
<option value="$PROJECT_DIR$/classes/external/bramus/router/tests" />
</list>
</option>
</component>

View File

@ -68,8 +68,9 @@ class CockpitApi
/**
* @throws GuzzleException
* @throws Exception
* @return Article[]
*/
public function getArticles(): Article|array
public function getArticles(): array
{
$res = $this->client->request('GET', $this->getApiPath('itemsByModel', ['model' => 'article']), [
'headers' => [
@ -130,7 +131,6 @@ class CockpitApi
$return = [];
foreach ($array['data'] as $data) {
$json = json_encode($data);
dump($json);
$return[] = SerializerBuilder::create()->build()->deserialize($json, $type, 'json');
}

View File

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace Application\Controller;
use Application\Content\CockpitApi;
@ -8,7 +10,6 @@ use GuzzleHttp\Exception\GuzzleException;
class ArticleController extends MainController
{
/**
* @throws Exception
* @throws GuzzleException
@ -17,15 +18,20 @@ class ArticleController extends MainController
{
$article = (new CockpitApi())->getArticle($this->getRouteParams('id'));
$this->getBreadcrumbs()->addBreadcrumb(
$article->getTitle(),
$article->getUrl()
);
$this->pushToStash('article', [
'subtitle' => $this->faker->sentence(2),
'subtitle' => 'TODO: Subtitle',
'title' => $article->getTitle(),
'lead' => $this->faker->paragraph(),
'lead' => $article->getExcerpt(),
'text' => $article->getText(),
'image' => [
'src' => 'https://picsum.photos/seed/' . $this->faker->randomDigit() . '/1920/1080',
'width' => 1920,
'height' => 1080,
'src' => $article->getImage()->getImageUrl(),
'width' => $article->getImage()->getWidth(),
'height' => $article->getImage()->getHeight(),
'alt' => 'lorem ipsum',
],
]);

View File

@ -1,27 +1,33 @@
<?php
declare(strict_types=1);
namespace Application\Controller;
use Application\Generator\Article;
use Application\Helper\NumberHash;
use Application\Content\CockpitApi;
use Exception;
use GuzzleHttp\Exception\GuzzleException;
class HomeController extends MainController
{
/**
* @throws Exception
* @throws GuzzleException
*/
protected function action(): void
{
$this->pushToStash('articles', $this->generateArticles());
$this->pushToStash('articles', $this->getArticles());
}
private function generateArticles(): array
/**
* @throws GuzzleException
*/
private function getArticles(): array
{
$return = [];
for ($i = 0; $i < 10; $i++) {
$return[] = (new Article(NumberHash::numHash("home_$i")))->getTeaserData();
foreach ((new CockpitApi())->getArticles() as $article) {
$return[] = $article->getTeaserData();
}
return $return;

View File

@ -10,8 +10,6 @@ use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
use Twig\Loader\FilesystemLoader;
use Faker\Factory;
use Faker\Generator;
abstract class MainController
{
@ -50,13 +48,6 @@ abstract class MainController
*/
private array $route_parameters = array();
/**
* Fake data generator.
*
* @var Generator
*/
protected Generator $faker;
/**
* Breadcrumbs.
*
@ -73,8 +64,6 @@ abstract class MainController
public function __invoke(array $parameters = array()): void
{
$this->route_parameters = $parameters;
$this->faker = Factory::create();
$this->faker->seed(1234567);
$this->preAction();
$this->action();
$this->postAction();
@ -150,7 +139,7 @@ abstract class MainController
$this->pushToStash(
'meta',
[
'title' => $this->faker->domainName(),
'title' => 'News Page | Your #1 News Source',
],
self::STASH_GLOBAL
);

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace Application\Models;
use Exception;
use JMS\Serializer\Annotation\SerializedName;
use JMS\Serializer\Annotation\Type;
@ -13,39 +14,95 @@ class Article
#[SerializedName('authors')]
#[Type('array<' . Author::class . '>')]
protected array $authors;
protected ?array $authors = null;
#[SerializedName('headline')]
#[Type('string')]
protected string $headline;
protected ?string $headline = null;
#[SerializedName('excerpt')]
#[Type('string')]
protected string $excerpt;
protected ?string $excerpt = null;
#[SerializedName('image')]
#[Type(Image::class)]
protected Image $image;
protected ?Image $image = null;
#[SerializedName('text')]
#[Type('string')]
protected string $text;
protected ?string $text = null;
/**
* Return the title / headline.
*
* @return string
* @return string|null
*/
public function getTitle(): string {
public function getTitle(): string|null
{
return $this->headline;
}
/**
* Return the text / article body text.
*
* @return string
* @return string|null
*/
public function getText(): string {
public function getText(): string|null
{
return $this->text;
}
/**
* Get the excerpt / teaser text.
*
* @return string|null
*/
public function getExcerpt(): string|null
{
return $this->excerpt;
}
public function getImage(): Image|null
{
return $this->image;
}
public function getTeaserData(): array
{
return [
'headline' => $this->getHeadline(),
'kicker' => $this->getKicker(),
'excerpt' => $this->getExcerpt(),
'teaserImage' => $this->getTeaserImage(),
'url' => $this->getUrl(),
];
}
private function getIdentifier(): string
{
return $this->metaId;
}
private function getHeadline(): ?string
{
return $this->headline;
}
private function getKicker(): ?string
{
return $this->excerpt;
}
/**
* @throws Exception
*/
private function getTeaserImage(): array
{
return $this->image->getTeaserData();
}
public function getUrl(): string
{
return '/article/test_article-' . $this->getIdentifier();
}
}

View File

@ -4,6 +4,8 @@ declare(strict_types=1);
namespace Application\Models;
use Application\AppEnvironment;
use Exception;
use JMS\Serializer\Annotation\SerializedName;
use JMS\Serializer\Annotation\Type;
@ -44,12 +46,12 @@ class Image
private array $colors;
#[SerializedName('width')]
#[Type('string')]
private string $width;
#[Type('int')]
private int $width;
#[SerializedName('height')]
#[Type('string')]
private string $height;
#[Type('int')]
private int $height;
#[SerializedName('altText')]
#[Type('string')]
@ -62,4 +64,56 @@ class Image
#[SerializedName('folder')]
#[Type('string')]
private string $folder;
/**
* Return the URL to the original asset.
*
* @return string
* @throws Exception
*/
public function getImageUrl(): string
{
$apiPath = AppEnvironment::getInstance()->getVariable('COCKPIT_API_PATH');
$url = parse_url($apiPath, PHP_URL_SCHEME) . '://';
$url .= parse_url($apiPath, PHP_URL_HOST) . '/storage/uploads';
$url .= $this->path;
return $url;
}
/**
* Return original image width in pixel.
*
* @return int
*/
public function getWidth(): int
{
return $this->width;
}
/**
* Return original image height in pixel.
*
* @return int
*/
public function getHeight(): int
{
return $this->height;
}
/**
* Get teaser data array ready to be used within the template.
*
* @return array
* @throws Exception
*/
public function getTeaserData(): array
{
return [
'src' => $this->getImageUrl(),
'width' => $this->getWidth(),
'height' => $this->getHeight(),
'alt' => $this->altText,
];
}
}

View File

@ -6,7 +6,7 @@
<div class="o-card__image" style="background-image: url('{{ image.src }}')"></div>
<div class="o-card__text">
<div class="o-card__headline">
<h3>{{ headline }}</h3>
<h3><a href="{{ url }}">{{ headline }}</a></h3>
</div>
<div class="o-card__teaser">
{{ text }}