aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorrvelices <rv-github@modusoptimus.com>2006-02-22 01:00:39 +0000
committerrvelices <rv-github@modusoptimus.com>2006-02-22 01:00:39 +0000
commitfe8fbac3cf9af0464d2b0990c88631ff9fd803ac (patch)
tree69d79b344767d2ce6e7d3d0e48e00c55e6fc9bc2 /include
parent2afff7c2266c55970e666bda1b02964dd97d8f71 (diff)
calendar redesign: monthly and weekly styles + list/calendar views for monthly
git-svn-id: http://piwigo.org/svn/trunk@1050 68402e56-0260-453c-a942-63ccdbb3a9ee
Diffstat (limited to 'include')
-rw-r--r--include/calendar_base.class.php165
-rw-r--r--include/calendar_monthly.class.php309
-rw-r--r--include/calendar_weekly.class.php95
-rw-r--r--include/functions_calendar.inc.php457
4 files changed, 700 insertions, 326 deletions
diff --git a/include/calendar_base.class.php b/include/calendar_base.class.php
new file mode 100644
index 000000000..1f120c811
--- /dev/null
+++ b/include/calendar_base.class.php
@@ -0,0 +1,165 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery |
+// | Copyright (C) 2003-2006 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | branch : BSF (Best So Far)
+// | file : $RCSfile$
+// | last update : $Date: 2006-01-27 02:11:43 +0100 (ven, 27 jan 2006) $
+// | last modifier : $Author: rvelices $
+// | revision : $Revision: 1014 $
+// +-----------------------------------------------------------------------+
+// | 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. |
+// +-----------------------------------------------------------------------+
+
+/**
+ * Base class for monthly and weekly calendar styles
+ */
+class CalendarBase
+{
+// db column on which this calendar works
+var $date_field;
+// used for queries (INNER JOIN or normal)
+var $inner_sql;
+// base url used when generating html links
+var $url_base;
+
+function get_date_where()
+{
+ die("get_date_where not extended");
+}
+
+/**
+ * Initialize the calendar
+ * @param string date_field db column on which this calendar works
+ * @param string inner_sql used for queries (INNER JOIN or normal)
+ */
+function initialize($date_field, $inner_sql)
+{
+ $this->date_field = $date_field;
+ $this->inner_sql = $inner_sql;
+}
+
+//--------------------------------------------------------- private members ---
+/**
+ * Creates a calendar navigation bar.
+ * @param string url_base - links start with this root
+ * @param array items - hash of items to put in the bar (e.g. 2005,2006)
+ * @param array selected_item - item currently selected (e.g. 2005)
+ * @param string class_prefix - html class attribute prefix for span elements
+ * @param bool allow_any - adds any to the end of the bar
+ * @param array labels - optional labels for items (e.g. Jan,Feb,...)
+ * @return string the navigation bar
+ */
+function get_nav_bar_from_items($url_base, $items, $selected_item,
+ $class_prefix, $allow_any, $labels=null)
+{
+ $nav_bar='';
+ foreach ($items as $item => $nb_images)
+ {
+ $label = $item;
+ if (isset($labels[$item]))
+ {
+ $label = $labels[$item];
+ }
+ if ( isset($selected_item) and $item==$selected_item )
+ {
+ $nav_bar .= '<span class="'.$class_prefix.'Sel">';
+ $nav_bar .= $label;
+ }
+ else
+ {
+ $nav_bar .= '<span class="'.$class_prefix.'">';
+ $url = $url_base . $item;
+ $nav_bar .= '<a href="'.$url.'">';
+ $nav_bar .= $label;
+ $nav_bar .= '</a>';
+ }
+ if ($nb_images>0)
+ {
+ $nav_bar .= '('.$nb_images.')';
+ }
+ $nav_bar.= '</span>';
+ }
+
+ if ($allow_any and count($items)>1 )
+ {
+ $label = l10n('calendar_any');
+ if ( isset($selected_item) and 'any'==$selected_item )
+ {
+ $nav_bar .= '<span class="'.$class_prefix.'Sel">';
+ $nav_bar .= $label;
+ }
+ else
+ {
+ $nav_bar .= '<span class="'.$class_prefix.'">';
+ $url = $url_base . 'any';
+ $nav_bar .= '<a href="'.$url.'">';
+ $nav_bar .= $label;
+ $nav_bar .= '</a>';
+ }
+ $nav_bar.= '</span>';
+ }
+ return $nav_bar;
+}
+
+
+/**
+ * Creates a calendar navigation bar for a given level.
+ * @param string view_type - list or calendar (e.g. 'l' or 'c')
+ * @param array requested - array of current selected elements (e.g. 2005,10)
+ * @param string sql_func - YEAR/MONTH/DAY/WEEK/DAYOFWEEK ...
+ * @param string sql_offset - (e.g. +1 for WEEK - first in year is 1)
+ * @param array labels - optional labels to show in the navigation bar
+ * @return void
+ */
+function build_nav_bar($view_type, $requested, $level, $sql_func,
+ $sql_offset='', $labels=null)
+{
+ global $template;
+ $query = 'SELECT DISTINCT('.$sql_func.'('.$this->date_field.')'.$sql_offset
+ .') as period';
+ $query.= $this->inner_sql;
+ $query.= $this->get_date_where($requested, $level);
+ $query.= '
+ GROUP BY period';
+
+ $level_items=array();
+ $result = pwg_query($query);
+ while ($row = mysql_fetch_array($result))
+ {
+ $level_items[$row['period']] = 0;
+ }
+
+ $url_base = $this->url_base;
+ $url_base .= $view_type.'-';
+ for ($i=0; $i<$level; $i++)
+ {
+ if (isset($requested[$i]))
+ {
+ $url_base .= $requested[$i].'-';
+ }
+ }
+
+ $nav_bar = $this->get_nav_bar_from_items( $url_base, $level_items,
+ $requested[$level], 'cal', true, $labels);
+
+ $template->assign_block_vars( 'calendar.navbar',
+ array( 'BAR' => $nav_bar)
+ );
+}
+}
+
+?> \ No newline at end of file
diff --git a/include/calendar_monthly.class.php b/include/calendar_monthly.class.php
new file mode 100644
index 000000000..cc50a6641
--- /dev/null
+++ b/include/calendar_monthly.class.php
@@ -0,0 +1,309 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery |
+// | Copyright (C) 2003-2006 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | branch : BSF (Best So Far)
+// | file : $RCSfile$
+// | last update : $Date: 2006-01-27 02:11:43 +0100 (ven, 27 jan 2006) $
+// | last modifier : $Author: rvelices $
+// | revision : $Revision: 1014 $
+// +-----------------------------------------------------------------------+
+// | 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. |
+// +-----------------------------------------------------------------------+
+
+include_once(PHPWG_ROOT_PATH.'include/calendar_base.class.php');
+
+/**
+ * Monthly calendar style (composed of years/months and days)
+ */
+class Calendar extends CalendarBase
+{
+
+/**
+ * Generate navigation bars for category page
+ * @return boolean false to indicate that thumbnails
+ * where not included here, true otherwise
+ */
+function generate_category_content($url_base, $view_type, &$requested)
+{
+ global $lang;
+
+ $this->url_base = $url_base;
+
+ if ($view_type==CAL_VIEW_CALENDAR and count($requested)==0)
+ {//case A: no year given - display all years+months
+ if ($this->build_global_calendar($requested))
+ return true;
+ }
+
+ if ($view_type==CAL_VIEW_CALENDAR and count($requested)==1)
+ {//case B: year given - display all days in given year
+ if ($this->build_year_calendar($requested))
+ {
+ $this->build_nav_bar2($view_type, $requested, 0, 'YEAR'); // years
+ return true;
+ }
+ }
+
+ if ($view_type==CAL_VIEW_CALENDAR and count($requested)==2)
+ {//case C: year+month given - display a nice month calendar
+ $this->build_month_calendar($requested);
+ $this->build_nav_bar2(CAL_VIEW_CALENDAR, $requested, 0, 'YEAR'); // years
+ if (count($requested)>0)
+ $this->build_nav_bar2(CAL_VIEW_CALENDAR, $requested, 1, 'MONTH', $lang['month']); // month
+ return true;
+ }
+
+ if ($view_type==CAL_VIEW_LIST or count($requested)==3)
+ {
+ $this->build_nav_bar2($view_type, $requested, 0, 'YEAR'); // years
+ if (count($requested)>0)
+ $this->build_nav_bar2($view_type, $requested, 1, 'MONTH', $lang['month']); // month
+ if (count($requested)>1)
+ $this->build_nav_bar2($view_type, $requested, 2, 'DAY' ); // days
+ }
+ return false;
+}
+
+
+/**
+ * Returns a sql where subquery for the date field
+ * @param array requested selected levels for this calendar
+ * (e.g. 2005,11,5 for 5th of November 2005)
+ * @param int max_levels return the where up to this level
+ * (e.g. 2=only year and month)
+ * @return string
+ */
+function get_date_where($requested, $max_levels=3)
+{
+ while (count($requested)>$max_levels)
+ {
+ array_pop($requested);
+ }
+ $res = '';
+ if (isset($requested[0]) and $requested[0]!='any')
+ {
+ $b = $requested[0] . '-';
+ $e = $requested[0] . '-';
+ if (isset($requested[1]) and $requested[1]!='any')
+ {
+ $b .= $requested[1] . '-';
+ $e .= $requested[1] . '-';
+ if (isset($requested[2]) and $requested[2]!='any')
+ {
+ $b .= $requested[2];
+ $e .= $requested[2];
+ }
+ else
+ {
+ $b .= '01';
+ $e .= '31';
+ }
+ }
+ else
+ {
+ $b .= '01-01';
+ $e .= '12-31';
+ if (isset($requested[1]) and $requested[1]!='any')
+ {
+ $res .= ' AND MONTH('.$this->date_field.')='.$requested[1];
+ }
+ if (isset($requested[2]) and $requested[2]!='any')
+ {
+ $res .= ' AND DAY('.$this->date_field.')='.$requested[2];
+ }
+ }
+ $res = " AND $this->date_field BETWEEN '$b' AND '$e'" . $res;
+ }
+ else
+ {
+ $res = ' AND '.$this->date_field.' IS NOT NULL';
+ if (isset($requested[1]) and $requested[1]!='any')
+ {
+ $res .= ' AND MONTH('.$this->date_field.')='.$requested[1];
+ }
+ if (isset($requested[2]) and $requested[2]!='any')
+ {
+ $res .= ' AND DAY('.$this->date_field.')='.$requested[2];
+ }
+ }
+ return $res;
+}
+
+//--------------------------------------------------------- private members ---
+function build_nav_bar2($view_type, $requested, $level, $sql_func, $labels=null)
+{
+ parent::build_nav_bar($view_type, $requested, $level, $sql_func, '', $labels);
+}
+
+function build_global_calendar(&$requested)
+{
+ $query='SELECT DISTINCT(DATE_FORMAT('.$this->date_field.',"%Y%m")) as period,
+ COUNT(id) as count';
+ $query.= $this->inner_sql;
+ $query.= $this->get_date_where($requested, 0);
+ $query.= '
+ GROUP BY period';
+
+ $result = pwg_query($query);
+ while ($row = mysql_fetch_array($result))
+ {
+ $y = substr($row['period'], 0, 4);
+ $m = (int)substr($row['period'], 4, 2);
+ if ( ! isset($items[$y]) )
+ {
+ $items[$y] = array('nb_images'=>0, 'children'=>array() );
+ }
+ $items[$y]['children'][$m] = $row['count'];
+ $items[$y]['nb_images'] += $row['count'];
+ }
+ //echo ('<pre>'. var_export($items, true) . '</pre>');
+ if (count($items)==1)
+ {// only one year exists so bail out to year view
+ list($y) = array_keys($items);
+ array_push($requested, $y );
+ return false;
+ }
+
+ global $lang, $template;
+ foreach ( $items as $year=>$year_data)
+ {
+ $url_base = $this->url_base .'c-'.$year;
+
+ $nav_bar = '<span class="calCalHead"><a href="'.$url_base.'">'.$year.'</a>';
+ $nav_bar .= ' ('.$year_data['nb_images'].')';
+ $nav_bar .= '</span><br>';
+
+ $url_base .= '-';
+ $nav_bar .= $this->get_nav_bar_from_items( $url_base, $year_data['children'], $requested[0], 'calCal', false, $lang['month'] );
+
+ $template->assign_block_vars( 'calendar.calbar',
+ array( 'BAR' => $nav_bar)
+ );
+ }
+ return true;
+}
+
+function build_year_calendar(&$requested)
+{
+ $query='SELECT DISTINCT(DATE_FORMAT('.$this->date_field.',"%m%d")) as period,
+ COUNT(id) as count';
+ $query.= $this->inner_sql;
+ $query.= $this->get_date_where($requested, 1);
+ $query.= '
+ GROUP BY period';
+
+ $result = pwg_query($query);
+ while ($row = mysql_fetch_array($result))
+ {
+ $m = (int)substr($row['period'], 0, 2);
+ $d = substr($row['period'], 2, 2);
+ if ( ! isset($items[$m]) )
+ {
+ $items[$m] = array('nb_images'=>0, 'children'=>array() );
+ }
+ $items[$m]['children'][$d] = $row['count'];
+ $items[$m]['nb_images'] += $row['count'];
+ }
+ //echo ('<pre>'. var_export($items, true) . '</pre>');
+ if (count($items)==1)
+ { // only one month exists so bail out to month view
+ list($m) = array_keys($items);
+ array_push($requested, $m );
+ if (count($items[$m]['children'])==1)
+ { // or even to day view if everything occured in one day
+ list($d) = array_keys($items[$m]['children']);
+ array_push($requested, $d);
+ }
+ return false;
+ }
+ global $lang, $template;
+ foreach ( $items as $month=>$month_data)
+ {
+ $url_base = $this->url_base.'c-'.$requested[0].'-'.$month;
+
+ $nav_bar = '<span class="calCalHead"><a href="'.$url_base.'">'.$lang['month'][$month].'</a>';
+ $nav_bar .= ' ('.$month_data['nb_images'].')';
+ $nav_bar .= '</span><br>';
+
+ $url_base .= '-';
+ $nav_bar .= $this->get_nav_bar_from_items( $url_base, $month_data['children'], $requested[1], 'calCal', false );
+
+ $template->assign_block_vars( 'calendar.calbar',
+ array( 'BAR' => $nav_bar)
+ );
+ }
+ return true;
+
+}
+
+function build_month_calendar($requested)
+{
+ $query='SELECT DISTINCT(DATE_FORMAT('.$this->date_field.',"%d")) as period,
+ COUNT(id) as count';
+ $query.= $this->inner_sql;
+ $query.= $this->get_date_where($requested, 2);
+ $query.= '
+ GROUP BY period';
+
+ $result = pwg_query($query);
+ while ($row = mysql_fetch_array($result))
+ {
+ $d = $row['period'];
+ $items[$d] = $row['count'];
+ }
+
+ global $lang, $template;
+
+ $template->assign_block_vars('thumbnails', array());
+ $template->assign_block_vars('thumbnails.line', array());
+ foreach ( $items as $day=>$nb_images)
+ {
+ $url_base = $this->url_base.'c-'.$requested[0].'-'.$requested[1].'-'.$day;
+ $requested[2]=$day;
+ $query = '
+SELECT file,tn_ext,path, DAYOFWEEK('.$this->date_field.')-1 as dw';
+ $query.= $this->inner_sql;
+ $query.= $this->get_date_where($requested);
+
+ $row = mysql_fetch_array(pwg_query($query));
+
+ $thumbnail_src = get_thumbnail_src($row['path'], @$row['tn_ext']);
+ $thumbnail_title = $lang['day'][$row['dw']] . ' ' . $day;
+ $name = $thumbnail_title .' ('.$nb_images.')';
+
+ $template->assign_block_vars(
+ 'thumbnails.line.thumbnail',
+ array(
+ 'IMAGE'=>$thumbnail_src,
+ 'IMAGE_ALT'=>$row['file'],
+ 'IMAGE_TITLE'=>$thumbnail_title,
+ 'U_IMG_LINK'=>$url_base
+ )
+ );
+ $template->assign_block_vars(
+ 'thumbnails.line.thumbnail.category_name',
+ array(
+ 'NAME' => $name
+ )
+ );
+ }
+ return true;
+}
+
+}
+
+?> \ No newline at end of file
diff --git a/include/calendar_weekly.class.php b/include/calendar_weekly.class.php
new file mode 100644
index 000000000..4ae65e076
--- /dev/null
+++ b/include/calendar_weekly.class.php
@@ -0,0 +1,95 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery |
+// | Copyright (C) 2003-2006 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | branch : BSF (Best So Far)
+// | file : $RCSfile$
+// | last update : $Date: 2006-01-27 02:11:43 +0100 (ven, 27 jan 2006) $
+// | last modifier : $Author: rvelices $
+// | revision : $Revision: 1014 $
+// +-----------------------------------------------------------------------+
+// | 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. |
+// +-----------------------------------------------------------------------+
+
+include_once(PHPWG_ROOT_PATH.'include/calendar_base.class.php');
+
+/**
+ * Weekly calendar style (composed of years/week in years and days in week)
+ */
+class Calendar extends CalendarBase
+{
+
+/**
+ * Generate navigation bars for category page
+ * @return boolean false to indicate that thumbnails where not included here
+ */
+function generate_category_content($url_base, $view_type, &$requested)
+{
+ global $lang;
+
+ $this->url_base = $url_base;
+
+ assert($view_type==CAL_VIEW_LIST);
+
+ $this->build_nav_bar($view_type, $requested, 0, 'YEAR'); // years
+ if (count($requested)>0)
+ $this->build_nav_bar($view_type, $requested, 1, 'WEEK', '+1' ); // month
+ if (count($requested)>1)
+ $this->build_nav_bar($view_type, $requested, 2, 'DAYOFWEEK', '-1',
+ $lang['day'] ); // days
+ return false;
+}
+
+
+/**
+ * Returns a sql where subquery for the date field
+ * @param array requested selected levels for this calendar
+ * (e.g. 2005,42,1 for 41st week of 2005, Monday)
+ * @param int max_levels return the where up to this level
+ * (e.g. 2=only year and week in year)
+ * @return string
+ */
+function get_date_where($requested, $max_levels=3)
+{
+ while (count($requested)>$max_levels)
+ {
+ array_pop($requested);
+ }
+ $res = '';
+ if (isset($requested[0]) and $requested[0]!='any')
+ {
+ $y = $requested[0];
+ $res = " AND $this->date_field BETWEEN '$y-01-01' AND '$y-12-31'";
+ }
+
+ if (isset($requested[1]) and $requested[1]!='any')
+ {
+ $res .= ' AND WEEK('.$this->date_field.')+1='.$requested[1];
+ }
+ if (isset($requested[2]) and $requested[2]!='any')
+ {
+ $res .= ' AND DAYOFWEEK('.$this->date_field.')-1='.$requested[2];
+ }
+ if (empty($res))
+ {
+ $res = ' AND '.$this->date_field.' IS NOT NULL';
+ }
+ return $res;
+}
+
+}
+
+?> \ No newline at end of file
diff --git a/include/functions_calendar.inc.php b/include/functions_calendar.inc.php
index 9260bbbed..a5a1e87bb 100644
--- a/include/functions_calendar.inc.php
+++ b/include/functions_calendar.inc.php
@@ -5,9 +5,9 @@
// +-----------------------------------------------------------------------+
// | branch : BSF (Best So Far)
// | file : $RCSfile$
-// | last update : $Date: 2006-02-12 16:52:16 -0500 (Sun, 12 Feb 2006) $
-// | last modifier : $Author: plg $
-// | revision : $Revision: 1036 $
+// | last update : $Date: 2006-01-27 02:11:43 +0100 (ven, 27 jan 2006) $
+// | last modifier : $Author: rvelices $
+// | revision : $Revision: 1014 $
// +-----------------------------------------------------------------------+
// | 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 |
@@ -24,146 +24,107 @@
// | USA. |
// +-----------------------------------------------------------------------+
-class BaseCalendarLevel
-{
- function BaseCalendarLevel($sql, $allow_any=true, $labels=null)
- {
- $this->sql = $sql;
- $this->allow_any = $allow_any;
- $this->labels = $labels;
- }
-
- function sql()
- {
- return $this->sql;
- }
- function sql_equal($item)
- {
- return $this->sql.'='.$item;
- }
- function allow_any()
- {
- return $this->allow_any;
- }
- function get_label($item)
- {
- if ( isset($this->labels[$item]) )
- {
- return $this->labels[$item];
- }
- return $item;
- }
+define('CAL_VIEW_LIST','l');
+define('CAL_VIEW_CALENDAR','c');
- var $sql;
- var $allow_any;
- var $labels;
-}
-
-class YearMonthCalendarLevel extends BaseCalendarLevel
+function initialize_calendar()
{
- function YearMonthCalendarLevel()
- {
- global $conf;
- parent::BaseCalendarLevel('DATE_FORMAT('.$conf['calendar_datefield'].',"%Y%m")', false);
- }
+ global $page, $conf, $user, $template;
- function sql_equal($item)
- {
- global $conf;
- $y = (int)($item/100);
- $m = (int)$item%100;
- // There seems to be much difference in performance between these:
- return $conf['calendar_datefield']." BETWEEN '$y-$m-01' AND '$y-$m-31'";
-/* return '(YEAR('.$conf['calendar_datefield'].')='.$y.'
- AND MONTH('.$conf['calendar_datefield'].')='.$m.')';*/
-// return parent::sql_equal($item);
+//------------------ initialize the condition on items to take into account ---
+ $inner_sql = ' FROM ' . IMAGES_TABLE;
+ if ( !isset($page['cat']) or is_numeric($page['cat']) )
+ { // we will regenerate the items by including subcats elements
+ $page['cat_nb_images']=0;
+ $page['items']=array();
+ $inner_sql .= '
+INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id = image_id';
+ if ( is_numeric($page['cat']) )
+ {
+ $sub_ids = get_subcat_ids(array($page['cat']));
+ $sub_ids = array_diff($sub_ids,
+ explode(',', $user['forbidden_categories']) );
+ if (empty($sub_ids))
+ {
+ return; // nothing to do
+ }
+ $inner_sql .= '
+WHERE category_id IN ('.implode(',',$sub_ids).')';
+ }
+ else
+ {
+ $inner_sql .= '
+WHERE category_id NOT IN ('.$user['forbidden_categories'].')';
+ }
}
-
- function get_label($item)
+ else
{
- global $lang;
- if ( preg_match( '/(\d{4})(\d{2})/', $item, $matches) )
+ if ( empty($page['items']) )
{
- return $lang['month'][(int)$matches[2]].' '.$matches[1];
+ return; // nothing to do
}
- return $item;
+ $inner_sql .= '
+WHERE id IN (' . implode(',',$page['items']) .')';
}
-}
-// just to optimize MySql query so that it uses the index
-class YearCalendarLevel extends BaseCalendarLevel
-{
- function YearCalendarLevel($sql, $allow_any=true)
- {
- parent::BaseCalendarLevel($sql, $allow_any);
+//-------------------------------------- initialize the calendar parameters ---
+ pwg_debug('start initialize_calendar');
+ $cal_styles = array(
+ array('link'=>'m', 'default_link'=>'', 'name'=>l10n('Monthly'),
+ 'include'=>'calendar_monthly.class.php', 'view_calendar'=>true ),
+ array('link'=>'w', 'default_link'=>'w-', 'name'=>l10n('Weekly'),
+ 'include'=>'calendar_weekly.class.php', ),
+ );
+
+ $requested = explode('-', $_GET['calendar']);
+ $calendar = null;
+ foreach( $cal_styles as $cal_style)
+ {
+ if ($requested[0]==$cal_style['link'])
+ {
+ include( PHPWG_ROOT_PATH.'include/'.$cal_style['include']);
+ $calendar = new Calendar();
+ array_shift($requested);
+ break;
+ }
}
-
- function sql_equal($item)
+ if ( !isset($calendar) )
{
- global $conf;
- return $conf['calendar_datefield']." BETWEEN '$item-01-01' AND '$item-12-31'";
+ foreach( $cal_styles as $cal_style)
+ {
+ if (''==$cal_style['default_link'])
+ break;
+ }
+ include( PHPWG_ROOT_PATH.'include/'.$cal_style['include']);
+ $calendar = new Calendar();
}
-}
-/**
- * Parses $param and returns an array of calendar levels
- * @param requested array of requested items for each calendar level
- * @param cal_type is the requested calendar type
- */
-function get_calendar_params($param, &$requested, &$cal_type)
-{
- global $conf, $lang;
- $requested = explode('-', $param);
- $cal_struct = array();
- if ($requested[0]=='ywd')
- {
- array_push($cal_struct, new YearCalendarLevel(
- 'YEAR('.$conf['calendar_datefield'].')' ) );
- array_push($cal_struct, new BaseCalendarLevel(
- 'WEEK('.$conf['calendar_datefield'].')+1' ) );
- array_push($cal_struct, new BaseCalendarLevel(
- 'DAYOFWEEK('.$conf['calendar_datefield'].')-1', true, $lang['day'] ) );
- $cal_type=array_shift($requested);
- }
- else if ($requested[0]=='md')
+ $view_type=CAL_VIEW_LIST;
+ if ($requested[0]==CAL_VIEW_LIST)
{
- array_push($cal_struct, new YearMonthCalendarLevel() );
- array_push($cal_struct, new BaseCalendarLevel(
- 'DAY('.$conf['calendar_datefield'].')' ) );
- $cal_type=array_shift($requested);
+ array_shift($requested);
}
- else
+ elseif ($requested[0]==CAL_VIEW_CALENDAR)
{
- array_push($cal_struct, new YearCalendarLevel(
- 'YEAR('.$conf['calendar_datefield'].')' ) );
- array_push($cal_struct, new BaseCalendarLevel(
- 'MONTH('.$conf['calendar_datefield'].')', true, $lang['month'] ) );
- array_push($cal_struct, new BaseCalendarLevel(
- 'DAY('.$conf['calendar_datefield'].')' ) );
-
- if ($requested[0]=='ymd')
- {
- $cal_type=array_shift($requested);
- }
- else
+ if ($cal_style['view_calendar'])
{
- $cal_type='';
+ $view_type=CAL_VIEW_CALENDAR;
}
+ array_shift($requested);
}
-
// perform a sanity check on $requested
- while (count($requested)>count($cal_struct))
+ while (count($requested)>3)
{
array_pop($requested);
}
-
+
$any_count = 0;
for ($i=0; $i<count($requested); $i++)
{
if ($requested[$i]=='any')
{
- if (! $cal_struct[$i]->allow_any() )
- {
+ if ($view_type==CAL_VIEW_CALENDAR)
+ {// we dont allow any in calendar view
while ($i<count($requested))
{
array_pop( $requested );
@@ -172,7 +133,7 @@ function get_calendar_params($param, &$requested, &$cal_type)
}
$any_count++;
}
- elseif ( empty($requested[$i]) )
+ elseif ( $requested[$i]=='' )
{
while ($i<count($requested))
{
@@ -180,60 +141,22 @@ function get_calendar_params($param, &$requested, &$cal_type)
}
}
}
- if ($any_count==count($cal_struct))
+ if ($any_count==3)
{
array_pop($requested);
}
- return $cal_struct;
-}
-
-
-
-function initialize_calendar()
-{
- global $page, $conf, $user, $template;
-
- if ( !isset($page['cat']) or is_numeric($page['cat']) )
- { // we will regenerate the items by including subcats elements
- $page['cat_nb_images']=0;
- $page['items']=array();
- if ( is_numeric($page['cat']) )
- {
- $sub_ids = get_subcat_ids(array($page['cat']));
- $sub_ids = array_diff($sub_ids,
- explode(',', $user['forbidden_categories']) );
- if (empty($sub_ids))
- {
- return; // nothing to do
- }
- $category_restriction .= ' IN ('.implode(',',$sub_ids).')';
- }
- else
- {
- $category_restriction = ' NOT IN ('.$user['forbidden_categories'].')';
- }
- }
- else
- {
- if ( empty($page['items']) )
- {
- return; // nothing to do
- }
- }
-
- pwg_debug('start initialize_calendar');
-
- $cal_struct = get_calendar_params($_GET['calendar'], $requested, $cal_type);
- //echo ('<pre>'. var_export($cal_struct, true) . '</pre>');
+ $calendar->initialize($conf['calendar_datefield'], $inner_sql);
//echo ('<pre>'. var_export($requested, true) . '</pre>');
-
+ //echo ('<pre>'. var_export($calendar, true) . '</pre>');
+
$category_calling = false;
if (basename($_SERVER["PHP_SELF"]) == 'category.php')
{
$category_calling = true;
}
-
+
+ $must_show_list = true;
if ($category_calling)
{
$template->assign_block_vars('calendar', array());
@@ -242,191 +165,73 @@ function initialize_calendar()
$url_base .= empty($url_base) ? '?' : '&';
$url_base .= 'calendar=';
$url_base = PHPWG_ROOT_PATH.'category.php'.$url_base;
-
- // Build navigation bar for calendar styles
- $nav_bar = 'Styles: ';
- foreach ( array('ymd','md','ywd') as $type)
- {
- if ( $type==$cal_type or ($cal_type=='' and $type=='ymd') )
- {
- $nav_bar .= $type.' ';
- }
- else
- {
- $nav_bar .= '<a href="'. $url_base.$type . '">'.$type.'</a> ';
- }
- }
- $template->assign_block_vars( 'calendar.navbar',
- array( 'BAR' => $nav_bar)
- );
-
- $url_base .= $cal_type;
- if ($cal_type!='')
- {
- $url_base .= '-';
- }
-
-
- $prev_level_query='
-AND '.$conf['calendar_datefield'].' IS NOT NULL ';
- for ($i=0; $i<count($cal_struct); $i++)
+ if ( $calendar->generate_category_content(
+ $url_base.$cal_style['default_link'], $view_type, $requested) )
{
- $crt_cal_level = $cal_struct[$i];
- $query = '
-SELECT DISTINCT('.$crt_cal_level->sql().') AS period, COUNT(id) as count
-FROM '.IMAGES_TABLE;
- if ( isset($category_restriction) )
- {
- $query.= '
-INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id = image_id
-WHERE category_id' . $category_restriction;
- }
- else
- {
- $query.= '
-WHERE id IN (' . implode(',',$page['items']) .')';
- }
- $query.= $prev_level_query;
- $query.= '
-GROUP BY period';
-
- $level_items=array();
- $result = pwg_query($query);
- $total_pics = 0;
- while ($row = mysql_fetch_array($result))
- {
- $level_items[$row['period']] = (int)$row['count'];
- $total_pics += $row['count'];
- }
- //echo ('<pre>'. var_export($level_items, true) . '</pre>');
+ unset( $page['thumbnails_include'] );
+ unset( $page['items'] );
+ unset( $page['cat_nb_images'] );
+ $must_show_list = false;
+ }
- if ( $requested[$i] == 'any' and ! $crt_cal_level->allow_any() )
- {
- unset($requested[$i]);
- }
-
- // --- Build the navigation bar
- if ( $crt_cal_level->allow_any() )
- {
- $level_items['any'] = $total_pics;
- }
- $nav_bar='';
- foreach ($level_items as $item => $nb_images)
+ if ($cal_style['view_calendar'])
+ { // Build bar for view modes (List/Calendar)
+ $views = array(
+ array(CAL_VIEW_LIST, l10n('List') ),
+ array(CAL_VIEW_CALENDAR, l10n('calendar') ),
+ );
+ $views_bar = '';
+ foreach( $views as $view )
{
- $label = $crt_cal_level->get_label($item);
- if ( $item==$requested[$i] )
+ $v = $view[1];
+ if ( $view_type!=$view[0] )
{
- $nav_bar .= ' <span class="dateSelected">';
- $nav_bar .= $label;
- $nav_bar.= '</span>';
+ $url = $url_base.$cal_style['default_link'].$view[0].'-';
+ $url .= implode('-', $requested);
+ $v = '<a href="'.$url.'">'.$v.'</a> ';
}
else
{
- $url = $url_base . $item;
- $nav_bar .= '<a href="'.$url.'">';
- $nav_bar .= $label;
- $nav_bar .= '</a>';
+ $v = $v.' ';
}
- $nav_bar .= ' ';
+ $views_bar .= $v . ' ';
}
- $template->assign_block_vars( 'calendar.navbar',
- array( 'BAR' => $nav_bar)
- );
-
- if ( !isset($requested[$i]) )
- break;
- if ($requested[$i]!='any')
- {
- $prev_level_query.= ' AND '.$crt_cal_level->sql_equal($requested[$i]);
- }
- $url_base .= $requested[$i].'-';
- } // end for each calendar level
-
+ $template->assign_block_vars('calendar.views', array(
+ 'BAR'=>$views_bar
+ ));
+ }
- if ( $i < count($cal_struct) )
+ // Build bar for calendar styles (Monthly, Weekly)
+ $styles_bar = '';
+ foreach ( $cal_styles as $style)
{
- $template->assign_block_vars('thumbnails', array());
- $template->assign_block_vars('thumbnails.line', array());
- foreach ($level_items as $level_item => $nb_pics)
+ if ($cal_style['link']!=$style['link'])
{
- if ($level_item=='any')
- continue;
- $query = '
-SELECT file,tn_ext,'.$conf['calendar_datefield'].',path
-FROM '.IMAGES_TABLE;
- if ( isset($category_restriction) )
+ $url = $url_base.$style['default_link'];
+ $url .= $view_type;
+ if (isset($requested[0]))
{
- $query.= '
-INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id = image_id
-WHERE category_id' . $category_restriction;
+ $url .= '-' . $requested[0];
}
- else
- {
- $query.= '
-WHERE id IN (' . implode(',',$page['items']) .')';
- }
- $query.= $prev_level_query;
- $query.= ' AND '.$crt_cal_level->sql_equal($level_item);
- $query.= '
-ORDER BY RAND()
-LIMIT 0,1';
- $row = mysql_fetch_array(pwg_query($query));
-
- $thumbnail_src = get_thumbnail_src($row['path'], @$row['tn_ext']);
- $thumbnail_title = $crt_cal_level->get_label($level_item);
- $name = $thumbnail_title .' ('.$nb_pics.')';
-
- $template->assign_block_vars(
- 'thumbnails.line.thumbnail',
- array(
- 'IMAGE'=>$thumbnail_src,
- 'IMAGE_ALT'=>$row['file'],
- 'IMAGE_TITLE'=>$thumbnail_title,
- 'U_IMG_LINK'=>$url_base.$level_item
- )
- );
- $template->assign_block_vars(
- 'thumbnails.line.thumbnail.category_name',
- array(
- 'NAME' => $name
- )
- );
+ $styles_bar .= '<a href="'. $url . '">'.$style['name'].'</a> ';
}
- unset( $page['thumbnails_include'] ); // maybe move everything to a new include file ?
- pwg_debug('end initialize_calendar for thumbs');
- return;
- }
- }
-
- if (!$category_calling or $i==count($cal_struct) )
- {
- $query = 'SELECT DISTINCT(id) FROM '.IMAGES_TABLE;
- if ( isset($category_restriction) )
- {
- $query.= '
-INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id = image_id
-WHERE category_id' . $category_restriction;
- }
- else
- {
- $query.= '
-WHERE id IN ('.implode(',',$page['items']).')';
- }
- $query.= '
-AND '.$conf['calendar_datefield'].' IS NOT NULL ';
-
- for ($i=0; $i<count($cal_struct); $i++)
- {
- assert( isset($requested[$i]) ); // otherwise we should not be here
- if ($requested[$i]!='any')
+ else
{
- $query.= '
-AND '. $cal_struct[$i]->sql_equal($requested[$i]);
+ $styles_bar .= $style['name'].' ';
}
-
}
-
+ $template->assign_block_vars( 'calendar.styles',
+ array( 'BAR' => $styles_bar)
+ );
+ } // end category calling
+
+ if ($must_show_list)
+ {
+ $query = 'SELECT DISTINCT(id)';
+ $query .= $calendar->inner_sql;
+ $query .= $calendar->get_date_where($requested);
+
$page['items'] = array_from_query($query, 'id');
$page['cat_nb_images'] = count($page['items']);
$page['thumbnails_include'] = 'include/category_default.inc.php';