Store discussion slug in database table

In preparation for #646.
This commit is contained in:
Franz Liedke 2016-02-04 11:46:30 +01:00
parent efff4c1801
commit 97979b2189
5 changed files with 91 additions and 3 deletions

View File

@ -2,14 +2,13 @@ import Model from 'flarum/Model';
import mixin from 'flarum/utils/mixin';
import computed from 'flarum/utils/computed';
import ItemList from 'flarum/utils/ItemList';
import { slug } from 'flarum/utils/string';
import Badge from 'flarum/components/Badge';
export default class Discussion extends Model {}
Object.assign(Discussion.prototype, {
title: Model.attribute('title'),
slug: computed('title', slug),
slug: Model.attribute('slug'),
startTime: Model.attribute('startTime', Model.transformDate),
startUser: Model.hasOne('startUser'),

View File

@ -0,0 +1,41 @@
<?php
/*
* This file is part of Flarum.
*
* (c) Toby Zerner <toby.zerner@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Flarum\Core\Migration;
use Flarum\Core\Discussion;
use Flarum\Database\AbstractMigration;
use Flarum\Util\Str;
use Illuminate\Database\Schema\Blueprint;
class AddSlugToDiscussions extends AbstractMigration
{
public function up()
{
$this->schema->table('discussions', function (Blueprint $table) {
$table->string('slug');
});
// Store slugs for existing discussions
Discussion::chunk(100, function ($discussions) {
foreach ($discussions as $discussion) {
$discussion->slug = Str::slug($discussion->title);
$discussion->save();
}
});
}
public function down()
{
$this->schema->table('discussions', function (Blueprint $table) {
$table->dropColumn('slug');
});
}
}

View File

@ -34,7 +34,8 @@ class DiscussionBasicSerializer extends AbstractSerializer
}
return [
'title' => $discussion->title
'title' => $discussion->title,
'slug' => $discussion->slug,
];
}

View File

@ -22,10 +22,12 @@ use Flarum\Event\DiscussionWasRestored;
use Flarum\Event\DiscussionWasStarted;
use Flarum\Event\PostWasDeleted;
use Flarum\Event\ScopePostVisibility;
use Flarum\Util\Str;
/**
* @property int $id
* @property string $title
* @property string $slug
* @property int $comments_count
* @property int $participants_count
* @property int $number_index
@ -432,4 +434,17 @@ class Discussion extends AbstractModel
{
static::$stateUser = $user;
}
/**
* Set the discussion title.
*
* This automatically creates a matching slug for the discussion.
*
* @param string $title
*/
protected function setTitleAttribute($title)
{
$this->attributes['title'] = $title;
$this->slug = Str::slug($title);
}
}

32
src/Util/Str.php Normal file
View File

@ -0,0 +1,32 @@
<?php
/*
* This file is part of Flarum.
*
* (c) Toby Zerner <toby.zerner@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Flarum\Util;
class Str
{
/**
* Create a slug out of the given string.
*
* Non-alphanumeric characters are converted to hyphens.
*
* @param string $str
* @return string
*/
public static function slug($str)
{
$str = strtolower($str);
$str = preg_replace('/[^a-z0-9]/i', '-', $str);
$str = preg_replace('/-+/', '-', $str);
$str = preg_replace('/-$|^-/', '', $str);
return $str ?: '-';
}
}