Dennis Brentjes
16ec547064
The ConfirmDelete page now uses parts of the photopage. The Confirmation dialog is its own template which is based on Alert. The database now updates the album thumb to the most recent addition to the album, when the album thumb asset is being deleted. When there are no pictures left in the album 0 will be set.
407 lines
8.2 KiB
PHP
407 lines
8.2 KiB
PHP
<?php
|
|
/*****************************************************************************
|
|
* Tag.php
|
|
* Contains key class Tag.
|
|
*
|
|
* Kabuki CMS (C) 2013-2015, Aaron van Geffen
|
|
*****************************************************************************/
|
|
|
|
class Tag
|
|
{
|
|
public $id_tag;
|
|
public $id_parent;
|
|
public $id_asset_thumb;
|
|
public $tag;
|
|
public $slug;
|
|
public $description;
|
|
public $kind;
|
|
public $count;
|
|
|
|
protected function __construct(array $data)
|
|
{
|
|
foreach ($data as $attribute => $value)
|
|
$this->$attribute = $value;
|
|
}
|
|
|
|
public static function fromId($id_tag, $return_format = 'object')
|
|
{
|
|
$db = Registry::get('db');
|
|
|
|
$row = $db->queryAssoc('
|
|
SELECT *
|
|
FROM tags
|
|
WHERE id_tag = {int:id_tag}',
|
|
[
|
|
'id_tag' => $id_tag,
|
|
]);
|
|
|
|
// Tag not found?
|
|
if (empty($row))
|
|
throw new NotFoundException();
|
|
|
|
return $return_format == 'object' ? new Tag($row) : $row;
|
|
}
|
|
|
|
public static function fromSlug($slug, $return_format = 'object')
|
|
{
|
|
$db = Registry::get('db');
|
|
|
|
$row = $db->queryAssoc('
|
|
SELECT *
|
|
FROM tags
|
|
WHERE slug = {string:slug}',
|
|
[
|
|
'slug' => $slug,
|
|
]);
|
|
|
|
// Tag not found?
|
|
if (empty($row))
|
|
throw new NotFoundException();
|
|
|
|
return $return_format == 'object' ? new Tag($row) : $row;
|
|
}
|
|
|
|
public static function getAll($limit = 0, $return_format = 'array')
|
|
{
|
|
$rows = Registry::get('db')->queryAssocs('
|
|
SELECT *
|
|
FROM tags
|
|
ORDER BY ' . ($limit > 0 ? 'count
|
|
LIMIT {int:limit}' : 'tag'),
|
|
[
|
|
'limit' => $limit,
|
|
]);
|
|
|
|
// No tags found?
|
|
if (empty($rows))
|
|
return [];
|
|
|
|
// Limited? Make sure the lot is sorted alphabetically.
|
|
if (!empty($limit))
|
|
{
|
|
usort($rows, function($a, $b) {
|
|
return strcmp($a['tag'], $b['tag']);
|
|
});
|
|
}
|
|
|
|
if ($return_format == 'object')
|
|
{
|
|
$return = [];
|
|
foreach ($rows as $row)
|
|
$return[$row['id_tag']] = new Tag($row);
|
|
return $return;
|
|
}
|
|
else
|
|
return $rows;
|
|
}
|
|
|
|
public static function getAlbums($id_parent = 0, $offset = 0, $limit = 24, $return_format = 'array')
|
|
{
|
|
$rows = Registry::get('db')->queryAssocs('
|
|
SELECT *
|
|
FROM tags
|
|
WHERE id_parent = {int:id_parent} AND kind = {string:kind}
|
|
ORDER BY tag ASC
|
|
LIMIT {int:offset}, {int:limit}',
|
|
[
|
|
'id_parent' => $id_parent,
|
|
'kind' => 'Album',
|
|
'offset' => $offset,
|
|
'limit' => $limit,
|
|
]);
|
|
|
|
if ($return_format == 'object')
|
|
{
|
|
$return = [];
|
|
foreach ($rows as $row)
|
|
$return[$row['id_tag']] = new Tag($row);
|
|
return $return;
|
|
}
|
|
else
|
|
return $rows;
|
|
}
|
|
|
|
public static function getPeople($id_parent = 0, $offset = 0, $limit = 24, $return_format = 'array')
|
|
{
|
|
$rows = Registry::get('db')->queryAssocs('
|
|
SELECT *
|
|
FROM tags
|
|
WHERE id_parent = {int:id_parent} AND kind = {string:kind}
|
|
ORDER BY tag ASC
|
|
LIMIT {int:offset}, {int:limit}',
|
|
[
|
|
'id_parent' => $id_parent,
|
|
'kind' => 'Person',
|
|
'offset' => $offset,
|
|
'limit' => $limit,
|
|
]);
|
|
|
|
if ($return_format == 'object')
|
|
{
|
|
$return = [];
|
|
foreach ($rows as $row)
|
|
$return[$row['id_tag']] = new Tag($row);
|
|
return $return;
|
|
}
|
|
else
|
|
return $rows;
|
|
}
|
|
|
|
public static function byAssetId($id_asset, $return_format = 'object')
|
|
{
|
|
$rows = Registry::get('db')->queryAssocs('
|
|
SELECT *
|
|
FROM tags
|
|
WHERE id_tag IN(
|
|
SELECT id_tag
|
|
FROM assets_tags
|
|
WHERE id_asset = {int:id_asset}
|
|
)
|
|
ORDER BY count DESC',
|
|
[
|
|
'id_asset' => $id_asset,
|
|
]);
|
|
|
|
// No tags found?
|
|
if (empty($rows))
|
|
return [];
|
|
|
|
if ($return_format == 'object')
|
|
{
|
|
$return = [];
|
|
foreach ($rows as $row)
|
|
$return[$row['id_tag']] = new Tag($row);
|
|
return $return;
|
|
}
|
|
else
|
|
return $rows;
|
|
}
|
|
|
|
public static function byPostId($id_post, $return_format = 'object')
|
|
{
|
|
$rows = Registry::get('db')->queryAssocs('
|
|
SELECT *
|
|
FROM tags
|
|
WHERE id_tag IN(
|
|
SELECT id_tag
|
|
FROM posts_tags
|
|
WHERE id_post = {int:id_post}
|
|
)
|
|
ORDER BY count DESC',
|
|
[
|
|
'id_post' => $id_post,
|
|
]);
|
|
|
|
// No tags found?
|
|
if (empty($rows))
|
|
return [];
|
|
|
|
if ($return_format == 'object')
|
|
{
|
|
$return = [];
|
|
foreach ($rows as $row)
|
|
$return[$row['id_tag']] = new Tag($row);
|
|
return $return;
|
|
}
|
|
else
|
|
return $rows;
|
|
}
|
|
|
|
public static function recount(array $id_tags = [])
|
|
{
|
|
return Registry::get('db')->query('
|
|
UPDATE tags AS t SET count = (
|
|
SELECT COUNT(*)
|
|
FROM `assets_tags` AS at
|
|
WHERE at.id_tag = t.id_tag
|
|
)' . (!empty($id_tags) ? '
|
|
WHERE t.id_tag IN({array_int:id_tags})' : ''),
|
|
['id_tags' => $id_tags]);
|
|
}
|
|
|
|
public static function createNew(array $data, $return_format = 'object')
|
|
{
|
|
$db = Registry::get('db');
|
|
|
|
if (!isset($data['id_parent']))
|
|
$data['id_parent'] = 0;
|
|
|
|
if (!isset($data['description']))
|
|
$data['description'] = '';
|
|
|
|
if (!isset($data['count']))
|
|
$data['count'] = 0;
|
|
|
|
$res = $db->query('
|
|
INSERT IGNORE INTO tags
|
|
(id_parent, tag, slug, kind, description, count)
|
|
VALUES
|
|
({int:id_parent}, {string:tag}, {string:slug}, {string:kind}, {string:description}, {int:count})
|
|
ON DUPLICATE KEY UPDATE count = count + 1',
|
|
$data);
|
|
|
|
if (!$res)
|
|
trigger_error('Could not create the requested tag.', E_USER_ERROR);
|
|
|
|
$data['id_tag'] = $db->insert_id();
|
|
return $return_format == 'object' ? new Tag($data) : $data;
|
|
}
|
|
|
|
public function getUrl()
|
|
{
|
|
return BASEURL . '/' . $this->slug . '/';
|
|
}
|
|
|
|
public function save()
|
|
{
|
|
return Registry::get('db')->query('
|
|
UPDATE tags
|
|
SET
|
|
id_parent = {int:id_parent},
|
|
id_asset_thumb = {int:id_asset_thumb},
|
|
tag = {string:tag},
|
|
slug = {string:slug},
|
|
description = {string:description},
|
|
count = {int:count}
|
|
WHERE id_tag = {int:id_tag}',
|
|
get_object_vars($this));
|
|
}
|
|
|
|
public function delete()
|
|
{
|
|
$db = Registry::get('db');
|
|
|
|
$res = $db->query('
|
|
DELETE FROM assets_tags
|
|
WHERE id_tag = {int:id_tag}',
|
|
[
|
|
'id_tag' => $this->id_tag,
|
|
]);
|
|
|
|
if (!$res)
|
|
return false;
|
|
|
|
return $db->query('
|
|
DELETE FROM tags
|
|
WHERE id_tag = {int:id_tag}',
|
|
[
|
|
'id_tag' => $this->id_tag,
|
|
]);
|
|
}
|
|
|
|
public function resetIdAsset()
|
|
{
|
|
$db = Registry::get('db');
|
|
|
|
$row = $db->query('
|
|
SELECT MAX(id_asset) as new_id
|
|
FROM assets_tags
|
|
WHERE id_tag = {int:id_tag}',
|
|
[
|
|
'id_tag' => $this->id_tag,
|
|
]);
|
|
|
|
$new_id = 0;
|
|
if(!empty($row))
|
|
{
|
|
$new_id = $row->fetch_assoc()['new_id'];
|
|
}
|
|
|
|
return $db->query('
|
|
UPDATE tags
|
|
SET id_asset_thumb = {int:new_id}
|
|
WHERE id_tag = {int:id_tag}',
|
|
[
|
|
'new_id' => $new_id,
|
|
'id_tag' => $this->id_tag,
|
|
]);
|
|
}
|
|
|
|
public static function match($tokens)
|
|
{
|
|
if (!is_array($tokens))
|
|
$tokens = explode(' ', $tokens);
|
|
|
|
return Registry::get('db')->queryPair('
|
|
SELECT id_tag, tag
|
|
FROM tags
|
|
WHERE LOWER(tag) LIKE {string:tokens}
|
|
ORDER BY tag ASC',
|
|
['tokens' => '%' . strtolower(implode('%', $tokens)) . '%']);
|
|
}
|
|
|
|
public static function matchPeople($tokens)
|
|
{
|
|
if (!is_array($tokens))
|
|
$tokens = explode(' ', $tokens);
|
|
|
|
return Registry::get('db')->queryPair('
|
|
SELECT id_tag, tag
|
|
FROM tags
|
|
WHERE LOWER(tag) LIKE {string:tokens} AND
|
|
kind = {string:person}
|
|
ORDER BY tag ASC',
|
|
[
|
|
'tokens' => '%' . strtolower(implode('%', $tokens)) . '%',
|
|
'person' => 'Person',
|
|
]);
|
|
}
|
|
|
|
public static function exactMatch($tag)
|
|
{
|
|
if (!is_string($tag))
|
|
throw new InvalidArgumentException('Expecting a string!');
|
|
|
|
return Registry::get('db')->queryPair('
|
|
SELECT id_tag, tag
|
|
FROM tags
|
|
WHERE tag = {string:tag}',
|
|
['tag' => $tag]);
|
|
}
|
|
|
|
public static function matchSlug($slug)
|
|
{
|
|
if (!is_string($slug))
|
|
throw new InvalidArgumentException('Expecting a string!');
|
|
|
|
return Registry::get('db')->queryValue('
|
|
SELECT id_tag
|
|
FROM tags
|
|
WHERE slug = {string:slug}',
|
|
['slug' => $slug]);
|
|
}
|
|
|
|
public static function matchAll(array $tags)
|
|
{
|
|
return Registry::get('db')->queryPair('
|
|
SELECT tag, id_tag
|
|
FROM tags
|
|
WHERE tag IN ({array_string:tags})',
|
|
['tags' => $tags]);
|
|
}
|
|
|
|
public static function getCount($only_active = 1, $kind = '')
|
|
{
|
|
$where = [];
|
|
if ($only_active)
|
|
$where[] = 'count > 0';
|
|
if (!empty($kind))
|
|
$where[] = 'kind = {string:kind}';
|
|
|
|
if (!empty($where))
|
|
$where = 'WHERE ' . implode(' AND ', $where);
|
|
else
|
|
$where = '';
|
|
|
|
return Registry::get('db')->queryValue('
|
|
SELECT COUNT(*)
|
|
FROM tags ' . $where,
|
|
['kind' => $kind]);
|
|
}
|
|
|
|
public function __toString()
|
|
{
|
|
return $this->tag;
|
|
}
|
|
}
|