Ignore:
Timestamp:
Sep 16, 2010, 8:55:20 PM (14 years ago)
Author:
grum
Message:

Implement metadata keywords to piwigo tags convert functionnalies
Add some help text
bug:1858

File:
1 edited

Legend:

Unmodified
Added
Removed
  • extensions/AMetaData/amd_ajax.php

    r6920 r6950  
    8484           $_REQUEST['ajaxfct']=='admin.userDefined.deleteTag' or
    8585           $_REQUEST['ajaxfct']=='admin.tag.getValues' or
     86           $_REQUEST['ajaxfct']=='admin.tags.getKeywords' or
     87           $_REQUEST['ajaxfct']=='admin.tags.convertKeywords' or
    8688
    8789           $_REQUEST['ajaxfct']=='public.makeStats.doPictureAnalyze')) $_REQUEST['ajaxfct']='';
     
    317319        }
    318320
     321        /*
     322         * check admin.tags.convertKeywords values
     323         */
     324        if($_REQUEST['ajaxfct']=="admin.tags.convertKeywords")
     325        {
     326          if(!isset($_REQUEST['keywords'])) $_REQUEST['keywords']=array();
     327          if(!is_array($_REQUEST['keywords'])) $_REQUEST['keywords']=array();
     328          if(count($_REQUEST['keywords'])==0) $_REQUEST['ajaxfct']='';
     329        }
     330
     331
    319332
    320333
     
    401414        case 'admin.tag.getValues':
    402415          $result=$this->ajax_amd_admin_tagGetValues($_REQUEST['id']);
     416          break;
     417        case 'admin.tags.getKeywords':
     418          $result=$this->ajax_amd_admin_tagsGetKeywords();
     419          break;
     420        case 'admin.tags.convertKeywords':
     421          $result=$this->ajax_amd_admin_tagsConvertKeywords($_REQUEST['keywords']);
    403422          break;
    404423
     
    942961              'name'  => L10n::get($row['name']),
    943962              'numId' => $row['numId'],
    944               'nbItems' => $row['numOfImg'],
    945               'pct'   => ($numOfPictures==0)?"0":sprintf("%.2f", 100*$row['numOfImg']/$numOfPictures)
     963              'nbItems' => ($this->config['amd_InterfaceMode']=='advanced')?$row['numOfImg']:'',
     964              'pct'   => ($this->config['amd_InterfaceMode']=='advanced')?(($numOfPictures==0)?"0":sprintf("%.2f", 100*$row['numOfImg']/$numOfPictures)):''
    946965            );
    947966          }
     
    13401359        $result=pwg_query($sql);
    13411360        */
     1361
     1362        if($this->config['amd_InterfaceMode']=='basic')
     1363        {
     1364          $sql="INSERT INTO ".$this->tables['selected_tags']." VALUES ('".$properties['tagId']."', 0, -1);";
     1365          pwg_query($sql);
     1366        }
    13421367      }
    13431368      else
     
    13711396      foreach($properties['rules'] as $rule)
    13721397      {
    1373         print_r($rule['value']);
     1398        //print_r($rule['value']);
    13741399        $inserts[]="('$id', '".$rule['defId']."', '".$rule['parentId']."', '".$rule['order']."', '".$rule['type']."', '".$rule['value']."', '".$rule['conditionType']."', '".$rule['conditionValue']."')";
    13751400      }
     
    13781403      $result=pwg_query($sql);
    13791404
    1380       $nbImg=$this->buildUserDefinedTags($id);
     1405      if($this->config['amd_InterfaceMode']=='advanced')
     1406      {
     1407        $nbImg=$this->buildUserDefinedTags($id);
     1408      }
     1409      else
     1410      {
     1411        $nbImg=0;
     1412      }
    13811413
    13821414      $this->makeStatsConsolidation();
     
    14631495
    14641496    /**
     1497     * return an html list of found keywords in the images_tags table
     1498     *
     1499     * @return String : html formatted list
     1500     */
     1501    private function ajax_amd_admin_tagsGetKeywords()
     1502    {
     1503      global $template;
     1504
     1505      $returned=array();
     1506      $keywordsList=array();
     1507      $sql="SELECT pait.value, pait.imageId, paut.numId
     1508            FROM (".$this->tables['images_tags']." pait
     1509              JOIN ".$this->tables['used_tags']." paut ON pait.numId = paut.numId)
     1510
     1511            WHERE (paut.tagId = 'xmp.dc:subject' OR
     1512                   paut.tagId = 'xmp.digiKam:tagsList' OR
     1513                   paut.tagId = 'iptc.Keywords');";
     1514      $result=pwg_query($sql);
     1515      if($result)
     1516      {
     1517        while($row=pwg_db_fetch_assoc($result))
     1518        {
     1519          if(preg_match('/^a:\d+:{/', $row['value']))
     1520          {
     1521            /*
     1522             *  if value is a serialized string, unserialize and process it
     1523             */
     1524            $tmp=unserialize($row['value']);
     1525            foreach($tmp['values'] as $val)
     1526            {
     1527              $keywordsList[]="('".mysql_escape_string($val)."', ".$row['imageId'].")";
     1528            }
     1529          }
     1530          else
     1531          {
     1532            $keywordsList[]="('".mysql_escape_string($row['value'])."', ".$row['imageId'].")";
     1533          }
     1534        }
     1535        $sql="CREATE TEMPORARY TABLE amd_temp_tags (
     1536                `value` CHAR(255) default '',
     1537                `imageId` mediumint(8) unsigned NOT NULL default '0',
     1538                PRIMARY KEY  USING BTREE (`value`,`imageId`)
     1539              ) CHARACTER SET utf8 COLLATE utf8_general_ci;";
     1540        if(pwg_query($sql))
     1541        {
     1542          $sql="INSERT IGNORE INTO amd_temp_tags
     1543            VALUES ".implode(',', $keywordsList);
     1544          if(pwg_query($sql))
     1545          {
     1546            $sql="SELECT att.value AS value,
     1547                    COUNT(DISTINCT att.imageId) AS nbPictures,
     1548                    IF(ptt.name IS NULL, 'n', 'y') AS tagExists,
     1549                    COUNT(DISTINCT pit.image_id) AS nbPicturesTagged
     1550                  FROM (amd_temp_tags att LEFT JOIN ".TAGS_TABLE."  ptt ON att.value = ptt.name)
     1551                    LEFT JOIN ".IMAGE_TAG_TABLE." pit ON pit.tag_id = ptt.id
     1552                  GROUP BY att.value
     1553                  HAVING nbPicturesTagged < nbPictures";
     1554            $result=pwg_query($sql);
     1555            if($result)
     1556            {
     1557              $i=0;
     1558              while($row=pwg_db_fetch_assoc($result))
     1559              {
     1560                $row['id']=$i;
     1561                $returned[]=$row;
     1562                $i++;
     1563              }
     1564            }
     1565          }
     1566        }
     1567      }
     1568
     1569      $template->set_filename('keywordsList',
     1570                    dirname($this->getFileLocation()).'/admin/amd_metadata_tags_iKeywordsList.tpl');
     1571
     1572      $template->assign('datas', $returned);
     1573      return($template->parse('keywordsList', true));
     1574    }
     1575
     1576
     1577    /**
     1578     * convert given keywords into tags, and associate them to pictures
     1579     *
     1580     * @param Array $keywords : an array of strings
     1581     * @return String : ok or ko
     1582     */
     1583    private function ajax_amd_admin_tagsConvertKeywords($keywords)
     1584    {
     1585      global $template;
     1586
     1587      $returned='ko';
     1588
     1589      /*
     1590       * 1/ build a temp table with all couple of keywords/imageId
     1591       */
     1592      $keywordsList=array();
     1593      $sql="SELECT pait.value, pait.imageId, paut.numId
     1594            FROM (".$this->tables['images_tags']." pait
     1595              JOIN ".$this->tables['used_tags']." paut ON pait.numId = paut.numId)
     1596
     1597            WHERE (paut.tagId = 'xmp.dc:subject' OR
     1598                   paut.tagId = 'xmp.digiKam:tagsList' OR
     1599                   paut.tagId = 'iptc.Keywords');";
     1600      $result=pwg_query($sql);
     1601      if($result)
     1602      {
     1603        while($row=pwg_db_fetch_assoc($result))
     1604        {
     1605          if(preg_match('/^a:\d+:{/', $row['value']))
     1606          {
     1607            /*
     1608             *  if value is a serialized string, unserialize and process it
     1609             */
     1610            $tmp=unserialize($row['value']);
     1611            foreach($tmp['values'] as $val)
     1612            {
     1613              $keywordsList[]="('".mysql_escape_string($val)."', ".$row['imageId'].")";
     1614            }
     1615          }
     1616          else
     1617          {
     1618            $keywordsList[]="('".mysql_escape_string($row['value'])."', ".$row['imageId'].")";
     1619          }
     1620        }
     1621        $sql="CREATE TEMPORARY TABLE amd_temp_tags (
     1622                `value` CHAR(255) default '',
     1623                `imageId` mediumint(8) unsigned NOT NULL default '0',
     1624                PRIMARY KEY  USING BTREE (`value`,`imageId`)
     1625              ) CHARACTER SET utf8 COLLATE utf8_general_ci;";
     1626        if(pwg_query($sql))
     1627        {
     1628          $sql="INSERT IGNORE INTO amd_temp_tags
     1629            VALUES ".implode(',', $keywordsList);
     1630          if(pwg_query($sql))
     1631          {
     1632            foreach($keywords as $key => $val)
     1633            {
     1634              $keywords[$key]="(att.value LIKE '".mysql_escape_string($val)."')";
     1635            }
     1636            /*
     1637             * 2/ join temp table with piwigo tags table, found the keywords
     1638             *    that don't have a corresponding keyword
     1639             */
     1640            $sql="SELECT DISTINCT att.value
     1641                  FROM amd_temp_tags att LEFT JOIN ".TAGS_TABLE." ptt ON att.value = ptt.name
     1642                  WHERE ptt.id IS NULL
     1643                    AND".implode(' OR ', $keywords);
     1644            $result=pwg_query($sql);
     1645            if($result)
     1646            {
     1647              $sql=array();
     1648              while($row=pwg_db_fetch_assoc($result))
     1649              {
     1650                $sql[]="('', '".mysql_escape_string($row['value'])."', '".mysql_escape_string(str2url($row['value']))."')";
     1651              }
     1652              if(count($sql)>0)
     1653              {
     1654                $sql="INSERT INTO ".TAGS_TABLE." VALUES ".implode(',', $sql);
     1655                pwg_query($sql);
     1656              }
     1657            }
     1658
     1659            /*
     1660             * 3/ join temp table with piwigo tags table, associate piwigo tagId
     1661             *    to the keywords (at this step, all keyword can be associated
     1662             *    with a piwigo tagId)
     1663             */
     1664            $sql="INSERT IGNORE INTO ".IMAGE_TAG_TABLE."
     1665                    SELECT DISTINCT att.imageId, ptt.id
     1666                    FROM amd_temp_tags att LEFT JOIN ".TAGS_TABLE." ptt ON att.value = ptt.name
     1667                    WHERE ".implode(' OR ', $keywords);
     1668            $result=pwg_query($sql);
     1669            $returned='ok';
     1670          }
     1671        }
     1672      }
     1673
     1674      return($returned);
     1675    }
     1676
     1677
     1678    /**
    14651679     * set value(s) for option(s)
    14661680     *
Note: See TracChangeset for help on using the changeset viewer.