Compare commits
3 Commits
new-contac
...
fix-layout
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
732318d282 | ||
|
|
c76c1fa8f7 | ||
|
|
e406257121 |
@@ -18,7 +18,7 @@ REDIS_PASSWORD=null
|
||||
REDIS_PORT=6379
|
||||
|
||||
MAIL_DRIVER=smtp
|
||||
MAIL_HOST=in-v3.mailjet.com
|
||||
MAIL_HOST=in-v3.mailjet.com
|
||||
MAIL_PORT=25
|
||||
MAIL_USERNAME=mailjet_username
|
||||
MAIL_PASSWORD=mailjet_password
|
||||
@@ -37,7 +37,3 @@ DB_PASSWORD=dbpass
|
||||
|
||||
CACHE_DRIVER=file
|
||||
QUEUE_DRIVER=sync
|
||||
|
||||
FRIENDLY_CAPTCHA_SITEKEY=
|
||||
FRIENDLY_CAPTCHA_SECRET=
|
||||
FRIENDLY_CAPTCHA_DEBUG=true
|
||||
|
||||
4
Dockerfile
Executable file → Normal file
@@ -1,4 +1,4 @@
|
||||
FROM php:8.2-apache
|
||||
FROM php:8.1-apache
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get -y install \
|
||||
@@ -27,7 +27,7 @@ COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
|
||||
ADD docker/apache.conf /etc/apache2/sites-enabled/000-default.conf
|
||||
|
||||
WORKDIR /var/www/html
|
||||
COPY . /var/www/html
|
||||
# COPY . /var/www/html
|
||||
|
||||
RUN mkdir -p storage/framework/{sessions,views,cache,cache/data} && \
|
||||
chown -R www-data:www-data storage/framework && \
|
||||
|
||||
2
Dockerfile.dev
Executable file → Normal file
@@ -1,4 +1,4 @@
|
||||
FROM php:8.2-apache
|
||||
FROM php:8.1-apache
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get -y install \
|
||||
|
||||
0
Gruntfile.js
vendored
Executable file → Normal file
0
app/Console/Kernel.php
Executable file → Normal file
0
app/Exceptions/Handler.php
Executable file → Normal file
0
app/Helpers/FormatterHelper.php
Executable file → Normal file
0
app/Http/Controllers/Auth/ForgotPasswordController.php
Executable file → Normal file
0
app/Http/Controllers/Auth/LoginController.php
Executable file → Normal file
0
app/Http/Controllers/Auth/RegisterController.php
Executable file → Normal file
0
app/Http/Controllers/Auth/ResetPasswordController.php
Executable file → Normal file
12
app/Http/Controllers/CalendarController.php
Executable file → Normal file
@@ -6,20 +6,26 @@ use \Illuminate\Http\Request;
|
||||
|
||||
class CalendarController extends Controller
|
||||
{
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function show(Request $request, $id)
|
||||
{
|
||||
parent::registerView($request, 'agenda', $id);
|
||||
$apiResult = $this->API('agenda/item/' . (int)$id);
|
||||
$calendarEvent = new \Model\CalendarEvent($apiResult->news);
|
||||
$calendarEvent = new \Model\CalendarEvent($apiResult);
|
||||
|
||||
return view('calendarevent', array_merge($this->getSidebareData(), ['event' => $calendarEvent, 'metadata' => $calendarEvent->metadata]));
|
||||
}
|
||||
|
||||
public function overview(Request $request)
|
||||
{
|
||||
$apiResult = $this->API('agenda/overzicht?aantal=100');
|
||||
$apiResult = $this->API('agenda/overzicht');
|
||||
$calendar = [];
|
||||
foreach($apiResult->events as $calendarItem)
|
||||
foreach($apiResult as $calendarItem)
|
||||
{
|
||||
$calendar[] = new \Model\CalendarEvent($calendarItem);
|
||||
}
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Validation\Rule;
|
||||
use App\Mail\ContactFormSubmitted;
|
||||
|
||||
class ContactController extends Controller
|
||||
{
|
||||
public function show()
|
||||
{
|
||||
return view('contact');
|
||||
}
|
||||
|
||||
public function submit(Request $request)
|
||||
{
|
||||
$rules = [
|
||||
'name' => 'required|string|max:255',
|
||||
'email' => 'required|email|max:255',
|
||||
'message' => 'required|string',
|
||||
'image' => 'nullable|image|max:10240',
|
||||
'video' => 'nullable|mimetypes:video/avi,video/mpeg,video/quicktime,video/mp4|max:512000',
|
||||
];
|
||||
|
||||
$debugCaptcha = env('FRIENDLY_CAPTCHA_DEBUG', false)
|
||||
|| (app()->environment('local')
|
||||
&& (!env('FRIENDLY_CAPTCHA_SITEKEY') || !env('FRIENDLY_CAPTCHA_SECRET')));
|
||||
|
||||
if ($debugCaptcha) {
|
||||
$rules['frc-captcha-solution'] = 'nullable';
|
||||
} else {
|
||||
$rules['frc-captcha-solution'] = ['required', Rule::friendlycaptcha()];
|
||||
}
|
||||
|
||||
$request->validate($rules);
|
||||
|
||||
$data = $request->only(['name', 'email', 'message']);
|
||||
$attachments = [];
|
||||
|
||||
// Handle Image
|
||||
if ($request->hasFile('image')) {
|
||||
// Store temporarily to attach
|
||||
$imagePath = $request->file('image')->store('contact_images');
|
||||
$attachments['image'] = storage_path('app/' . $imagePath);
|
||||
}
|
||||
|
||||
// Handle Video
|
||||
if ($request->hasFile('video')) {
|
||||
$videoPath = $request->file('video')->store('contact_videos', 'local');
|
||||
$data['video_link'] = route('contact.video', ['filename' => basename($videoPath)]);
|
||||
}
|
||||
|
||||
// Send Email
|
||||
Mail::to('info@nhgooi.nl')->send(new ContactFormSubmitted($data, $attachments));
|
||||
|
||||
return redirect()->route('contact')->with('success', 'Bedankt voor uw bericht. We nemen zo snel mogelijk contact met u op.');
|
||||
}
|
||||
|
||||
public function video(string $filename)
|
||||
{
|
||||
$path = 'contact_videos/' . basename($filename);
|
||||
|
||||
if (!Storage::disk('local')->exists($path)) {
|
||||
abort(404);
|
||||
}
|
||||
|
||||
$fullPath = Storage::disk('local')->path($path);
|
||||
|
||||
return response()->file($fullPath);
|
||||
}
|
||||
}
|
||||
94
app/Http/Controllers/Controller.php
Executable file → Normal file
@@ -19,9 +19,9 @@ class Controller extends BaseController
|
||||
|
||||
private function getDataFromFileAndConvert($file, $path, $class, $maxItems = 0)
|
||||
{
|
||||
$data = json_decode(Storage::get($file));
|
||||
$data = json_decode(Storage::disk('local')->get($file));
|
||||
foreach ($path as $subobject) {
|
||||
$data = $data->$subobject ?? [];
|
||||
$data = $data->$subobject;
|
||||
}
|
||||
$items = [];
|
||||
foreach ($data as $item_data) {
|
||||
@@ -39,30 +39,39 @@ class Controller extends BaseController
|
||||
View::share('apiUrl', $this->API_URL = env('API_URL', 'http://api.6fm.nl/'));
|
||||
View::share('imgBase', env('IMAGE_BASE_URL', '/'));
|
||||
|
||||
$blogs = $this->getDataFromFileAndConvert('blogs.json', [], '\Model\Blog', 1);
|
||||
$activeBlog = count($blogs) && $blogs[0]->is_active ? $blogs[0] : null;
|
||||
View::share('activeBlog', $activeBlog);
|
||||
|
||||
|
||||
//View::share('onAir', file_get_contents(url('onair')));
|
||||
View::composer('widgets.laatstenieuws', function ($view) {
|
||||
$view->with('data', $this->getDataFromFileAndConvert('laatste_nieuws.json', ['news'], '\Model\NewsItem'));
|
||||
});
|
||||
View::composer('widgets.populairnieuws', function ($view) {
|
||||
$view->with('data', $this->getDataFromFileAndConvert('populair_nieuws.json', ['news'], '\Model\NewsItem'));
|
||||
$view->with('data', $this->getDataFromFileAndConvert('populair_nieuws.json', [], '\Model\NewsItem'));
|
||||
});
|
||||
View::composer('widgets.nustraks', function ($view) {
|
||||
$data = json_decode(Storage::get('nu_straks.json'))->schedule;
|
||||
$data = json_decode(Storage::disk('local')->get('nu_straks.json'))->schedule;
|
||||
$programs = [];
|
||||
foreach ($data as $item_data) {
|
||||
$programs[] = $program = new \Model\Program($item_data->program);
|
||||
$program->start = self::JsonToDateTime($item_data->start);
|
||||
$program->end = self::JsonToDateTime($item_data->end);
|
||||
$program->start = new \DateTimeImmutable($item_data->start->date,
|
||||
new \DateTimeZone($item_data->start->timezone));
|
||||
$program->end = new \DateTimeImmutable($item_data->end->date,
|
||||
new \DateTimeZone($item_data->end->timezone));
|
||||
}
|
||||
|
||||
// Need a bit of slack here, otherwise the current program may show up
|
||||
$now = new \DateTimeImmutable('2 minutes ago');
|
||||
$data = json_decode(Storage::get('zojuist.json'))->schedule;
|
||||
$data = json_decode(Storage::disk('local')->get('zojuist.json'))->schedule;
|
||||
$i = 0;
|
||||
foreach (array_reverse($data) as $item_data) {
|
||||
$recent = $program = new \Model\Program($item_data->program);
|
||||
$recent->start = self::JsonToDateTime($item_data->start);
|
||||
$recent->end = self::JsonToDateTime($item_data->end);
|
||||
$recent->start = new \DateTimeImmutable($item_data->start->date,
|
||||
new \DateTimeZone($item_data->start->timezone));
|
||||
$recent->end = new \DateTimeImmutable($item_data->end->date,
|
||||
new \DateTimeZone($item_data->end->timezone));
|
||||
if (($recent->end < $now) && (!$recent->nonstop) && (!$recent->rerun)) {
|
||||
$view->with('recent', $recent);
|
||||
break;
|
||||
@@ -72,10 +81,8 @@ class Controller extends BaseController
|
||||
$view->with('data', $programs);
|
||||
});
|
||||
View::composer('widgets.laatstepodcasts', function ($view) {
|
||||
$view->with(
|
||||
'data',
|
||||
$this->getDataFromFileAndConvert('laatste_podcasts.json', ['podcasts'], '\Model\Podcast')
|
||||
);
|
||||
$view->with('data',
|
||||
$this->getDataFromFileAndConvert('laatste_podcasts.json', ['podcasts'], '\Model\Podcast'));
|
||||
});
|
||||
View::composer('widgets.regioagenda', function ($view) {
|
||||
$view->with('data', $this->getDataFromFileAndConvert('regioagenda.json', [], '\Model\CalendarEvent'));
|
||||
@@ -85,17 +92,12 @@ class Controller extends BaseController
|
||||
});
|
||||
View::composer('widgets.menu', function ($view) {
|
||||
$view->with('news', $this->getDataFromFileAndConvert('laatste_nieuws.json', ['news'], '\Model\NewsItem'))
|
||||
->with('popular', $this->getDataFromFileAndConvert('populair_nieuws.json', ['news'], '\Model\NewsItem', 3))
|
||||
->with(
|
||||
'podcasts',
|
||||
$this->getDataFromFileAndConvert('laatste_podcasts.json', ['podcasts'], '\Model\Podcast')
|
||||
);
|
||||
});
|
||||
View::composer('widgets.menu', function($view) {
|
||||
$view->with('items', json_decode(Storage::get('static/menu.json')));
|
||||
->with('popular', $this->getDataFromFileAndConvert('populair_nieuws.json', [], '\Model\NewsItem', 3))
|
||||
->with('podcasts',
|
||||
$this->getDataFromFileAndConvert('laatste_podcasts.json', ['podcasts'], '\Model\Podcast'));
|
||||
});
|
||||
|
||||
View::share('disableBanners', env('DISABLE_BANNERS', false));
|
||||
View::share('disableBanners', env('DISABLE_BANNERS', true));
|
||||
}
|
||||
|
||||
protected function registerView(Request $request, $type, $id)
|
||||
@@ -104,34 +106,31 @@ class Controller extends BaseController
|
||||
return;
|
||||
}
|
||||
|
||||
app('db')->insert(
|
||||
'INSERT INTO `pagestats`(`type`, `item_id`, `visitor_ip`, `session`, `referer`) VALUES(:type, :id, :ip, :session, :referer)',
|
||||
app('db')->insert('INSERT INTO `pagestats`(`type`, `item_id`, `visitor_ip`, `session`, `referer`) VALUES(:type, :id, :ip, :session, :referer)',
|
||||
[
|
||||
'type' => $type,
|
||||
'id' => $id,
|
||||
'ip' => $request->server('REMOTE_ADDR'),
|
||||
'session' => md5(Session::getId()),
|
||||
'referer' => $request->server('HTTP_REFERRER')
|
||||
]
|
||||
);
|
||||
]);
|
||||
}
|
||||
|
||||
protected function API($url)
|
||||
{
|
||||
// if (strpos($url, 'nieuws/overzicht') !== false) {
|
||||
// return json_decode(file_get_contents(__DIR__ . '/../../../storage/app/laatste_nieuws.json'));
|
||||
// }
|
||||
// return [];
|
||||
|
||||
$arrContextOptions = [
|
||||
'ssl' => [
|
||||
"verify_peer" => false,
|
||||
"verify_peer_name" => false,
|
||||
],
|
||||
'http' => [
|
||||
'method' => 'GET',
|
||||
'header' => 'X-Api-Key: ' . sha1(request()->server('REMOTE_ADDR')) . "\r\n"
|
||||
. 'X-User-Agent: ' . request()->server('HTTP_USER_AGENT') . "\r\n"
|
||||
]
|
||||
];
|
||||
//\dump($http_response_header);
|
||||
$result = @file_get_contents($this->API_URL . $url, false, stream_context_create($arrContextOptions));
|
||||
return $result ? json_decode($result) : null;
|
||||
|
||||
return json_decode(file_get_contents($this->API_URL . $url, false, stream_context_create($arrContextOptions)));
|
||||
}
|
||||
|
||||
protected function checkAPI($url)
|
||||
@@ -149,10 +148,9 @@ class Controller extends BaseController
|
||||
|
||||
protected static function JsonToDateTime($obj)
|
||||
{
|
||||
return is_object($obj) ? new \DateTime($obj->date, new \DateTimeZone($obj->timezone)) : \Carbon\Carbon::parse($obj)->setTimezone(date_default_timezone_get());
|
||||
return new \DateTime($obj->date, new \DateTimeZone($obj->timezone));
|
||||
}
|
||||
|
||||
/*
|
||||
public function __call($method, $arguments)
|
||||
{
|
||||
if (substr($method, 0, 5) == 'view_') {
|
||||
@@ -162,15 +160,14 @@ class Controller extends BaseController
|
||||
}
|
||||
}
|
||||
|
||||
return abort(404);
|
||||
return abort(404);
|
||||
}
|
||||
*/
|
||||
|
||||
public function getSidebareData()
|
||||
{
|
||||
$populair = [];
|
||||
$apiResult = $this->API('nieuws/populair?aantal=5');
|
||||
foreach ($apiResult->news as $_newsItem) {
|
||||
foreach ($apiResult as $_newsItem) {
|
||||
$populair[] = new \Model\NewsItem($_newsItem);
|
||||
}
|
||||
|
||||
@@ -182,23 +179,4 @@ class Controller extends BaseController
|
||||
|
||||
return ['newsItems' => $newsItems, 'populair' => $populair];
|
||||
}
|
||||
|
||||
public function static_page($slug)
|
||||
{
|
||||
if (view()->exists($slug)) {
|
||||
return view($slug);
|
||||
}
|
||||
|
||||
$page = $this->API('statisch/' . $slug);
|
||||
if ($page == null) {
|
||||
return abort(404);
|
||||
}
|
||||
|
||||
$page->published = Controller::JsonToDateTime($page->published);
|
||||
if ($page->edited) {
|
||||
$page->edited = Controller::JsonToDateTime($page->edited);
|
||||
}
|
||||
|
||||
return view('static', compact('page'));
|
||||
}
|
||||
}
|
||||
|
||||
23
app/Http/Controllers/HomeController.php
Executable file → Normal file
@@ -9,25 +9,26 @@ class HomeController extends Controller
|
||||
{
|
||||
public function show(Request $request)
|
||||
{
|
||||
$page = (int) $request->get('pagina', 1);
|
||||
$apiResult = $this->API('nieuws/overzicht?pagina=' . (int) max(1, $page) . '&aantal=10');
|
||||
$page = (int)$request->get('pagina', 1);
|
||||
$apiResult = $this->API('nieuws/overzicht?pagina=' . (int)max(1, $page) . '&aantal=10');
|
||||
$news = [];
|
||||
foreach ($apiResult->news as $newsItem) {
|
||||
$news[] = new \Model\NewsItem($newsItem);
|
||||
}
|
||||
|
||||
$apiResult = $this->API('nieuws/liveblogs');
|
||||
$liveblogs = $apiResult->liveblogs;
|
||||
|
||||
$populair = [];
|
||||
$apiResult = $this->API('nieuws/populair?pagina=' . (int) max(1, $page) . '&aantal=5');
|
||||
foreach ($apiResult->news as $newsItem) {
|
||||
$apiResult = $this->API('nieuws/populair?pagina=' . (int)max(1, $page) . '&aantal=5');
|
||||
foreach ($apiResult as $newsItem) {
|
||||
$populair[] = new \Model\NewsItem($newsItem);
|
||||
}
|
||||
|
||||
$apiResult = $this->API('podcast/overzicht?aantal=15');
|
||||
$index = array_rand($apiResult->podcasts);
|
||||
$podcast = new \Model\Podcast($apiResult->podcasts[$index]);
|
||||
return view('home', ['populair' => $populair, 'podcast' => $podcast, 'title' => 'Home', 'news' => $news, 'liveblogs' => $liveblogs, 'searchURL' => 'nieuws/zoeken']);
|
||||
$podcasts = [];
|
||||
$apiResult = $this->API('podcast/overzicht?aantal=3');
|
||||
$podcast = new \Model\Podcast($apiResult->podcasts[0]);
|
||||
foreach ($apiResult->podcasts as $_podcast) {
|
||||
$podcasts[] = new \Model\Podcast($_podcast);
|
||||
}
|
||||
|
||||
return view('home', ['populair' => $populair, 'podcasts' => $podcasts, 'podcast' => $podcast, 'title' => 'Home', 'news' => $news, 'searchURL' => 'nieuws/zoeken']);
|
||||
}
|
||||
}
|
||||
|
||||
0
app/Http/Controllers/ImagesController.php
Executable file → Normal file
10
app/Http/Controllers/JobsController.php
Executable file → Normal file
@@ -29,12 +29,12 @@ class JobsController extends Controller
|
||||
private function listJobs(Request $request, $url, $title = null)
|
||||
{
|
||||
$page = (int)$request->get('pagina', 1);
|
||||
#$apiResult = $this->API('vacatures/' . $url . '?pagina=' . (int)max(1, $page));
|
||||
$apiResult = $this->API('vacatures/' . $url . '?pagina=' . (int)max(1, $page));
|
||||
$jobs = [];
|
||||
#foreach($apiResult->jobs as $jobsItem)
|
||||
#{
|
||||
# $jobs[] = new \Model\JobOpening($jobsItem);
|
||||
#}
|
||||
foreach($apiResult->jobs as $jobsItem)
|
||||
{
|
||||
$jobs[] = new \Model\JobOpening($jobsItem);
|
||||
}
|
||||
|
||||
return view('jobslist', array_merge($this->getSidebareData(), ['title' => $title, 'jobs' => $jobs]));
|
||||
//return view($request->ajax() ? 'partial/jobslist_small' : ($title == null ? 'home' : 'jobslist'), ['title' => $title, 'jobs' => $jobs, 'searchURL' => 'vacatures/zoeken']);
|
||||
|
||||
0
app/Http/Controllers/KerkdienstController.php
Executable file → Normal file
113
app/Http/Controllers/NewsController.php
Executable file → Normal file
@@ -17,31 +17,27 @@ class NewsController extends Controller
|
||||
public function show(Request $request, $id)
|
||||
{
|
||||
parent::registerView($request, 'nieuws', $id);
|
||||
$preview = "";
|
||||
if (request()->get('preview', null) != null) {
|
||||
$preview = "?preview=" . request()->get('preview');
|
||||
}
|
||||
$apiResult = $this->API('nieuws/bericht/' . $id . $preview);
|
||||
$apiResult = $this->API('nieuws/bericht/' . $id);
|
||||
$newsItem = new \Model\NewsItem($apiResult->news);
|
||||
|
||||
switch ($apiResult->version) {
|
||||
case 1:
|
||||
if (!$newsItem->content)
|
||||
return redirect('//nhnieuws.nl/gooi');
|
||||
if (!$newsItem->content) return redirect('//nhnieuws.nl/gooi');
|
||||
return view('newsitem', ['news' => $newsItem, 'metadata' => $newsItem->metadata]);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
if (isset($apiResult->source->article)) {
|
||||
$source = $apiResult->source->article;
|
||||
$newsItem->published = self::TimestampToDateTime($source->created);
|
||||
$newsItem->edited = self::TimestampToDateTime($source->updated);
|
||||
$newsItem->author = $source->author;
|
||||
$newsItem->images = null; // Images will be embedded
|
||||
$newsItem->video = null; // Videos will be embedded
|
||||
$newsItem->content = $source->blocks;
|
||||
} elseif (isset($apiResult->source->blocks)) {
|
||||
$newsItem->content = $apiResult->source->blocks;
|
||||
}
|
||||
return view('newsitem', array_merge($this->getSidebareData(), ['type' => $apiResult->type, 'news' => $newsItem, 'metadata' => $newsItem->metadata, 'searchURL' => 'nieuws/zoeken']));
|
||||
$source = $apiResult->source;
|
||||
$newsItem->published = self::TimestampToDateTime($source->created);
|
||||
$newsItem->edited = self::TimestampToDateTime($source->updated);
|
||||
$newsItem->author = $source->author;
|
||||
$newsItem->images = null; // Images will be embedded
|
||||
$newsItem->video = null; // Videos will be embedded
|
||||
$newsItem->content = $source->blocks;
|
||||
|
||||
|
||||
|
||||
return view('newsitem', array_merge($this->getSidebareData(), ['news' => $newsItem, 'metadata' => $newsItem->metadata, 'searchURL' => 'nieuws/zoeken']));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,9 +48,9 @@ class NewsController extends Controller
|
||||
|
||||
public function more(Request $request)
|
||||
{
|
||||
$page = (int) $request->get('pagina', 1);
|
||||
$page = (int)$request->get('pagina', 1);
|
||||
$id = $request->get('id', '');
|
||||
$apiResult = $this->API('nieuws/overzicht?pagina=' . (int) max(1, $page) . '&aantal=5');
|
||||
$apiResult = $this->API('nieuws/overzicht?pagina=' . (int)max(1, $page) . '&aantal=5');
|
||||
$news = [];
|
||||
foreach ($apiResult->news as $newsItem) {
|
||||
$news[] = new \Model\NewsItem($newsItem);
|
||||
@@ -65,30 +61,25 @@ class NewsController extends Controller
|
||||
|
||||
public function populair(Request $request)
|
||||
{
|
||||
$page = (int) $request->get('pagina', 1);
|
||||
$page = (int)$request->get('pagina', 1);
|
||||
$id = $request->get('id', '');
|
||||
$populair = [];
|
||||
$apiResult = $this->API('nieuws/populair?pagina=' . (int) max(1, $page) . '&aantal=5');
|
||||
foreach ($apiResult->news as $_newsItem) {
|
||||
$apiResult = $this->API('nieuws/populair?pagina=' . (int)max(1, $page) . '&aantal=5');
|
||||
foreach ($apiResult as $_newsItem) {
|
||||
$populair[] = new \Model\NewsItem($_newsItem);
|
||||
}
|
||||
|
||||
return view('partial/newslist_small', ['id' => $id, 'news' => $populair]);
|
||||
}
|
||||
|
||||
public function taglist(Request $request, $tag)
|
||||
{
|
||||
return $this->listNews($request, 'tag/' . $tag, ucfirst($tag));
|
||||
}
|
||||
|
||||
public function regionlist(Request $request, $region)
|
||||
{
|
||||
return $this->listNews($request, 'tag/' . $region, ucfirst($region));
|
||||
return $this->listNews($request, 'regio/' . $region, ucfirst($region));
|
||||
}
|
||||
|
||||
public function themelist(Request $request, $theme)
|
||||
{
|
||||
return $this->listNews($request, 'tag/' . $theme, ucfirst($theme));
|
||||
return $this->listNews($request, 'thema/' . $theme, ucfirst($theme));
|
||||
}
|
||||
|
||||
public function search(Request $request, $query)
|
||||
@@ -110,25 +101,30 @@ class NewsController extends Controller
|
||||
return abort(404);
|
||||
}
|
||||
|
||||
public function liveblog(Request $request, $id)
|
||||
public function blog(Request $request, $id)
|
||||
{
|
||||
|
||||
parent::registerView($request, 'blog', $id);
|
||||
|
||||
$blog = $this->API('nieuws/liveblog/' . (int) $id);
|
||||
foreach ($blog->artikelen as &$item) {
|
||||
$item = new \Model\NewsItem($item);
|
||||
$page = (int)$request->get('pagina', 1);
|
||||
$hasNext = true;
|
||||
while ($page > 0) {
|
||||
$apiResult = $this->API('blog/overzicht/' . (int)$id . '?pagina=' . (int)max(1, $page));
|
||||
|
||||
$blog = new \Model\Blog($apiResult->blog);
|
||||
$items = [];
|
||||
foreach ($apiResult->items as $blogItem) {
|
||||
$items[] = new \Model\NewsItem($blogItem);
|
||||
}
|
||||
|
||||
if (count($items) || ($page == 1)) {
|
||||
return view('blog', ['blog' => $blog, 'pagina' => $page, 'items' => $items, 'hasNext' => $hasNext && count($items) == 15]);
|
||||
}
|
||||
|
||||
$hasNext = false;
|
||||
--$page;
|
||||
}
|
||||
|
||||
if (request()->ajax()) {
|
||||
return $blog;
|
||||
}
|
||||
|
||||
if (count($blog->artikelen)) {
|
||||
return view('blog', ['blog' => $blog]);
|
||||
}
|
||||
|
||||
return abort();
|
||||
return abort(404);
|
||||
}
|
||||
|
||||
private function listNews(Request $request, $url, $title = null, $id = 'items', $total = null)
|
||||
@@ -136,13 +132,10 @@ class NewsController extends Controller
|
||||
if ($request->ajax()) {
|
||||
$total = 5;
|
||||
}
|
||||
$page = (int) $request->get('pagina', 1);
|
||||
if ($url == 'overzicht' && $request->get('dateStart', null) && $request->get('dateEnd', null)) {
|
||||
$url = 'datum/' . $request->get('dateStart', null) . '/' . $request->get('dateEnd', null);
|
||||
}
|
||||
$apiResult = $this->API('nieuws/' . $url . '?pagina=' . (int) max(1, $page) . ($total ? '&aantal=' . $total : ''));
|
||||
$page = (int)$request->get('pagina', 1);
|
||||
$apiResult = $this->API('nieuws/' . $url . '?pagina=' . (int)max(1, $page) . ($total ? '&aantal=' . $total : ''));
|
||||
$news = [];
|
||||
foreach ($apiResult->news ?? [] as $newsItem) {
|
||||
foreach ($apiResult->news as $newsItem) {
|
||||
$news[] = new \Model\NewsItem($newsItem);
|
||||
}
|
||||
|
||||
@@ -150,11 +143,9 @@ class NewsController extends Controller
|
||||
if ($title == null) {
|
||||
$total = 5;
|
||||
}
|
||||
$apiResult = $this->API('nieuws/populair?pagina=' . (int) max(
|
||||
1,
|
||||
$page
|
||||
) . ($total ? '&aantal=' . $total : ''));
|
||||
foreach ($apiResult->news as $newsItem) {
|
||||
$apiResult = $this->API('nieuws/populair?pagina=' . (int)max(1,
|
||||
$page) . ($total ? '&aantal=' . $total : ''));
|
||||
foreach ($apiResult as $newsItem) {
|
||||
$populair[] = new \Model\NewsItem($newsItem);
|
||||
}
|
||||
|
||||
@@ -181,7 +172,7 @@ class NewsController extends Controller
|
||||
{
|
||||
$apiResult = $this->API('nieuws/populair');
|
||||
$news = [];
|
||||
foreach ($apiResult->news as $newsItem) {
|
||||
foreach ($apiResult as $newsItem) {
|
||||
$news[] = new \Model\NewsItem($newsItem);
|
||||
}
|
||||
|
||||
@@ -190,15 +181,11 @@ class NewsController extends Controller
|
||||
|
||||
public function regionieuws()
|
||||
{
|
||||
$data = $this->API('nieuws/regionieuws.json');
|
||||
return view('listen', [
|
||||
'source' => $this->API_URL . 'nieuws/regionieuws.mp3',
|
||||
'source' => $this->API_URL . 'nieuws/regionieuws',
|
||||
'title' => 'Regionieuws',
|
||||
'content' => 'het laatste nieuws uit de regio',
|
||||
'isStream' => false,
|
||||
'canDownload' => true,
|
||||
'lengte' => $data->length * 0.25,
|
||||
'waveform' => $data
|
||||
]);
|
||||
'canDownload' => true]);
|
||||
}
|
||||
}
|
||||
|
||||
15
app/Http/Controllers/PodcastController.php
Executable file → Normal file
@@ -29,23 +29,14 @@ class PodcastController extends Controller
|
||||
$podcasts[] = new \Model\Podcast($podcast);
|
||||
}
|
||||
|
||||
return view($request->ajax() ? 'partial.podcastitems' : 'podcastseries', array_merge($viewData, ['podcasts' => $podcasts, 'searchURL' => 'gemist/zoeken', 'isPodcast' => true]));
|
||||
return view($request->ajax() ? 'partial.podcastitems' : 'podcastseries', array_merge($viewData, ['podcasts' => $podcasts, 'searchURL' => 'gemist/zoeken']));
|
||||
}
|
||||
|
||||
public function podcast(Request $request, $id)
|
||||
{
|
||||
parent::registerView($request, 'podcast', $id);
|
||||
$apiResult = $this->API('podcast/details/' . (int)$id);
|
||||
$podcast = new \Model\Podcast($apiResult);
|
||||
$podcasts = [];
|
||||
if($podcast->program) {
|
||||
$apiResult = $this->API('podcast/programma/' . (int)$podcast->program->id . '?pagina=1&aantal=5');
|
||||
$podcasts = [];
|
||||
foreach($apiResult->podcasts as $p)
|
||||
{
|
||||
$podcasts[] = new \Model\Podcast($p);
|
||||
}
|
||||
}
|
||||
return view('podcastitem', ['podcast' => $podcast, 'metadata' => $podcast->metadata, 'podcasts' => $podcasts, 'isPodcast' => true]);
|
||||
$podcast = new \Model\Podcast($apiResult);
|
||||
return view('podcastitem', ['podcast' => $podcast, 'metadata' => $podcast->metadata]);
|
||||
}
|
||||
}
|
||||
|
||||
15
app/Http/Controllers/RadioController.php
Executable file → Normal file
@@ -49,17 +49,14 @@ class RadioController extends Controller
|
||||
|
||||
public function program($id)
|
||||
{
|
||||
$apiResult = $this->API('programma/details/' . (int)$id);
|
||||
if($apiResult == null) {
|
||||
return abort(404);
|
||||
}
|
||||
$apiResult = $this->API('programma/details/' . (int)$id);
|
||||
return view('radioprogram', ['program' => new \Model\Program($apiResult)]);
|
||||
}
|
||||
|
||||
public function podcast(Request $request, $id, $title = '')
|
||||
{
|
||||
if($this->checkAPI('podcast/details/' . (int)$id) != "200"){
|
||||
return view('podcastitem', array_merge($this->getSidebareData(), ['title' => $title, 'podcast' => null, 'metadata' => null, 'related' => [], 'searchURL' => 'gemist/zoeken', 'isPodcast' => false]));
|
||||
return view('podcastitem', array_merge($this->getSidebareData(), ['title' => $title, 'podcast' => null, 'metadata' => null, 'related' => [], 'searchURL' => 'gemist/zoeken']));
|
||||
}
|
||||
|
||||
parent::registerView($request, 'podcast', $id);
|
||||
@@ -74,7 +71,7 @@ class RadioController extends Controller
|
||||
$podcasts[] = new \Model\Podcast($_podcast);
|
||||
}
|
||||
|
||||
return view($request->ajax() ? 'partial/podcastitems' : 'podcastitem', ['title' => $title, 'podcast' => $podcast, 'metadata' => $podcast->metadata, 'podcasts' => $podcasts, 'searchURL' => 'gemist/zoeken', 'isPodcast' => false]);
|
||||
return view($request->ajax() ? 'partial/podcastitems' : 'podcastitem', ['title' => $title, 'podcast' => $podcast, 'metadata' => $podcast->metadata, 'podcasts' => $podcasts, 'searchURL' => 'gemist/zoeken']);
|
||||
}
|
||||
|
||||
public function podcasts(Request $request, $programma = null)
|
||||
@@ -98,7 +95,7 @@ class RadioController extends Controller
|
||||
{
|
||||
$programs = [];
|
||||
$now = new \DateTimeImmutable('2 minutes ago');
|
||||
$page = (int)$request->get('pagina', 1);
|
||||
$page = (int)$request->get('pagina', 1);
|
||||
$apiResult = $this->API('programma/schema/recent?pagina=' . (int)max(1, $page) . '&aantal=12');
|
||||
foreach($apiResult->schedule as $item) {
|
||||
if(!$item->program->nonstop && !$item->program->rerun) {
|
||||
@@ -110,7 +107,7 @@ class RadioController extends Controller
|
||||
}
|
||||
}
|
||||
|
||||
return view($request->ajax() ? 'partial/programitems' : 'programlist', ['programs' => array_reverse($programs), 'isPodcast' => false]);
|
||||
return view($request->ajax() ? 'partial/programitems' : 'programlist', ['programs' => array_reverse($programs)]);
|
||||
}
|
||||
|
||||
private function getPodcastList(Request $request, $action, $viewData = [])
|
||||
@@ -123,7 +120,7 @@ class RadioController extends Controller
|
||||
$podcasts[] = new \Model\Podcast($podcast);
|
||||
}
|
||||
|
||||
return view($request->ajax() ? 'partial/podcastitems' : 'podcastlist', array_merge($viewData, ['id' => 'items-podcasts', 'podcasts' => $podcasts, 'searchURL' => 'gemist/zoeken', 'isPodcast' => false]));
|
||||
return view($request->ajax() ? 'partial/podcastitems' : 'podcastlist', array_merge($viewData, ['id' => 'items-podcasts', 'podcasts' => $podcasts, 'searchURL' => 'gemist/zoeken']));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
0
app/Http/Controllers/SpecialController.php
Executable file → Normal file
36
app/Http/Controllers/StreamController.php
Executable file → Normal file
@@ -14,8 +14,6 @@ class StreamController extends Controller
|
||||
return view('listen', [
|
||||
'source' => self::$STREAM_URL . 'mp3live',
|
||||
'title' => 'Luister live',
|
||||
'lengte' => 0,
|
||||
'waveform' => null,
|
||||
'content' => 'de live-uitzending van NH Gooi.',
|
||||
'isStream' => true ]);
|
||||
}
|
||||
@@ -32,17 +30,6 @@ class StreamController extends Controller
|
||||
return view('watch', ['title' => 'Kijk NH Gooi Tv Studio', 'stream' => 'https://studiocam.nhgooi.nl/studiocam/live/index.m3u8']);
|
||||
}
|
||||
|
||||
public function inline(Request $request, $id)
|
||||
{
|
||||
$apiResult = $this->API('podcast/details/' . (int)$id);
|
||||
$podcast = new \Model\Podcast($apiResult);
|
||||
if(sha1($id . ':' . date('Y-m-d')) != $request->get('auth')) {
|
||||
// return view('widgets/podcastplayer', ['podcast' => null]);
|
||||
}
|
||||
|
||||
return view('widgets/podcastplayer', ['podcast' => $podcast]);
|
||||
}
|
||||
|
||||
public function podcast(Request $request, $id)
|
||||
{
|
||||
$apiResult = $this->API('podcast/details/' . (int)$id);
|
||||
@@ -52,23 +39,16 @@ class StreamController extends Controller
|
||||
}
|
||||
|
||||
return view('listen', [
|
||||
'source' => $this->API_URL . 'podcast/stream/' . $apiResult->url,
|
||||
'source' => $this->API_URL . 'podcast/download' . $apiResult->url . '?auth=' . $podcast->auth,
|
||||
'title' => $podcast->title,
|
||||
'content' => $podcast->title,
|
||||
'lengte' => $podcast->duration / 1000,
|
||||
'waveform' => $podcast->waveform,
|
||||
'isStream' => false,
|
||||
'canDownload' => $this->API_URL . 'podcast/download/' . $apiResult->url ]);
|
||||
'canDownload' => true ]);
|
||||
}
|
||||
|
||||
public function program(Request $request, $year, $month, $day, $hour, $duration, $offset = 0) {
|
||||
$date = (new \DateTimeImmutable())->setDate($year, $month, $day)->setTime($hour, 0, 0);
|
||||
$current = $date->add(\DateInterval::createFromDateString($offset . ' hours'));
|
||||
|
||||
$programma = $this->API("programma/details/" . $current->Format("Y/m/d/H"));
|
||||
if(!$programma->is_beschikbaar) {
|
||||
return view('listen', ['notAvailable' => true]);
|
||||
}
|
||||
$current = $date->add(\DateInterval::createFromDateString($offset . ' hours'));
|
||||
|
||||
$hours = [];
|
||||
for($i = 0; $i < $duration; $i++) {
|
||||
@@ -78,12 +58,10 @@ class StreamController extends Controller
|
||||
}
|
||||
|
||||
return view('listen', [
|
||||
'source' => $this->API_URL . 'programma/stream/' . $current->format('Y/m/d/H'),
|
||||
'source' => $this->API_URL . 'programma/download/' . $current->format('Y/m/d/H') . '/1',
|
||||
'tabs' => $hours,
|
||||
'title' => 'Uitzending terugluisteren',
|
||||
'lengte' => $programma->waveform->length,
|
||||
'waveform' => $programma->waveform,
|
||||
'content' => $programma->programma->name . ' van ' . $current->format('d-m-Y, H') . ':00 uur',
|
||||
'content' => 'de uitzending van ' . $current->format('d-m-Y, H') . ':00 uur',
|
||||
'isStream' => false,
|
||||
'canDownload' => false ]);
|
||||
}
|
||||
@@ -99,10 +77,10 @@ class StreamController extends Controller
|
||||
|
||||
public function kerkdienst(Request $request) {
|
||||
return view('listen', [
|
||||
'source' => $this->API_URL . 'kerkdienst/stream',
|
||||
'source' => $this->API_URL . 'kerkdienst/download',
|
||||
'title' => 'Kerkdienst gemist',
|
||||
'content' => 'de kerkdienst van afgelopen zondag',
|
||||
'isStream' => false,
|
||||
'canDownload' => $this->API_URL . 'kerkdienst/download' ]);
|
||||
'canDownload' => true ]);
|
||||
}
|
||||
}
|
||||
|
||||
0
app/Http/Kernel.php
Executable file → Normal file
0
app/Http/Middleware/EncryptCookies.php
Executable file → Normal file
0
app/Http/Middleware/RedirectIfAuthenticated.php
Executable file → Normal file
0
app/Http/Middleware/TrimStrings.php
Executable file → Normal file
0
app/Http/Middleware/VerifyCsrfToken.php
Executable file → Normal file
@@ -1,45 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Mail;
|
||||
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Mail\Mailable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
|
||||
class ContactFormSubmitted extends Mailable
|
||||
{
|
||||
use Queueable, SerializesModels;
|
||||
|
||||
public $data;
|
||||
public $attachments_files;
|
||||
|
||||
/**
|
||||
* Create a new message instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($data, $attachments_files = [])
|
||||
{
|
||||
$this->data = $data;
|
||||
$this->attachments_files = $attachments_files;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the message.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function build()
|
||||
{
|
||||
$email = $this->view('emails.contact_submitted')
|
||||
->subject('Nieuw contactformulier bericht van NH Gooi')
|
||||
->replyTo($this->data['email'], $this->data['name']);
|
||||
|
||||
if (isset($this->attachments_files['image'])) {
|
||||
$email->attach($this->attachments_files['image']);
|
||||
}
|
||||
|
||||
return $email;
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Model;
|
||||
|
||||
class Blog extends Model {
|
||||
public $id;
|
||||
public $title;
|
||||
public $description;
|
||||
public $news_category;
|
||||
public $start_date;
|
||||
public $end_date;
|
||||
public $is_active;
|
||||
|
||||
public $url;
|
||||
|
||||
public function __construct($data, $images = null, $podcast = null) {
|
||||
parent::__construct($data);
|
||||
parent::ConvertToDateTime($this->start_date);
|
||||
parent::ConvertToDateTime($this->end_date);
|
||||
|
||||
$this->url = "/blog/{$this->id}/" . parent::url_slug($this->title);
|
||||
}
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Model;
|
||||
|
||||
class CalendarEvent extends Model {
|
||||
public $id;
|
||||
public $title;
|
||||
public $region;
|
||||
public $content;
|
||||
public $starts;
|
||||
public $ends;
|
||||
public $images;
|
||||
public $podcast;
|
||||
public $video;
|
||||
public $keywords;
|
||||
public $url;
|
||||
public $metadata;
|
||||
public $tags;
|
||||
|
||||
public function __construct($data, $images = null, $podcast = null) {
|
||||
parent::__construct($data);
|
||||
parent::ConvertToDateTime($this->starts);
|
||||
parent::ConvertToDateTime($this->ends);
|
||||
|
||||
$this->keywords = null;
|
||||
if(isset($data->keywords)) {
|
||||
if(is_array($data->keywords)) {
|
||||
$this->keywords = $data->keywords;
|
||||
} else if(trim($data->keywords)) {
|
||||
$this->keywords = explode(' ', $data->keywords);
|
||||
}
|
||||
}
|
||||
|
||||
if($podcast)
|
||||
{
|
||||
$this->podcast = new \Model\Podcast($podcast);
|
||||
} else if(isset($data->podcast) && $data->podcast) {
|
||||
$this->podcast = new \Model\Podcast($data->podcast);
|
||||
}
|
||||
|
||||
$images = ($images != null) ? $images
|
||||
: (isset($data->images) ? $data->images : null);
|
||||
if($images) {
|
||||
$this->images = [];
|
||||
foreach($images as $image) {
|
||||
$this->images[] = new NewsImage($image, '/img/news/');
|
||||
}
|
||||
}
|
||||
|
||||
$this->url = "/agenda/{$this->id}/" . parent::url_slug($this->title);
|
||||
$this->metadata = (new MetaData())
|
||||
->set('title', $this->title)
|
||||
->set('description', strip_tags($this->excerpt()))
|
||||
->set('image', isset($this->images) && count($this->images) ? $this->images[0]->url : null )
|
||||
->set('audio', isset($this->podcast) ? $this->podcast->url : null)
|
||||
;
|
||||
}
|
||||
|
||||
public function excerpt() {
|
||||
$hasImages = isset($this->images) && count($this->images) > 0;
|
||||
$maxLength = $hasImages ? 200 : 500;
|
||||
return '<p class="news-excerpt ' . ($hasImages ? 'short' : 'long') . '">' .
|
||||
substr($this->content, 0, $maxLength) .
|
||||
(strlen($this->content) > $maxLength ? '...' : '') .
|
||||
'</p>';
|
||||
}
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Model;
|
||||
|
||||
class JobOpening extends Model {
|
||||
public $id;
|
||||
public $title;
|
||||
public $content;
|
||||
public $starts;
|
||||
public $ends;
|
||||
public $images;
|
||||
public $url;
|
||||
|
||||
public function __construct($data, $images = null, $podcast = null) {
|
||||
parent::__construct($data);
|
||||
parent::ConvertToDateTime($this->starts);
|
||||
parent::ConvertToDateTime($this->ends);
|
||||
|
||||
$this->keywords = null;
|
||||
if(isset($data->keywords)) {
|
||||
if(is_array($data->keywords)) {
|
||||
$this->keywords = $data->keywords;
|
||||
} else if(trim($data->keywords)) {
|
||||
$this->keywords = explode(' ', $data->keywords);
|
||||
}
|
||||
}
|
||||
|
||||
if($podcast)
|
||||
{
|
||||
$this->podcast = new \Model\Podcast($podcast);
|
||||
} else if(isset($data->podcast) && $data->podcast) {
|
||||
$this->podcast = new \Model\Podcast($data->podcast);
|
||||
}
|
||||
|
||||
$images = ($images != null) ? $images
|
||||
: (isset($data->images) ? $data->images : null);
|
||||
if($images) {
|
||||
$this->images = [];
|
||||
foreach($images as $image) {
|
||||
$this->images[] = new NewsImage($image, '/img/news/');
|
||||
}
|
||||
}
|
||||
|
||||
$this->url = "/vacatures/{$this->id}/" . parent::url_slug($this->title);
|
||||
$this->metadata = (new MetaData())
|
||||
->set('title', $this->title)
|
||||
->set('description', strip_tags($this->excerpt()))
|
||||
->set('image', isset($this->images) && count($this->images) ? $this->images[0]->url : null )
|
||||
->set('audio', isset($this->podcast) ? $this->podcast->url : null)
|
||||
;
|
||||
}
|
||||
|
||||
public function excerpt() {
|
||||
$hasImages = count($this->images) > 0;
|
||||
$maxLength = $hasImages ? 200 : 500;
|
||||
return '<p class="news-excerpt ' . ($hasImages ? 'short' : 'long') . '">' .
|
||||
substr($this->content, 0, $maxLength) .
|
||||
(strlen($this->content) > $maxLength ? '...' : '') .
|
||||
'</p>';
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Model;
|
||||
|
||||
class KerkdienstInstance extends Model {
|
||||
public $name;
|
||||
public $start;
|
||||
|
||||
public function __construct($data) {
|
||||
parent::__construct($data);
|
||||
parent::ConvertToDateTime($this->start);
|
||||
}
|
||||
}
|
||||
|
||||
class Kerkdienst extends Model {
|
||||
public $isRunning;
|
||||
public $previous;
|
||||
public $next;
|
||||
|
||||
public function __construct($data) {
|
||||
// parent::__construct($data);
|
||||
$this->isRunning = $data->isRunning;
|
||||
$this->previous = new KerkdienstInstance($data->previous);
|
||||
$this->next = new KerkdienstInstance($data->next);
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
<?php
|
||||
namespace Model;
|
||||
|
||||
class MetaData {
|
||||
private $data = ['type' => 'article', 'locale' => 'nl-nl'];
|
||||
|
||||
public function set($prop, $val) {
|
||||
if($val) {
|
||||
$this->data[$prop] = $val;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function append($prop, $val) {
|
||||
if(array_key_exists($prop, $this->data)) {
|
||||
$this->data[$prop] .= $val;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function prepend($prop, $val) {
|
||||
if(array_key_exists($prop, $this->data)) {
|
||||
$this->data[$prop] = $val . $this->data[$prop];
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function metaTags() {
|
||||
foreach($this->data as $prop => $val) {
|
||||
if($val) {
|
||||
echo "<meta property=\"og:$prop\" content=\"" . htmlentities($val) . "\" />\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Model;
|
||||
|
||||
class Model {
|
||||
protected function ConvertToDateTime(&$field) {
|
||||
if($field) {
|
||||
// PHP7 JSON-encodes to {date: "", "timezone_type": ..., "timezone": "UTC" }
|
||||
// In that case $field will be an object
|
||||
if(is_object($field)) {
|
||||
$field = ($field->timezone)
|
||||
? new \DateTimeImmutable($field->date, new \DateTimeZone($field->timezone))
|
||||
: (new \DateTimeImmutable($field->date));
|
||||
} else {
|
||||
// If $field is not an object, assume it's a plain, valid, string
|
||||
$field = new \DateTime($field);
|
||||
}
|
||||
|
||||
if($field === false || $field->getTimestamp() <= 0) {
|
||||
// If field had data but is invalid DateTime or is 0000-00-00 00:00, set it to null.
|
||||
$field = null;
|
||||
} else {
|
||||
// If valid, return local timezone
|
||||
$field->setTimezone(new \DateTimeZone("Europe/Amsterdam"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function __construct($data) {
|
||||
$class = get_class($this);
|
||||
foreach($data as $key => $val) {
|
||||
if(property_exists($class, $key)) {
|
||||
$this->$key = is_string($val) ? stripslashes($val) : $val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function url_slug($text) {
|
||||
// Alles naar kleine letter
|
||||
$text = strtolower($text);
|
||||
|
||||
// Vervang accent-tekens door niet-geaccentueerde versies
|
||||
// $text = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $text);
|
||||
$search = explode(",","ç,æ,œ,á,é,í,ó,ú,à,è,ì,ò,ù,ä,ë,ï,ö,ü,ÿ,â,ê,î,ô,û,å,e,i,ø,u");
|
||||
$replace = explode(",","c,ae,oe,a,e,i,o,u,a,e,i,o,u,a,e,i,o,u,y,a,e,i,o,u,a,e,i,o,u");
|
||||
$text = str_replace($search, $replace, $text);
|
||||
|
||||
// Verwijder alle woorden van 3 letters, behalve BEL (BEL-combinatie etc)
|
||||
if(strlen($text) > 3) {
|
||||
$text = preg_replace('/\b(?!bel|fm|nh)([a-z]{1,3})\b/u', '', $text);
|
||||
}
|
||||
|
||||
// Vervang alles dat niet een woord-karakter is (letter, cijfer), een streepje of spatie
|
||||
if(strlen($text) > 3) {
|
||||
$text = preg_replace('/[^\w_\-\s]/', '', $text);
|
||||
}
|
||||
|
||||
// Reeksen van één of meer spaties / streepjes vervangen door een enkel streepje
|
||||
$text = preg_replace('/[\-\s]+/', '-', $text);
|
||||
|
||||
// Verwijder alle witruimte / streepjes aan begin en eind
|
||||
return trim(strtolower($text), '-');
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Model;
|
||||
|
||||
class NewsImage extends Model {
|
||||
public $id;
|
||||
public $title;
|
||||
public $author;
|
||||
public $url;
|
||||
|
||||
public function __construct($data, $urlPrefix = '/') {
|
||||
parent::__construct($data);
|
||||
|
||||
// Deserialisatie van JSON heeft url in data,
|
||||
// lezen uit database heeft file en (als het goed is) urlPrefix
|
||||
if(isset($data->file)) {
|
||||
$this->url = $urlPrefix . $data->file;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,118 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Model;
|
||||
|
||||
require_once "NewsImage.php";
|
||||
require_once "NewsSource.php";
|
||||
require_once "MetaData.php";
|
||||
|
||||
class NewsItem extends Model {
|
||||
public $id;
|
||||
public $title;
|
||||
public $author;
|
||||
public $content;
|
||||
public $published;
|
||||
public $edited;
|
||||
public $keywords;
|
||||
|
||||
public $source;
|
||||
public $category;
|
||||
public $theme;
|
||||
public $region;
|
||||
public $tags;
|
||||
|
||||
public $podcast;
|
||||
public $images;
|
||||
public $video;
|
||||
public $type;
|
||||
public $url;
|
||||
public $metadata;
|
||||
|
||||
public function __construct($data, $images = null, $podcast = null) {
|
||||
parent::__construct($data);
|
||||
parent::ConvertToDateTime($this->published);
|
||||
parent::ConvertToDateTime($this->edited);
|
||||
|
||||
if($this->edited && ($this->edited->getTimestamp() - $this->published->getTimestamp() < 1800 /* == 30 minutes */)) {
|
||||
// If last edit was within grace period, consider it unedited (note: currently RES always saves edited == published on creation)
|
||||
$this->edited = null;
|
||||
}
|
||||
|
||||
$this->source = null;
|
||||
if(isset($data->source))
|
||||
{
|
||||
if(is_object($data->source))
|
||||
{
|
||||
$this->source = new \Model\NewsSource($data->source->title, $data->source->url, $data->source->show);
|
||||
} else if($data->source) {
|
||||
$this->source = new \Model\NewsSource($data->source, $data->source_url, $data->showsource);
|
||||
}
|
||||
}
|
||||
|
||||
if($podcast) {
|
||||
$this->podcast = new \Model\Podcast($podcast);
|
||||
} else if(isset($data->podcast) && $data->podcast) {
|
||||
$this->podcast = new \Model\Podcast($data->podcast);
|
||||
}
|
||||
|
||||
$this->keywords = null;
|
||||
if(isset($data->keywords)) {
|
||||
if(is_array($data->keywords) || is_object($data->keywords)) {
|
||||
$this->keywords = $data->keywords;
|
||||
} else if(trim($data->keywords)) {
|
||||
$this->keywords = explode(' ', $data->keywords);
|
||||
}
|
||||
}
|
||||
|
||||
if(isset($data->region)) {
|
||||
if(is_object($data->region)) {
|
||||
$this->region = new \Model\NewsRegion($data->region->title, $data->region->slug);
|
||||
} else {
|
||||
$this->region = new \Model\NewsRegion($data->region, $data->region_slug);
|
||||
}
|
||||
}
|
||||
|
||||
if(isset($data->theme)) {
|
||||
if(is_object($data->theme)) {
|
||||
$this->theme = new \Model\NewsRegion($data->theme->title, $data->theme->slug);
|
||||
} else {
|
||||
$this->theme = new \Model\NewsRegion($data->theme, $data->theme_slug);
|
||||
}
|
||||
}
|
||||
|
||||
if(isset($data->tags)) {
|
||||
foreach($data->tags as $tag) {
|
||||
$this->theme = new \Model\NewsRegion($tag->titel, $tag->slug);
|
||||
}
|
||||
}
|
||||
|
||||
$images = ($images != null) ? $images
|
||||
: (isset($data->images) ? $data->images : null);
|
||||
if($images) {
|
||||
$this->images = [];
|
||||
foreach($images as $image) {
|
||||
$this->images[] = new NewsImage($image, '/img/news/');
|
||||
}
|
||||
}
|
||||
|
||||
$this->url = "/nieuws/{$this->id}/" . parent::url_slug($this->title);
|
||||
$this->metadata = (new MetaData())
|
||||
->set('title', $this->title)
|
||||
->set('description', strip_tags($this->excerpt()))
|
||||
->set('image', isset($this->images) && count($this->images) ? $this->images[0]->url : null )
|
||||
->set('video', isset($this->video) ? $this->video : null)
|
||||
->set('audio', isset($this->podcast) ? $this->podcast->url : null)
|
||||
->set('article:published_time', $this->published->format('r'))
|
||||
->set('article:modified_time', $this->edited ? $this->edited->format('r') : null)
|
||||
;
|
||||
}
|
||||
|
||||
public function excerpt() {
|
||||
$hasImages = isset($this->images) && count($this->images) > 0;
|
||||
$maxLength = $hasImages ? 200 : 500;
|
||||
return '<p class="news-excerpt ' . ($hasImages ? 'short' : 'long') . '">' .
|
||||
substr($this->content, 0, $maxLength) .
|
||||
(strlen($this->content) > $maxLength ? '...' : '') .
|
||||
'</p>';
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Model;
|
||||
|
||||
class NewsRegion {
|
||||
public $title;
|
||||
public $slug;
|
||||
|
||||
public function __construct($title, $slug = null) {
|
||||
$this->title = $title;
|
||||
$this->slug = $slug ? $slug : strtolower(str_replace(' ', '', $title));
|
||||
}
|
||||
}
|
||||
|
||||
class NewsSource {
|
||||
public $title;
|
||||
public $url;
|
||||
public $show;
|
||||
|
||||
public function __construct($title, $url, $show) {
|
||||
$this->title = $title;
|
||||
$this->url = $url;
|
||||
$this->show = $show;
|
||||
}
|
||||
}
|
||||
@@ -1,94 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Model;
|
||||
|
||||
require_once "NewsImage.php";
|
||||
|
||||
class Podcast extends Model {
|
||||
public $id;
|
||||
public $title;
|
||||
public $content;
|
||||
protected $soundfilename;
|
||||
public $created;
|
||||
public $program;
|
||||
public $url;
|
||||
public $auth;
|
||||
public $download;
|
||||
public $duration;
|
||||
public $image;
|
||||
public $metadata;
|
||||
public $waveform;
|
||||
private $key;
|
||||
|
||||
public function __construct($data) {
|
||||
parent::__construct($data);
|
||||
parent::ConvertToDateTime($this->created);
|
||||
|
||||
$this->url = '/' . $this->id . '/' . parent::url_slug($this->title) . '.mp3';
|
||||
if($this->soundfilename) {
|
||||
// Only generate when not constructing from a JSON object
|
||||
$this->key = sha1($this->id . ':' . date('Y-m-d') . ':' . $this->soundfilename);
|
||||
$this->auth = $this->key;
|
||||
}
|
||||
|
||||
if(isset($data->program)) {
|
||||
$this->program = null;
|
||||
if(is_object($data->program)) {
|
||||
$this->program = new \Model\Program($data->program);
|
||||
} elseif($data->program) {
|
||||
$this->program = new \Model\Program(['id' => $data->program, 'name' => $data->program_name, 'description' => $data->program_description]);
|
||||
}
|
||||
}
|
||||
|
||||
if(isset($data->imagefile)) {
|
||||
$imagedata = new \stdClass();
|
||||
$imagedata->id = $this->id;
|
||||
$imagedata->file = $data->imagefile;
|
||||
$imagedata->title = $data->imagecaption;
|
||||
$this->image = new NewsImage($imagedata, '/img/podcast/');
|
||||
}
|
||||
|
||||
if(isset($data->metadata, $data->metadata->waveform)){
|
||||
$this->waveform = $data->metadata->waveform;
|
||||
}
|
||||
|
||||
$this->metadata = (new MetaData())
|
||||
->set('title', $this->title)
|
||||
->set('description', strip_tags($this->excerpt()))
|
||||
->set('image', isset($this->image) ? $this->image->url : null )
|
||||
->set('audio', $this->url)
|
||||
;
|
||||
}
|
||||
|
||||
public function titleWithoutProgram() {
|
||||
if(!$this->program) { return $this->title; }
|
||||
return trim(str_replace($this->program->name, '', $this->title), "- \t\n\r\0\x0B");
|
||||
}
|
||||
|
||||
public function isValidAuth($key) {
|
||||
return ($key == $this->key);
|
||||
}
|
||||
|
||||
public function getSoundfile() {
|
||||
return '/var/audio/podcast/' . $this->soundfilename;
|
||||
}
|
||||
|
||||
public function formatDuration() {
|
||||
$seconds = $this->duration / 1000;
|
||||
$milliseconds = $this->duration % 1000;
|
||||
|
||||
$hours = ($seconds > 3600) ? floor($seconds / 3600) : 0;
|
||||
$seconds %= 3600;
|
||||
return str_pad($hours, 2, '0', STR_PAD_LEFT)
|
||||
. gmdate(':i:s', $seconds)
|
||||
;//. ($milliseconds ? ".$milliseconds" : '') ;
|
||||
}
|
||||
|
||||
public function excerpt() {
|
||||
$maxLength = 500;
|
||||
return '<p class="news-excerpt long">' .
|
||||
substr($this->content, 0, $maxLength) .
|
||||
(strlen($this->content) > $maxLength ? '...' : '') .
|
||||
'</p>';
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Model;
|
||||
|
||||
class Program extends Model {
|
||||
public $id;
|
||||
public $name;
|
||||
public $tagline;
|
||||
public $description;
|
||||
public $email;
|
||||
public $nonstop;
|
||||
public $rerun;
|
||||
public $priority;
|
||||
public $image;
|
||||
|
||||
public $hosts;
|
||||
public $recent;
|
||||
public $next;
|
||||
|
||||
public function __construct($data) {
|
||||
parent::__construct($data);
|
||||
|
||||
if(isset($data->suffix) && $data->suffix) {
|
||||
$this->name .= ' ' . $data->suffix;
|
||||
}
|
||||
|
||||
if($this->recent && $this->recent) {
|
||||
foreach($this->recent as &$recent) {
|
||||
parent::ConvertToDateTime($recent->starts);
|
||||
parent::ConvertToDateTime($recent->ends);
|
||||
}
|
||||
}
|
||||
if($this->next && $this->next) {
|
||||
foreach($this->next as &$next) {
|
||||
parent::ConvertToDateTime($next->starts);
|
||||
parent::ConvertToDateTime($next->ends);
|
||||
}
|
||||
}
|
||||
|
||||
if(isset($data->email) && ($mailComma = strpos($data->email, ',')) !== false) {
|
||||
$this->email = substr($data->email, 0, $mailComma);
|
||||
}
|
||||
|
||||
if(isset($data->state)) {
|
||||
$this->nonstop = $data->state == 0;
|
||||
$this->rerun = $data->state == 3;
|
||||
}
|
||||
|
||||
$this->url = "/{$this->id}/" . parent::url_slug($this->name);
|
||||
}
|
||||
|
||||
public function isSpecial() {
|
||||
return ($this->priority < 2);
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Model;
|
||||
|
||||
class ProgramHost extends Model {
|
||||
public $id;
|
||||
public $name;
|
||||
public $email;
|
||||
}
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Model;
|
||||
|
||||
class Track extends Model {
|
||||
public $start;
|
||||
public $itemCode;
|
||||
public $title;
|
||||
public $artist;
|
||||
public $duration;
|
||||
public $ends;
|
||||
public $isLayout;
|
||||
|
||||
public function __construct($data) {
|
||||
parent::__construct($data);
|
||||
parent::ConvertToDateTime($this->start);
|
||||
parent::ConvertToDateTime($this->ends);
|
||||
$isLayout = $this->isLayout();
|
||||
}
|
||||
|
||||
private static $IDENTS = ['UURSLUITER' => 'Nieuws', 'NIEUWSOPEN ' => 'Nieuws', 'ANWB' => 'Verkeersinformatie', 'REGIO' => 'Regionieuws', 'CB' => 'Reclame'];
|
||||
|
||||
public function isLayout() {
|
||||
foreach(self::$IDENTS as $ident => $display) {
|
||||
if(substr($this->itemCode, 0, strlen($ident)) == $ident || substr($this->title, 0, strlen($ident)) == $ident) {
|
||||
$this->title = $display;
|
||||
$this->artist = "";
|
||||
$this->itemCode = '_' . $this->itemCode;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if(strlen($this->itemCode) > 0 && ($this->itemCode[0] == 'V')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function ends($ends = null) {
|
||||
$this->ends = $ends;
|
||||
}
|
||||
|
||||
public function secondsRemaining() {
|
||||
return ($this->ends) ? ($this->ends->getTimestamp() - time()) : -1;
|
||||
}
|
||||
}
|
||||
6
app/Providers/AppServiceProvider.php
Executable file → Normal file
@@ -3,8 +3,6 @@
|
||||
namespace App\Providers;
|
||||
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Ossycodes\FriendlyCaptcha\Rules\FriendlyCaptcha as FriendlyCaptchaRule;
|
||||
|
||||
class AppServiceProvider extends ServiceProvider
|
||||
{
|
||||
@@ -16,10 +14,6 @@ class AppServiceProvider extends ServiceProvider
|
||||
public function boot()
|
||||
{
|
||||
\Illuminate\Support\Facades\URL::forceScheme('https');
|
||||
|
||||
Rule::macro('friendlycaptcha', function () {
|
||||
return app(FriendlyCaptchaRule::class);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
0
app/Providers/AuthServiceProvider.php
Executable file → Normal file
0
app/Providers/BroadcastServiceProvider.php
Executable file → Normal file
0
app/Providers/EventServiceProvider.php
Executable file → Normal file
0
app/Providers/RouteServiceProvider.php
Executable file → Normal file
0
app/User.php
Executable file → Normal file
0
bootstrap/app.php
Executable file → Normal file
0
bootstrap/autoload.php
Executable file → Normal file
0
bootstrap/cache/.gitignore
vendored
Executable file → Normal file
11
bootstrap/cache/packages.php
vendored
@@ -53,17 +53,6 @@
|
||||
0 => 'Termwind\\Laravel\\TermwindServiceProvider',
|
||||
),
|
||||
),
|
||||
'ossycodes/friendlycaptcha' =>
|
||||
array (
|
||||
'aliases' =>
|
||||
array (
|
||||
'FriendlyCaptcha' => 'Ossycodes\\FriendlyCaptcha\\Facades\\FriendlyCaptcha',
|
||||
),
|
||||
'providers' =>
|
||||
array (
|
||||
0 => 'Ossycodes\\FriendlyCaptcha\\FriendlyCaptchaServiceProvider',
|
||||
),
|
||||
),
|
||||
'spatie/laravel-ignition' =>
|
||||
array (
|
||||
'providers' =>
|
||||
|
||||
26
bootstrap/cache/services.php
vendored
@@ -30,14 +30,13 @@
|
||||
26 => 'Carbon\\Laravel\\ServiceProvider',
|
||||
27 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
|
||||
28 => 'Termwind\\Laravel\\TermwindServiceProvider',
|
||||
29 => 'Ossycodes\\FriendlyCaptcha\\FriendlyCaptchaServiceProvider',
|
||||
30 => 'Spatie\\LaravelIgnition\\IgnitionServiceProvider',
|
||||
31 => 'Collective\\Html\\HtmlServiceProvider',
|
||||
32 => 'Laravel\\Tinker\\TinkerServiceProvider',
|
||||
33 => 'App\\Providers\\AppServiceProvider',
|
||||
34 => 'App\\Providers\\AuthServiceProvider',
|
||||
35 => 'App\\Providers\\EventServiceProvider',
|
||||
36 => 'App\\Providers\\RouteServiceProvider',
|
||||
29 => 'Spatie\\LaravelIgnition\\IgnitionServiceProvider',
|
||||
30 => 'Collective\\Html\\HtmlServiceProvider',
|
||||
31 => 'Laravel\\Tinker\\TinkerServiceProvider',
|
||||
32 => 'App\\Providers\\AppServiceProvider',
|
||||
33 => 'App\\Providers\\AuthServiceProvider',
|
||||
34 => 'App\\Providers\\EventServiceProvider',
|
||||
35 => 'App\\Providers\\RouteServiceProvider',
|
||||
),
|
||||
'eager' =>
|
||||
array (
|
||||
@@ -55,12 +54,11 @@
|
||||
11 => 'Carbon\\Laravel\\ServiceProvider',
|
||||
12 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
|
||||
13 => 'Termwind\\Laravel\\TermwindServiceProvider',
|
||||
14 => 'Ossycodes\\FriendlyCaptcha\\FriendlyCaptchaServiceProvider',
|
||||
15 => 'Spatie\\LaravelIgnition\\IgnitionServiceProvider',
|
||||
16 => 'App\\Providers\\AppServiceProvider',
|
||||
17 => 'App\\Providers\\AuthServiceProvider',
|
||||
18 => 'App\\Providers\\EventServiceProvider',
|
||||
19 => 'App\\Providers\\RouteServiceProvider',
|
||||
14 => 'Spatie\\LaravelIgnition\\IgnitionServiceProvider',
|
||||
15 => 'App\\Providers\\AppServiceProvider',
|
||||
16 => 'App\\Providers\\AuthServiceProvider',
|
||||
17 => 'App\\Providers\\EventServiceProvider',
|
||||
18 => 'App\\Providers\\RouteServiceProvider',
|
||||
),
|
||||
'deferred' =>
|
||||
array (
|
||||
|
||||
5
composer.json
Executable file → Normal file
@@ -10,8 +10,7 @@
|
||||
"laravel/framework": "^9.19",
|
||||
"laravel/sanctum": "^3.0",
|
||||
"laravel/tinker": "^2.7",
|
||||
"laravelcollective/html": "^6.3",
|
||||
"ossycodes/friendlycaptcha": "^3.0"
|
||||
"laravelcollective/html": "^6.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"fakerphp/faker": "^1.9.1",
|
||||
@@ -28,7 +27,7 @@
|
||||
"Database\\Factories\\": "database/factories/",
|
||||
"Database\\Seeders\\": "database/seeders/",
|
||||
"Helpers\\": "app/Helpers",
|
||||
"Model\\": "app/Models"
|
||||
"Model\\": "/srv/api/common/classes"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
|
||||
132
composer.lock
generated
Executable file → Normal file
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "f9a3eebc09010b2b187541a3e59a0eff",
|
||||
"content-hash": "f70c81adf2990f185a8632535bd08631",
|
||||
"packages": [
|
||||
{
|
||||
"name": "brick/math",
|
||||
@@ -1934,37 +1934,34 @@
|
||||
},
|
||||
{
|
||||
"name": "nette/schema",
|
||||
"version": "v1.3.3",
|
||||
"version": "v1.2.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nette/schema.git",
|
||||
"reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004"
|
||||
"reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/nette/schema/zipball/2befc2f42d7c715fd9d95efc31b1081e5d765004",
|
||||
"reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004",
|
||||
"url": "https://api.github.com/repos/nette/schema/zipball/abbdbb70e0245d5f3bf77874cea1dfb0c930d06f",
|
||||
"reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"nette/utils": "^4.0",
|
||||
"php": "8.1 - 8.5"
|
||||
"nette/utils": "^2.5.7 || ^3.1.5 || ^4.0",
|
||||
"php": ">=7.1 <8.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"nette/tester": "^2.5.2",
|
||||
"phpstan/phpstan-nette": "^2.0@stable",
|
||||
"tracy/tracy": "^2.8"
|
||||
"nette/tester": "^2.3 || ^2.4",
|
||||
"phpstan/phpstan-nette": "^1.0",
|
||||
"tracy/tracy": "^2.7"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.3-dev"
|
||||
"dev-master": "1.2-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Nette\\": "src"
|
||||
},
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
@@ -1993,36 +1990,34 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/nette/schema/issues",
|
||||
"source": "https://github.com/nette/schema/tree/v1.3.3"
|
||||
"source": "https://github.com/nette/schema/tree/v1.2.3"
|
||||
},
|
||||
"time": "2025-10-30T22:57:59+00:00"
|
||||
"time": "2022-10-13T01:24:26+00:00"
|
||||
},
|
||||
{
|
||||
"name": "nette/utils",
|
||||
"version": "v4.1.1",
|
||||
"version": "v3.2.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nette/utils.git",
|
||||
"reference": "c99059c0315591f1a0db7ad6002000288ab8dc72"
|
||||
"reference": "02a54c4c872b99e4ec05c4aec54b5a06eb0f6368"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/nette/utils/zipball/c99059c0315591f1a0db7ad6002000288ab8dc72",
|
||||
"reference": "c99059c0315591f1a0db7ad6002000288ab8dc72",
|
||||
"url": "https://api.github.com/repos/nette/utils/zipball/02a54c4c872b99e4ec05c4aec54b5a06eb0f6368",
|
||||
"reference": "02a54c4c872b99e4ec05c4aec54b5a06eb0f6368",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "8.2 - 8.5"
|
||||
"php": ">=7.2 <8.3"
|
||||
},
|
||||
"conflict": {
|
||||
"nette/finder": "<3",
|
||||
"nette/schema": "<1.2.2"
|
||||
"nette/di": "<3.0.6"
|
||||
},
|
||||
"require-dev": {
|
||||
"jetbrains/phpstorm-attributes": "^1.2",
|
||||
"nette/tester": "^2.5",
|
||||
"phpstan/phpstan-nette": "^2.0@stable",
|
||||
"tracy/tracy": "^2.9"
|
||||
"nette/tester": "~2.0",
|
||||
"phpstan/phpstan": "^1.0",
|
||||
"tracy/tracy": "^2.3"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-gd": "to use Image",
|
||||
@@ -2030,18 +2025,16 @@
|
||||
"ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
|
||||
"ext-json": "to use Nette\\Utils\\Json",
|
||||
"ext-mbstring": "to use Strings::lower() etc...",
|
||||
"ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()"
|
||||
"ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()",
|
||||
"ext-xml": "to use Strings::length() etc. when mbstring is not available"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "4.1-dev"
|
||||
"dev-master": "3.2-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Nette\\": "src"
|
||||
},
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
@@ -2082,9 +2075,9 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/nette/utils/issues",
|
||||
"source": "https://github.com/nette/utils/tree/v4.1.1"
|
||||
"source": "https://github.com/nette/utils/tree/v3.2.8"
|
||||
},
|
||||
"time": "2025-12-22T12:14:32+00:00"
|
||||
"time": "2022-09-12T23:36:20+00:00"
|
||||
},
|
||||
{
|
||||
"name": "nikic/php-parser",
|
||||
@@ -2228,69 +2221,6 @@
|
||||
],
|
||||
"time": "2022-12-20T19:00:15+00:00"
|
||||
},
|
||||
{
|
||||
"name": "ossycodes/friendlycaptcha",
|
||||
"version": "v3.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/ossycodes/friendlycaptcha.git",
|
||||
"reference": "b18dfab44ee5fff7d75412232eb6f834864efde6"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/ossycodes/friendlycaptcha/zipball/b18dfab44ee5fff7d75412232eb6f834864efde6",
|
||||
"reference": "b18dfab44ee5fff7d75412232eb6f834864efde6",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"guzzlehttp/guzzle": "^7.0",
|
||||
"illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0",
|
||||
"php": "^7.4|^8.0|^8.1|^8.2|^8.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"orchestra/testbench": "^6.0|^7.0|^8.0|^9.0",
|
||||
"phpunit/phpunit": "^8.0 || ^9.5 || ^10.5 || ^11.0 || ^12.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"aliases": {
|
||||
"FriendlyCaptcha": "Ossycodes\\FriendlyCaptcha\\Facades\\FriendlyCaptcha"
|
||||
},
|
||||
"providers": [
|
||||
"Ossycodes\\FriendlyCaptcha\\FriendlyCaptchaServiceProvider"
|
||||
]
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Ossycodes\\FriendlyCaptcha\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "ossycodes",
|
||||
"email": "osaigbovoemmanuel1@gmail.com",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "A simple package to help integrate FriendlyCaptcha in your Laravel applications.",
|
||||
"homepage": "https://github.com/ossycodes/friendlycaptcha",
|
||||
"keywords": [
|
||||
"captcha",
|
||||
"friendlycaptcha",
|
||||
"laravel"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/ossycodes/friendlycaptcha/issues",
|
||||
"source": "https://github.com/ossycodes/friendlycaptcha/tree/v3.0.0"
|
||||
},
|
||||
"time": "2025-05-08T13:30:49+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpoption/phpoption",
|
||||
"version": "1.9.0",
|
||||
@@ -8001,12 +7931,12 @@
|
||||
],
|
||||
"aliases": [],
|
||||
"minimum-stability": "dev",
|
||||
"stability-flags": {},
|
||||
"stability-flags": [],
|
||||
"prefer-stable": true,
|
||||
"prefer-lowest": false,
|
||||
"platform": {
|
||||
"php": "^8.0"
|
||||
"php": "^8.0.2"
|
||||
},
|
||||
"platform-dev": {},
|
||||
"plugin-api-version": "2.6.0"
|
||||
"platform-dev": [],
|
||||
"plugin-api-version": "2.3.0"
|
||||
}
|
||||
|
||||
0
config/app.php
Executable file → Normal file
0
config/auth.php
Executable file → Normal file
0
config/broadcasting.php
Executable file → Normal file
0
config/cache.php
Executable file → Normal file
0
config/database.php
Executable file → Normal file
12
config/filesystems.php
Executable file → Normal file
@@ -48,12 +48,12 @@ return [
|
||||
'root' => storage_path('app'),
|
||||
],
|
||||
|
||||
//'public' => [
|
||||
// 'driver' => 'local',
|
||||
// 'root' => storage_path('app/public'),
|
||||
// 'url' => env('APP_URL').'/storage',
|
||||
// 'visibility' => 'public',
|
||||
//],
|
||||
'public' => [
|
||||
'driver' => 'local',
|
||||
'root' => storage_path('app/public'),
|
||||
'url' => env('APP_URL').'/storage',
|
||||
'visibility' => 'public',
|
||||
],
|
||||
|
||||
's3' => [
|
||||
'driver' => 's3',
|
||||
|
||||
0
config/mail.php
Executable file → Normal file
0
config/queue.php
Executable file → Normal file
0
config/services.php
Executable file → Normal file
0
config/session.php
Executable file → Normal file
0
config/view.php
Executable file → Normal file
0
database/.gitignore
vendored
Executable file → Normal file
0
database/factories/ModelFactory.php
Executable file → Normal file
0
database/migrations/2014_10_12_000000_create_users_table.php
Executable file → Normal file
0
database/migrations/2014_10_12_100000_create_password_resets_table.php
Executable file → Normal file
0
database/migrations/2024_02_27_000000_create_pagestats_table.php
Executable file → Normal file
0
database/seeds/DatabaseSeeder.php
Executable file → Normal file
5
docker-compose.dev.yml
Executable file → Normal file
@@ -22,8 +22,3 @@ services:
|
||||
MYSQL_DATABASE: forge
|
||||
MYSQL_USER: forge
|
||||
MYSQL_PASSWORD: secret
|
||||
mailpit:
|
||||
image: axllent/mailpit:latest
|
||||
ports:
|
||||
- "8025:8025"
|
||||
- "1025:1025"
|
||||
|
||||
0
docker-compose.yml
Executable file → Normal file
0
docker/apache.conf
Executable file → Normal file
8
docker/apache.dev.conf
Executable file → Normal file
@@ -23,7 +23,7 @@ ServerTokens Prod
|
||||
<VirtualHost *:443>
|
||||
ServerName localhost
|
||||
ServerAdmin support@websight.nl
|
||||
DocumentRoot /var/www/html/public
|
||||
DocumentRoot /var/www/html
|
||||
|
||||
SSLEngine on
|
||||
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
|
||||
@@ -32,15 +32,15 @@ ServerTokens Prod
|
||||
SSLProtocol All -SSLv2 -SSLv3
|
||||
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
|
||||
|
||||
<Directory /var/www/html/public>
|
||||
<Directory /var/www/html/>
|
||||
Options -Indexes +FollowSymLinks +MultiViews
|
||||
AllowOverride All
|
||||
Order deny,allow
|
||||
Allow from all
|
||||
</Directory>
|
||||
|
||||
ErrorLog /var/log/apache2/error.log
|
||||
CustomLog /var/log/apache2/access.log combined
|
||||
ErrorLog /var/log/apache2/ssl-vhost-error.log
|
||||
CustomLog /var/log/apache2/ssl-vhost-access.log combined
|
||||
|
||||
</VirtualHost>
|
||||
</IfModule>
|
||||
|
||||
0
download_mediaplayer_plugins.php
Executable file → Normal file
6
env.example
Executable file → Normal file
@@ -18,7 +18,7 @@ REDIS_PASSWORD=null
|
||||
REDIS_PORT=6379
|
||||
|
||||
MAIL_DRIVER=smtp
|
||||
MAIL_HOST=in-v3.mailjet.com
|
||||
MAIL_HOST=in-v3.mailjet.com
|
||||
MAIL_PORT=25
|
||||
MAIL_USERNAME=mailjet_username
|
||||
MAIL_PASSWORD=mailjet_password
|
||||
@@ -37,7 +37,3 @@ DB_PASSWORD=dbpass
|
||||
|
||||
CACHE_DRIVER=file
|
||||
QUEUE_DRIVER=sync
|
||||
|
||||
FRIENDLY_CAPTCHA_SITEKEY=
|
||||
FRIENDLY_CAPTCHA_SECRET=
|
||||
FRIENDLY_CAPTCHA_DEBUG=true
|
||||
|
||||
0
package-lock.json
generated
Executable file → Normal file
0
package.json
Executable file → Normal file
0
phpunit.xml
Executable file → Normal file
0
public/.htaccess
Executable file → Normal file
0
public/android-chrome-192x192.png
Executable file → Normal file
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
0
public/android-chrome-512x512.png
Executable file → Normal file
|
Before Width: | Height: | Size: 183 KiB After Width: | Height: | Size: 183 KiB |
0
public/apple-touch-icon.png
Executable file → Normal file
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
0
public/css/airplay.png
Executable file → Normal file
|
Before Width: | Height: | Size: 606 B After Width: | Height: | Size: 606 B |
0
public/css/airplay.svg
Executable file → Normal file
|
Before Width: | Height: | Size: 417 B After Width: | Height: | Size: 417 B |
0
public/css/app.css
vendored
Executable file → Normal file
0
public/css/app.css.map
Executable file → Normal file
0
public/css/bootstrap-grid.css
vendored
Executable file → Normal file
0
public/css/bootstrap-grid.css.map
Executable file → Normal file
0
public/css/bootstrap-grid.min.css
vendored
Executable file → Normal file
0
public/css/bootstrap-grid.min.css.map
Executable file → Normal file
0
public/css/chromecast.png
Executable file → Normal file
|
Before Width: | Height: | Size: 951 B After Width: | Height: | Size: 951 B |
0
public/css/chromecast.svg
Executable file → Normal file
|
Before Width: | Height: | Size: 637 B After Width: | Height: | Size: 637 B |
0
public/css/components/posts.css.map
Executable file → Normal file
0
public/css/components/pretty_photo.css.map
Executable file → Normal file
0
public/css/images/ui-bg_flat_0_aaaaaa_40x100.png
Executable file → Normal file
|
Before Width: | Height: | Size: 274 B After Width: | Height: | Size: 274 B |
0
public/css/images/ui-bg_flat_0_eeeeee_40x100.png
Executable file → Normal file
|
Before Width: | Height: | Size: 274 B After Width: | Height: | Size: 274 B |
0
public/css/images/ui-bg_flat_55_ffffff_40x100.png
Executable file → Normal file
|
Before Width: | Height: | Size: 271 B After Width: | Height: | Size: 271 B |