Fix adding / removing photo tags + tagrm delete via GET + Item::update / add Term::deleteAllTags

This commit is contained in:
Jonny Tischbein 2018-10-23 11:40:20 +02:00
parent dbfe5c9d2a
commit fd2e06781d
5 changed files with 81 additions and 28 deletions

View file

@ -612,7 +612,7 @@ function photos_post(App $a)
} }
} elseif (strpos($tag, '#') === 0) { } elseif (strpos($tag, '#') === 0) {
$tagname = substr($tag, 1); $tagname = substr($tag, 1);
$str_tags .= '#[url=' . System::baseUrl() . "/search?tag=" . $tagname . ']' . $tagname . '[/url]'; $str_tags .= '#[url=' . System::baseUrl() . "/search?tag=" . $tagname . ']' . $tagname . '[/url],';
} }
} }
} }
@ -1417,17 +1417,15 @@ function photos_content(App $a)
if (count($linked_items) && strlen($link_item['tag'])) { if (count($linked_items) && strlen($link_item['tag'])) {
$arr = explode(',', $link_item['tag']); $arr = explode(',', $link_item['tag']);
// parse tags and add links // parse tags and add links
$tag_str = ''; $tag_arr = [];
foreach ($arr as $t) { foreach ($arr as $t) {
if (strlen($tag_str)) { array_push($tag_arr, ['name' => BBCode::convert($t),
$tag_str .= ', '; 'removeurl' => '/tagrm/'.$link_item['id'] . '/' . bin2hex($t)]);
}
$tag_str .= BBCode::convert($t);
} }
$tags = [L10n::t('Tags: '), $tag_str]; $tags = ['title' => L10n::t('Tags: '), 'tags' => $tag_arr];
if ($cmd === 'edit') { if ($cmd === 'edit') {
$tags[] = 'tagrm/' . $link_item['id']; $tags += ['removeanyurl' => 'tagrm/' . $link_item['id']];
$tags[] = L10n::t('[Remove any tag]'); $tags += ['removetitle' => L10n::t('[Remove any tag]')];
} }
} }

View file

@ -20,8 +20,27 @@ function tagrm_post(App $a)
$a->internalRedirect($_SESSION['photo_return']); $a->internalRedirect($_SESSION['photo_return']);
} }
$tag = (x($_POST,'tag') ? hex2bin(notags(trim($_POST['tag']))) : ''); $tags = [];
$item_id = (x($_POST,'item') ? intval($_POST['item']) : 0); if (defaults($_POST, 'tag', '')){
foreach ($_POST['tag'] as $t){
array_push($tags, hex2bin(notags(trim($t))));
}
}
$item_id = defaults($_POST,'item', 0);
update_tags($item_id, $tags);
info(L10n::t('Tag(s) removed') . EOL );
$a->internalRedirect($_SESSION['photo_return']);
// NOTREACHED
}
function update_tags($item_id, $tags){
if (empty($item_id) || empty($tags)){
$a->internalRedirect($_SESSION['photo_return']);
}
$item = Item::selectFirst(['tag'], ['id' => $item_id, 'uid' => local_user()]); $item = Item::selectFirst(['tag'], ['id' => $item_id, 'uid' => local_user()]);
if (!DBA::isResult($item)) { if (!DBA::isResult($item)) {
@ -29,25 +48,29 @@ function tagrm_post(App $a)
} }
$arr = explode(',', $item['tag']); $arr = explode(',', $item['tag']);
for ($x = 0; $x < count($arr); $x ++) {
if ($arr[$x] === $tag) { foreach ($tags as $t) {
unset($arr[$x]); foreach ($arr as $i => $x) {
break; if (strcmp($x, $t) == 0) {
unset($arr[$i]);
break;
}
} }
} }
$tag_str = implode(',',$arr); $tag_str = implode(',',$arr);
if(empty($tag_str)){
$tag_str = '';
}
Item::update(['tag' => $tag_str], ['id' => $item_id]); Item::update(['tag' => $tag_str], ['id' => $item_id]);
info(L10n::t('Tag removed') . EOL ); info(L10n::t('Tag(s) removed') . EOL );
$a->internalRedirect($_SESSION['photo_return']); $a->internalRedirect($_SESSION['photo_return']);
// NOTREACHED // NOTREACHED
} }
function tagrm_content(App $a) function tagrm_content(App $a)
{ {
$o = ''; $o = '';
@ -57,6 +80,11 @@ function tagrm_content(App $a)
// NOTREACHED // NOTREACHED
} }
if ($a->argc == 3){
update_tags($a->argv[1], [hex2bin(notags(trim($a->argv[2])))]);
goaway('/' . $_SESSION['photo_return']);
}
$item_id = (($a->argc > 1) ? intval($a->argv[1]) : 0); $item_id = (($a->argc > 1) ? intval($a->argv[1]) : 0);
if (!$item_id) { if (!$item_id) {
$a->internalRedirect($_SESSION['photo_return']); $a->internalRedirect($_SESSION['photo_return']);
@ -70,7 +98,8 @@ function tagrm_content(App $a)
$arr = explode(',', $item['tag']); $arr = explode(',', $item['tag']);
if (!count($arr)) {
if (empty($item['tag'])) {
$a->internalRedirect($_SESSION['photo_return']); $a->internalRedirect($_SESSION['photo_return']);
} }
@ -83,7 +112,7 @@ function tagrm_content(App $a)
$o .= '<ul>'; $o .= '<ul>';
foreach ($arr as $x) { foreach ($arr as $x) {
$o .= '<li><input type="checkbox" name="tag" value="' . bin2hex($x) . '" >' . BBCode::convert($x) . '</input></li>'; $o .= '<li><input type="checkbox" name="tag[]" value="' . bin2hex($x) . '" >' . BBCode::convert($x) . '</input></li>';
} }
$o .= '</ul>'; $o .= '</ul>';

View file

@ -816,7 +816,7 @@ class Item extends BaseObject
$tags = $fields['tag']; $tags = $fields['tag'];
$fields['tag'] = null; $fields['tag'] = null;
} else { } else {
$tags = ''; $tags = null;
} }
if (array_key_exists('file', $fields)) { if (array_key_exists('file', $fields)) {
@ -895,10 +895,14 @@ class Item extends BaseObject
} }
} }
if (!empty($tags)) { if (!is_null($tags)) {
Term::insertFromTagFieldByItemId($item['id'], $tags); Term::deleteAllTags($item['id']);
if (!empty($item['tag'])) {
DBA::update('item', ['tag' => ''], ['id' => $item['id']]); if ($tags) {
Term::insertFromTagFieldByItemId($item['id'], $tags);
if (!empty($item['tag'])) {
DBA::update('item', ['tag' => ''], ['id' => $item['id']]);
}
} }
} }

View file

@ -290,4 +290,19 @@ class Term
return $return; return $return;
} }
/*
* Deletes all Tags from an item
*/
public static function deleteAllTags($itemid)
{
$message = Item::selectFirst(['id'], ['id' => $itemid]);
if (!DBA::isResult($message)) {
return;
}
// Clean up all tags
DBA::delete('term', ['otype' => TERM_OBJ_POST, 'oid' => $itemid, 'type' => [TERM_HASHTAG, TERM_MENTION]]);
}
} }

View file

@ -51,12 +51,19 @@
{{* Tags and mentions *}} {{* Tags and mentions *}}
{{if $tags}} {{if $tags}}
<div id="photo-tags">{{$tags.1}}</div> <div id="photo-tags">{{$tags.title}}
{{foreach $tags.tags as $t}}
<span class="category label btn-success sm">
<span class="p-category">{{$t.name}}</span>
{{if $t.removeurl}} (<a href="{{$t.removeurl}}">x</a>) {{/if}}
</span>
{{/foreach}}
</div>
{{/if}} {{/if}}
{{if $tags.2}} {{if $tags.removeanyurl}}
<div id="tag-remove"> <div id="tag-remove">
<a href="{{$tags.2}}">{{$tags.3}}</a> <a href="{{$tags.removeanyurl}}">{{$tags.removetitle}}</a>
</div> </div>
{{/if}} {{/if}}