aboutsummaryrefslogtreecommitdiffstats
path: root/BSF/admin/include/functions_permalinks.php
diff options
context:
space:
mode:
Diffstat (limited to 'BSF/admin/include/functions_permalinks.php')
-rw-r--r--BSF/admin/include/functions_permalinks.php204
1 files changed, 204 insertions, 0 deletions
diff --git a/BSF/admin/include/functions_permalinks.php b/BSF/admin/include/functions_permalinks.php
new file mode 100644
index 000000000..4b19f02e1
--- /dev/null
+++ b/BSF/admin/include/functions_permalinks.php
@@ -0,0 +1,204 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify |
+// | it under the terms of the GNU General Public License as published by |
+// | the Free Software Foundation |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+/** returns a category id that corresponds to the given permalink (or null)
+ * @param string permalink
+ */
+function get_cat_id_from_permalink( $permalink )
+{
+ $query ='
+SELECT id FROM '.CATEGORIES_TABLE.'
+ WHERE permalink="'.$permalink.'"';
+ $ids = array_from_query($query, 'id');
+ if (!empty($ids))
+ {
+ return $ids[0];
+ }
+ return null;
+}
+
+/** returns a category id that has used before this permalink (or null)
+ * @param string permalink
+ * @param boolean is_hit if true update the usage counters on the old permalinks
+ */
+function get_cat_id_from_old_permalink($permalink)
+{
+ $query='
+SELECT c.id
+ FROM '.OLD_PERMALINKS_TABLE.' op INNER JOIN '.CATEGORIES_TABLE.' c
+ ON op.cat_id=c.id
+ WHERE op.permalink="'.$permalink.'"
+ LIMIT 1';
+ $result = pwg_query($query);
+ $cat_id = null;
+ if ( mysql_num_rows($result) )
+ list( $cat_id ) = mysql_fetch_array($result);
+ return $cat_id;
+}
+
+
+/** deletes the permalink associated with a category
+ * returns true on success
+ * @param int cat_id the target category id
+ * @param boolean save if true, the current category-permalink association
+ * is saved in the old permalinks table in case external links hit it
+ */
+function delete_cat_permalink( $cat_id, $save )
+{
+ global $page, $cache;
+ $query = '
+SELECT permalink
+ FROM '.CATEGORIES_TABLE.'
+ WHERE id="'.$cat_id.'"
+;';
+ $result = pwg_query($query);
+ if ( mysql_num_rows($result) )
+ {
+ list($permalink) = mysql_fetch_array($result);
+ }
+ if ( !isset($permalink) )
+ {// no permalink; nothing to do
+ return true;
+ }
+ if ($save)
+ {
+ $old_cat_id = get_cat_id_from_old_permalink($permalink);
+ if ( isset($old_cat_id) and $old_cat_id!=$cat_id )
+ {
+ $page['errors'][] =
+ sprintf(
+ l10n('Permalink_%s_histo_used_by_%s'),
+ $permalink, $old_cat_id
+ );
+ return false;
+ }
+ }
+ $query = '
+UPDATE '.CATEGORIES_TABLE.'
+ SET permalink=NULL
+ WHERE id='.$cat_id.'
+ LIMIT 1';
+ pwg_query($query);
+
+ unset( $cache['cat_names'] ); //force regeneration
+ if ($save)
+ {
+ if ( isset($old_cat_id) )
+ {
+ $query = '
+UPDATE '.OLD_PERMALINKS_TABLE.'
+ SET date_deleted=NOW()
+ WHERE cat_id='.$cat_id.' AND permalink="'.$permalink.'"';
+ }
+ else
+ {
+ $query = '
+INSERT INTO '.OLD_PERMALINKS_TABLE.'
+ (permalink, cat_id, date_deleted)
+VALUES
+ ( "'.$permalink.'",'.$cat_id.',NOW() )';
+ }
+ pwg_query( $query );
+ }
+ return true;
+}
+
+/** sets a new permalink for a category
+ * returns true on success
+ * @param int cat_id the target category id
+ * @param string permalink the new permalink
+ * @param boolean save if true, the current category-permalink association
+ * is saved in the old permalinks table in case external links hit it
+ */
+function set_cat_permalink( $cat_id, $permalink, $save )
+{
+ global $page, $cache;
+
+ $sanitized_permalink = preg_replace( '#[^a-zA-Z0-9_/-]#', '' ,$permalink);
+ $sanitized_permalink = trim($sanitized_permalink, '/');
+ $sanitized_permalink = str_replace('//', '/', $sanitized_permalink);
+ if ( $sanitized_permalink != $permalink
+ or preg_match( '#^(\d)+(-.*)?$#', $permalink) )
+ {
+ $page['errors'][] = l10n('Permalink_name_rule');
+ return false;
+ }
+
+ // check if the new permalink is actively used
+ $existing_cat_id = get_cat_id_from_permalink( $permalink );
+ if ( isset($existing_cat_id) )
+ {
+ if ( $existing_cat_id==$cat_id )
+ {// no change required
+ return true;
+ }
+ else
+ {
+ $page['errors'][] =
+ sprintf(
+ l10n('Permalink %s is already used by category %s'),
+ $permalink, $existing_cat_id
+ );
+ return false;
+ }
+ }
+
+ // check if the new permalink was historically used
+ $old_cat_id = get_cat_id_from_old_permalink($permalink);
+ if ( isset($old_cat_id) and $old_cat_id!=$cat_id )
+ {
+ $page['errors'][] =
+ sprintf(
+ l10n('Permalink_%s_histo_used_by_%s'),
+ $permalink, $old_cat_id
+ );
+ return false;
+ }
+
+ if ( !delete_cat_permalink($cat_id, $save ) )
+ {
+ return false;
+ }
+
+ if ( isset($old_cat_id) )
+ {// the new permalink must not be active and old at the same time
+ assert( $old_cat_id==$cat_id );
+ $query = '
+DELETE FROM '.OLD_PERMALINKS_TABLE.'
+ WHERE cat_id='.$old_cat_id.' AND permalink="'.$permalink.'"';
+ pwg_query($query);
+ }
+
+ $query = '
+UPDATE '.CATEGORIES_TABLE.'
+ SET permalink="'.$permalink.'"
+ WHERE id='.$cat_id.'
+ LIMIT 1';
+ pwg_query($query);
+
+ unset( $cache['cat_names'] ); //force regeneration
+
+ return true;
+}
+
+?>