From 884ca9f43d981acbf71e43a9f1ff321cb163e787 Mon Sep 17 00:00:00 2001 From: garvinhicking Date: Mon, 24 Apr 2006 17:42:26 +0000 Subject: [PATCH] Finalize --- docs/NEWS | 9 +- include/admin/images.inc.php | 52 +---- include/functions_images.inc.php | 232 ++++++++++++++++++++++- serendipity_admin_image_selector.php | 28 +-- templates/default/admin/media_choose.tpl | 1 + templates/default/admin/media_items.tpl | 11 +- templates/default/admin/media_pane.tpl | 6 +- 7 files changed, 263 insertions(+), 76 deletions(-) diff --git a/docs/NEWS b/docs/NEWS index 4ac252b..9486865 100644 --- a/docs/NEWS +++ b/docs/NEWS @@ -51,12 +51,9 @@ Version 1.1-alpha4() &serendipity[resizeWidth]=X&serendipity[resizeHeight]=Y - Track referrers by image selector and show them on detail page - - TODO: - - Move/rename images/directories (browse serendipity_entries to - fix up image paths [using ]. Also move ALL - images of a directory, like when moving s9y installations. Put - this into "Sync Thumbs" or "Manage Directories" panel. + - Allow to move directories with files and updating all links + in your entries to those moved items. (MySQL only!) + - Allow to move single images. (garvinhicking) * Create a new index on the plugin DB table, optimize fetching config diff --git a/include/admin/images.inc.php b/include/admin/images.inc.php index a32f9ac..b07a69c 100644 --- a/include/admin/images.inc.php +++ b/include/admin/images.inc.php @@ -67,6 +67,7 @@ switch ($serendipity['GET']['adminAction']) { break; case 'rename': + $serendipity['GET']['fid'] = (int)$serendipity['GET']['fid']; $file = serendipity_fetchImageFromDatabase($serendipity['GET']['fid']); $serendipity['GET']['newname'] = serendipity_uploadSecure($serendipity['GET']['newname'], true); @@ -74,52 +75,12 @@ switch ($serendipity['GET']['adminAction']) { return; } - if (serendipity_isActiveFile(basename($serendipity['GET']['newname']))) { - printf(ERROR_FILE_FORBIDDEN, htmlspecialchars($serendipity['GET']['newname'])); - return; - } - - if ($file['hotlink']) { - serendipity_updateImageInDatabase(array('name' => $serendipity['GET']['newname']), $serendipity['GET']['fid']); - } else { - $newfile = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $file['path'] . $serendipity['GET']['newname'] . '.' . $file['extension']; - $oldfile = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $file['path'] . $file['name'] . '.'. $file['extension']; - if ($serendipity['GET']['newname'] != '' && file_exists($oldfile) && !file_exists($newfile)) { - $renameValues = array(array( - 'from' => $oldfile, - 'to' => $newfile, - 'thumb' => $serendipity['thumbSuffix'], - 'fthumb' => $file['thumbnail_name'] - )); - - serendipity_plugin_api::hook_event('backend_media_rename', $renameValues); - - // Rename file - rename($renameValues[0]['from'], $renameValues[0]['to']); - - foreach($renameValues as $renameData) { - // Rename thumbnail - rename($serendipity['serendipityPath'] . $serendipity['uploadPath'] . $file['path'] . $file['name'] . (!empty($renameData['fthumb']) ? '.' . $renameData['fthumb'] : '') . '.' . $file['extension'], - $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $file['path'] . $serendipity['GET']['newname'] . '.' . $renameData['thumb'] . '.' . $file['extension']); - } - - serendipity_updateImageInDatabase(array('thumbnail_name' => $renameValues[0]['thumb'], 'name' => $serendipity['GET']['newname']), $serendipity['GET']['fid']); - - // Forward user to overview (we don't want the user's back button to rename things again) - } else { - if (!file_exists($oldfile)) { - echo ERROR_FILE_NOT_EXISTS; - } elseif (file_exists($newfile)) { - echo ERROR_FILE_EXISTS; - } else { - echo ERROR_SOMETHING; - } + if (!serendipity_moveMediaDirectory(null, $serendipity['GET']['newname'], 'file', $serendipity['GET']['fid'], $file)) { ?>
' . sprintf(SETTINGS_SAVED_AT, serendipity_strftime('%H:%M:%S')) . ''; @@ -543,7 +511,7 @@ switch ($serendipity['GET']['adminAction']) {
- + diff --git a/include/functions_images.inc.php b/include/functions_images.inc.php index 557b536..a9ee2e8 100644 --- a/include/functions_images.inc.php +++ b/include/functions_images.inc.php @@ -2112,6 +2112,7 @@ function serendipity_showPropertyForm(&$new_media, $keywordsPerBlock = 3, $is_ed 'keywords' => $keywords, 'dprops' => $dprops ); + return serendipity_showMedia( $show, $mirror, @@ -2379,6 +2380,14 @@ function serendipity_parsePropertyForm() { 'authorid' => $serendipity['authorid'] ); serendipity_insertMediaProperty('base_hidden', '', $media['image_id'], $s9y_img['hidden']); + + if ($serendipity['POST']['oldDir'][$id] != $serendipity['POST']['newDir'][$id]) { + serendipity_moveMediaDirectory( + serendipity_uploadSecure($serendipity['POST']['oldDir'][$id]), + serendipity_uploadSecure($serendipity['POST']['newDir'][$id]), + 'filedir', + $media['image_id']); + } } foreach($serendipity['POST']['mediaKeywords'] AS $id => $keywords) { @@ -2612,7 +2621,11 @@ function serendipity_showMedia(&$file, &$paths, $url = '', $manage = false, $lin $media = array_merge($media, $smarty_vars); $media['files'] =& $file; - $media['paths'] =& $paths; + if (count($paths) > 0) { + $media['paths'] =& $paths; + } else { + $media['paths'] =& serendipity_getMediaPaths(); + } $serendipity['smarty']->assign('media', $media); @@ -2997,4 +3010,221 @@ function serendipity_checkMediaSize($file) { } return true; +} + +/** + * Moves a media directory + * + * @param string The old directory + * @param string The new directory + * @param string The type of what to remove (dir|file|filedir) + * @param string An item id of a file + * @return boolean + * + */ +function serendipity_moveMediaDirectory($oldDir, $newDir, $type = 'dir', $item_id = null, $file = null) { + global $serendipity; + + $real_oldDir = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $oldDir; + $real_newDir = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $newDir; + + if ($type == 'dir') { + if (!is_dir($real_oldDir)) { + printf(ERROR_FILE_NOT_EXISTS . '
', $oldDir); + return false; + } + + if (is_dir($real_newDir)) { + printf(ERROR_FILE_EXISTS . '
', $newDir); + return false; + } + + if (!rename($real_oldDir, $real_newDir)) { + printf(MEDIA_DIRECTORY_MOVE_ERROR . '
', $newDir); + return false; + } + + printf(MEDIA_DIRECTORY_MOVED . '
', $newDir); + + $dirs = serendipity_db_query("SELECT id, path + FROM {$serendipity['dbPrefix']}images + WHERE path LIKE '" . serendipity_db_escape_string($oldDir) . "%'", false, 'assoc'); + if (is_array($dirs)) { + foreach($dirs AS $dir) { + $old = $dir['path']; + $new = preg_replace('@^(' . preg_quote($oldDir) . ')@i', $newDir, $old); + serendipity_db_query("UPDATE {$serendipity['dbPrefix']}images + SET path = '" . serendipity_db_escape_string($new) . "' + WHERE id = {$dir['id']}"); + } + } + + $dirs = serendipity_db_query("SELECT groupid, artifact_id, artifact_type, artifact_mode, artifact_index + FROM {$serendipity['dbPrefix']}access + WHERE artifact_type = 'directory' + AND artifact_index LIKE '" . serendipity_db_escape_string($oldDir) . "%'", false, 'assoc'); + if (is_array($dirs)) { + foreach($dirs AS $dir) { + $old = $dir['artifact_index']; + $new = preg_replace('@^(' . preg_quote($oldDir) . ')@i', $newDir, $old); + serendipity_db_query("UPDATE {$serendipity['dbPrefix']}access + SET artifact_index = '" . serendipity_db_escape_string($new) . "' + WHERE groupid = '" . serendipity_db_escape_string($dir['groupid']) . "' + AND artifact_id = '" . serendipity_db_escape_string($dir['artifact_id']) . "' + AND artifact_type = '" . serendipity_db_escape_string($dir['artifact_type']) . "' + AND artifact_mode = '" . serendipity_db_escape_string($dir['artifact_mode']) . "' + AND artifact_index = '" . serendipity_db_escape_string($dir['artifact_index']) . "'"); + } + } + } + + if ($type == 'file') { + if (serendipity_isActiveFile(basename($newDir))) { + printf(ERROR_FILE_FORBIDDEN, htmlspecialchars($newDir)); + return false; + } + + if ($file['hotlink']) { + serendipity_updateImageInDatabase(array('name' => $newDir), $item_id); + } else { + $file_new = $file['path'] . $newDir . '.'; + $file_old = $file['path'] . $file['name'] . '.'; + + $newfile = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $file_new . $file['extension']; + $oldfile = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $file_old . $file['extension']; + if ($newDir != '' && file_exists($oldfile) && !file_exists($newfile)) { + $renameValues = array(array( + 'from' => $oldfile, + 'to' => $newfile, + 'thumb' => $serendipity['thumbSuffix'], + 'fthumb' => $file['thumbnail_name'] + )); + + serendipity_plugin_api::hook_event('backend_media_rename', $renameValues); + + // Rename file + rename($renameValues[0]['from'], $renameValues[0]['to']); + + foreach($renameValues as $renameData) { + // Rename thumbnail + rename($serendipity['serendipityPath'] . $serendipity['uploadPath'] . $file['path'] . $file['name'] . (!empty($renameData['fthumb']) ? '.' . $renameData['fthumb'] : '') . '.' . $file['extension'], + $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $file['path'] . $newDir . '.' . $renameData['thumb'] . '.' . $file['extension']); + } + + serendipity_updateImageInDatabase(array('thumbnail_name' => $renameValues[0]['thumb'], 'name' => $newDir), $item_id); + $oldDir = $file_old; + $newDir = $file_new; + $real_oldDir = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $oldDir; + $real_newDir = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $newDir; + // Forward user to overview (we don't want the user's back button to rename things again) + } else { + if (!file_exists($oldfile)) { + echo ERROR_FILE_NOT_EXISTS; + } elseif (file_exists($newfile)) { + echo ERROR_FILE_EXISTS; + } else { + echo ERROR_SOMETHING; + } + + return false; + } + } + } + + if ($type == 'filedir') { + serendipity_db_query("UPDATE {$serendipity['dbPrefix']}images + SET path = '" . serendipity_db_escape_string($newDir) . "' + WHERE id = " . (int)$item_id); + $pick = serendipity_db_query("SELECT * FROM {$serendipity['dbPrefix']}images + WHERE id = " . (int)$item_id, true, 'assoc'); + + // Move thumbs + $oldfile = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $oldDir . $pick['name'] . '.' . $pick['extension']; + $newfile = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $newDir . $pick['name'] . '.' . $pick['extension']; + + $renameValues = array(array( + 'from' => $oldfile, + 'to' => $newfile, + 'thumb' => $serendipity['thumbSuffix'], + 'fthumb' => $pick['thumbnail_name'] + )); + + serendipity_plugin_api::hook_event('backend_media_rename', $renameValues); + + // Rename file + rename($renameValues[0]['from'], $renameValues[0]['to']); + + foreach($renameValues as $renameData) { + // Rename thumbnail + rename($serendipity['serendipityPath'] . $serendipity['uploadPath'] . $oldDir . $pick['name'] . (!empty($renameData['fthumb']) ? '.' . $renameData['fthumb'] : '') . '.' . $pick['extension'], + $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $newDir . $pick['name'] . '.' . $renameData['thumb'] . '.' . $pick['extension']); + } + + $oldDir .= $pick['name']; + $newDir .= $pick['name']; + } + + // Only MySQL supported, since I don't know how to use REGEXPs differently. + if ($serendipity['dbType'] != 'mysql' && $serendipity['dbType'] != 'mysqli') { + echo MEDIA_DIRECTORY_MOVE_ENTRY . '
'; + return true; + } + + $q = "SELECT id, body, extended + FROM {$serendipity['dbPrefix']}entries + WHERE body REGEXP '(src|href)=(\'|\")" . serendipity_db_escape_string($serendipity['serendipityHTTPPath'] . $serendipity['uploadHTTPPath'] . $oldDir) . "' + OR extended REGEXP '(src|href)=(\'|\")" . serendipity_db_escape_string($serendipity['serendipityHTTPPath'] . $serendipity['uploadHTTPPath'] . $oldDir) . "' + "; + + $dirs = serendipity_db_query($q); + if (is_array($dirs)) { + foreach($dirs AS $dir) { + $dir['body'] = preg_replace('@(src|href)=(\'|")' . preg_quote($serendipity['serendipityHTTPPath'] . $serendipity['uploadHTTPPath'] . $oldDir) . '@', '\1=\2' . $serendipity['serendipityHTTPPath'] . $serendipity['uploadHTTPPath'] . $newDir, $dir['body']); + $dir['extended'] = preg_replace('@(src|href)=(\'|")' . preg_quote($serendipity['serendipityHTTPPath'] . $serendipity['uploadHTTPPath'] . $oldDir) . '@', '\1=\2' . $serendipity['serendipityHTTPPath'] . $serendipity['uploadHTTPPath'] . $newDir, $dir['extended']); + + $uq = "UPDATE {$serendipity['dbPrefix']}entries + SET body = '" . serendipity_db_escape_string($dir['body']) . "' , + extended = '" . serendipity_db_escape_string($dir['extended']) . "' + WHERE id = " . serendipity_db_escape_string($dir['id']); + serendipity_db_query($uq); + } + + printf(MEDIA_DIRECTORY_MOVE_ENTRIES . '
', count($dirs)); + } + + return true; +} + +/** + * Gets all available media directories + * + * @return array + * + */ +function &serendipity_getMediaPaths() { + global $serendipity; + + $aExclude = array("CVS" => true, ".svn" => true); + serendipity_plugin_api::hook_event('backend_media_path_exclude_directories', $aExclude); + $paths = array(); + + $aResultSet = serendipity_traversePath( + $serendipity['serendipityPath'] . $serendipity['uploadPath'], + '', + false, + NULL, + 1, + NULL, + FALSE, + $aExclude + ); + + foreach ($aResultSet AS $sKey => $sFile) { + if ($sFile['directory']) { + array_push($paths, $sFile); + } + unset($aResultSet[$sKey]); + } + serendipity_directoryACL($paths, 'read'); + return $paths; } \ No newline at end of file diff --git a/serendipity_admin_image_selector.php b/serendipity_admin_image_selector.php index 5dc5956..174dc54 100644 --- a/serendipity_admin_image_selector.php +++ b/serendipity_admin_image_selector.php @@ -56,7 +56,8 @@ $media = array( 'token_url' => serendipity_setFormToken('url'), 'imgID' => (int)$serendipity['GET']['image'], 'from' => $serendipity['GET']['from'], - 'GET_STRING' => serendipity_build_query($import_vars, 'serendipity', '&') + 'GET_STRING' => serendipity_build_query($import_vars, 'serendipity', '&'), + 'paths' => &serendipity_getMediaPaths() ); switch ($serendipity['GET']['step']) { @@ -143,30 +144,7 @@ switch ($serendipity['GET']['step']) { break; case 'tree': - $media['case'] = 'tree'; - $aExclude = array("CVS" => true, ".svn" => true); - serendipity_plugin_api::hook_event('backend_media_path_exclude_directories', $aExclude); - $paths = array(); - - $aResultSet = serendipity_traversePath( - $serendipity['serendipityPath'] . $serendipity['uploadPath'], - '', - false, - NULL, - 1, - NULL, - FALSE, - $aExclude - ); - - foreach ($aResultSet AS $sKey => $sFile) { - if ($sFile['directory']) { - array_push($paths, $sFile); - } - unset($aResultSet[$sKey]); - } - serendipity_directoryACL($paths, 'read'); - $media['paths'] =& $paths; + $media['case'] = 'tree'; break; case 'showItem': diff --git a/templates/default/admin/media_choose.tpl b/templates/default/admin/media_choose.tpl index 24e4fbd..ce9006e 100644 --- a/templates/default/admin/media_choose.tpl +++ b/templates/default/admin/media_choose.tpl @@ -244,6 +244,7 @@
diff --git a/templates/default/admin/media_items.tpl b/templates/default/admin/media_items.tpl index 0a11353..bc6c053 100644 --- a/templates/default/admin/media_items.tpl +++ b/templates/default/admin/media_items.tpl @@ -11,7 +11,7 @@ {foreach from=$media.sort_order item="so_val" key="so_key"} - {if $media.filter[$so_key] != ''}{assign var="show_filter" value="true"}{/if} {if $so_val.type == 'date'} + {if $media.filter[$so_key].from != '' OR $media.filter[$so_key].to != ''}{assign var="show_filter" value=$media.filter[$so_key]}{/if} @@ -69,6 +69,7 @@ - (DD.MM.YYYY | YYYY-MM-DD | MM/DD/YYYY) {elseif $so_val.type == 'intrange'} + {if $media.filter[$so_key].from != '' OR $media.filter[$so_key].to != ''}{assign var="show_filter" value=$media.filter[$so_key]}{/if} @@ -76,6 +77,7 @@ - {elseif $so_val.type == 'authors'} + {if $media.filter[$so_key] != ''}{assign var="show_filter" value=$media.filter[$so_key]}{/if} {else} + {if $media.filter[$so_key] != ''}{assign var="show_filter" value=$media.filter[$so_key]}{/if} @@ -97,6 +100,7 @@ -- 2.39.5
{if $file.is_editable} {$CONST.MEDIA_FULLSIZE}
- {$CONST.MEDIA_RENAME}
+ {$CONST.MEDIA_RENAME}
{if $file.is_image AND NOT $file.hotlink}{$CONST.IMAGE_RESIZE}
{/if} {if $file.is_image AND NOT $file.hotlink}{$CONST.IMAGE_ROTATE_LEFT}
{/if} {if $file.is_image AND NOT $file.hotlink}{$CONST.IMAGE_ROTATE_RIGHT}
{/if} @@ -78,6 +78,15 @@ {/if} {/foreach} +
+
+ + +

{$CONST.MEDIA_KEYWORDS}

diff --git a/templates/default/admin/media_pane.tpl b/templates/default/admin/media_pane.tpl index 4a81411..cae0b82 100644 --- a/templates/default/admin/media_pane.tpl +++ b/templates/default/admin/media_pane.tpl @@ -58,10 +58,10 @@
{$so_val.desc}