adding #15
	
		
	
				
					
				
			
							parent
							
								
									d69bbc2357
								
							
						
					
					
						commit
						a404ed0789
					
				@ -1,4 +1,5 @@
 | 
				
			||||
APP_DEBUG=false
 | 
				
			||||
APP_LOCALE=en
 | 
				
			||||
 | 
				
			||||
DIRECTUS_API_URL=
 | 
				
			||||
DIRECTUS_API_TOKEN=
 | 
				
			||||
@ -0,0 +1,53 @@
 | 
				
			||||
<?php
 | 
				
			||||
 | 
				
			||||
namespace App\Controllers;
 | 
				
			||||
 | 
				
			||||
use App\Controllers\DirectusControllerAbstract;
 | 
				
			||||
use App\Repositories\SiteRepository;
 | 
				
			||||
use App\Repositories\PostRepository;
 | 
				
			||||
 | 
				
			||||
/**
 | 
				
			||||
 *  controller for render feed of posts
 | 
				
			||||
 *
 | 
				
			||||
 *
 | 
				
			||||
 *  @author Björn Hase, Tentakelfabrik
 | 
				
			||||
 *  @license http://opensource.org/licenses/MIT The MIT License
 | 
				
			||||
 *  @link https://gitea.tentakelfabrik.de/Tentakelfabrik/super-gear-directus
 | 
				
			||||
 *
 | 
				
			||||
 */
 | 
				
			||||
class FeedController extends DirectusControllerAbstract
 | 
				
			||||
{
 | 
				
			||||
    private $limit = 20;
 | 
				
			||||
 | 
				
			||||
    /**
 | 
				
			||||
     *
 | 
				
			||||
     */
 | 
				
			||||
    protected $page = [
 | 
				
			||||
        'data' => [
 | 
				
			||||
            'view' => 'rss'
 | 
				
			||||
        ]
 | 
				
			||||
    ];
 | 
				
			||||
 | 
				
			||||
    /**
 | 
				
			||||
     *  get single page from slug
 | 
				
			||||
     *
 | 
				
			||||
     *
 | 
				
			||||
     *  @param string $slug
 | 
				
			||||
     */
 | 
				
			||||
    public function indexAction()
 | 
				
			||||
    {
 | 
				
			||||
        $siteRepository = new SiteRepository();
 | 
				
			||||
        $site = $siteRepository->findOne();
 | 
				
			||||
 | 
				
			||||
        $postRepository = new PostRepository();
 | 
				
			||||
        $posts = $postRepository->find($this->limit);
 | 
				
			||||
 | 
				
			||||
        // change type
 | 
				
			||||
        header('Content-Type: text/xml');
 | 
				
			||||
 | 
				
			||||
        $this->render($this->page, [
 | 
				
			||||
            'site' => $site,
 | 
				
			||||
            'posts' => $posts
 | 
				
			||||
        ]);
 | 
				
			||||
    }
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,36 @@
 | 
				
			||||
<?php
 | 
				
			||||
 | 
				
			||||
namespace App\Controllers;
 | 
				
			||||
 | 
				
			||||
use App\Controllers\DirectusControllerAbstract;
 | 
				
			||||
use App\Repositories\PostRepository;
 | 
				
			||||
 | 
				
			||||
/**
 | 
				
			||||
 *  controller for page items from directus
 | 
				
			||||
 *
 | 
				
			||||
 *
 | 
				
			||||
 *  @author Björn Hase, Tentakelfabrik
 | 
				
			||||
 *  @license http://opensource.org/licenses/MIT The MIT License
 | 
				
			||||
 *  @link https://gitea.tentakelfabrik.de/Tentakelfabrik/super-gear-directus
 | 
				
			||||
 *
 | 
				
			||||
 */
 | 
				
			||||
class PostController extends DirectusControllerAbstract
 | 
				
			||||
{
 | 
				
			||||
    /**
 | 
				
			||||
     *  get single page from slug
 | 
				
			||||
     *
 | 
				
			||||
     *
 | 
				
			||||
     *  @param string $slug
 | 
				
			||||
     */
 | 
				
			||||
    public function getAction($slug)
 | 
				
			||||
    {
 | 
				
			||||
        $repository = new PostRepository();
 | 
				
			||||
        $post = $repository->findOneBySlug($slug);
 | 
				
			||||
 | 
				
			||||
        if (count($post['data']) === 0) {
 | 
				
			||||
            $this->app->redirect('/404');
 | 
				
			||||
        } else {
 | 
				
			||||
            $this->render($post);
 | 
				
			||||
        }
 | 
				
			||||
    }
 | 
				
			||||
}
 | 
				
			||||
@ -1,51 +0,0 @@
 | 
				
			||||
<?php
 | 
				
			||||
 | 
				
			||||
namespace App\Repositories;
 | 
				
			||||
 | 
				
			||||
use Exception;
 | 
				
			||||
 | 
				
			||||
/**
 | 
				
			||||
 *  Manager Class to create Repository Objects that
 | 
				
			||||
 *  are located in App\Repositories\
 | 
				
			||||
 *
 | 
				
			||||
 *
 | 
				
			||||
 *  @author Björn Hase, Tentakelfabrik
 | 
				
			||||
 *  @license http://opensource.org/licenses/MIT The MIT License
 | 
				
			||||
 *  @link https://gitea.tentakelfabrik.de/Tentakelfabrik/super-gear-directus
 | 
				
			||||
 *
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
class Manager
 | 
				
			||||
{
 | 
				
			||||
    /**
 | 
				
			||||
     * naming of Repository
 | 
				
			||||
     * @var string
 | 
				
			||||
     */
 | 
				
			||||
    const NAMESPACE = 'App\Repositories\\';
 | 
				
			||||
 | 
				
			||||
    /**
 | 
				
			||||
     * naming of Repository
 | 
				
			||||
     * @var string
 | 
				
			||||
     */
 | 
				
			||||
    const REPOSITORY_SUFFIX = 'Repository';
 | 
				
			||||
 | 
				
			||||
    /**
 | 
				
			||||
     * getting repository object
 | 
				
			||||
     *
 | 
				
			||||
     * @param  string $repositoryClass
 | 
				
			||||
     * @return AbstractRepository
 | 
				
			||||
     */
 | 
				
			||||
    public static function get($repositoryName)
 | 
				
			||||
    {
 | 
				
			||||
        $repositoryClass = self::NAMESPACE.$repositoryName.self::REPOSITORY_SUFFIX;
 | 
				
			||||
 | 
				
			||||
        if (!class_exists($repositoryClass)) {
 | 
				
			||||
            throw new Exception('Repository Class '.$repositoryClass.' not exists!');
 | 
				
			||||
        }
 | 
				
			||||
 | 
				
			||||
        // create respository object
 | 
				
			||||
        $repository = new $repositoryClass();
 | 
				
			||||
 | 
				
			||||
        return $repository;
 | 
				
			||||
    }
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,83 @@
 | 
				
			||||
<?php
 | 
				
			||||
 | 
				
			||||
namespace App\Repositories;
 | 
				
			||||
 | 
				
			||||
use App\Repositories\RepositoryAbstract;
 | 
				
			||||
 | 
				
			||||
/**
 | 
				
			||||
 *  request pages items from directus
 | 
				
			||||
 *
 | 
				
			||||
 *  @author Björn Hase, Tentakelfabrik
 | 
				
			||||
 *  @license http://opensource.org/licenses/MIT The MIT License
 | 
				
			||||
 *  @link https://gitea.tentakelfabrik.de/Tentakelfabrik/super-gear-directus
 | 
				
			||||
 *
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
class PostRepository extends RepositoryAbstract
 | 
				
			||||
{
 | 
				
			||||
    /** endpoint */
 | 
				
			||||
    protected $endpoint = 'posts';
 | 
				
			||||
 | 
				
			||||
    /**
 | 
				
			||||
     *
 | 
				
			||||
     */
 | 
				
			||||
    public function find($limit = 20)
 | 
				
			||||
    {
 | 
				
			||||
        return $this->queryBuilder
 | 
				
			||||
            ->fields([
 | 
				
			||||
                'title',
 | 
				
			||||
                'slug',
 | 
				
			||||
                'lead',
 | 
				
			||||
                'content',
 | 
				
			||||
                'view',
 | 
				
			||||
                'date_created',
 | 
				
			||||
                'published_at',
 | 
				
			||||
                'media_teaser.id',
 | 
				
			||||
                'media_teaser.description'
 | 
				
			||||
            ])
 | 
				
			||||
            ->aliases('template', 'view')
 | 
				
			||||
            ->filter([
 | 
				
			||||
                'status' => 'published',
 | 
				
			||||
                'published_at' => [
 | 
				
			||||
                    '_nnull' => 'true'
 | 
				
			||||
                ]
 | 
				
			||||
            ])
 | 
				
			||||
            ->sort(['published_at'])
 | 
				
			||||
            ->find();
 | 
				
			||||
     }
 | 
				
			||||
 | 
				
			||||
    /**
 | 
				
			||||
     *  find single page with a slug,
 | 
				
			||||
     *  page must be published
 | 
				
			||||
     *
 | 
				
			||||
     *  @param  string $slug
 | 
				
			||||
     *  @return array
 | 
				
			||||
     */
 | 
				
			||||
    public function findOneBySlug($slug)
 | 
				
			||||
    {
 | 
				
			||||
        return $this->queryBuilder
 | 
				
			||||
            ->fields([
 | 
				
			||||
                'title',
 | 
				
			||||
                'slug',
 | 
				
			||||
                'lead',
 | 
				
			||||
                'content',
 | 
				
			||||
                'view',
 | 
				
			||||
                'meta',
 | 
				
			||||
                'date_created',
 | 
				
			||||
                'published_at',
 | 
				
			||||
                'media_teaser.id',
 | 
				
			||||
                'media_teaser.description',
 | 
				
			||||
                'media_hero.id',
 | 
				
			||||
                'media_hero.description',
 | 
				
			||||
            ])
 | 
				
			||||
            ->aliases('template', 'view')
 | 
				
			||||
            ->filter([
 | 
				
			||||
                'status' => 'published',
 | 
				
			||||
                'published_at' => [
 | 
				
			||||
                    '_nnull' => 'true'
 | 
				
			||||
                ],
 | 
				
			||||
                'slug' => $slug
 | 
				
			||||
            ])
 | 
				
			||||
            ->findOne();
 | 
				
			||||
    }
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,53 @@
 | 
				
			||||
@extends('layout')
 | 
				
			||||
 | 
				
			||||
{{-- pretend duplicate content --}}
 | 
				
			||||
@push('head')
 | 
				
			||||
    <meta name="robots" content="noindex,follow" />
 | 
				
			||||
@endpush
 | 
				
			||||
 | 
				
			||||
{{-- inject helper for content & repositories --}}
 | 
				
			||||
@inject('markdownHelper', 'App\Helpers\MarkdownHelper')
 | 
				
			||||
@inject('postRepository', 'App\Repositories\PostRepository')
 | 
				
			||||
 | 
				
			||||
@php
 | 
				
			||||
    $posts = $postRepository->find();
 | 
				
			||||
@endphp
 | 
				
			||||
 | 
				
			||||
@section('content')
 | 
				
			||||
 | 
				
			||||
<h1>
 | 
				
			||||
    {{ $page['data']['title'] }}
 | 
				
			||||
</h1>
 | 
				
			||||
<div class="content">
 | 
				
			||||
    {!! $markdownHelper->parse($page['data']['content']) !!}
 | 
				
			||||
</div>
 | 
				
			||||
 | 
				
			||||
@if (count($posts) > 0)
 | 
				
			||||
    @foreach($posts['data'] as $post)
 | 
				
			||||
        <a class="post" href="/blog/{{ $post['slug'] }}">
 | 
				
			||||
            <header class="post__header">
 | 
				
			||||
                <h2 class="post__title">
 | 
				
			||||
                    {{ $post['title'] }}
 | 
				
			||||
                </h2>
 | 
				
			||||
                @include('partials.date', ['post' => $post])
 | 
				
			||||
                @include('partials.readtime', ['post' => $post])
 | 
				
			||||
                @if (isset($post['media_teaser']['id']))
 | 
				
			||||
                    <div class="post__teaser">
 | 
				
			||||
                        <img src="{{ assetsUrl($post['media_teaser']['id']) }}" alt="{{ $post['media_teaser']['description'] }}" />
 | 
				
			||||
                    </div>
 | 
				
			||||
                @endif
 | 
				
			||||
            </header>
 | 
				
			||||
            <div class="content post__lead">
 | 
				
			||||
                {!! $markdownHelper->parse($post['lead']) !!}
 | 
				
			||||
            </div>
 | 
				
			||||
        </div>
 | 
				
			||||
    @endforeach
 | 
				
			||||
@else
 | 
				
			||||
    <div class="post">
 | 
				
			||||
        <p>
 | 
				
			||||
            Nothing!
 | 
				
			||||
        </p>
 | 
				
			||||
    </div>
 | 
				
			||||
@endif
 | 
				
			||||
 | 
				
			||||
@endsection
 | 
				
			||||
@ -0,0 +1,5 @@
 | 
				
			||||
<div class="post__date">
 | 
				
			||||
    <time datetime="{{ $post['published_at'] }}">
 | 
				
			||||
        {{ Carbon\Carbon::parse($post['published_at'])->diffForHumans() }}
 | 
				
			||||
    </time>
 | 
				
			||||
</div>
 | 
				
			||||
@ -0,0 +1,10 @@
 | 
				
			||||
@php
 | 
				
			||||
    $content = $post['lead'].$post['content'];
 | 
				
			||||
    $readtime = (new \Mtownsend\ReadTime\ReadTime($content))->timeOnly(true)->setTranslation([
 | 
				
			||||
            'minute' => ''
 | 
				
			||||
        ])->get();
 | 
				
			||||
@endphp
 | 
				
			||||
 | 
				
			||||
<div class="post__readtime">
 | 
				
			||||
    Reading time {{ $readtime }} Minutes
 | 
				
			||||
</div>
 | 
				
			||||
@ -0,0 +1,17 @@
 | 
				
			||||
@extends('layout')
 | 
				
			||||
 | 
				
			||||
@inject('markdownHelper', 'App\Helpers\MarkdownHelper')
 | 
				
			||||
 | 
				
			||||
@section('content')
 | 
				
			||||
 | 
				
			||||
<h1>
 | 
				
			||||
    {{ $page['data']['title'] }}
 | 
				
			||||
</h1>
 | 
				
			||||
<div class="content content--lead">
 | 
				
			||||
    {!! $markdownHelper->parse($page['data']['lead']) !!}
 | 
				
			||||
</div>
 | 
				
			||||
<div class="content">
 | 
				
			||||
    {!! $markdownHelper->parse($page['data']['content']) !!}
 | 
				
			||||
</div>
 | 
				
			||||
 | 
				
			||||
@endsection
 | 
				
			||||
@ -0,0 +1,38 @@
 | 
				
			||||
@inject('markdownHelper', 'App\Helpers\MarkdownHelper')
 | 
				
			||||
 | 
				
			||||
@php
 | 
				
			||||
if (isset($_SERVER['HTTPS'])) {
 | 
				
			||||
    $http = 'https';
 | 
				
			||||
} else {
 | 
				
			||||
    $http = 'http';
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
$base_url = $http.'://'.$_SERVER['SERVER_NAME'];
 | 
				
			||||
 | 
				
			||||
@endphp
 | 
				
			||||
 | 
				
			||||
<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
 | 
				
			||||
    <channel>
 | 
				
			||||
        <title>{{ $site['data']['title'] }}</title>
 | 
				
			||||
	    <atom:link href="{{ $base_url }}/feed" rel="self" type="application/rss+xml" />
 | 
				
			||||
	    <link>{{ $base_url }}/blog</link>
 | 
				
			||||
	    <description>{{ $site['data']['description'] }}</description>
 | 
				
			||||
	    <lastBuildDate>{{ date(DATE_RSS) }}</lastBuildDate>
 | 
				
			||||
	    <language>{{ $_ENV['APP_LOCALE'] }}-{{ strtoupper($_ENV['APP_LOCALE']) }}</language>
 | 
				
			||||
        @foreach($posts['data'] as $post)
 | 
				
			||||
            <item>
 | 
				
			||||
                <title>{{ $post['title'] }}</title>
 | 
				
			||||
                <link>{{ $base_url.'/blog/'.$post['slug'] }}</link>
 | 
				
			||||
                <pubDate>{{ date(DATE_RSS, strtotime($post['published_at'])) }}</pubDate>
 | 
				
			||||
                <description>
 | 
				
			||||
                    <![CDATA[
 | 
				
			||||
                        {!! $markdownHelper->parse($post['lead']) !!}
 | 
				
			||||
                        {!! $markdownHelper->parse($post['content']) !!}
 | 
				
			||||
                    ]]>
 | 
				
			||||
                </description>
 | 
				
			||||
                <guid isPermaLink="false">{{ $post['slug'] }}</guid>
 | 
				
			||||
            </item>
 | 
				
			||||
        @endforeach
 | 
				
			||||
    </channel>
 | 
				
			||||
</rss>
 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue