✨ Cockpit integration
This commit is contained in:
parent
d3eccf99f0
commit
a4b336b3fd
2
.idea/phpunit.xml
generated
2
.idea/phpunit.xml
generated
@ -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>
|
||||
|
@ -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');
|
||||
}
|
||||
|
||||
|
@ -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',
|
||||
],
|
||||
]);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
);
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -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 }}
|
||||
|
Loading…
x
Reference in New Issue
Block a user