Added tag categories
This commit is contained in:
parent
9d2a8d5175
commit
614834c99c
21 changed files with 130 additions and 28 deletions
1
TODO
1
TODO
|
@ -8,7 +8,6 @@ first major release.
|
||||||
- users: add user-configurable "about me" (should support Markdown)
|
- users: add user-configurable "about me" (should support Markdown)
|
||||||
- tags: refresh tags.json when editing post
|
- tags: refresh tags.json when editing post
|
||||||
- tags: add tag merging
|
- tags: add tag merging
|
||||||
- tags: add tag categories
|
|
||||||
- tags: add tag descriptions
|
- tags: add tag descriptions
|
||||||
- tags: add tag edit snapshots (backed-only)
|
- tags: add tag edit snapshots (backed-only)
|
||||||
- misc: endless pager should include information about page number
|
- misc: endless pager should include information about page number
|
||||||
|
|
|
@ -60,6 +60,7 @@ changePostFlags = regularUser, powerUser, moderator, administrator
|
||||||
listTags = regularUser, powerUser, moderator, administrator
|
listTags = regularUser, powerUser, moderator, administrator
|
||||||
massTag = powerUser, moderator, administrator
|
massTag = powerUser, moderator, administrator
|
||||||
changeTagName = moderator, administrator
|
changeTagName = moderator, administrator
|
||||||
|
changeTagCategory = moderator, administrator
|
||||||
changeTagImplications = moderator, administrator
|
changeTagImplications = moderator, administrator
|
||||||
changeTagSuggestions = moderator, administrator
|
changeTagSuggestions = moderator, administrator
|
||||||
banTags = moderator, administrator
|
banTags = moderator, administrator
|
||||||
|
@ -81,6 +82,12 @@ usersPerPage = 20
|
||||||
[posts]
|
[posts]
|
||||||
postsPerPage = 40
|
postsPerPage = 40
|
||||||
|
|
||||||
|
[tags]
|
||||||
|
categories[] = meta
|
||||||
|
categories[] = artist
|
||||||
|
categories[] = character
|
||||||
|
categories[] = copyright
|
||||||
|
|
||||||
[misc]
|
[misc]
|
||||||
thumbnailCropStyle = outside
|
thumbnailCropStyle = outside
|
||||||
customFaviconUrl = /favicon.png
|
customFaviconUrl = /favicon.png
|
||||||
|
|
|
@ -123,6 +123,7 @@ module.exports = function(grunt) {
|
||||||
serviceName: config.basic.serviceName,
|
serviceName: config.basic.serviceName,
|
||||||
templates: readTemplates(grunt),
|
templates: readTemplates(grunt),
|
||||||
timestamp: grunt.template.today('isoDateTime'),
|
timestamp: grunt.template.today('isoDateTime'),
|
||||||
|
tagCategories: config.tags.categories,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
dist: {
|
dist: {
|
||||||
|
|
|
@ -66,3 +66,20 @@
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tag-category-character,
|
||||||
|
.tag-category-character a {
|
||||||
|
color: #0a0;
|
||||||
|
}
|
||||||
|
.tag-category-copyright,
|
||||||
|
.tag-category-copyright a {
|
||||||
|
color: #a0a;
|
||||||
|
}
|
||||||
|
.tag-category-artist,
|
||||||
|
.tag-category-artist a {
|
||||||
|
color: #a00;
|
||||||
|
}
|
||||||
|
.tag-category-meta,
|
||||||
|
.tag-category-meta a {
|
||||||
|
color: #aaa;
|
||||||
|
}
|
||||||
|
|
|
@ -1,10 +1,16 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<!-- build:remove -->
|
<!-- build:remove -->
|
||||||
<head data-version="dev" data-build-time="">
|
<head
|
||||||
|
data-version="dev"
|
||||||
|
data-build-time=""
|
||||||
|
data-tag-categories='["meta","character","artist","copyright"]'>
|
||||||
<!-- /build -->
|
<!-- /build -->
|
||||||
<!-- build:template
|
<!-- build:template
|
||||||
<head data-version="<%= version %>" data-build-time="<%= timestamp %>">
|
<head
|
||||||
|
data-version="<%= version %>"
|
||||||
|
data-build-time="<%= timestamp %>"
|
||||||
|
data-tag-categories='<%= JSON.stringify(tagCategories).replace(/'/g, ''') %>'>
|
||||||
/build -->
|
/build -->
|
||||||
<meta charset="utf-8"/>
|
<meta charset="utf-8"/>
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,7 @@ App.Auth = function(_, jQuery, util, api, appState, promise) {
|
||||||
listTags: 'listTags',
|
listTags: 'listTags',
|
||||||
massTag: 'massTag',
|
massTag: 'massTag',
|
||||||
changeTagName: 'changeTagName',
|
changeTagName: 'changeTagName',
|
||||||
|
changeTagCategory: 'changeTagCategory',
|
||||||
changeTagImplications: 'changeTagImplications',
|
changeTagImplications: 'changeTagImplications',
|
||||||
changeTagSuggestions: 'changeTagSuggestions',
|
changeTagSuggestions: 'changeTagSuggestions',
|
||||||
banTags: 'banTags',
|
banTags: 'banTags',
|
||||||
|
|
|
@ -30,6 +30,7 @@ App.Presenters.TagPresenter = function(
|
||||||
topNavigationPresenter.changeTitle('Tags');
|
topNavigationPresenter.changeTitle('Tags');
|
||||||
|
|
||||||
privileges.canChangeName = auth.hasPrivilege(auth.privileges.changeTagName);
|
privileges.canChangeName = auth.hasPrivilege(auth.privileges.changeTagName);
|
||||||
|
privileges.canChangeCategory = auth.hasPrivilege(auth.privileges.changeTagCategory);
|
||||||
privileges.canChangeImplications = auth.hasPrivilege(auth.privileges.changeTagImplications);
|
privileges.canChangeImplications = auth.hasPrivilege(auth.privileges.changeTagImplications);
|
||||||
privileges.canChangeSuggestions = auth.hasPrivilege(auth.privileges.changeTagSuggestions);
|
privileges.canChangeSuggestions = auth.hasPrivilege(auth.privileges.changeTagSuggestions);
|
||||||
privileges.canBan = auth.hasPrivilege(auth.privileges.banTags);
|
privileges.canBan = auth.hasPrivilege(auth.privileges.banTags);
|
||||||
|
@ -72,7 +73,12 @@ App.Presenters.TagPresenter = function(
|
||||||
}
|
}
|
||||||
|
|
||||||
function render() {
|
function render() {
|
||||||
$el.html(templates.tag({privileges: privileges, tag: tag, tagName: tagName}));
|
$el.html(templates.tag({
|
||||||
|
privileges: privileges,
|
||||||
|
tag: tag,
|
||||||
|
tagName: tagName,
|
||||||
|
tagCategories: JSON.parse(jQuery('head').attr('data-tag-categories')),
|
||||||
|
}));
|
||||||
$el.find('.post-list').hide();
|
$el.find('.post-list').hide();
|
||||||
$el.find('form').submit(editFormSubmitted);
|
$el.find('form').submit(editFormSubmitted);
|
||||||
implicationsTagInput = App.Controls.TagInput($el.find('[name=implications]'));
|
implicationsTagInput = App.Controls.TagInput($el.find('[name=implications]'));
|
||||||
|
@ -88,6 +94,10 @@ App.Presenters.TagPresenter = function(
|
||||||
formData.name = $form.find('[name=name]').val();
|
formData.name = $form.find('[name=name]').val();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (privileges.canChangeCategory) {
|
||||||
|
formData.category = $form.find('[name=category]:checked').val();
|
||||||
|
}
|
||||||
|
|
||||||
if (privileges.canBan) {
|
if (privileges.canBan) {
|
||||||
formData.banned = $form.find('[name=ban]').is(':checked') ? 1 : 0;
|
formData.banned = $form.find('[name=ban]').is(':checked') ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,7 @@
|
||||||
<h1>Tags (<%= _.size(post.tags) %>)</h1>
|
<h1>Tags (<%= _.size(post.tags) %>)</h1>
|
||||||
<ul class="tags">
|
<ul class="tags">
|
||||||
<% _.each(post.tags, function(tag) { %>
|
<% _.each(post.tags, function(tag) { %>
|
||||||
<li>
|
<li class="tag-category-<%= tag.category %>">
|
||||||
<a href="#/posts/query=<%= tag.name %>">
|
<a href="#/posts/query=<%= tag.name %>">
|
||||||
<%= tag.name %>
|
<%= tag.name %>
|
||||||
<span class="usages"><%= (tag.usages) %></span>
|
<span class="usages"><%= (tag.usages) %></span>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<tr class="tag">
|
<tr class="tag">
|
||||||
<td class="name">
|
<td class="name tag-category-<%= tag.category %>">
|
||||||
<a href="#/tag/<%= tag.name %>"><%= tag.name %></a>
|
<a href="#/tag/<%= tag.name %>"><%= tag.name %></a>
|
||||||
</td>
|
</td>
|
||||||
<td class="implications">
|
<td class="implications">
|
||||||
|
|
|
@ -37,6 +37,21 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<% if (privileges.canChangeCategory) { %>
|
||||||
|
<div class="form-row">
|
||||||
|
<label class="form-label" for="tag-category">Category:</label>
|
||||||
|
<div class="form-input">
|
||||||
|
<% _.each(_.extend({'default': 'default'}, _.object(tagCategories, tagCategories)), function(v, k) { %>
|
||||||
|
<input name="category" type="radio" value="<%= k %>" id="category-<%= k %>" <% print(tag.category === k ? 'checked="checked"' : '') %>>
|
||||||
|
<label for="category-<%= k %>">
|
||||||
|
<% print(tag.category === k ? v + ' (current)' : v) %>
|
||||||
|
</label>
|
||||||
|
<br/>
|
||||||
|
<% }) %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<% } %>
|
||||||
|
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label class="form-label" for="tag-ban">Ban:</label>
|
<label class="form-label" for="tag-ban">Ban:</label>
|
||||||
<div class="form-input">
|
<div class="form-input">
|
||||||
|
|
|
@ -81,6 +81,9 @@ final class TagController extends AbstractController
|
||||||
if ($formData->name !== null)
|
if ($formData->name !== null)
|
||||||
$this->privilegeService->assertPrivilege(Privilege::CHANGE_TAG_NAME);
|
$this->privilegeService->assertPrivilege(Privilege::CHANGE_TAG_NAME);
|
||||||
|
|
||||||
|
if ($formData->category !== null)
|
||||||
|
$this->privilegeService->assertPrivilege(Privilege::CHANGE_TAG_CATEGORY);
|
||||||
|
|
||||||
if ($formData->banned !== null)
|
if ($formData->banned !== null)
|
||||||
$this->privilegeService->assertPrivilege(Privilege::BAN_TAGS);
|
$this->privilegeService->assertPrivilege(Privilege::BAN_TAGS);
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ class TagViewProxy extends AbstractViewProxy
|
||||||
$result->name = $tag->getName();
|
$result->name = $tag->getName();
|
||||||
$result->usages = $tag->getUsages();
|
$result->usages = $tag->getUsages();
|
||||||
$result->banned = $tag->isBanned();
|
$result->banned = $tag->isBanned();
|
||||||
|
$result->category = !empty($tag->getCategory()) ? $tag->getCategory() : 'default';
|
||||||
|
|
||||||
if (!empty($config[self::FETCH_IMPLICATIONS]))
|
if (!empty($config[self::FETCH_IMPLICATIONS]))
|
||||||
$result->implications = $this->fromArray($tag->getImpliedTags());
|
$result->implications = $this->fromArray($tag->getImpliedTags());
|
||||||
|
|
|
@ -13,6 +13,7 @@ class TagEntityConverter extends AbstractEntityConverter implements IEntityConve
|
||||||
'name' => $entity->getName(),
|
'name' => $entity->getName(),
|
||||||
'creationTime' => $this->entityTimeToDbTime($entity->getCreationTime()),
|
'creationTime' => $this->entityTimeToDbTime($entity->getCreationTime()),
|
||||||
'banned' => $entity->isBanned(),
|
'banned' => $entity->isBanned(),
|
||||||
|
'category' => $entity->getCategory(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +24,7 @@ class TagEntityConverter extends AbstractEntityConverter implements IEntityConve
|
||||||
$entity->setCreationTime($this->dbTimeToEntityTime($array['creationTime']));
|
$entity->setCreationTime($this->dbTimeToEntityTime($array['creationTime']));
|
||||||
$entity->setMeta(Tag::META_USAGES, intval($array['usages']));
|
$entity->setMeta(Tag::META_USAGES, intval($array['usages']));
|
||||||
$entity->setBanned($array['banned']);
|
$entity->setBanned($array['banned']);
|
||||||
|
$entity->setCategory($array['category']);
|
||||||
return $entity;
|
return $entity;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ final class Tag extends Entity
|
||||||
private $name;
|
private $name;
|
||||||
private $creationTime;
|
private $creationTime;
|
||||||
private $banned = false;
|
private $banned = false;
|
||||||
|
private $category;
|
||||||
|
|
||||||
const LAZY_LOADER_IMPLIED_TAGS = 'implications';
|
const LAZY_LOADER_IMPLIED_TAGS = 'implications';
|
||||||
const LAZY_LOADER_SUGGESTED_TAGS = 'suggestions';
|
const LAZY_LOADER_SUGGESTED_TAGS = 'suggestions';
|
||||||
|
@ -27,6 +28,11 @@ final class Tag extends Entity
|
||||||
return $this->creationTime;
|
return $this->creationTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setCreationTime($creationTime)
|
||||||
|
{
|
||||||
|
$this->creationTime = $creationTime;
|
||||||
|
}
|
||||||
|
|
||||||
public function isBanned()
|
public function isBanned()
|
||||||
{
|
{
|
||||||
return $this->banned;
|
return $this->banned;
|
||||||
|
@ -37,9 +43,14 @@ final class Tag extends Entity
|
||||||
$this->banned = boolval($banned);
|
$this->banned = boolval($banned);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setCreationTime($creationTime)
|
public function getCategory()
|
||||||
{
|
{
|
||||||
$this->creationTime = $creationTime;
|
return $this->category;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setCategory($category)
|
||||||
|
{
|
||||||
|
$this->category = $category;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getUsages()
|
public function getUsages()
|
||||||
|
|
|
@ -7,6 +7,7 @@ class TagEditFormData implements IValidatable
|
||||||
{
|
{
|
||||||
public $name;
|
public $name;
|
||||||
public $banned;
|
public $banned;
|
||||||
|
public $category;
|
||||||
public $implications;
|
public $implications;
|
||||||
public $suggestions;
|
public $suggestions;
|
||||||
|
|
||||||
|
@ -14,7 +15,8 @@ class TagEditFormData implements IValidatable
|
||||||
{
|
{
|
||||||
if ($inputReader !== null)
|
if ($inputReader !== null)
|
||||||
{
|
{
|
||||||
$this->name = $inputReader->name;
|
$this->name = trim($inputReader->name);
|
||||||
|
$this->category = strtolower(trim($inputReader->category));
|
||||||
|
|
||||||
if ($inputReader->banned !== null)
|
if ($inputReader->banned !== null)
|
||||||
$this->banned = boolval($inputReader->banned);
|
$this->banned = boolval($inputReader->banned);
|
||||||
|
@ -26,6 +28,9 @@ class TagEditFormData implements IValidatable
|
||||||
|
|
||||||
public function validate(Validator $validator)
|
public function validate(Validator $validator)
|
||||||
{
|
{
|
||||||
|
if ($this->category !== null)
|
||||||
|
$validator->validateLength($this->category, 1, 25, 'Tag category');
|
||||||
|
|
||||||
if ($this->name !== null)
|
if ($this->name !== null)
|
||||||
$validator->validatePostTags([$this->name]);
|
$validator->validatePostTags([$this->name]);
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,7 @@ class Privilege
|
||||||
const LIST_TAGS = 'listTags';
|
const LIST_TAGS = 'listTags';
|
||||||
const MASS_TAG = 'massTag';
|
const MASS_TAG = 'massTag';
|
||||||
const CHANGE_TAG_NAME = 'changeTagName';
|
const CHANGE_TAG_NAME = 'changeTagName';
|
||||||
|
const CHANGE_TAG_CATEGORY = 'changeTagCategory';
|
||||||
const CHANGE_TAG_IMPLICATIONS = 'changeTagImplications';
|
const CHANGE_TAG_IMPLICATIONS = 'changeTagImplications';
|
||||||
const CHANGE_TAG_SUGGESTIONS = 'changeTagSuggestions';
|
const CHANGE_TAG_SUGGESTIONS = 'changeTagSuggestions';
|
||||||
const BAN_TAGS = 'banTags';
|
const BAN_TAGS = 'banTags';
|
||||||
|
|
|
@ -143,6 +143,9 @@ class TagService
|
||||||
if ($formData->name !== null)
|
if ($formData->name !== null)
|
||||||
$this->updateTagName($tag, $formData->name);
|
$this->updateTagName($tag, $formData->name);
|
||||||
|
|
||||||
|
if ($formData->category !== null)
|
||||||
|
$this->updateTagCategory($tag, $formData->category);
|
||||||
|
|
||||||
if ($formData->banned !== $tag->isBanned())
|
if ($formData->banned !== $tag->isBanned())
|
||||||
$tag->setBanned(boolval($formData->banned));
|
$tag->setBanned(boolval($formData->banned));
|
||||||
|
|
||||||
|
@ -179,6 +182,14 @@ class TagService
|
||||||
$tag->setName($newName);
|
$tag->setName($newName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function updateTagCategory(Tag $tag, $newCategory)
|
||||||
|
{
|
||||||
|
if ($newCategory === 'default')
|
||||||
|
$tag->setCategory($newCategory);
|
||||||
|
else
|
||||||
|
$tag->setCategory($newCategory);
|
||||||
|
}
|
||||||
|
|
||||||
private function updateImplications(Tag $tag, array $relatedNames)
|
private function updateImplications(Tag $tag, array $relatedNames)
|
||||||
{
|
{
|
||||||
$relatedNames = array_udiff($relatedNames, [$tag->getName()], 'strnatcasecmp');
|
$relatedNames = array_udiff($relatedNames, [$tag->getName()], 'strnatcasecmp');
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
namespace Szurubooru\Upgrades;
|
namespace Szurubooru\Upgrades;
|
||||||
use Szurubooru\DatabaseConnection;
|
use Szurubooru\DatabaseConnection;
|
||||||
use Szurubooru\Services\TagService;
|
|
||||||
|
|
||||||
class Upgrade24 implements IUpgrade
|
class Upgrade24 implements IUpgrade
|
||||||
{
|
{
|
||||||
|
|
14
src/Upgrades/Upgrade25.php
Normal file
14
src/Upgrades/Upgrade25.php
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<?php
|
||||||
|
namespace Szurubooru\Upgrades;
|
||||||
|
use Szurubooru\DatabaseConnection;
|
||||||
|
|
||||||
|
class Upgrade25 implements IUpgrade
|
||||||
|
{
|
||||||
|
public function run(DatabaseConnection $databaseConnection)
|
||||||
|
{
|
||||||
|
$pdo = $databaseConnection->getPDO();
|
||||||
|
|
||||||
|
$pdo->exec('ALTER TABLE tags ADD COLUMN category VARCHAR(25)');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -40,6 +40,7 @@ return [
|
||||||
$container->get(\Szurubooru\Upgrades\Upgrade22::class),
|
$container->get(\Szurubooru\Upgrades\Upgrade22::class),
|
||||||
$container->get(\Szurubooru\Upgrades\Upgrade23::class),
|
$container->get(\Szurubooru\Upgrades\Upgrade23::class),
|
||||||
$container->get(\Szurubooru\Upgrades\Upgrade24::class),
|
$container->get(\Szurubooru\Upgrades\Upgrade24::class),
|
||||||
|
$container->get(\Szurubooru\Upgrades\Upgrade25::class),
|
||||||
];
|
];
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
|
|
@ -13,8 +13,7 @@ final class TagDaoTest extends AbstractDatabaseTestCase
|
||||||
|
|
||||||
public function testSaving()
|
public function testSaving()
|
||||||
{
|
{
|
||||||
$tag = new Tag();
|
$tag = $this->getTestTag('test');
|
||||||
$tag->setName('test1');
|
|
||||||
$tag->setCreationTime(date('c', mktime(0, 0, 0, 10, 1, 2014)));
|
$tag->setCreationTime(date('c', mktime(0, 0, 0, 10, 1, 2014)));
|
||||||
$this->assertFalse($tag->isBanned());
|
$this->assertFalse($tag->isBanned());
|
||||||
$tag->setBanned(true);
|
$tag->setBanned(true);
|
||||||
|
@ -27,27 +26,17 @@ final class TagDaoTest extends AbstractDatabaseTestCase
|
||||||
|
|
||||||
public function testSavingRelations()
|
public function testSavingRelations()
|
||||||
{
|
{
|
||||||
$tag1 = new Tag();
|
$tag1 = $this->getTestTag('test 1');
|
||||||
$tag1->setName('test 1');
|
$tag2 = $this->getTestTag('test 2');
|
||||||
$tag1->setCreationTime(date('c'));
|
$tag3 = $this->getTestTag('test 3');
|
||||||
$tag2 = new Tag();
|
$tag4 = $this->getTestTag('test 4');
|
||||||
$tag2->setName('test 2');
|
|
||||||
$tag2->setCreationTime(date('c'));
|
|
||||||
$tag3 = new Tag();
|
|
||||||
$tag3->setName('test 3');
|
|
||||||
$tag3->setCreationTime(date('c'));
|
|
||||||
$tag4 = new Tag();
|
|
||||||
$tag4->setName('test 4');
|
|
||||||
$tag4->setCreationTime(date('c'));
|
|
||||||
$tagDao = $this->getTagDao();
|
$tagDao = $this->getTagDao();
|
||||||
$tagDao->save($tag1);
|
$tagDao->save($tag1);
|
||||||
$tagDao->save($tag2);
|
$tagDao->save($tag2);
|
||||||
$tagDao->save($tag3);
|
$tagDao->save($tag3);
|
||||||
$tagDao->save($tag4);
|
$tagDao->save($tag4);
|
||||||
|
|
||||||
$tag = new Tag();
|
$tag = $this->getTestTag('test');
|
||||||
$tag->setName('test1');
|
|
||||||
$tag->setCreationTime(date('c'));
|
|
||||||
$tag->setImpliedTags([$tag1, $tag3]);
|
$tag->setImpliedTags([$tag1, $tag3]);
|
||||||
$tag->setSuggestedTags([$tag2, $tag4]);
|
$tag->setSuggestedTags([$tag2, $tag4]);
|
||||||
|
|
||||||
|
@ -119,4 +108,13 @@ final class TagDaoTest extends AbstractDatabaseTestCase
|
||||||
{
|
{
|
||||||
return new TagDao($this->databaseConnection);
|
return new TagDao($this->databaseConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function getTestTag($name)
|
||||||
|
{
|
||||||
|
$tag = new Tag();
|
||||||
|
$tag->setName($name);
|
||||||
|
$tag->setCreationTime(date('c'));
|
||||||
|
$tag->setCategory('default');
|
||||||
|
return $tag;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue