X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=mod%2Fphotos.php;h=5a477c3bce4a468145cd829eb6b476dd2694b517;hb=b124c414dcaebaf15ab1f82c2e47e348400b582e;hp=b637d69694add678dea727010dace228a6e21785;hpb=3e13799e70ff77a8733b663e1ff3a4d5bea18015;p=friendica.git diff --git a/mod/photos.php b/mod/photos.php index b637d69694..5a477c3bce 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -9,13 +9,12 @@ use Friendica\Content\Nav; use Friendica\Content\Pager; use Friendica\Content\Text\BBCode; use Friendica\Core\ACL; -use Friendica\Core\Addon; use Friendica\Core\Config; +use Friendica\Core\Hook; use Friendica\Core\L10n; use Friendica\Core\Logger; use Friendica\Core\Renderer; use Friendica\Core\System; -use Friendica\Core\Worker; use Friendica\Database\DBA; use Friendica\Model\Contact; use Friendica\Model\Group; @@ -30,8 +29,8 @@ use Friendica\Util\Crypto; use Friendica\Util\DateTimeFormat; use Friendica\Util\Map; use Friendica\Util\Security; -use Friendica\Util\Temporal; use Friendica\Util\Strings; +use Friendica\Util\Temporal; use Friendica\Util\XML; function photos_init(App $a) { @@ -48,23 +47,21 @@ function photos_init(App $a) { if ($a->argc > 1) { $nick = $a->argv[1]; - $user = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `blocked` = 0 LIMIT 1", - DBA::escape($nick) - ); + $user = DBA::selectFirst('user', [], ['nickname' => $nick, 'blocked' => false]); if (!DBA::isResult($user)) { return; } - $a->data['user'] = $user[0]; - $a->profile_uid = $user[0]['uid']; + $a->data['user'] = $user; + $a->profile_uid = $user['uid']; $is_owner = (local_user() && (local_user() == $a->profile_uid)); $profile = Profile::getByNickname($nick, $a->profile_uid); $account_type = Contact::getAccountType($profile); - $tpl = Renderer::getMarkupTemplate("vcard-widget.tpl"); + $tpl = Renderer::getMarkupTemplate("widget/vcard.tpl"); $vcard_widget = Renderer::replaceMacros($tpl, [ '$name' => $profile['name'], @@ -116,7 +113,6 @@ function photos_init(App $a) { '$title' => L10n::t('Photo Albums'), '$recent' => L10n::t('Recent Photos'), '$albums' => $ret['albums'], - '$baseurl' => System::baseUrl(), '$upload' => [L10n::t('Upload New Photos'), 'photos/' . $a->data['user']['nickname'] . '/upload'], '$can_post' => $can_post ]); @@ -154,7 +150,7 @@ function photos_post(App $a) $visitor = 0; $page_owner_uid = $a->data['user']['uid']; - $community_page = $a->data['user']['page-flags'] == Contact::PAGE_COMMUNITY; + $community_page = $a->data['user']['page-flags'] == User::PAGE_FLAGS_COMMUNITY; if (local_user() && (local_user() == $page_owner_uid)) { $can_post = true; @@ -171,12 +167,7 @@ function photos_post(App $a) } if ($contact_id > 0) { - $r = q("SELECT `uid` FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1", - intval($contact_id), - intval($page_owner_uid) - ); - - if (DBA::isResult($r)) { + if (DBA::exists('contact', ['id' => $contact_id, 'uid' => $page_owner_uid, 'blocked' => false, 'pending' => false])) { $can_post = true; $visitor = $contact_id; } @@ -185,7 +176,7 @@ function photos_post(App $a) if (!$can_post) { notice(L10n::t('Permission denied.') . EOL); - killme(); + exit(); } $owner_record = User::getOwnerDataById($page_owner_uid); @@ -193,10 +184,13 @@ function photos_post(App $a) if (!$owner_record) { notice(L10n::t('Contact information unavailable') . EOL); Logger::log('photos_post: unable to locate contact record for page owner. uid=' . $page_owner_uid); - killme(); + exit(); } if ($a->argc > 3 && $a->argv[2] === 'album') { + if (!Strings::isHex($a->argv[3])) { + $a->internalRedirect('photos/' . $a->data['user']['nickname'] . '/album'); + } $album = hex2bin($a->argv[3]); if ($album === L10n::t('Profile Photos') || $album === 'Contact Photos' || $album === L10n::t('Contact Photos')) { @@ -236,36 +230,12 @@ function photos_post(App $a) } /* - * DELETE photo album and all its photos + * DELETE all photos filed in a given album */ - - if ($_POST['dropalbum'] == L10n::t('Delete Album')) { - // Check if we should do HTML-based delete confirmation - if (!empty($_REQUEST['confirm'])) { - $drop_url = $a->query_string; - - $extra_inputs = [ - ['name' => 'albumname', 'value' => $_POST['albumname']], - ]; - - $a->page['content'] = Renderer::replaceMacros(Renderer::getMarkupTemplate('confirm.tpl'), [ - '$method' => 'post', - '$message' => L10n::t('Do you really want to delete this photo album and all its photos?'), - '$extra_inputs' => $extra_inputs, - '$confirm' => L10n::t('Delete Album'), - '$confirm_url' => $drop_url, - '$confirm_name' => 'dropalbum', // Needed so that confirmation will bring us back into this if statement - '$cancel' => L10n::t('Cancel'), - ]); - - $a->error = 1; // Set $a->error so the other module functions don't execute - return; - } - + if (!empty($_POST['dropalbum'])) { $res = []; // get the list of photos we are about to delete - if ($visitor) { $r = q("SELECT distinct(`resource-id`) as `rid` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d AND `album` = '%s'", intval($visitor), @@ -283,77 +253,57 @@ function photos_post(App $a) foreach ($r as $rr) { $res[] = $rr['rid']; } - } else { - $a->internalRedirect($_SESSION['photo_return']); - return; // NOTREACHED - } - // remove the associated photos - Photo::delete(['resource-id' => $res, 'uid' => $page_owner_uid]); + // remove the associated photos + Photo::delete(['resource-id' => $res, 'uid' => $page_owner_uid]); - // find and delete the corresponding item with all the comments and likes/dislikes - Item::deleteForUser(['resource-id' => $res, 'uid' => $page_owner_uid], $page_owner_uid); + // find and delete the corresponding item with all the comments and likes/dislikes + Item::deleteForUser(['resource-id' => $res, 'uid' => $page_owner_uid], $page_owner_uid); - // Update the photo albums cache - Photo::clearAlbumCache($page_owner_uid); + // Update the photo albums cache + Photo::clearAlbumCache($page_owner_uid); + notice(L10n::t('Album successfully deleted')); + } else { + notice(L10n::t('Album was empty.')); + } } - $a->internalRedirect('photos/' . $a->data['user']['nickname']); - return; // NOTREACHED + $a->internalRedirect('photos/' . $a->argv[1]); } + if ($a->argc > 3 && $a->argv[2] === 'image') { + // Check if the user has responded to a delete confirmation query for a single photo + if (!empty($_POST['canceled'])) { + $a->internalRedirect('photos/' . $a->argv[1] . '/image/' . $a->argv[3]); + } - // Check if the user has responded to a delete confirmation query for a single photo - if ($a->argc > 2 && !empty($_REQUEST['canceled'])) { - $a->internalRedirect($_SESSION['photo_return']); - } - - if ($a->argc > 2 && defaults($_POST, 'delete', '') === L10n::t('Delete Photo')) { - - // same as above but remove single photo - - // Check if we should do HTML-based delete confirmation - if (!empty($_REQUEST['confirm'])) { - $drop_url = $a->query_string; + if (!empty($_POST['delete'])) { + // same as above but remove single photo + if ($visitor) { + $condition = ['contact-id' => $visitor, 'uid' => $page_owner_uid, 'resource-id' => $a->argv[3]]; - $a->page['content'] = Renderer::replaceMacros(Renderer::getMarkupTemplate('confirm.tpl'), [ - '$method' => 'post', - '$message' => L10n::t('Do you really want to delete this photo?'), - '$extra_inputs' => [], - '$confirm' => L10n::t('Delete Photo'), - '$confirm_url' => $drop_url, - '$confirm_name' => 'delete', // Needed so that confirmation will bring us back into this if statement - '$cancel' => L10n::t('Cancel'), - ]); + } else { + $condition = ['uid' => local_user(), 'resource-id' => $a->argv[3]]; + } - $a->error = 1; // Set $a->error so the other module functions don't execute - return; - } + $photo = DBA::selectFirst('photo', ['resource-id'], $condition); - if ($visitor) { - $r = q("SELECT `id`, `resource-id` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d AND `resource-id` = '%s' LIMIT 1", - intval($visitor), - intval($page_owner_uid), - DBA::escape($a->argv[2]) - ); - } else { - $r = q("SELECT `id`, `resource-id` FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s' LIMIT 1", - intval(local_user()), - DBA::escape($a->argv[2]) - ); - } + if (DBA::isResult($photo)) { + Photo::delete(['uid' => $page_owner_uid, 'resource-id' => $photo['resource-id']]); - if (DBA::isResult($r)) { - Photo::delete(['resource-id' => $r[0]['resource-id'], 'uid' => $page_owner_uid]); + Item::deleteForUser(['resource-id' => $photo['resource-id'], 'uid' => $page_owner_uid], $page_owner_uid); - Item::deleteForUser(['resource-id' => $r[0]['resource-id'], 'uid' => $page_owner_uid], $page_owner_uid); + // Update the photo albums cache + Photo::clearAlbumCache($page_owner_uid); + notice('Successfully deleted the photo.'); + } else { + notice('Failed to delete the photo.'); + $a->internalRedirect('photos/' . $a->argv[1] . '/image/' . $a->argv[3]); + } - // Update the photo albums cache - Photo::clearAlbumCache($page_owner_uid); + $a->internalRedirect('photos/' . $a->argv[1]); + return; // NOTREACHED } - - $a->internalRedirect('photos/' . $a->data['user']['nickname']); - return; // NOTREACHED } if ($a->argc > 2 && (!empty($_POST['desc']) || !empty($_POST['newtag']) || isset($_POST['albname']))) { @@ -368,7 +318,7 @@ function photos_post(App $a) $str_group_deny = !empty($_POST['group_deny']) ? perms2str($_POST['group_deny']) : ''; $str_contact_deny = !empty($_POST['contact_deny']) ? perms2str($_POST['contact_deny']) : ''; - $resource_id = $a->argv[2]; + $resource_id = $a->argv[3]; if (!strlen($albname)) { $albname = DateTimeFormat::localNow('Y'); @@ -410,9 +360,12 @@ function photos_post(App $a) } } - $photo = Photo::getPhotoForUser($page_owner_uid, $resource_id); + $photos_stmt = DBA::select('photo', [], ['resource-id' => $resource_id, 'uid' => $page_owner_uid], ['order' => ['scale' => true]]); + + $photos = DBA::toArray($photos_stmt); - if (DBA::isResult($photo)) { + if (DBA::isResult($photos)) { + $photo = $photos[0]; $ext = $phototypes[$photo['type']]; Photo::update( ['desc' => $desc, 'album' => $albname, 'allow_cid' => $str_contact_allow, 'allow_gid' => $str_group_allow, 'deny_cid' => $str_contact_deny, 'deny_gid' => $str_group_deny], @@ -423,16 +376,15 @@ function photos_post(App $a) if ($albname !== $origaname) { Photo::clearAlbumCache($page_owner_uid); } - } - - /* Don't make the item visible if the only change was the album name */ + /* Don't make the item visible if the only change was the album name */ - $visibility = 0; - if ($photo['desc'] !== $desc || strlen($rawtags)) { - $visibility = 1; + $visibility = 0; + if ($photo['desc'] !== $desc || strlen($rawtags)) { + $visibility = 1; + } } - if (!$item_id) { + if (DBA::isResult($photos) && !$item_id) { // Create item container $title = ''; $uri = Item::newURI($page_owner_uid); @@ -469,10 +421,11 @@ function photos_post(App $a) if ($item_id) { $item = Item::selectFirst(['tag', 'inform'], ['id' => $item_id, 'uid' => $page_owner_uid]); - } - if (DBA::isResult($item)) { - $old_tag = $item['tag']; - $old_inform = $item['inform']; + + if (DBA::isResult($item)) { + $old_tag = $item['tag']; + $old_inform = $item['inform']; + } } if (strlen($rawtags)) { @@ -492,6 +445,7 @@ function photos_post(App $a) foreach ($tags as $tag) { if (strpos($tag, '@') === 0) { $profile = ''; + $contact = null; $name = substr($tag,1); if ((strpos($name, '@')) || (strpos($name, 'http://'))) { @@ -519,7 +473,6 @@ function photos_post(App $a) $taginfo[] = [$newname, $profile, $salmon]; } else { $newname = $name; - $alias = ''; $tagcid = 0; if (strrpos($newname, '+')) { @@ -527,34 +480,26 @@ function photos_post(App $a) } if ($tagcid) { - $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", - intval($tagcid), - intval($profile_uid) - ); + $contact = DBA::selectFirst('contact', [], ['id' => $tagcid, 'uid' => $page_owner_uid]); } else { $newname = str_replace('_',' ',$name); //select someone from this user's contacts by name - $r = q("SELECT * FROM `contact` WHERE `name` = '%s' AND `uid` = %d LIMIT 1", - DBA::escape($newname), - intval($page_owner_uid) - ); - - if (!DBA::isResult($r)) { + $contact = DBA::selectFirst('contact', [], ['name' => $newname, 'uid' => $page_owner_uid]); + if (!DBA::isResult($contact)) { //select someone by attag or nick and the name passed in - $r = q("SELECT * FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1", - DBA::escape($name), - DBA::escape($name), - intval($page_owner_uid) + $contact = DBA::selectFirst('contact', [], + ['(`attag` = ? OR `nick` = ?) AND `uid` = ?', $name, $name, $page_owner_uid], + ['order' => ['attag' => true]] ); } } - if (DBA::isResult($r)) { - $newname = $r[0]['name']; - $profile = $r[0]['url']; + if (DBA::isResult($contact)) { + $newname = $contact['name']; + $profile = $contact['url']; - $notify = 'cid:' . $r[0]['id']; + $notify = 'cid:' . $contact['id']; if (strlen($inform)) { $inform .= ','; } @@ -563,8 +508,8 @@ function photos_post(App $a) } if ($profile) { - if (substr($notify, 0, 4) === 'cid:') { - $taginfo[] = [$newname, $profile, $notify, $r[0], '@[url=' . str_replace(',','%2c',$profile) . ']' . $newname . '[/url]']; + if (!empty($contact)) { + $taginfo[] = [$newname, $profile, $notify, $contact, '@[url=' . str_replace(',', '%2c', $profile) . ']' . $newname . '[/url]']; } else { $taginfo[] = [$newname, $profile, $notify, null, $str_tags .= '@[url=' . $profile . ']' . $newname . '[/url]']; } @@ -583,13 +528,13 @@ function photos_post(App $a) } } - $newtag = $old_tag; + $newtag = $old_tag ?? ''; if (strlen($newtag) && strlen($str_tags)) { $newtag .= ','; } $newtag .= $str_tags; - $newinform = $old_inform; + $newinform = $old_inform ?? ''; if (strlen($newinform) && strlen($inform)) { $newinform .= ','; } @@ -600,7 +545,7 @@ function photos_post(App $a) Item::update($fields, $condition); $best = 0; - foreach ($p as $scales) { + foreach ($photos as $scales) { if (intval($scales['scale']) == 2) { $best = 2; break; @@ -648,15 +593,15 @@ function photos_post(App $a) $arr['object'] = '' . ACTIVITY_OBJ_PERSON . '' . $tagged[0] . '' . $tagged[1] . '/' . $tagged[0] . ''; $arr['object'] .= '' . XML::escape('' . "\n"); if ($tagged[3]) { - $arr['object'] .= XML::escape('' . "\n"); + $arr['object'] .= XML::escape('' . "\n"); } $arr['object'] .= '' . "\n"; $arr['target'] = '' . ACTIVITY_OBJ_IMAGE . '' . $photo['desc'] . '' . System::baseUrl() . '/photos/' . $owner_record['nickname'] . '/image/' . $photo['resource-id'] . ''; - $arr['target'] .= '' . XML::escape('' . "\n" . '') . ''; + $arr['target'] .= '' . XML::escape('' . "\n" . '') . ''; - $item_id = Item::insert($arr); + Item::insert($arr); } } } @@ -666,7 +611,7 @@ function photos_post(App $a) // default post action - upload a photo - Addon::callHooks('photo_post_init', $_POST); + Hook::callAll('photo_post_init', $_POST); // Determine the album to use $album = !empty($_REQUEST['album']) ? Strings::escapeTags(trim($_REQUEST['album'])) : ''; @@ -690,7 +635,7 @@ function photos_post(App $a) * they acquire comments, likes, dislikes, and/or tags */ - $r = Photo::select([], ["`album` = ? AND `uid` = ? AND `created` > UTC_TIMESTAMP() - INTERVAL 3 HOUR", $album, $page_owner_uid]); + $r = Photo::select([], ['`album` = ? AND `uid` = ? AND `created` > UTC_TIMESTAMP() - INTERVAL 3 HOUR', $album, $page_owner_uid]); if (!DBA::isResult($r) || ($album == L10n::t('Profile Photos'))) { $visible = 1; @@ -714,7 +659,7 @@ function photos_post(App $a) $ret = ['src' => '', 'filename' => '', 'filesize' => 0, 'type' => '']; - Addon::callHooks('photo_post_file', $ret); + Hook::callAll('photo_post_file', $ret); if (!empty($ret['src']) && !empty($ret['filesize'])) { $src = $ret['src']; @@ -754,7 +699,7 @@ function photos_post(App $a) } @unlink($src); $foo = 0; - Addon::callHooks('photo_post_end', $foo); + Hook::callAll('photo_post_end', $foo); return; } @@ -770,7 +715,7 @@ function photos_post(App $a) notice(L10n::t('Image exceeds size limit of %s', Strings::formatBytes($maximagesize)) . EOL); @unlink($src); $foo = 0; - Addon::callHooks('photo_post_end', $foo); + Hook::callAll('photo_post_end', $foo); return; } @@ -778,7 +723,7 @@ function photos_post(App $a) notice(L10n::t('Image file is empty.') . EOL); @unlink($src); $foo = 0; - Addon::callHooks('photo_post_end', $foo); + Hook::callAll('photo_post_end', $foo); return; } @@ -793,8 +738,8 @@ function photos_post(App $a) notice(L10n::t('Unable to process image.') . EOL); @unlink($src); $foo = 0; - Addon::callHooks('photo_post_end',$foo); - killme(); + Hook::callAll('photo_post_end',$foo); + return; } $exif = $image->orient($src); @@ -820,7 +765,7 @@ function photos_post(App $a) if (!$r) { Logger::log('mod/photos.php: photos_post(): image store failed', Logger::DEBUG); notice(L10n::t('Image upload failed.') . EOL); - killme(); + return; } if ($width > 640 || $height > 640) { @@ -879,7 +824,7 @@ function photos_post(App $a) // Update the photo albums cache Photo::clearAlbumCache($page_owner_uid); - Addon::callHooks('photo_post_end', $item_id); + Hook::callAll('photo_post_end', $item_id); // addon uploaders should call "killme()" [e.g. exit] within the photo_post_end hook // if they do not wish to be redirected @@ -896,8 +841,10 @@ function photos_content(App $a) // photos/name/upload/xxxxx (xxxxx is album name) // photos/name/album/xxxxx // photos/name/album/xxxxx/edit + // photos/name/album/xxxxx/drop // photos/name/image/xxxxx // photos/name/image/xxxxx/edit + // photos/name/image/xxxxx/drop if (Config::get('system', 'block_public') && !local_user() && !remote_user()) { notice(L10n::t('Public access denied.') . EOL); @@ -936,11 +883,12 @@ function photos_content(App $a) $contact = null; $remote_contact = false; $contact_id = 0; - $edit = false; + $edit = ''; + $drop = ''; $owner_uid = $a->data['user']['uid']; - $community_page = (($a->data['user']['page-flags'] == Contact::PAGE_COMMUNITY) ? true : false); + $community_page = (($a->data['user']['page-flags'] == User::PAGE_FLAGS_COMMUNITY) ? true : false); if (local_user() && (local_user() == $owner_uid)) { $can_post = true; @@ -954,15 +902,12 @@ function photos_content(App $a) } } } + if ($contact_id) { + $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => $owner_uid, 'blocked' => false, 'pending' => false]); - $r = q("SELECT `uid` FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1", - intval($contact_id), - intval($owner_uid) - ); - if (DBA::isResult($r)) { + if (DBA::isResult($contact)) { $can_post = true; - $contact = $r[0]; $remote_contact = true; $visitor = $contact_id; } @@ -983,16 +928,13 @@ function photos_content(App $a) } } } + if ($contact_id) { $groups = Group::getIdsByContactId($contact_id); - $r = q("SELECT * FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1", - intval($contact_id), - intval($owner_uid) - ); - if (DBA::isResult($r)) { - $contact = $r[0]; - $remote_contact = true; - } + + $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => $owner_uid, 'blocked' => false, 'pending' => false]); + + $remote_contact = DBA::isResult($contact); } } @@ -1012,7 +954,7 @@ function photos_content(App $a) // tabs $is_owner = (local_user() && (local_user() == $owner_uid)); - $o .= Profile::getTabs($a, $is_owner, $a->data['user']['nickname']); + $o .= Profile::getTabs($a, 'photos', $is_owner, $a->data['user']['nickname']); // Display upload form if ($datatype === 'upload') { @@ -1021,7 +963,7 @@ function photos_content(App $a) return; } - $selname = $datum ? hex2bin($datum) : ''; + $selname = Strings::isHex($datum) ? hex2bin($datum) : ''; $albumselect = ''; @@ -1042,7 +984,7 @@ function photos_content(App $a) 'addon_text' => $uploader, 'default_upload' => true]; - Addon::callHooks('photo_upload_form',$ret); + Hook::callAll('photo_upload_form',$ret); $default_upload_box = Renderer::replaceMacros(Renderer::getMarkupTemplate('photos_default_uploader_box.tpl'), []); $default_upload_submit = Renderer::replaceMacros(Renderer::getMarkupTemplate('photos_default_uploader_submit.tpl'), [ @@ -1088,6 +1030,10 @@ function photos_content(App $a) // Display a single photo album if ($datatype === 'album') { + // if $datum is not a valid hex, redirect to the default page + if (!Strings::isHex($datum)) { + $a->internalRedirect('photos/' . $a->data['user']['nickname']. '/album'); + } $album = hex2bin($datum); $total = 0; @@ -1121,6 +1067,24 @@ function photos_content(App $a) $pager->getItemsPerPage() ); + if ($cmd === 'drop') { + $drop_url = $a->query_string; + + $extra_inputs = [ + ['name' => 'albumname', 'value' => $_POST['albumname']], + ]; + + return Renderer::replaceMacros(Renderer::getMarkupTemplate('confirm.tpl'), [ + '$method' => 'post', + '$message' => L10n::t('Do you really want to delete this photo album and all its photos?'), + '$extra_inputs' => $extra_inputs, + '$confirm' => L10n::t('Delete Album'), + '$confirm_url' => $drop_url, + '$confirm_name' => 'dropalbum', + '$cancel' => L10n::t('Cancel'), + ]); + } + // edit album name if ($cmd === 'edit') { if (($album !== L10n::t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== L10n::t('Contact Photos'))) { @@ -1142,6 +1106,7 @@ function photos_content(App $a) } else { if (($album !== L10n::t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== L10n::t('Contact Photos')) && $can_post) { $edit = [L10n::t('Edit Album'), 'photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($album) . '/edit']; + $drop = [L10n::t('Drop Album'), 'photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($album) . '/drop']; } } @@ -1187,6 +1152,7 @@ function photos_content(App $a) '$upload' => [L10n::t('Upload New Photos'), 'photos/' . $a->data['user']['nickname'] . '/upload/' . bin2hex($album)], '$order' => $order, '$edit' => $edit, + '$drop' => $drop, '$paginate' => $pager->renderFull($total), ]); @@ -1204,12 +1170,7 @@ function photos_content(App $a) ); if (!DBA::isResult($ph)) { - $ph = q("SELECT `id` FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s' - LIMIT 1", - intval($owner_uid), - DBA::escape($datum) - ); - if (DBA::isResult($ph)) { + if (DBA::exists('photo', ['resource-id' => $datum, 'uid' => $owner_uid])) { notice(L10n::t('Permission denied. Access to this item may be restricted.')); } else { notice(L10n::t('Photo not available') . EOL); @@ -1217,6 +1178,20 @@ function photos_content(App $a) return; } + if ($cmd === 'drop') { + $drop_url = $a->query_string; + + return Renderer::replaceMacros(Renderer::getMarkupTemplate('confirm.tpl'), [ + '$method' => 'post', + '$message' => L10n::t('Do you really want to delete this photo?'), + '$extra_inputs' => [], + '$confirm' => L10n::t('Delete Photo'), + '$confirm_url' => $drop_url, + '$confirm_name' => 'delete', + '$cancel' => L10n::t('Cancel'), + ]); + } + $prevlink = ''; $nextlink = ''; @@ -1225,7 +1200,7 @@ function photos_content(App $a) * The query leads to a really intense used index. * By now we hide it if someone wants to. */ - if (!Config::get('system', 'no_count', false)) { + if ($cmd === 'view' && !Config::get('system', 'no_count', false)) { $order_field = defaults($_GET, 'order', ''); if ($order_field === 'posted') { @@ -1256,12 +1231,26 @@ function photos_content(App $a) break; } } - $edit_suffix = ((($cmd === 'edit') && $can_post) ? '/edit' : ''); + if (!is_null($prv)) { - $prevlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$prv]['resource-id'] . $edit_suffix . ($order_field === 'posted' ? '?f=&order=posted' : ''); + $prevlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$prv]['resource-id'] . ($order_field === 'posted' ? '?f=&order=posted' : ''); } if (!is_null($nxt)) { - $nextlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$nxt]['resource-id'] . $edit_suffix . ($order_field === 'posted' ? '?f=&order=posted' : ''); + $nextlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$nxt]['resource-id'] . ($order_field === 'posted' ? '?f=&order=posted' : ''); + } + + $tpl = Renderer::getMarkupTemplate('photo_edit_head.tpl'); + $a->page['htmlhead'] .= Renderer::replaceMacros($tpl,[ + '$prevlink' => $prevlink, + '$nextlink' => $nextlink + ]); + + if ($prevlink) { + $prevlink = [$prevlink, '']; + } + + if ($nextlink) { + $nextlink = [$nextlink, '']; } } } @@ -1283,33 +1272,23 @@ function photos_content(App $a) $album_link = 'photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($ph[0]['album']); $tools = null; - $lock = null; if ($can_post && ($ph[0]['uid'] == $owner_uid)) { - $tools = [ - 'edit' => ['photos/' . $a->data['user']['nickname'] . '/image/' . $datum . (($cmd === 'edit') ? '' : '/edit'), (($cmd === 'edit') ? L10n::t('View photo') : L10n::t('Edit photo'))], - 'profile'=>['profile_photo/use/'.$ph[0]['resource-id'], L10n::t('Use as profile photo')], - ]; - - // lock - $lock = ((($ph[0]['uid'] == local_user()) && (strlen($ph[0]['allow_cid']) || strlen($ph[0]['allow_gid']) - || strlen($ph[0]['deny_cid']) || strlen($ph[0]['deny_gid']))) - ? L10n::t('Private Message') - : Null); - - - } - - if ($cmd === 'edit') { - $tpl = Renderer::getMarkupTemplate('photo_edit_head.tpl'); - $a->page['htmlhead'] .= Renderer::replaceMacros($tpl,[ - '$prevlink' => $prevlink, - '$nextlink' => $nextlink - ]); - } + $tools = []; + if ($cmd === 'edit') { + $tools['view'] = ['photos/' . $a->data['user']['nickname'] . '/image/' . $datum, L10n::t('View photo')]; + } else { + $tools['edit'] = ['photos/' . $a->data['user']['nickname'] . '/image/' . $datum . '/edit', L10n::t('Edit photo')]; + $tools['delete'] = ['photos/' . $a->data['user']['nickname'] . '/image/' . $datum . '/drop', L10n::t('Delete photo')]; + $tools['profile'] = ['profile_photo/use/'.$ph[0]['resource-id'], L10n::t('Use as profile photo')]; + } - if ($prevlink) { - $prevlink = [$prevlink, '']; + if ( + $ph[0]['uid'] == local_user() + && (strlen($ph[0]['allow_cid']) || strlen($ph[0]['allow_gid']) || strlen($ph[0]['deny_cid']) || strlen($ph[0]['deny_gid'])) + ) { + $tools['lock'] = L10n::t('Private Photo'); + } } $photo = [ @@ -1322,10 +1301,9 @@ function photos_content(App $a) 'filename' => $hires['filename'], ]; - if ($nextlink) { - $nextlink = [$nextlink, '']; - } - + $map = null; + $link_item = []; + $total = 0; // Do we have an item for this photo? @@ -1339,15 +1317,12 @@ function photos_content(App $a) $linked_items = q("SELECT `id` FROM `item` WHERE `resource-id` = '%s' $sql_extra LIMIT 1", DBA::escape($datum) ); - - $map = null; - $link_item = []; - $total = 0; - if (DBA::isResult($linked_items)) { // This is a workaround to not being forced to rewrite the while $sql_extra handling $link_item = Item::selectFirst([], ['id' => $linked_items[0]['id']]); + } + if (!empty($link_item['parent']) && !empty($link_item['uid'])) { $condition = ["`parent` = ? AND `parent` != `id`", $link_item['parent']]; $total = DBA::count('item', $condition); @@ -1357,25 +1332,25 @@ function photos_content(App $a) $result = Item::selectForUser($link_item['uid'], Item::ITEM_FIELDLIST, $condition, $params); $items = Item::inArray($result); - if (local_user() && (local_user() == $link_item['uid'])) { + if (local_user() == $link_item['uid']) { Item::update(['unseen' => false], ['parent' => $link_item['parent']]); } + } - if ($link_item['coord']) { - $map = Map::byCoordinates($link_item['coord']); - } + if (!empty($link_item['coord'])) { + $map = Map::byCoordinates($link_item['coord']); } $tags = null; - if (count($linked_items) && strlen($link_item['tag'])) { + if (!empty($link_item['id']) && !empty($link_item['tag'])) { $arr = explode(',', $link_item['tag']); // parse tags and add links $tag_arr = []; foreach ($arr as $tag) { $tag_arr[] = [ 'name' => BBCode::convert($tag), - 'removeurl' => '/tagrm/'.$link_item['id'] . '/' . bin2hex($tag) + 'removeurl' => '/tagrm/' . $link_item['id'] . '/' . bin2hex($tag) ]; } $tags = ['title' => L10n::t('Tags: '), 'tags' => $tag_arr]; @@ -1408,7 +1383,7 @@ function photos_content(App $a) '$permissions' => L10n::t('Permissions'), '$aclselect' => $aclselect_e, - '$item_id' => defaults($link_item, 'id', 0), + '$item_id' => $link_item['id'] ?? 0, '$submit' => L10n::t('Submit'), '$delete' => L10n::t('Delete Photo'), @@ -1426,12 +1401,12 @@ function photos_content(App $a) $paginate = ''; $responses = ''; - if (count($linked_items)) { + if (!empty($link_item['id']) && !empty($link_item['uri'])) { $cmnt_tpl = Renderer::getMarkupTemplate('comment_item.tpl'); $tpl = Renderer::getMarkupTemplate('photo_item.tpl'); $return_path = $a->cmd; - if ($can_post || Security::canWriteToUserWall($owner_uid)) { + if ($cmd === 'view' && ($can_post || Security::canWriteToUserWall($owner_uid))) { $like_tpl = Renderer::getMarkupTemplate('like_noshare.tpl'); $likebuttons = Renderer::replaceMacros($like_tpl, [ '$id' => $link_item['id'], @@ -1510,7 +1485,7 @@ function photos_content(App $a) continue; } - $profile_url = Contact::MagicLinkById($item['author-id']); + $profile_url = Contact::magicLinkbyId($item['author-id']); if (strpos($profile_url, 'redir/') === 0) { $sparkle = ' sparkle'; } else { @@ -1537,7 +1512,7 @@ function photos_content(App $a) '$title' => $title_e, '$body' => $body_e, '$ago' => Temporal::getRelativeDate($item['created']), - '$indent' => (($item['parent'] != $item['item_id']) ? ' comment' : ''), + '$indent' => (($item['parent'] != $item['id']) ? ' comment' : ''), '$drop' => $drop, '$comment' => $comment ]); @@ -1546,7 +1521,7 @@ function photos_content(App $a) $comments .= Renderer::replaceMacros($cmnt_tpl, [ '$return_path' => '', '$jsreload' => $return_path, - '$id' => $item['item_id'], + '$id' => $item['id'], '$parent' => $item['parent'], '$profile_uid' => $owner_uid, '$mylink' => $contact['url'], @@ -1564,7 +1539,7 @@ function photos_content(App $a) } $response_verbs = ['like']; $response_verbs[] = 'dislike'; - $responses = get_responses($conv_responses, $response_verbs, '', $link_item); + $responses = get_responses($conv_responses, $response_verbs, $link_item); $paginate = $pager->renderFull($total); } @@ -1574,7 +1549,6 @@ function photos_content(App $a) '$id' => $ph[0]['id'], '$album' => [$album_link, $ph[0]['album']], '$tools' => $tools, - '$lock' => $lock, '$photo' => $photo, '$prevlink' => $prevlink, '$nextlink' => $nextlink,