source: trunk/include/calendar_base.class.php @ 19703

Last change on this file since 19703 was 19703, checked in by plg, 12 years ago

update Piwigo headers to 2013 (the end of the world didn't occur as expected on r12922)

  • Property svn:eol-style set to LF
File size: 9.7 KB
Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | Piwigo - a PHP based photo gallery                                    |
4// +-----------------------------------------------------------------------+
5// | Copyright(C) 2008-2013 Piwigo Team                  http://piwigo.org |
6// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
7// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
8// +-----------------------------------------------------------------------+
9// | This program is free software; you can redistribute it and/or modify  |
10// | it under the terms of the GNU General Public License as published by  |
11// | the Free Software Foundation                                          |
12// |                                                                       |
13// | This program is distributed in the hope that it will be useful, but   |
14// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
15// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
16// | General Public License for more details.                              |
17// |                                                                       |
18// | You should have received a copy of the GNU General Public License     |
19// | along with this program; if not, write to the Free Software           |
20// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
21// | USA.                                                                  |
22// +-----------------------------------------------------------------------+
23
24/**
25 * Base class for monthly and weekly calendar styles
26 */
27class CalendarBase
28{
29  // db column on which this calendar works
30  var $date_field;
31  // used for queries (INNER JOIN or normal)
32  var $inner_sql;
33  //
34  var $calendar_levels;
35
36  /**
37   * Initialize the calendar
38   * @param string inner_sql used for queries (INNER JOIN or normal)
39   */
40  function initialize($inner_sql)
41  {
42    global $page;
43    if ($page['chronology_field']=='posted')
44    {
45      $this->date_field = 'date_available';
46    }
47    else
48    {
49      $this->date_field = 'date_creation';
50    }
51    $this->inner_sql = $inner_sql;
52  }
53
54  function get_display_name()
55  {
56    global $conf, $page;
57    $res = '';
58
59    for ($i=0; $i<count($page['chronology_date']); $i++)
60    {
61      $res .= $conf['level_separator'];
62      if ( isset($page['chronology_date'][$i+1]) )
63      {
64        $chronology_date = array_slice($page['chronology_date'],0, $i+1);
65        $url = duplicate_index_url(
66            array( 'chronology_date'=>$chronology_date ),
67            array( 'start' )
68            );
69        $res .=
70          '<a href="'.$url.'">'
71          .$this->get_date_component_label($i, $page['chronology_date'][$i])
72          .'</a>';
73      }
74      else
75      {
76        $res .=
77          '<span class="calInHere">'
78          .$this->get_date_component_label($i, $page['chronology_date'][$i])
79          .'</span>';
80      }
81    }
82    return $res;
83  }
84
85//--------------------------------------------------------- private members ---
86  /**
87   * Returns a display name for a date component optionally using labels
88  */
89  function get_date_component_label($level, $date_component)
90  {
91    $label = $date_component;
92    if (isset($this->calendar_levels[$level]['labels'][$date_component]))
93    {
94      $label = $this->calendar_levels[$level]['labels'][$date_component];
95    }
96    elseif ('any' === $date_component )
97    {
98      $label = l10n('All');
99    }
100    return $label;
101  }
102
103  /**
104   * Gets a nice display name for a date to be shown in previos/next links.
105   */
106  function get_date_nice_name($date)
107  {
108    $date_components = explode('-', $date);
109    $res = '';
110    for ($i=count($date_components)-1; $i>=0; $i--)
111    {
112      if ('any' !== $date_components[$i])
113      {
114        $label = $this->get_date_component_label($i, $date_components[$i] );
115        if ( $res!='' )
116        {
117          $res .= ' ';
118        }
119        $res .= $label;
120      }
121    }
122    return $res;
123  }
124
125  /**
126   * Creates a calendar navigation bar.
127   *
128   * @param array date_components
129   * @param array items - hash of items to put in the bar (e.g. 2005,2006)
130   * @param bool show_any - adds any link to the end of the bar
131   * @param bool show_empty - shows all labels even those without items
132   * @param array labels - optional labels for items (e.g. Jan,Feb,...)
133   * @return string the navigation bar
134   */
135  function get_nav_bar_from_items($date_components, $items,
136                                  $show_any,
137                                  $show_empty=false, $labels=null)
138  {
139    global $conf, $page, $template;
140
141    $nav_bar_datas=array();
142
143    if ($conf['calendar_show_empty'] and $show_empty and !empty($labels) )
144    {
145      foreach ($labels as $item => $label)
146      {
147        if ( ! isset($items[$item]) )
148        {
149          $items[$item] = -1;
150        }
151      }
152      ksort($items);
153    }
154
155    foreach ($items as $item => $nb_images)
156    {
157      $label = $item;
158      if (isset($labels[$item]))
159      {
160        $label = $labels[$item];
161      }
162      if ($nb_images==-1)
163      {
164        $tmp_datas=array(
165          'LABEL'=> $label
166        );
167      }
168      else
169      {
170        $url = duplicate_index_url(
171          array('chronology_date'=>array_merge($date_components,array($item))),
172          array( 'start' )
173            );
174        $tmp_datas=array(
175          'LABEL'=> $label,
176          'URL' => $url
177        );
178      }
179      if ($nb_images > 0)
180      {
181        $tmp_datas['NB_IMAGES']=$nb_images;
182      }
183      $nav_bar_datas[]=$tmp_datas;
184
185    }
186
187    if ($conf['calendar_show_any'] and $show_any and count($items)>1 and
188          count($date_components)<count($this->calendar_levels)-1 )
189    {
190      $url = duplicate_index_url(
191        array('chronology_date'=>array_merge($date_components,array('any'))),
192        array( 'start' )
193          );
194      $nav_bar_datas[]=array(
195        'LABEL' => l10n('All'),
196        'URL' => $url
197      );
198    }
199
200    return $nav_bar_datas;
201  }
202
203  /**
204   * Creates a calendar navigation bar for a given level.
205   *
206   * @param int level - the level (0-year,1-month/week,2-day)
207   * @return void
208   */
209  function build_nav_bar($level, $labels=null)
210  {
211    global $template, $conf, $page;
212
213    $query = '
214SELECT DISTINCT('.$this->calendar_levels[$level]['sql'].') as period,
215  COUNT(DISTINCT id) as nb_images'.
216$this->inner_sql.
217$this->get_date_where($level).'
218  GROUP BY period;';
219
220    $level_items = simple_hash_from_query($query, 'period', 'nb_images');
221
222    if ( count($level_items)==1 and
223         count($page['chronology_date'])<count($this->calendar_levels)-1)
224    {
225      if ( ! isset($page['chronology_date'][$level]) )
226      {
227        list($key) = array_keys($level_items);
228        $page['chronology_date'][$level] = (int)$key;
229
230        if ( $level<count($page['chronology_date']) and
231             $level!=count($this->calendar_levels)-1 )
232        {
233          return;
234        }
235      }
236    }
237
238    $dates = $page['chronology_date'];
239    while ($level<count($dates))
240    {
241      array_pop($dates);
242    }
243
244    $nav_bar = $this->get_nav_bar_from_items(
245      $dates,
246      $level_items,
247      true,
248      true,
249      isset($labels) ? $labels : $this->calendar_levels[$level]['labels']
250      );
251
252    $template->append(
253      'chronology_navigation_bars',
254      array(
255        'items' => $nav_bar,
256        )
257      );
258  }
259
260  /**
261   * Assigns the next/previous link to the template with regards to
262   * the currently choosen date.
263   */
264  function build_next_prev()
265  {
266    global $template, $page;
267
268    $prev = $next =null;
269    if ( empty($page['chronology_date']) )
270      return;
271   
272    $sub_queries = array();
273    $nb_elements = count($page['chronology_date']);
274    for ($i=0; $i<$nb_elements; $i++)
275    {
276      if ( 'any' === $page['chronology_date'][$i] )
277      {
278        $sub_queries[] = '\'any\'';
279      }
280      else
281      {
282        $sub_queries[] = pwg_db_cast_to_text($this->calendar_levels[$i]['sql']);
283      }
284    }
285    $query = 'SELECT '.pwg_db_concat_ws($sub_queries, '-').' AS period';
286    $query .= $this->inner_sql .'
287AND ' . $this->date_field . ' IS NOT NULL
288GROUP BY period';
289   
290    $current = implode('-', $page['chronology_date'] );
291    $upper_items = array_from_query( $query, 'period');
292
293    usort($upper_items, 'version_compare');
294    $upper_items_rank = array_flip($upper_items);
295    if ( !isset($upper_items_rank[$current]) )
296    {
297      array_push($upper_items, $current);// just in case (external link)
298      usort($upper_items, 'version_compare');
299      $upper_items_rank = array_flip($upper_items);
300    }
301    $current_rank = $upper_items_rank[$current];
302
303    $tpl_var = array();
304
305    if ( $current_rank>0 )
306    { // has previous
307      $prev = $upper_items[$current_rank-1];
308      $chronology_date = explode('-', $prev);
309      $tpl_var['previous'] =
310        array(
311          'LABEL' => $this->get_date_nice_name($prev),
312          'URL' => duplicate_index_url(
313                array('chronology_date'=>$chronology_date), array('start')
314                )
315        );
316    }
317
318    if ( $current_rank < count($upper_items)-1 )
319    { // has next
320      $next = $upper_items[$current_rank+1];
321      $chronology_date = explode('-', $next);
322      $tpl_var['next'] =
323        array(
324          'LABEL' => $this->get_date_nice_name($next),
325          'URL' => duplicate_index_url(
326                array('chronology_date'=>$chronology_date), array('start')
327                )
328        );
329    }
330
331    if ( !empty($tpl_var) )
332    {
333      $existing = & $template->get_template_vars('chronology_navigation_bars');
334      if ( !empty($existing) )
335      {
336        $existing[ sizeof($existing)-1 ] =
337          array_merge( $existing[ sizeof($existing)-1 ], $tpl_var);
338      }
339      else
340      {
341        $template->append( 'chronology_navigation_bars', $tpl_var );
342      }
343    }
344  }
345}
346?>
Note: See TracBrowser for help on using the repository browser.