mirror of
https://github.com/flarum/framework.git
synced 2024-12-14 08:03:37 +08:00
Build very rough HTML-only content
And redirect to the "no JS" mode if the JS app crashes on boot. ClientView/ClientAction is all a bit of a mess and will need to be radically cleaned up at some point...
This commit is contained in:
parent
bb89ef276f
commit
6f4d7a36b6
|
@ -174,13 +174,6 @@ export default class DiscussionPage extends mixin(Component, evented) {
|
||||||
* @param {Discussion} discussion
|
* @param {Discussion} discussion
|
||||||
*/
|
*/
|
||||||
init(discussion) {
|
init(discussion) {
|
||||||
// If the slug in the URL doesn't match up, we'll redirect so we have the
|
|
||||||
// correct one.
|
|
||||||
if (m.route.param('id') === discussion.id() && m.route.param('slug') !== discussion.slug()) {
|
|
||||||
m.route(app.route.discussion(discussion, m.route.param('near')), null, true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.discussion = discussion;
|
this.discussion = discussion;
|
||||||
|
|
||||||
app.setTitle(discussion.title());
|
app.setTitle(discussion.title());
|
||||||
|
@ -207,7 +200,7 @@ export default class DiscussionPage extends mixin(Component, evented) {
|
||||||
// the specific post that was routed to.
|
// the specific post that was routed to.
|
||||||
this.stream = new PostStream({discussion, includedPosts});
|
this.stream = new PostStream({discussion, includedPosts});
|
||||||
this.stream.on('positionChanged', this.positionChanged.bind(this));
|
this.stream.on('positionChanged', this.positionChanged.bind(this));
|
||||||
this.stream.goToNumber(m.route.param('near') || 1, true);
|
this.stream.goToNumber(m.route.param('near') || includedPosts[0].number(), true);
|
||||||
|
|
||||||
this.trigger('loaded', discussion);
|
this.trigger('loaded', discussion);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,18 +11,50 @@ class DiscussionAction extends ClientAction
|
||||||
{
|
{
|
||||||
$view = parent::render($request, $routeParams);
|
$view = parent::render($request, $routeParams);
|
||||||
|
|
||||||
|
$queryParams = $request->getQueryParams();
|
||||||
|
$page = max(1, array_get($queryParams, 'page'));
|
||||||
|
|
||||||
$params = [
|
$params = [
|
||||||
'id' => array_get($routeParams, 'id'),
|
'id' => array_get($routeParams, 'id'),
|
||||||
'page.near' => array_get($routeParams, 'near')
|
'page' => [
|
||||||
|
'near' => array_get($routeParams, 'near'),
|
||||||
|
'offset' => ($page - 1) * 20,
|
||||||
|
'limit' => 20
|
||||||
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
// FIXME: make sure this is extensible. 404s, pagination.
|
|
||||||
|
|
||||||
$document = $this->preload($params);
|
$document = $this->preload($params);
|
||||||
|
|
||||||
|
$getResource = function ($link) use ($document) {
|
||||||
|
return array_first($document->included, function ($key, $value) use ($link) {
|
||||||
|
return $value->type === $link->type && $value->id === $link->id;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$url = function ($newQueryParams) use ($queryParams, $document) {
|
||||||
|
$newQueryParams = array_merge($queryParams, $newQueryParams);
|
||||||
|
$queryString = [];
|
||||||
|
|
||||||
|
foreach ($newQueryParams as $k => $v) {
|
||||||
|
$queryString[] = $k . '=' . $v;
|
||||||
|
}
|
||||||
|
|
||||||
|
return app('Flarum\Http\UrlGeneratorInterface')
|
||||||
|
->toRoute('flarum.forum.discussion', ['id' => $document->data->id]) .
|
||||||
|
($queryString ? '?' . implode('&', $queryString) : '');
|
||||||
|
};
|
||||||
|
|
||||||
|
$posts = [];
|
||||||
|
|
||||||
|
foreach ($document->included as $resource) {
|
||||||
|
if ($resource->type === 'posts' && isset($resource->relationships->discussion) && isset($resource->attributes->contentHtml)) {
|
||||||
|
$posts[] = $resource;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$view->setTitle($document->data->attributes->title);
|
$view->setTitle($document->data->attributes->title);
|
||||||
$view->setDocument($document);
|
$view->setDocument($document);
|
||||||
$view->setContent(app('view')->make('flarum.forum::discussion', compact('document')));
|
$view->setContent(app('view')->make('flarum.forum::discussion', compact('document', 'page', 'getResource', 'posts', 'url')));
|
||||||
|
|
||||||
return $view;
|
return $view;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,18 +27,18 @@ class IndexAction extends ClientAction
|
||||||
|
|
||||||
$sort = array_pull($queryParams, 'sort');
|
$sort = array_pull($queryParams, 'sort');
|
||||||
$q = array_pull($queryParams, 'q');
|
$q = array_pull($queryParams, 'q');
|
||||||
|
$page = array_pull($queryParams, 'page', 1);
|
||||||
|
|
||||||
$params = [
|
$params = [
|
||||||
'sort' => $sort && isset($this->sortMap[$sort]) ? $this->sortMap[$sort] : '',
|
'sort' => $sort && isset($this->sortMap[$sort]) ? $this->sortMap[$sort] : '',
|
||||||
'filter' => ['q' => $q]
|
'filter' => compact('q'),
|
||||||
|
'page' => ['offset' => ($page - 1) * 20, 'limit' => 20]
|
||||||
];
|
];
|
||||||
|
|
||||||
// FIXME: make sure this is extensible. Support pagination.
|
|
||||||
|
|
||||||
$document = $this->preload($params);
|
$document = $this->preload($params);
|
||||||
|
|
||||||
$view->setDocument($document);
|
$view->setDocument($document);
|
||||||
$view->setContent(app('view')->make('flarum.forum::index', compact('document')));
|
$view->setContent(app('view')->make('flarum.forum::index', compact('document', 'page', 'forum')));
|
||||||
|
|
||||||
return $view;
|
return $view;
|
||||||
}
|
}
|
||||||
|
|
|
@ -237,10 +237,19 @@ class ClientView implements Renderable
|
||||||
] + $this->variables;
|
] + $this->variables;
|
||||||
$view->bootstrappers = $this->bootstrappers;
|
$view->bootstrappers = $this->bootstrappers;
|
||||||
|
|
||||||
|
$noJs = array_get($this->request->getQueryParams(), 'nojs');
|
||||||
|
|
||||||
$view->title = ($this->title ? $this->title . ' - ' : '') . $forum->data->attributes->title;
|
$view->title = ($this->title ? $this->title . ' - ' : '') . $forum->data->attributes->title;
|
||||||
$view->forum = $forum->data;
|
$view->forum = $forum->data;
|
||||||
$view->layout = app('view')->file($this->layout, ['forum' => $forum->data]);
|
$view->layout = app('view')->file($this->layout, [
|
||||||
$view->content = $this->content;
|
'forum' => $forum->data,
|
||||||
|
'content' => app('view')->file(__DIR__.'/../../views/content.blade.php', [
|
||||||
|
'content' => $this->content,
|
||||||
|
'noJs' => $noJs,
|
||||||
|
'forum' => $forum->data
|
||||||
|
])
|
||||||
|
]);
|
||||||
|
$view->noJs = $noJs;
|
||||||
|
|
||||||
$view->styles = [$this->assets->getCssFile()];
|
$view->styles = [$this->assets->getCssFile()];
|
||||||
$view->scripts = [$this->assets->getJsFile(), $this->locale->getFile()];
|
$view->scripts = [$this->assets->getJsFile(), $this->locale->getFile()];
|
||||||
|
|
|
@ -21,31 +21,27 @@
|
||||||
<div id="modal"></div>
|
<div id="modal"></div>
|
||||||
<div id="alerts"></div>
|
<div id="alerts"></div>
|
||||||
|
|
||||||
@foreach ($scripts as $file)
|
@if (! $noJs)
|
||||||
<script src="{{ str_replace(public_path(), '', $file) }}"></script>
|
@foreach ($scripts as $file)
|
||||||
@endforeach
|
<script src="{{ str_replace(public_path(), '', $file) }}"></script>
|
||||||
|
|
||||||
<script>
|
|
||||||
try {
|
|
||||||
var app = System.get('flarum/app').default;
|
|
||||||
|
|
||||||
babelHelpers._extends(app, {!! json_encode($app) !!});
|
|
||||||
|
|
||||||
@foreach ($bootstrappers as $bootstrapper)
|
|
||||||
System.get('{{ $bootstrapper }}');
|
|
||||||
@endforeach
|
@endforeach
|
||||||
|
|
||||||
app.boot();
|
<script>
|
||||||
} catch (e) {
|
try {
|
||||||
document.write('<div class="container">Something went wrong.</div>');
|
var app = System.get('flarum/app').default;
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
@if ($content)
|
babelHelpers._extends(app, {!! json_encode($app) !!});
|
||||||
<noscript>
|
|
||||||
{!! $content !!}
|
@foreach ($bootstrappers as $bootstrapper)
|
||||||
</noscript>
|
System.get('{{ $bootstrapper }}');
|
||||||
|
@endforeach
|
||||||
|
|
||||||
|
app.boot();
|
||||||
|
} catch (e) {
|
||||||
|
window.location = window.location + '?nojs=1';
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
{!! $foot !!}
|
{!! $foot !!}
|
||||||
|
|
6
framework/core/views/content.blade.php
Normal file
6
framework/core/views/content.blade.php
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
@if (! $noJs) <noscript> @endif
|
||||||
|
<div class="container">
|
||||||
|
<div class="Alert">You're viewing the HTML-only version of {{ $forum->attributes->title }}. Upgrade your browser for the full version.</div>
|
||||||
|
</div>
|
||||||
|
{!! $content !!}
|
||||||
|
@if (! $noJs) </noscript> @endif
|
|
@ -1 +1,29 @@
|
||||||
discussion SEO content
|
<?php
|
||||||
|
$discussion = $document->data;
|
||||||
|
$postsCount = count($discussion->relationships->posts->data);
|
||||||
|
?>
|
||||||
|
<div class="container">
|
||||||
|
<h2>{{ $discussion->attributes->title }}</h2>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
@foreach ($posts as $post)
|
||||||
|
<div>
|
||||||
|
<?php $user = $getResource($post->relationships->user->data); ?>
|
||||||
|
<h3>{{ $user ? $user->attributes->username : '[deleted]' }}</h3>
|
||||||
|
<div class="Post-body">
|
||||||
|
{!! $post->attributes->contentHtml !!}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if ($page > 1)
|
||||||
|
<a href="{{ $url(['page' => $page - 1]) }}">« Previous Page</a>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if ($page < $postsCount / 20)
|
||||||
|
<a href="{{ $url(['page' => $page + 1]) }}">Next Page »</a>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
|
|
@ -45,6 +45,8 @@
|
||||||
<main class="App-content">
|
<main class="App-content">
|
||||||
<div id="content"></div>
|
<div id="content"></div>
|
||||||
|
|
||||||
|
{!! $content !!}
|
||||||
|
|
||||||
<div class="App-composer">
|
<div class="App-composer">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div id="composer"></div>
|
<div id="composer"></div>
|
||||||
|
|
|
@ -1 +1,21 @@
|
||||||
index SEO content
|
<?php
|
||||||
|
$url = app('Flarum\Http\UrlGeneratorInterface');
|
||||||
|
?>
|
||||||
|
<div class="container">
|
||||||
|
<h2>All Discussions</h2>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
@foreach ($document->data as $discussion)
|
||||||
|
<li>
|
||||||
|
<a href="{{ $url->toRoute('flarum.forum.discussion', [
|
||||||
|
'id' => $discussion->id,
|
||||||
|
'slug' => $discussion->attributes->title
|
||||||
|
]) }}">
|
||||||
|
{{ $discussion->attributes->title }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<a href="{{ $url->toRoute('flarum.forum.index') }}?page={{ $page + 1 }}">Next Page »</a>
|
||||||
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user