source: extensions/AMetaData/amd_aip.class.inc.php @ 6891

Last change on this file since 6891 was 6891, checked in by grum, 10 years ago

Implement metadata search, release 0.5.1
bug:1846, bug:1691

  • Property svn:executable set to *
File size: 20.9 KB
Line 
1<?php
2/*
3 * -----------------------------------------------------------------------------
4 * Plugin Name: Advanced MetaData
5 * -----------------------------------------------------------------------------
6 * Author     : Grum
7 *   email    : grum@piwigo.org
8 *   website  : http://photos.grum.fr
9 *   PWG user : http://forum.piwigo.org/profile.php?id=3706
10 *
11 *   << May the Little SpaceFrog be with you ! >>
12 *
13 * -----------------------------------------------------------------------------
14 *
15 * See main.inc.php for release information
16 *
17 * AIP classe => manage integration in administration interface
18 *
19 * -----------------------------------------------------------------------------
20 */
21
22if (!defined('PHPWG_ROOT_PATH')) { die('Hacking attempt!'); }
23
24include_once('amd_root.class.inc.php');
25include_once(PHPWG_PLUGINS_PATH.'GrumPluginClasses/classes/GPCTabSheet.class.inc.php');
26include_once(PHPWG_PLUGINS_PATH.'GrumPluginClasses/classes/GPCAjax.class.inc.php');
27include_once(PHPWG_PLUGINS_PATH.'GrumPluginClasses/classes/genericjs.class.inc.php');
28
29
30class AMD_AIP extends AMD_root
31{
32  protected $tabsheet;
33
34  /**
35   *
36   * constructor needs the prefix of piwigo's tables and the location of plugin
37   *
38   * @param String $prefixeTable
39   * @param String $filelocation
40   */
41  public function __construct($prefixeTable, $filelocation)
42  {
43    parent::__construct($prefixeTable, $filelocation);
44
45    $this->loadConfig();
46    $this->configForTemplate();
47    $this->initEvents();
48
49    $this->tabsheet = new tabsheet();
50    $this->tabsheet->add('database',
51                          l10n('g003_database'),
52                          $this->getAdminLink().'&amp;fAMD_tabsheet=database');
53    $this->tabsheet->add('metadata',
54                          l10n('g003_metadata'),
55                          $this->getAdminLink().'&amp;fAMD_tabsheet=metadata');
56    $this->tabsheet->add('search',
57                          l10n('g003_search'),
58                          $this->getAdminLink().'&amp;fAMD_tabsheet=search');
59    $this->tabsheet->add('help',
60                          l10n('g003_help'),
61                          $this->getAdminLink().'&amp;fAMD_tabsheet=help');
62  }
63
64  public function __destruct()
65  {
66    unset($this->tabsheet);
67    unset($this->ajax);
68    parent::__destruct();
69  }
70
71
72  /*
73   * ---------------------------------------------------------------------------
74   * Public classe functions
75   * ---------------------------------------------------------------------------
76   */
77
78
79  /**
80   * manage the plugin integration into piwigo's admin interface
81   */
82  public function manage()
83  {
84    global $template, $page;
85
86    $this->initRequest();
87
88    $template->set_filename('plugin_admin_content', dirname(__FILE__)."/admin/amd_admin.tpl");
89
90    $this->tabsheet->select($_REQUEST['fAMD_tabsheet']);
91    $this->tabsheet->assign();
92    $selected_tab=$this->tabsheet->get_selected();
93    $template->assign($this->tabsheet->get_titlename(), "[".$selected_tab['caption']."]");
94
95    $pluginInfo=array(
96      'AMD_VERSION' => "<i>".$this->getPluginName()."</i> ".l10n('g003_version').AMD_VERSION,
97      'AMD_PAGE' => $_REQUEST['fAMD_tabsheet'],
98      'PATH' => AMD_PATH
99    );
100
101    $template->assign('plugin', $pluginInfo);
102
103    switch($_REQUEST['fAMD_tabsheet'])
104    {
105      case 'help':
106        $this->displayHelp();
107        break;
108      case 'database':
109        $this->displayDatabase($_REQUEST['fAMD_page']);
110        break;
111      case 'metadata':
112        $this->displayMetaData($_REQUEST['fAMD_page']);
113        break;
114      case 'search':
115        $this->displaySearch($_REQUEST['fAMD_page']);
116        break;
117    }
118
119    $template->assign_var_from_handle('ADMIN_CONTENT', 'plugin_admin_content');
120  }
121
122  /**
123   * initialize events call for the plugin
124   *
125   * don't inherits from its parent => it's normal
126   */
127  public function initEvents()
128  {
129    if(isset($_REQUEST['fAMD_tabsheet']) and $_REQUEST['fAMD_tabsheet']=='search')
130    {
131      // load request builder JS only on the search page
132      GPCRequestBuilder::loadJSandCSS();
133    }
134
135    add_event_handler('loc_end_page_header', array(&$this->css, 'applyCSS'));
136    GPCCss::applyGpcCss();
137  }
138
139  /**
140   * ---------------------------------------------------------------------------
141   * Private & protected functions
142   * ---------------------------------------------------------------------------
143   */
144
145  /**
146   * if empty, initialize the $_REQUEST var
147   *
148   * if not empty, check validity for the request values
149   *
150   */
151  private function initRequest()
152  {
153    //initialise $REQUEST values if not defined
154
155    if(!isset($_REQUEST['fAMD_tabsheet']))
156    {
157      if($this->getNumOfPictures()==0)
158      {
159        $_REQUEST['fAMD_tabsheet']="database";
160        $_REQUEST['fAMD_page']="state";
161      }
162      else
163      {
164        $_REQUEST['fAMD_tabsheet']="metadata";
165        $_REQUEST['fAMD_page']="select";
166      }
167    }
168
169    if(!($_REQUEST['fAMD_tabsheet']=="metadata" or
170         $_REQUEST['fAMD_tabsheet']!="help" or
171         $_REQUEST['fAMD_tabsheet']!="database" or
172         $_REQUEST['fAMD_tabsheet']!="search"))
173    {
174      $_REQUEST['fAMD_tabsheet']="metadata";
175    }
176
177    /*
178     * metadata tabsheet
179     */
180    if($_REQUEST['fAMD_tabsheet']=="metadata")
181    {
182      if(!isset($_REQUEST['fAMD_page'])) $_REQUEST['fAMD_page']="select";
183
184      if(!($_REQUEST['fAMD_page']=="personnal" or
185           $_REQUEST['fAMD_page']=="select" or
186           $_REQUEST['fAMD_page']=="display")) $_REQUEST['fAMD_page']="select";
187    }
188
189    /*
190     * help tabsheet
191     */
192    if($_REQUEST['fAMD_tabsheet']=="help")
193    {
194      if(!isset($_REQUEST['fAMD_page'])) $_REQUEST['fAMD_page']="exif";
195
196      if(!($_REQUEST['fAMD_page']=="exif" or
197           $_REQUEST['fAMD_page']=="iptc" or
198           $_REQUEST['fAMD_page']=="xmp" or
199           $_REQUEST['fAMD_page']=="magic")) $_REQUEST['fAMD_page']="exif";
200    }
201
202    /*
203     * search tabsheet
204     */
205    if($_REQUEST['fAMD_tabsheet']=="search")
206    {
207      if(!isset($_REQUEST['fAMD_page'])) $_REQUEST['fAMD_page']="search";
208
209      if(!($_REQUEST['fAMD_page']=="config" or
210           $_REQUEST['fAMD_page']=="search")) $_REQUEST['fAMD_page']="search";
211    }
212
213    /*
214     * database tabsheet
215     */
216    if($_REQUEST['fAMD_tabsheet']=="database")
217    {
218      if(!isset($_REQUEST['fAMD_page'])) $_REQUEST['fAMD_page']="state";
219
220      if(!($_REQUEST['fAMD_page']=="state" or
221           $_REQUEST['fAMD_page']=="update")) $_REQUEST['fAMD_page']="state";
222    }
223
224  } //init_request
225
226
227  /**
228   * manage adviser profile
229   *
230   * @return Boolean : true if user is adviser, otherwise false (and push a
231   *                   message in the error list)
232   */
233  protected function adviser_abort()
234  {
235    if(is_adviser())
236    {
237      $this->display_result(l10n("g003_adviser_not_allowed"), false);
238      return(true);
239    }
240    return(false);
241  }
242
243
244
245
246  /**
247   * display and manage the search page
248   */
249  protected function displaySearch()
250  {
251    global $template, $lang;
252
253    $template->set_filename('body_page',
254                dirname($this->getFileLocation()).'/admin/amd_metadata_search.tpl');
255
256    $template->assign('amd_search_page', GPCRequestBuilder::displaySearchPage($this->getPluginName()));
257
258    $template->assign_var_from_handle('AMD_BODY_PAGE', 'body_page');
259  }
260
261
262
263
264  /**
265   * display and manage the metadata page
266   * the page have three tabsheet :
267   *  - personnal tag management, to build personnal tags
268   *  - select tag management, to manage tags to be selected on the galerie
269   *  - display tag management, to choose how the tags are displayed
270   *
271   * @param String $tab : the selected tab on the stat page
272   */
273  protected function displayMetaData($tab)
274  {
275    global $template, $user;
276    $template->set_filename('body_page', dirname(__FILE__).'/admin/amd_metadata.tpl');
277
278    $statTabsheet = new GPCTabSheet('statTabsheet', $this->tabsheet->get_titlename(), 'tabsheet2 gcBorder', 'itab2');
279    $statTabsheet->select($tab);
280    $statTabsheet->add('personnal',
281                          l10n('g003_personnal'),
282                          $this->getAdminLink().'&amp;fAMD_tabsheet=metadata&amp;fAMD_page=personnal');
283    $statTabsheet->add('select',
284                          l10n('g003_select'),
285                          $this->getAdminLink().'&amp;fAMD_tabsheet=metadata&amp;fAMD_page=select');
286    $statTabsheet->add('display',
287                          l10n('g003_display'),
288                          $this->getAdminLink().'&amp;fAMD_tabsheet=metadata&amp;fAMD_page=display');
289    $statTabsheet->assign();
290
291    switch($tab)
292    {
293      case 'select':
294        $template->assign('sheetContent', $this->displayMetaDataSelect());
295        break;
296      case 'display':
297        $template->assign('sheetContent', $this->displayMetaDataDisplay());
298        break;
299      case 'personnal':
300        $template->assign('sheetContent', $this->displayMetaDataPersonnal());
301        break;
302    }
303
304    $template->assign_var_from_handle('AMD_BODY_PAGE', 'body_page');
305  }
306
307
308  /**
309   * display and manage the metadata page allowing to build user defined tags
310   *
311   * @return String : the content of the page
312   */
313  protected function displayMetaDataPersonnal()
314  {
315    global $template, $theme, $themes, $themeconf;
316
317    $template->set_filename('sheet_page',
318                  dirname($this->getFileLocation()).'/admin/amd_metadata_personnal.tpl');
319
320    $datas=array(
321      'urlRequest' => $this->getAdminLink('ajax'),
322      'tagList' => array(),
323    );
324
325    /*
326     * build tagList
327     */
328    $sql="SELECT ut.name, ut.numId, ut.tagId
329          FROM ".$this->tables['used_tags']." ut
330            JOIN ".$this->tables['selected_tags']." st ON st.tagId = ut.tagId
331          ORDER BY tagId";
332    $result=pwg_query($sql);
333    if($result)
334    {
335      while($row=pwg_db_fetch_assoc($result))
336      {
337        $datas['tagList'][]=Array(
338          'tagId' => $row['tagId'],
339          'name'  => L10n::get($row['name']),
340          'numId' => $row['numId']
341        );
342      }
343    }
344
345    $template->assign('datas', $datas);
346    return($template->parse('sheet_page', true));
347  }
348
349
350  /**
351   * display and manage the metadata page allowing to make tags selection
352   *
353   * @return String : the content of the page
354   */
355  protected function displayMetaDataSelect()
356  {
357    global $template, $theme, $themes, $themeconf;
358
359    $template->set_filename('sheet_page',
360                  dirname($this->getFileLocation()).'/admin/amd_metadata_select.tpl');
361
362    $datas=array(
363      'urlRequest' => $this->getAdminLink('ajax'),
364      'config_GetListTags_OrderType' => $this->config['amd_GetListTags_OrderType'],
365      'config_GetListTags_FilterType' => $this->config['amd_GetListTags_FilterType'],
366      'config_GetListTags_ExcludeUnusedTag' => $this->config['amd_GetListTags_ExcludeUnusedTag'],
367      'config_GetListTags_SelectedTagOnly' => $this->config['amd_GetListTags_SelectedTagOnly'],
368      'config_GetListImages_OrderType' => $this->config['amd_GetListImages_OrderType']
369    );
370
371    $template->assign('datas', $datas);
372    return($template->parse('sheet_page', true));
373  }
374
375
376  /**
377   * display and manage the metadata page allowing to choose tags order
378   *
379   * @return String : the content of the page
380   */
381  protected function displayMetaDataDisplay()
382  {
383    global $user, $template;
384
385    //$local_tpl = new Template(AMD_PATH."admin/", "");
386    $template->set_filename('sheet_page',
387                  dirname($this->getFileLocation()).'/admin/amd_metadata_display.tpl');
388
389    $datas=array(
390      'urlRequest' => $this->getAdminLink('ajax'),
391      'selectedTags' => Array(),
392      'groups' => Array(),
393      'tagByGroup' => Array(),
394    );
395
396    $sql="SELECT st.tagId, st.order, st.groupId, ut.numId
397          FROM ".$this->tables['selected_tags']." st
398            LEFT JOIN ".$this->tables['used_tags']." ut
399              ON ut.tagId = st.tagId
400          ORDER BY st.groupId ASC, st.order ASC, st.tagId ASC";
401    $result=pwg_query($sql);
402    if($result)
403    {
404      while($row=pwg_db_fetch_assoc($result))
405      {
406        if($row['groupId']==-1)
407        {
408          $datas['selectedTags'][]=Array(
409            'numId' => $row['numId'],
410            'tagId' => $row['tagId']
411          );
412        }
413        else
414        {
415          $datas['tagByGroup'][]=Array(
416            'numId' => $row['numId'],
417            'tagId' => $row['tagId'],
418            'group' => $row['groupId'],
419            'order' => $row['order']
420          );
421        }
422      }
423    }
424
425    $sql="SELECT g.groupId, gn.name
426          FROM ".$this->tables['groups']." g
427            LEFT JOIN ".$this->tables['groups_names']." gn
428              ON g.groupId = gn.groupId
429          WHERE gn.lang = '".$user['language']."'
430          ORDER BY g.order;";
431    $result=pwg_query($sql);
432    if($result)
433    {
434      while($row=pwg_db_fetch_assoc($result))
435      {
436        $datas['groups'][]=Array(
437          'id' => $row['groupId'],
438          'name' => $row['name']
439        );
440      }
441    }
442
443    $template->assign('datas', $datas);
444    return($template->parse('sheet_page', true));
445  }
446
447
448  /**
449   * display and manage the database page
450   * the page have two tabsheet :
451   *  - state, to have general information about the database
452   *  - update, to manage database fill-in
453   *
454   * @param String $tab : the selected tab on the stat page
455   */
456  protected function displayDatabase($tab)
457  {
458    global $template, $user;
459    $template->set_filename('body_page', dirname(__FILE__).'/admin/amd_metadata.tpl');
460
461    $statTabsheet = new GPCTabSheet('statTabsheet', $this->tabsheet->get_titlename(), 'tabsheet2 gcBorder', 'itab2');
462    $statTabsheet->select($tab);
463    $statTabsheet->add('state',
464                          l10n('g003_state'),
465                          $this->getAdminLink().'&amp;fAMD_tabsheet=database&amp;fAMD_page=state');
466    $statTabsheet->add('update',
467                          l10n('g003_update'),
468                          $this->getAdminLink().'&amp;fAMD_tabsheet=database&amp;fAMD_page=update');
469    $statTabsheet->assign();
470
471    switch($tab)
472    {
473      case 'state':
474        $template->assign('sheetContent', $this->displayDatabaseStatus());
475        break;
476      case 'update':
477        $template->assign('sheetContent', $this->displayDatabaseDatabase());
478        break;
479    }
480
481    $template->assign_var_from_handle('AMD_BODY_PAGE', 'body_page');
482  }
483
484
485
486  /**
487   * display the database status
488   *
489   * @return String : the content of the page
490   */
491  private function displayDatabaseStatus()
492  {
493    global $template, $page;
494
495    $template->set_filename('sheet_page', dirname(__FILE__).'/admin/amd_metadata_database_status.tpl');
496
497    $datas=array(
498      'urlRequest' => $this->getAdminLink('ajax'),
499      'warning1' => GPCCore::BBtoHTML(l10n('g003_databaseWarning1')),
500      'nfoMetadata' => Array(
501          'exif' => 0,
502          'iptc' => 0,
503          'magic' => 0,
504          'xmp' => 0,
505          'userDefined' => 0,
506          'numOfPictures' => 0,
507          'numOfNotAnalyzedPictures' => 0,
508          'numOfPicturesWithoutTag' => 0,
509          'nfoSize' => 0,
510          'nfoRows' => 0,
511          'nfoSizeAndRows' => '',
512        )
513    );
514
515    $sql="SELECT SUM(numOfImg) AS nb, 'exif' AS `type`
516          FROM ".$this->tables['used_tags']."
517          WHERE tagId LIKE 'exif.%'
518          UNION
519          SELECT SUM(numOfImg), 'iptc'
520          FROM ".$this->tables['used_tags']."
521          WHERE tagId LIKE 'iptc.%'
522          UNION
523          SELECT SUM(numOfImg), 'magic'
524          FROM ".$this->tables['used_tags']."
525          WHERE tagId LIKE 'magic.%'
526          UNION
527          SELECT SUM(numOfImg), 'xmp'
528          FROM ".$this->tables['used_tags']."
529          WHERE tagId LIKE 'xmp.%'
530          UNION
531          SELECT SUM(numOfImg), 'userDefined'
532          FROM ".$this->tables['used_tags']."
533          WHERE tagId LIKE 'userDefined.%'
534          UNION
535          SELECT COUNT(imageId), 'numOfPictures'
536          FROM ".$this->tables['images']."
537          WHERE analyzed='y'
538          UNION
539          SELECT COUNT(imageId), 'numOfNotAnalyzedPictures'
540          FROM ".$this->tables['images']."
541          WHERE analyzed='n'
542          UNION
543          SELECT COUNT(imageId), 'numOfPicturesWithoutTag'
544          FROM ".$this->tables['images']."
545          WHERE nbTags=0";
546    $result=pwg_query($sql);
547    if($result)
548    {
549      while($row=pwg_db_fetch_assoc($result))
550      {
551        if(!is_null($row['nb']))
552        {
553          $datas['nfoMetadata'][$row['type']]=$row['nb'];
554          if($row['type']=='exif' or
555             $row['type']=='iptc' or
556             $row['type']=='magic' or
557             $row['type']=='xmp' or
558             $row['type']=='userDefined') $datas['nfoMetadata']['nfoRows']+=$row['nb'];
559        }
560      }
561    }
562
563    $sql="SHOW TABLE STATUS WHERE name LIKE '".$this->tables['images_tags']."'";
564    $result=pwg_query($sql);
565    if($result)
566    {
567      while($row=pwg_db_fetch_assoc($result))
568      {
569        $datas['nfoMetadata']['nfoSize']=$row['Data_length']+$row['Index_length'];
570      }
571    }
572
573    if($datas['nfoMetadata']['nfoSize']<1048576)
574    {
575      $datas['nfoMetadata']['nfoSize']=sprintf('%.2fKio', $datas['nfoMetadata']['nfoSize']/1024);
576    }
577    else
578    {
579      $datas['nfoMetadata']['nfoSize']=sprintf('%.2fMio', $datas['nfoMetadata']['nfoSize']/1048576);
580    }
581    $datas['nfoMetadata']['nfoSizeAndRows']=sprintf(l10n('g003_sizeAndRows'), $datas['nfoMetadata']['nfoSize'], $datas['nfoMetadata']['nfoRows']);
582    $datas['nfoMetadata']['numOfPictures']=sprintf(l10n('g003_numberOfAnalyzedPictures'), $datas['nfoMetadata']['numOfPictures']);
583    $datas['nfoMetadata']['numOfNotAnalyzedPictures']=sprintf(l10n('g003_numberOfNotAnalyzedPictures'), $datas['nfoMetadata']['numOfNotAnalyzedPictures']);
584    $datas['nfoMetadata']['numOfPicturesWithoutTag']=sprintf(l10n('g003_numberOfPicturesWithoutTags'), $datas['nfoMetadata']['numOfPicturesWithoutTag']);
585
586    $template->assign("datas", $datas);
587
588    return($template->parse('sheet_page', true));
589  } // displayDatabaseStatus
590
591
592
593
594  /**
595   * display and manage the database page
596   *
597   * the function automatically update the AMD tables :
598   *  - add new pictures in the AMD image table (assuming image is not analyzed
599   *    yet)
600   *  - remove deleted pictures in the AMD image & image_tags table
601   *
602   * @return String : the content of the page
603   */
604  private function displayDatabaseDatabase()
605  {
606    global $template, $page;
607
608    /*
609     * insert new image (from piwigo images table) in the AMD images table, with
610     * statut 'not analyzed'
611     */
612    $sql="INSERT INTO ".$this->tables['images']."
613            SELECT id, 'n', 0
614              FROM ".IMAGES_TABLE."
615              WHERE id NOT IN (SELECT imageId FROM ".$this->tables['images'].")";
616    pwg_query($sql);
617
618
619    /*
620     * delete image who are in the AMD images table and not in the piwigo image
621     * table
622     */
623    $sql="DELETE FROM ".$this->tables['images']."
624            WHERE imageId NOT IN (SELECT id FROM ".IMAGES_TABLE.")";
625    pwg_query($sql);
626
627
628    /*
629     * delete metadata for images that are not in the AMD image table
630     */
631    $sql="DELETE ait
632          FROM ".$this->tables['images_tags']." ait
633            JOIN (SELECT DISTINCT imageId FROM ".$this->tables['images_tags']." ) aitd
634              ON ait.imageId=aitd.imageId
635          WHERE aitd.imageId NOT IN (SELECT id FROM ".IMAGES_TABLE.") ";
636    pwg_query($sql);
637
638
639
640
641    $template->set_filename('sheet_page', dirname(__FILE__).'/admin/amd_metadata_database_database.tpl');
642
643    $datas=array(
644      'urlRequest' => $this->getAdminLink('ajax'),
645      'NumberOfItemsPerRequest' => $this->config['amd_NumberOfItemsPerRequest'],
646    );
647
648    $template->assign("datas", $datas);
649
650    return($template->parse('sheet_page', true));
651  } // displayDatabase
652
653
654
655
656
657  /**
658   * display and manage the help page
659   *
660   * @param String $tab : the selected tab on the help page
661   */
662  protected function displayHelp()
663  {
664    global $template, $user, $lang;
665    $template->set_filename('body_page', dirname(__FILE__).'/admin/amd_help.tpl');
666
667    $statTabsheet = new GPCTabSheet('statTabsheet', $this->tabsheet->get_titlename(), 'tabsheet2 gcBorder', 'itab2');
668    $statTabsheet->add('exif',
669                          l10n('g003_help_tab_exif'),
670                          '', true, "displayHelp('exif');");
671    $statTabsheet->add('iptc',
672                          l10n('g003_help_tab_iptc'),
673                          '', false, "displayHelp('iptc');");
674    $statTabsheet->add('xmp',
675                          l10n('g003_help_tab_xmp'),
676                          '', false, "displayHelp('xmp');");
677    $statTabsheet->add('magic',
678                          l10n('g003_help_tab_magic'),
679                          '', false, "displayHelp('magic');");
680    $statTabsheet->assign();
681
682    $data=Array(
683      'sheetContent_exif' => GPCCore::BBtoHTML($lang['g003_help_exif']),
684      'sheetContent_xmp' => GPCCore::BBtoHTML($lang['g003_help_xmp']),
685      'sheetContent_iptc' => GPCCore::BBtoHTML($lang['g003_help_iptc']),
686      'sheetContent_magic' => GPCCore::BBtoHTML($lang['g003_help_magic']),
687      'title_exif' => l10n('g003_help_tab_exif'),
688      'title_xmp' => l10n('g003_help_tab_xmp'),
689      'title_iptc' => l10n('g003_help_tab_iptc'),
690      'title_magic' => l10n('g003_help_tab_magic')
691    );
692
693    $template->assign('data', $data);
694
695    $template->assign_var_from_handle('AMD_BODY_PAGE', 'body_page');
696  }
697
698} // AMD_AIP class
699
700
701?>
Note: See TracBrowser for help on using the repository browser.