Changeset 1064


Ignore:
Timestamp:
03/05/06 00:31:46 (13 years ago)
Author:
plg
Message:

new feature: source/destination links between categories. Will we keep this
feature? Code is complicated and very few people will understand how it
works...

modification: #images.storage_category_id replaced by
#image_category.is_storage

improvement: many code refactoring to improve readibility

improvement: virtual category creation code was moved to a dedicated
function in order to be called from admin/cat_list.php and
admin/cat_modify.php (create a new destination category)

Location:
trunk
Files:
2 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/admin/cat_list.php

    r1004 r1064  
    8484else if (isset($_POST['submitAdd'])) 
    8585{ 
    86   // is the given category name only containing blank spaces ? 
    87   if (preg_match('/^\s*$/', $_POST['virtual_name'])) 
    88   { 
    89     array_push($page['errors'], $lang['cat_error_name']); 
    90   } 
    91          
    92   if (!count($page['errors'])) 
    93   { 
    94     $parent_id = !empty($_GET['parent_id'])?$_GET['parent_id']:'NULL'; 
    95      
    96     if ($parent_id != 'NULL') 
    97     { 
    98       $query = ' 
    99 SELECT id,uppercats,global_rank,visible,status 
    100   FROM '.CATEGORIES_TABLE.' 
    101   WHERE id = '.$parent_id.' 
    102 ;'; 
    103       $row = mysql_fetch_array(pwg_query($query)); 
    104       $parent = array('id' => $row['id'], 
    105                       'uppercats' => $row['uppercats'], 
    106                       'visible' => $row['visible'], 
    107                       'status' => $row['status'], 
    108                       'global_rank' => $row['global_rank']); 
    109     } 
    110  
    111     // what will be the inserted id ? 
    112     $query = ' 
    113 SELECT IF(MAX(id)+1 IS NULL, 1, MAX(id)+1) 
    114   FROM '.CATEGORIES_TABLE.' 
    115 ;'; 
    116     list($next_id) = mysql_fetch_array(pwg_query($query)); 
    117      
    118     $insert = array(); 
    119     $insert{'id'} = $next_id++; 
    120     $insert{'name'} = $_POST['virtual_name']; 
    121     $insert{'rank'} = $_POST['rank']; 
    122     $insert{'commentable'} = $conf['newcat_default_commentable']; 
    123  
    124     // a virtual category can't be uploadable 
    125     $insert{'uploadable'} = 'false'; 
    126      
    127     if (isset($parent)) 
    128     { 
    129       $insert{'id_uppercat'} = $parent{'id'}; 
    130       $insert{'uppercats'}   = $parent{'uppercats'}.','.$insert{'id'}; 
    131       $insert{'global_rank'} = $parent{'global_rank'}.'.'.$insert{'rank'}; 
    132       // at creation, must a category be visible or not ? Warning : if 
    133       // the parent category is invisible, the category is automatically 
    134       // create invisible. (invisible = locked) 
    135       if ('false' == $parent['visible']) 
    136       { 
    137         $insert{'visible'} = 'false'; 
    138       } 
    139       else 
    140       { 
    141         $insert{'visible'} = $conf['newcat_default_visible']; 
    142       } 
    143       // at creation, must a category be public or private ? Warning : 
    144       // if the parent category is private, the category is 
    145       // automatically create private. 
    146       if ('private' == $parent['status']) 
    147       { 
    148         $insert{'status'} = 'private'; 
    149       } 
    150       else 
    151       { 
    152         $insert{'status'} = $conf['newcat_default_status']; 
    153       } 
    154     } 
    155     else 
    156     { 
    157       $insert{'visible'} = $conf['newcat_default_visible']; 
    158       $insert{'status'} = $conf['newcat_default_status']; 
    159       $insert{'uppercats'} = $insert{'id'}; 
    160       $insert{'global_rank'} = $insert{'rank'}; 
    161     } 
    162  
    163     $inserts = array($insert); 
    164      
    165     // we have then to add the virtual category 
    166     $dbfields = array('id','site_id','name','id_uppercat','rank', 
    167                       'commentable','uploadable','visible','status', 
    168                       'uppercats','global_rank'); 
    169     mass_inserts(CATEGORIES_TABLE, $dbfields, $inserts); 
    170  
    171     array_push($page['infos'], $lang['cat_virtual_added']); 
     86  $output_create = create_virtual_category( 
     87    $_POST['virtual_name'], 
     88    @$_GET['parent_id'] 
     89    ); 
     90 
     91  if (isset($output_create['error'])) 
     92  { 
     93    array_push($page['errors'], $output_create['error']); 
     94  } 
     95  else 
     96  { 
     97    array_push($page['infos'], $output_create['info']); 
    17298  } 
    17399} 
     
    212138 
    213139  $current_category = get_cat_info($_GET['parent_id']); 
    214   $navigation.= get_cat_display_name($current_category['name'], 
    215                                      $base_url.'&parent_id=', 
    216                                      false); 
     140   
     141  $navigation.= get_cat_display_name( 
     142    $current_category['name'], 
     143    $base_url.'&parent_id=', 
     144    false 
     145    ); 
    217146} 
    218147// +-----------------------------------------------------------------------+ 
     
    227156} 
    228157 
    229 if (count($categories) > 0) 
    230 { 
    231   $next_rank = max(array_keys($categories)) + 1; 
    232 } 
    233 else 
    234 { 
    235   $next_rank = 1; 
    236 } 
    237  
    238158$template->assign_vars(array( 
    239159  'CATEGORIES_NAV'=>$navigation, 
    240   'NEXT_RANK'=>$next_rank, 
    241160  'F_ACTION'=>$form_action, 
    242161   
  • trunk/admin/cat_modify.php

    r1058 r1064  
    8989  pwg_query($query); 
    9090} 
     91else if (isset($_POST['submitAdd'])) 
     92{ 
     93  $output_create = create_virtual_category( 
     94    $_POST['virtual_name'], 
     95    (0 == $_POST['parent'] ? null : $_POST['parent']) 
     96    ); 
     97   
     98  if (isset($output_create['error'])) 
     99  { 
     100    array_push($page['errors'], $output_create['error']); 
     101  } 
     102  else 
     103  { 
     104    // Virtual category creation succeeded 
     105    // 
     106    // Add the information in the information list 
     107    array_push($page['infos'], $output_create['info']); 
     108     
     109    // Link the new category to the current category 
     110    $query = ' 
     111INSERT 
     112  INTO '.CATEGORIES_LINK_TABLE.' 
     113  (source, destination) 
     114  VALUES 
     115  ('.$_GET['cat_id'].', '.$output_create['id'].') 
     116;'; 
     117    pwg_query($query); 
     118 
     119    check_links(array($output_create['id'])); 
     120    update_category(array($output_create['id'])); 
     121  } 
     122} 
     123else if (isset($_POST['destination_trueify']) 
     124         and isset($_POST['destination_false']) 
     125         and count($_POST['destination_false'])) 
     126{ 
     127  $datas = array(); 
     128   
     129  foreach ($_POST['destination_false'] as $category_id) 
     130  { 
     131    array_push( 
     132      $datas, 
     133      array( 
     134        'source'      => $_GET['cat_id'], 
     135        'destination' => $category_id, 
     136        ) 
     137      ); 
     138  } 
     139   
     140  mass_inserts( 
     141    CATEGORIES_LINK_TABLE, 
     142    array('source', 'destination'), 
     143    $datas 
     144    ); 
     145 
     146  check_links($_POST['destination_false']); 
     147  update_category( 
     148    $_POST['destination_false'], 
     149    true                          // recursive update 
     150    ); 
     151} 
     152else if (isset($_POST['destination_falsify']) 
     153         and isset($_POST['destination_true']) 
     154         and count($_POST['destination_true'])) 
     155{ 
     156  foreach ($_POST['destination_true'] as $destination) 
     157  { 
     158    delete_sources($destination, array($_GET['cat_id'])); 
     159  } 
     160 
     161  update_category( 
     162    $_POST['destination_true'], 
     163    true                          // recursive update 
     164    ); 
     165} 
     166else if (isset($_POST['source_trueify']) 
     167         and isset($_POST['source_false']) 
     168         and count($_POST['source_false'])) 
     169{ 
     170  $datas = array(); 
     171   
     172  foreach ($_POST['source_false'] as $category_id) 
     173  { 
     174    array_push( 
     175      $datas, 
     176      array( 
     177        'source'      => $category_id, 
     178        'destination' => $_GET['cat_id'], 
     179        ) 
     180      ); 
     181  } 
     182   
     183  mass_inserts( 
     184    CATEGORIES_LINK_TABLE, 
     185    array('source', 'destination'), 
     186    $datas 
     187    ); 
     188 
     189  check_links(array($_GET['cat_id'])); 
     190  update_category( 
     191    array($_GET['cat_id']), 
     192    true                          // recursive update 
     193    ); 
     194} 
     195else if (isset($_POST['source_falsify']) 
     196         and isset($_POST['source_true']) 
     197         and count($_POST['source_true'])) 
     198{ 
     199  delete_sources($_GET['cat_id'], $_POST['source_true']); 
     200   
     201  update_category( 
     202    array($_GET['cat_id']), 
     203    true                          // recursive update 
     204    ); 
     205} 
     206 
    91207 
    92208$query = ' 
     
    317433} 
    318434 
     435$blockname = 'category_option_parent'; 
     436 
     437$template->assign_block_vars( 
     438  $blockname, 
     439  array( 
     440    'VALUE'=> 0, 
     441    'OPTION' => '------------' 
     442    ) 
     443  ); 
     444 
     445$query = ' 
     446SELECT id,name,uppercats,global_rank 
     447  FROM '.CATEGORIES_TABLE.' 
     448;'; 
     449 
     450display_select_cat_wrapper( 
     451  $query, 
     452  array(), 
     453  $blockname 
     454  ); 
     455 
     456// destination categories 
     457$query = ' 
     458SELECT DISTINCT id, name, uppercats, global_rank 
     459  FROM '.CATEGORIES_TABLE.' 
     460    INNER JOIN '.CATEGORIES_LINK_TABLE.' ON destination = id 
     461  WHERE source = '.$_GET['cat_id'].' 
     462;'; 
     463display_select_cat_wrapper($query, array(), 'destination_option_true'); 
     464 
     465// non destination categories 
     466$destinations = array_merge( 
     467  array($_GET['cat_id']), 
     468  array_from_query($query, 'id') 
     469  ); 
     470 
     471$query = ' 
     472SELECT DISTINCT id, name, uppercats, global_rank 
     473  FROM '.CATEGORIES_TABLE.' 
     474  WHERE id NOT IN ('.implode(',', $destinations).') 
     475;'; 
     476display_select_cat_wrapper($query, array(), 'destination_option_false'); 
     477 
     478// source categories 
     479$query = ' 
     480SELECT DISTINCT id, name, uppercats, global_rank 
     481  FROM '.CATEGORIES_TABLE.' 
     482    INNER JOIN '.CATEGORIES_LINK_TABLE.' ON source = id 
     483  WHERE destination = '.$_GET['cat_id'].' 
     484;'; 
     485display_select_cat_wrapper($query, array(), 'source_option_true'); 
     486 
     487// non source categories 
     488$sources = array_merge( 
     489  array($_GET['cat_id']), 
     490  array_from_query($query, 'id') 
     491  ); 
     492 
     493$query = ' 
     494SELECT DISTINCT id, name, uppercats, global_rank 
     495  FROM '.CATEGORIES_TABLE.' 
     496  WHERE id NOT IN ('.implode(',', $sources).') 
     497;'; 
     498display_select_cat_wrapper($query, array(), 'source_option_false'); 
     499 
    319500//----------------------------------------------------------- sending html code 
    320501$template->assign_var_from_handle('ADMIN_CONTENT', 'categories'); 
  • trunk/admin/include/functions.php

    r1060 r1064  
     1 
    12<?php 
    23// +-----------------------------------------------------------------------+ 
     
    153154  // destruction of all the related elements 
    154155  $query = ' 
    155 SELECT id 
    156   FROM '.IMAGES_TABLE.' 
    157   WHERE storage_category_id IN ( 
    158 '.wordwrap(implode(', ', $ids), 80, "\n").') 
     156SELECT image_id 
     157  FROM '.IMAGE_CATEGORY_TABLE.' 
     158  WHERE is_storage = \'true\' 
     159    AND category_id IN ('. 
     160    wordwrap( 
     161      implode(', ', $ids), 
     162      80, 
     163      "\n" 
     164      ). 
     165    ') 
    159166;'; 
    160167  $result = pwg_query($query); 
     
    162169  while ($row = mysql_fetch_array($result)) 
    163170  { 
    164     array_push($element_ids, $row['id']); 
     171    array_push($element_ids, $row['image_id']); 
    165172  } 
    166173  delete_elements($element_ids); 
     
    181188;'; 
    182189  pwg_query($query); 
     190   
    183191  $query = ' 
    184192DELETE FROM '.GROUP_ACCESS_TABLE.' 
     
    187195;'; 
    188196  pwg_query($query); 
     197 
     198  // source/destination links deletion 
     199  $query = ' 
     200SELECT destination, source 
     201  FROM '.CATEGORIES_LINK_TABLE.' 
     202  WHERE source IN ('.implode(',', $ids).') 
     203    OR destination IN ('.implode(',', $ids).') 
     204;'; 
     205  $result = pwg_query($query); 
     206 
     207  $sources_of = array(); 
     208   
     209  while ($row = mysql_fetch_array($result)) 
     210  { 
     211    if (!isset($sources_of[ $row['destination'] ])) 
     212    { 
     213      $sources_of[ $row['destination'] ] = array(); 
     214    } 
     215 
     216    array_push( 
     217      $sources_of[ $row['destination'] ], 
     218      $row['source'] 
     219      ); 
     220  } 
     221 
     222  foreach ($sources_of as $destination => $sources) 
     223  { 
     224    delete_sources($destination, $sources); 
     225  } 
     226 
     227  update_category(); 
    189228 
    190229  // destruction of the category 
     
    396435       COUNT(image_id) AS nb_images, 
    397436       MAX(date_available) AS date_last 
    398   FROM '.IMAGES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id = image_id 
     437  FROM '.IMAGES_TABLE.' 
     438    INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id = image_id 
    399439  WHERE category_id IN ('.wordwrap(implode(', ', $cat_ids), 80, "\n").') 
    400440  GROUP BY category_id 
     
    403443  $datas = array(); 
    404444  $query_ids = array(); 
    405   while ( $row = mysql_fetch_array( $result ) ) 
     445  while ($row = mysql_fetch_array($result)) 
    406446  { 
    407447    array_push($query_ids, $row['category_id']); 
    408     array_push($datas, array('id' => $row['category_id'], 
    409                              'date_last' => $row['date_last'], 
    410                              'nb_images' => $row['nb_images'])); 
     448     
     449    array_push( 
     450      $datas, 
     451      array( 
     452        'id'        => $row['category_id'], 
     453        'date_last' => $row['date_last'], 
     454        'nb_images' => $row['nb_images'] 
     455        ) 
     456      ); 
    411457  } 
    412458  // if all links between a category and elements have disappeared, no line 
     
    414460  foreach (array_diff($cat_ids, $query_ids) as $id) 
    415461  { 
    416     array_push($datas, array('id' => $id, 'nb_images' => 0)); 
    417   } 
    418  
    419   $fields = array('primary' => array('id'), 
    420                   'update'  => array('date_last', 'nb_images')); 
    421   mass_updates(CATEGORIES_TABLE, $fields, $datas); 
     462    array_push( 
     463      $datas, 
     464      array( 
     465        'id'        => $id, 
     466        'nb_images' => 0, 
     467        ) 
     468      ); 
     469  } 
     470 
     471  mass_updates( 
     472    CATEGORIES_TABLE, 
     473    array( 
     474      'primary' => array('id'), 
     475      'update'  => array('date_last', 'nb_images') 
     476      ), 
     477    $datas 
     478    ); 
    422479 
    423480  // representative pictures 
     
    12921349function update_path() 
    12931350{ 
    1294   $query = ' 
    1295 SELECT DISTINCT(storage_category_id) 
    1296   FROM '.IMAGES_TABLE.' 
    1297 ;'; 
    1298   $cat_ids = array_from_query($query, 'storage_category_id'); 
    1299   $fulldirs = get_fulldirs($cat_ids); 
    1300  
    1301   foreach ($cat_ids as $cat_id) 
     1351  $images_of = array(); 
     1352   
     1353  $query = ' 
     1354SELECT category_id, image_id 
     1355  FROM '.IMAGE_CATEGORY_TABLE.' 
     1356  WHERE is_storage = \'true\' 
     1357;'; 
     1358  $result = pwg_query($query); 
     1359  while ($row = mysql_fetch_array($result)) 
     1360  { 
     1361    if (!isset($images_of[ $row['category_id'] ])) 
     1362    { 
     1363      $images_of[ $row['category_id'] ] = array(); 
     1364    } 
     1365 
     1366    array_push( 
     1367      $images_of[ $row['category_id'] ], 
     1368      $row['image_id'] 
     1369      ); 
     1370  } 
     1371   
     1372  $fulldirs = get_fulldirs( 
     1373    array_keys($images_of) 
     1374    ); 
     1375 
     1376  foreach ($images_of as $cat_id => $image_ids) 
    13021377  { 
    13031378    $query = ' 
    13041379UPDATE '.IMAGES_TABLE.' 
    13051380  SET path = CONCAT(\''.$fulldirs[$cat_id].'\',\'/\',file) 
    1306   WHERE storage_category_id = '.$cat_id.' 
     1381  WHERE id IN ('. 
     1382      wordwrap( 
     1383        implode(', ', $image_ids), 
     1384        80, 
     1385        "\n"). 
     1386      ') 
    13071387;'; 
    13081388    pwg_query($query); 
     
    15231603    ); 
    15241604} 
     1605 
     1606/** 
     1607 * Returns all destinations of a list of source categories. This function 
     1608 * solves transitivity. 
     1609 * 
     1610 * @param mixed array of category ids, empty for all categories 
     1611 */ 
     1612function get_destinations($categories = 'all') 
     1613{ 
     1614  $query = ' 
     1615SELECT source, destination 
     1616  FROM '.CATEGORIES_LINK_TABLE.' 
     1617'; 
     1618  $result = pwg_query($query); 
     1619 
     1620  $destinations_of = array(); 
     1621   
     1622  while ($row = mysql_fetch_array($result)) 
     1623  { 
     1624    if (!isset($destinations_of[ $row['source'] ])) 
     1625    { 
     1626      $destinations_of[ $row['source'] ] = array(); 
     1627    } 
     1628 
     1629    array_push( 
     1630      $destinations_of[ $row['source'] ], 
     1631      $row['destination'] 
     1632      ); 
     1633  } 
     1634 
     1635  // transitivity resolution: if " => " means "source of", if A=>B=>C 
     1636  // implies A=>B and A=>C. So A has 2 destinations: B and C. 
     1637  do 
     1638  { 
     1639    // let's suppose we only need a single turn 
     1640    $need_new_turn = false; 
     1641     
     1642    foreach ($destinations_of as $source => $destinations) 
     1643    { 
     1644      foreach ($destinations as $destination) 
     1645      { 
     1646        // does the current destination has destinations itself? 
     1647        if (isset($destinations_of[$destination])) 
     1648        { 
     1649          // are there destinations of current destination not already among 
     1650          // destinations of the current source? (advise: take a piece of 
     1651          // paper and draw a schema). The source itself must not be counted 
     1652          // as a destination, thus avoiding cyclic links. 
     1653          $missing_destinations = array_diff( 
     1654            $destinations_of[$destination], 
     1655            $destinations, 
     1656            array($source) // no cyclic link 
     1657            ); 
     1658           
     1659          if (count($missing_destinations) > 0) 
     1660          { 
     1661            $destinations_of[$source] = array_unique( 
     1662              array_merge( 
     1663                $destinations, 
     1664                $missing_destinations 
     1665                ) 
     1666              ); 
     1667 
     1668            // a category has a least one new destination, we have to check 
     1669            // one more time that it doesn't generate more destinations 
     1670            $need_new_turn = true; 
     1671          } 
     1672        } 
     1673      } 
     1674    } 
     1675  } while ($need_new_turn); 
     1676 
     1677  if (is_array($categories)) 
     1678  { 
     1679    $filtered_destinations_of = array(); 
     1680 
     1681    // Even if there is no destinations for the requested categories, we 
     1682    // return empty arrays 
     1683    foreach ($categories as $category) 
     1684    { 
     1685      $filtered_destinations_of[$category] = array(); 
     1686    } 
     1687     
     1688    foreach ($destinations_of as $source => $destinations) 
     1689    { 
     1690      if (in_array($source, $categories)) 
     1691      { 
     1692        $filtered_destinations_of[$source] = $destinations; 
     1693      } 
     1694    } 
     1695 
     1696    return $filtered_destinations_of; 
     1697  } 
     1698  else 
     1699  { 
     1700    return $destinations_of; 
     1701  } 
     1702} 
     1703 
     1704/** 
     1705 * Returns all sources of a list of destination categories. This function 
     1706 * solves transitivity. 
     1707 * 
     1708 * @param mixed array of category ids, empty for all categories 
     1709 */ 
     1710function get_sources($categories = 'all') 
     1711{ 
     1712  $destinations_of = get_destinations(); 
     1713 
     1714  $sources_of = array(); 
     1715   
     1716  foreach ($destinations_of as $source => $destinations) 
     1717  { 
     1718    foreach ($destinations as $destination) 
     1719    { 
     1720      if (!isset($sources_of[$destination])) 
     1721      { 
     1722        $sources_of[$destination] = array(); 
     1723      } 
     1724 
     1725      array_push($sources_of[$destination], $source); 
     1726    } 
     1727  } 
     1728   
     1729  // eventually, filter 
     1730  if (is_array($categories)) 
     1731  { 
     1732    $filtered_sources_of = array(); 
     1733 
     1734    // Even if there is no sources for the requested categories, we return 
     1735    // empty arrays 
     1736    foreach ($categories as $category) 
     1737    { 
     1738      $filtered_sources_of[$category] = array(); 
     1739    } 
     1740     
     1741    foreach ($sources_of as $destination => $sources) 
     1742    { 
     1743      if (in_array($destination, $categories)) 
     1744      { 
     1745        $filtered_sources_of[$destination] = $sources; 
     1746      } 
     1747    } 
     1748 
     1749    return $filtered_sources_of; 
     1750  } 
     1751  else 
     1752  { 
     1753    return $sources_of; 
     1754  } 
     1755} 
     1756 
     1757/** 
     1758 * Checks categories links are respected for a given list of destinations. 
     1759 * 
     1760 * Checking categories links means that each destination must be associated 
     1761 * to the images of its sources. 
     1762 * 
     1763 * @param mixed source category ids 
     1764 */ 
     1765function check_links($destinations = 'all') 
     1766{ 
     1767  $sources_of = get_sources($destinations); 
     1768 
     1769  if (empty($sources_of)) 
     1770  { 
     1771    return true; 
     1772  } 
     1773 
     1774  // we need to search images of all sources and destinations 
     1775  $images_of = array(); 
     1776 
     1777  foreach ($sources_of as $destination => $sources) 
     1778  { 
     1779    $images_of[$destination] = array(); 
     1780 
     1781    foreach ($sources as $source) 
     1782    { 
     1783      $images_of[$source] = array(); 
     1784    } 
     1785  } 
     1786   
     1787  $query = ' 
     1788SELECT image_id, category_id 
     1789  FROM '.IMAGE_CATEGORY_TABLE.' 
     1790  WHERE category_id IN ('. 
     1791    implode(',', array_keys($images_of)). 
     1792    ') 
     1793;'; 
     1794  $result = pwg_query($query); 
     1795 
     1796  while ($row = mysql_fetch_array($result)) 
     1797  { 
     1798    array_push( 
     1799      $images_of[ $row['category_id'] ], 
     1800      $row['image_id'] 
     1801      ); 
     1802  } 
     1803 
     1804  $inserts = array(); 
     1805   
     1806  foreach ($sources_of as $destination => $sources) 
     1807  { 
     1808    // merge all images from the sources of this destination 
     1809    $sources_images = array(); 
     1810     
     1811    foreach ($sources as $source) 
     1812    { 
     1813      $sources_images = array_merge( 
     1814        $sources_images, 
     1815        $images_of[$source] 
     1816        ); 
     1817    } 
     1818 
     1819    $sources_images = array_unique($sources_images); 
     1820 
     1821    // are there images among the sources that are not linked to the 
     1822    // destination? 
     1823    $missing_images = array_diff( 
     1824      $sources_images, 
     1825      $images_of[$destination] 
     1826      ); 
     1827 
     1828    // if we find missing images (missing links in reality), we prepare the 
     1829    // final mass_inserts 
     1830    if (count($missing_images) > 0) 
     1831    { 
     1832      foreach ($missing_images as $missing_image) 
     1833      { 
     1834        array_push( 
     1835          $inserts, 
     1836          array( 
     1837            'category_id' => $destination, 
     1838            'image_id'    => $missing_image, 
     1839            ) 
     1840          ); 
     1841      } 
     1842    } 
     1843  } 
     1844 
     1845  if (count($inserts) > 0) 
     1846  { 
     1847    mass_inserts( 
     1848      IMAGE_CATEGORY_TABLE, 
     1849      array_keys($inserts[0]), 
     1850      $inserts 
     1851      ); 
     1852  } 
     1853} 
     1854 
     1855/** 
     1856 * Based on categories links, delete image_category links on destinations. 
     1857 * 
     1858 * The rule is the following: if an image belong to the category and to the 
     1859 * source, we suppose it comes from the source. If the source/destination 
     1860 * link is broken, we delete the image/category link if the only origin of 
     1861 * the link was the broken categories link. 
     1862 * 
     1863 * Example: "=>" means "source of". Between brackets the associated images. 
     1864 * 
     1865 * A (1,2,9) => \ 
     1866 *               |=> C (1,2,3,4,5,9) => D (1,2,3,4,5,6,9) 
     1867 * B (3,4,9) => / 
     1868 * 
     1869 * In category C, we suppose (1,2) come from A, (3,4) from B, 9 from A or B 
     1870 * and 5 was manually added. In category D, 6 was added manually. 
     1871 * 
     1872 * If we break A=>C, C and D loose (1,2) but not 9 because it can come from 
     1873 * B. If we break C=>D, D loose (3,4,5,9) but not 6 because it was 
     1874 * associated manually to 9. 
     1875 * 
     1876 * Warning: only virtual links can be removed, physical links are protected. 
     1877 *  
     1878 * @param int destination 
     1879 * @param array sources 
     1880 */ 
     1881function delete_sources($destination, $sources) 
     1882{ 
     1883  // if no sources to unlink, we stop with OK status 
     1884  if (count($sources) == 0) 
     1885  { 
     1886    return true; 
     1887  } 
     1888 
     1889  $query = ' 
     1890DELETE 
     1891  FROM '.CATEGORIES_LINK_TABLE.' 
     1892  WHERE destination = '.$destination.' 
     1893    AND source IN ('.implode(',', $sources).') 
     1894;'; 
     1895  pwg_query($query); 
     1896   
     1897  // The strategy is the following: 
     1898  // 
     1899  // * first we brutally delete the image/category associations on 
     1900  // destinations categories for all images belonging to sources. 
     1901  // 
     1902  // * then we check_links on destinations to rebuild missing image/category 
     1903  // associations. 
     1904 
     1905  // what are the images associated to the sources to unlink 
     1906  $query = ' 
     1907SELECT image_id 
     1908  FROM '.IMAGE_CATEGORY_TABLE.' 
     1909  WHERE category_id IN ('. 
     1910    implode(',', $sources). 
     1911    ') 
     1912;'; 
     1913  $sources_images = array_unique( 
     1914    array_from_query($query, 'image_id') 
     1915    ); 
     1916 
     1917  if (count($sources_images) == 0) 
     1918  { 
     1919    return true; 
     1920  } 
     1921 
     1922  // retrieve all direct and indirect destinations of the current 
     1923  // destination 
     1924  $destinations_of = get_destinations(array($destination)); 
     1925 
     1926  $destinations = array_merge( 
     1927    array($destination), 
     1928    $destinations_of[$destination] 
     1929    ); 
     1930   
     1931  // unlink sources images from destinations 
     1932  $query = ' 
     1933DELETE 
     1934  FROM '.IMAGE_CATEGORY_TABLE.' 
     1935  WHERE category_id IN ('.implode(',', $destinations).') 
     1936    AND image_id IN ('.implode(',', $sources_images).') 
     1937    AND is_storage = \'false\' 
     1938;'; 
     1939  pwg_query($query); 
     1940 
     1941  // if the representative thumbnail of destinations was a picture from 
     1942  // $sources_images, we request a new random representant 
     1943  $query = ' 
     1944SELECT id, representative_picture_id 
     1945  FROM '.CATEGORIES_TABLE.' 
     1946  WHERE id IN ('.implode(',', $destinations).') 
     1947;'; 
     1948  $result = pwg_query($query); 
     1949 
     1950  $request_random = array(); 
     1951   
     1952  while ($row = mysql_fetch_array($result)) 
     1953  { 
     1954    if (isset($row['representative_picture_id'])) 
     1955    { 
     1956      if (in_array($row['representative_picture_id'], $sources_images)) 
     1957      { 
     1958        array_push($request_random, $row['id']); 
     1959      } 
     1960    } 
     1961  } 
     1962 
     1963  set_random_representant($request_random); 
     1964 
     1965  // eventually, we check_links to rebuild missing associations 
     1966  check_links($destinations); 
     1967 
     1968  return true; 
     1969} 
     1970 
     1971/** 
     1972 * create a virtual category 
     1973 * 
     1974 * @param string category name 
     1975 * @param int parent category id 
     1976 * @return array with ('info' and 'id') or ('error') key 
     1977 */ 
     1978function create_virtual_category($category_name, $parent_id=null) 
     1979{ 
     1980  global $conf; 
     1981   
     1982  // is the given category name only containing blank spaces ? 
     1983  if (preg_match('/^\s*$/', $category_name)) 
     1984  { 
     1985    return array('error' => l10n('cat_error_name')); 
     1986  } 
     1987         
     1988  $parent_id = !empty($parent_id) ? $parent_id : 'NULL'; 
     1989 
     1990  $query = ' 
     1991SELECT MAX(rank) 
     1992  FROM '.CATEGORIES_TABLE.' 
     1993  WHERE id_uppercat '.(is_numeric($parent_id) ? '= '.$parent_id : 'IS NULL').' 
     1994;'; 
     1995  list($current_rank) = mysql_fetch_array(pwg_query($query)); 
     1996   
     1997  $insert = array( 
     1998    'name' => $category_name, 
     1999    'rank' => ++$current_rank, 
     2000    'commentable' => $conf['newcat_default_commentable'], 
     2001    'uploadable' => 'false', 
     2002    ); 
     2003     
     2004  if ($parent_id != 'NULL') 
     2005  { 
     2006    $query = ' 
     2007SELECT id, uppercats, global_rank, visible, status 
     2008  FROM '.CATEGORIES_TABLE.' 
     2009  WHERE id = '.$parent_id.' 
     2010;'; 
     2011    $parent = mysql_fetch_array(pwg_query($query)); 
     2012 
     2013    $insert{'id_uppercat'} = $parent{'id'}; 
     2014    $insert{'global_rank'} = $parent{'global_rank'}.'.'.$insert{'rank'}; 
     2015     
     2016    // at creation, must a category be visible or not ? Warning : if the 
     2017    // parent category is invisible, the category is automatically create 
     2018    // invisible. (invisible = locked) 
     2019    if ('false' == $parent['visible']) 
     2020    { 
     2021      $insert{'visible'} = 'false'; 
     2022    } 
     2023    else 
     2024    { 
     2025      $insert{'visible'} = $conf['newcat_default_visible']; 
     2026    } 
     2027     
     2028    // at creation, must a category be public or private ? Warning : if the 
     2029    // parent category is private, the category is automatically create 
     2030    // private. 
     2031    if ('private' == $parent['status']) 
     2032    { 
     2033      $insert{'status'} = 'private'; 
     2034    } 
     2035    else 
     2036    { 
     2037      $insert{'status'} = $conf['newcat_default_status']; 
     2038    } 
     2039  } 
     2040  else 
     2041  { 
     2042    $insert{'visible'} = $conf['newcat_default_visible']; 
     2043    $insert{'status'} = $conf['newcat_default_status']; 
     2044    $insert{'global_rank'} = $insert{'rank'}; 
     2045  } 
     2046 
     2047  // we have then to add the virtual category 
     2048  mass_inserts( 
     2049    CATEGORIES_TABLE, 
     2050    array( 
     2051      'site_id', 'name', 'id_uppercat', 'rank', 'commentable', 
     2052      'uploadable', 'visible', 'status', 'global_rank', 
     2053      ), 
     2054    array($insert) 
     2055    ); 
     2056 
     2057  $inserted_id = mysql_insert_id(); 
     2058 
     2059  $query = ' 
     2060UPDATE 
     2061  '.CATEGORIES_TABLE.' 
     2062  SET uppercats = \''. 
     2063    (isset($parent) ? $parent{'uppercats'}.',' : ''). 
     2064    $inserted_id. 
     2065    '\' 
     2066  WHERE id = '.$inserted_id.' 
     2067;'; 
     2068  pwg_query($query); 
     2069   
     2070  return array( 
     2071    'info' => l10n('cat_virtual_added'), 
     2072    'id'   => $inserted_id, 
     2073    ); 
     2074} 
    15252075?> 
  • trunk/admin/include/functions_metadata.php

    r1029 r1064  
    225225SELECT id, path 
    226226  FROM '.IMAGES_TABLE.' 
    227   WHERE storage_category_id IN ('.implode(',', $cat_ids).')'; 
     227    INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON image_id = id 
     228  WHERE is_storage = \'true\' 
     229    AND category_id IN ('.implode(',', $cat_ids).')'; 
    228230  if ($only_new) 
    229231  { 
  • trunk/admin/maintenance.php

    r1004 r1064  
    4242  case 'categories' : 
    4343  { 
     44    check_links(); 
    4445    update_uppercats(); 
    4546    update_category('all'); 
  • trunk/admin/picture_modify.php

    r1004 r1064  
    172172SELECT * 
    173173  FROM '.IMAGES_TABLE.' 
     174    INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON image_id = id 
    174175  WHERE id = '.$_GET['image_id'].' 
     176    AND is_storage = \'true\' 
    175177;'; 
    176178$row = mysql_fetch_array(pwg_query($query)); 
    177179 
    178 $storage_category_id = $row['storage_category_id']; 
     180$storage_category_id = $row['category_id']; 
    179181 
    180182// Navigation path 
     
    342344    INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id = category_id 
    343345  WHERE image_id = '.$_GET['image_id'].' 
    344     AND id != '.$storage_category_id.' 
     346    AND is_storage = \'false\' 
    345347;'; 
    346348display_select_cat_wrapper($query, array(), 'associated_option'); 
  • trunk/admin/rating.php

    r1059 r1064  
    169169} 
    170170 
    171 $query = 'SELECT i.id, i.path, i.file, i.tn_ext, i.average_rate, i.storage_category_id, 
    172           MAX(r.date) as recently_rated, COUNT(r.rate) as nb_rates, 
    173           SUM(r.rate) as sum_rates, ROUND(STD(r.rate),2) as std_rates 
    174 FROM '.RATE_TABLE.' AS r LEFT JOIN '.IMAGES_TABLE.' AS i 
    175 ON r.element_id=i.id 
    176 WHERE 1=1 ' . $display_filter . ' 
    177 GROUP BY r.element_id 
    178 ORDER BY ' . $available_order_by[$order_by_index][1] .' 
    179 LIMIT '.$start.','.$elements_per_page . 
    180 ';'; 
     171$query = ' 
     172SELECT i.id, 
     173       i.path, 
     174       i.file, 
     175       i.tn_ext, 
     176       i.average_rate, 
     177       MAX(r.date)          AS recently_rated, 
     178       COUNT(r.rate)        AS nb_rates, 
     179       SUM(r.rate)          AS sum_rates, 
     180       ROUND(STD(r.rate),2) AS std_rates, 
     181       ic.category_id       AS storage_category_id 
     182  FROM '.RATE_TABLE.' AS r 
     183    LEFT JOIN '.IMAGES_TABLE.' AS i ON r.element_id = i.id 
     184    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON ic.image_id = i.id 
     185  WHERE 1 = 1 ' . $display_filter . ' 
     186    AND ic.is_storage = \'true\' 
     187  GROUP BY r.element_id 
     188  ORDER BY ' . $available_order_by[$order_by_index][1] .' 
     189  LIMIT '.$start.','.$elements_per_page.' 
     190;'; 
    181191 
    182192$images = array(); 
     
    189199foreach ($images as $image) 
    190200{ 
    191   $thumbnail_src = get_thumbnail_src( 
    192     $image['path'], $image['tn_ext'] 
    193     ); 
    194  
    195   $image_url = PHPWG_ROOT_PATH.'picture.php?'. 
    196                 'cat=' . $image['storage_category_id']. 
    197                 '&amp;image_id=' . $image['id']; 
     201  $thumbnail_src = get_thumbnail_src($image['path'], $image['tn_ext']); 
     202 
     203  $image_url = 
     204    PHPWG_ROOT_PATH.'picture.php?'. 
     205    'cat=' . $image['storage_category_id']. 
     206    '&amp;image_id=' . $image['id'] 
     207    ; 
    198208 
    199209  $query = 'SELECT * 
  • trunk/admin/site_reader_local.php

    r1058 r1064  
    4545{ 
    4646  global $errors; 
     47   
    4748  if (!is_dir($this->site_url)) 
    4849  { 
    49     array_push($errors, array('path' => $this->site_url, 'type' => 'PWG-ERROR-NO-FS')); 
     50    array_push( 
     51      $errors, 
     52      array( 
     53        'path' => $this->site_url, 
     54        'type' => 'PWG-ERROR-NO-FS' 
     55        ) 
     56      ); 
     57     
    5058    return false; 
    5159  } 
     60   
    5261  return true; 
    5362} 
     
    136145{ 
    137146  global $conf; 
    138   $update_fields = array( 'has_high', 'representative_ext', 
    139       'filesize', 'width', 'height' ); 
     147   
     148  $update_fields = array( 
     149    'has_high', 'representative_ext', 'filesize', 'width', 'height' 
     150    ); 
     151   
    140152  if ($conf['use_exif']) 
    141153  { 
     
    155167        ); 
    156168  } 
     169   
    157170  return $update_fields; 
    158171} 
     
    170183 
    171184  $filename = basename($file); 
    172   $data['has_high'] = $this->get_has_high( dirname($file), $filename ); 
    173   $data['representative_ext'] = $this->get_representative_ext( dirname($file), 
    174                                         get_filename_wo_extension($filename) ); 
     185   
     186  $data['has_high'] = $this->get_has_high(dirname($file), $filename); 
     187   
     188  $data['representative_ext'] = $this->get_representative_ext( 
     189    dirname($file), 
     190    get_filename_wo_extension($filename) 
     191    ); 
    175192 
    176193  $data['filesize'] = floor(filesize($file)/1024); 
     
    205222    } 
    206223  } 
     224   
    207225  return $data; 
    208226} 
     
    213231{ 
    214232  global $conf; 
    215   $base_test = $path.'/pwg_representative/'; 
    216   $base_test.= $filename_wo_ext.'.'; 
     233  $base_test = $path.'/pwg_representative/'.$filename_wo_ext.'.'; 
    217234  foreach ($conf['picture_ext'] as $ext) 
    218235  { 
     
    229246{ 
    230247  global $conf; 
    231   $base_test = $path.'/thumbnail/'; 
    232   $base_test.= $conf['prefix_thumbnail'].$filename_wo_ext.'.'; 
     248   
     249  $base_test = 
     250    $path.'/thumbnail/'.$conf['prefix_thumbnail'].$filename_wo_ext.'.'; 
     251   
    233252  foreach ($conf['picture_ext'] as $ext) 
    234253  { 
     
    239258    } 
    240259  } 
     260   
    241261  return null; 
    242262} 
     
    248268    return 'true'; 
    249269  } 
     270   
    250271  return null; 
    251272} 
  • trunk/admin/site_reader_remote.php

    r1058 r1064  
    4040{ 
    4141  $this->site_url = $url; 
    42   $this->insert_attributes = array('tn_ext', 'representative_ext', 'has_high'); 
    43   $this->update_attributes = array( 'representative_ext', 'has_high', 'filesize', 'width', 'height' ); 
     42  $this->insert_attributes = array( 
     43    'tn_ext', 'representative_ext', 'has_high' 
     44    ); 
     45  $this->update_attributes = array( 
     46    'representative_ext', 'has_high', 'filesize', 'width', 'height' 
     47    ); 
    4448} 
    4549 
     
    5256{ 
    5357  global $errors; 
     58   
    5459  $listing_file = $this->site_url.'/listing.xml'; 
    5560  if (@fopen($listing_file, 'r')) 
     
    5964    $xml_content = getXmlCode($listing_file); 
    6065    $info_xml_element = getChild($xml_content, 'informations'); 
    61     if ( getAttribute($info_xml_element , 'phpwg_version') != PHPWG_VERSION ) 
    62     { 
    63       array_push($errors, array('path' => $listing_file, 'type' => 'PWG-ERROR-VERSION')); 
     66    if (getAttribute($info_xml_element , 'phpwg_version') != PHPWG_VERSION) 
     67    { 
     68      array_push( 
     69        $errors, 
     70        array( 
     71          'path' => $listing_file, 
     72          'type' => 'PWG-ERROR-VERSION' 
     73          ) 
     74        ); 
     75       
    6476      return false; 
    6577    } 
    66     $meta_attributes = explode ( ',', 
    67         getAttribute($info_xml_element , 'metadata') ); 
    68     $this->update_attributes = array_merge( $this->update_attributes, $meta_attributes ); 
     78 
     79    $this->update_attributes = array_merge( 
     80      $this->update_attributes, 
     81      explode(',', getAttribute($info_xml_element, 'metadata')) 
     82      ); 
     83     
    6984    $this->build_structure($xml_content, '', 0); 
     85     
    7086    return true; 
    7187  } 
    7288  else 
    7389  { 
    74     array_push($errors, array('path' => $listing_file, 'type' => 'PWG-ERROR-NOLISTING')); 
     90    array_push( 
     91      $errors, 
     92      array( 
     93        'path' => $listing_file, 
     94        'type' => 'PWG-ERROR-NOLISTING' 
     95        ) 
     96      ); 
     97 
    7598    return false; 
    7699  } 
     
    84107  { 
    85108    $full_dir = $this->site_url . $dir; 
    86     if ( $full_dir!=$basedir 
    87       and strpos($full_dir, $basedir)===0 
     109    if ($full_dir != $basedir 
     110        and strpos($full_dir, $basedir) === 0 
    88111      ) 
    89112    { 
     
    106129  { 
    107130    $full_dir = $this->site_url . $dir; 
    108     if ( strpos($full_dir, $path)===0 ) 
    109     { 
    110       foreach ( $files as $file) 
     131    if (strpos($full_dir, $path) === 0) 
     132    { 
     133      foreach ($files as $file) 
    111134      { 
    112         $data = $this->get_element_attributes($file, 
    113                                               $this->insert_attributes); 
     135        $data = $this->get_element_attributes( 
     136          $file, 
     137          $this->insert_attributes 
     138          ); 
    114139        $elements[$file] = $data; 
    115140      } 
     
    130155function get_element_update_attributes($file) 
    131156{ 
    132     return $this->get_element_attributes($file, 
    133                                          $this->update_attributes); 
     157  return $this->get_element_attributes( 
     158    $file, 
     159    $this->update_attributes 
     160    ); 
    134161} 
    135162 
     
    144171{ 
    145172  $xml_element = $this->site_files[$file]; 
    146   if ( ! isset($xml_element) ) 
     173  if (!isset($xml_element)) 
    147174  { 
    148175    return null; 
     
    178205  if ($basedir != '') 
    179206  { 
    180     $xml_elements = getChildren( getChild($xml_content, 'root'), 'element' ); 
     207    $xml_elements = getChildren( 
     208      getChild($xml_content, 'root'), 
     209      'element' 
     210      ); 
    181211    foreach ($xml_elements as $xml_element) 
    182212    { 
    183213      $path = getAttribute($xml_element, 'path'); 
    184214      $this->site_files[$path] = $xml_element; 
    185       array_push( $this->site_dirs[$basedir], $path); 
     215      array_push($this->site_dirs[$basedir], $path); 
    186216    } 
    187217  } 
  • trunk/admin/site_update.php

    r1058 r1064  
    2828if (!defined('PHPWG_ROOT_PATH')) 
    2929{ 
    30   die ('Hacking attempt!'); 
     30  die('Hacking attempt!'); 
    3131} 
    3232include_once( PHPWG_ROOT_PATH.'admin/include/isadmin.inc.php'); 
    3333 
    34 if (! is_numeric($_GET['site']) ) 
     34if (!is_numeric($_GET['site'])) 
    3535{ 
    3636  die ('site param missing or invalid'); 
    3737} 
    3838$site_id = $_GET['site']; 
    39 $query='SELECT galleries_url FROM '.SITES_TABLE.' 
    40 WHERE id='.$site_id.' 
    41 ;'; 
    42 list($site_url)=mysql_fetch_row(pwg_query($query)); 
    43 if (! isset($site_url) ) 
    44 { 
    45   die ("site $site_id does not exist"); 
     39 
     40$query=' 
     41SELECT galleries_url 
     42  FROM '.SITES_TABLE.' 
     43  WHERE id = '.$site_id.' 
     44;'; 
     45list($site_url) = mysql_fetch_row(pwg_query($query)); 
     46if (!isset($site_url)) 
     47{ 
     48  die('site '.$site_id.' does not exist'); 
    4649} 
    4750$site_is_remote = url_is_remote($site_url); 
     
    5154 
    5255$error_labels = array( 
    53   'PWG-UPDATE-1' => array( l10n('update_wrong_dirname_short'), 
    54                            l10n('update_wrong_dirname_info') ), 
    55   'PWG-UPDATE-2' => array( l10n('update_missing_tn_short'), 
    56                            l10n('update_missing_tn_info') 
    57                            . implode(',', $conf['picture_ext']) ), 
    58   'PWG-ERROR-NO-FS' => array( l10n('update_missing_file_or_dir'), 
    59                              l10n('update_missing_file_or_dir_info')), 
    60   'PWG-ERROR-VERSION' => array( l10n('update_err_pwg_version_differs'), 
    61                              l10n('update_err_pwg_version_differs_info')), 
    62   'PWG-ERROR-NOLISTING' => array( l10n('update_err_remote_listing_not_found'), 
    63                              l10n('update_err_remote_listing_not_found_info')) 
    64                       ); 
     56  'PWG-UPDATE-1' => array( 
     57    l10n('update_wrong_dirname_short'), 
     58    l10n('update_wrong_dirname_info') 
     59    ), 
     60  'PWG-UPDATE-2' => array( 
     61    l10n('update_missing_tn_short'), 
     62    l10n('update_missing_tn_info').implode(',', $conf['picture_ext']) 
     63    ), 
     64  'PWG-ERROR-NO-FS' => array( 
     65    l10n('update_missing_file_or_dir'), 
     66    l10n('update_missing_file_or_dir_info') 
     67    ), 
     68  'PWG-ERROR-VERSION' => array( 
     69    l10n('update_err_pwg_version_differs'), 
     70    l10n('update_err_pwg_version_differs_info') 
     71    ), 
     72  'PWG-ERROR-NOLISTING' => array( 
     73    l10n('update_err_remote_listing_not_found'), 
     74    l10n('update_err_remote_listing_not_found_info') 
     75    ) 
     76  ); 
    6577$errors = array(); 
    6678$infos = array(); 
     
    6880if ($site_is_remote) 
    6981{ 
    70   include_once( PHPWG_ROOT_PATH.'admin/site_reader_remote.php'); 
     82  include_once(PHPWG_ROOT_PATH.'admin/site_reader_remote.php'); 
    7183  $site_reader = new RemoteSiteReader($site_url); 
    7284} 
     
    7789} 
    7890 
    79 $general_failure=true; 
     91$general_failure = true; 
    8092if (isset($_POST['submit'])) 
    8193{ 
     
    214226    if (preg_match('/^[a-zA-Z0-9-_.]+$/', $dir)) 
    215227    { 
    216       $insert = array(); 
    217  
    218       $insert{'id'} = $next_id++; 
    219       $insert{'dir'} = $dir; 
    220       $insert{'name'} = str_replace('_', ' ', $dir); 
    221       $insert{'site_id'} = $site_id; 
    222       $insert{'commentable'} = $conf['newcat_default_commentable']; 
    223       if (! $site_is_remote) 
    224       { 
    225         $insert{'uploadable'} = $conf['newcat_default_uploadable']; 
    226       } 
    227       else 
    228       { 
    229         $insert{'uploadable'} = 'false'; 
    230       } 
    231       $insert{'status'} = $conf{'newcat_default_status'}; 
    232       $insert{'visible'} = $conf{'newcat_default_visible'}; 
     228      $insert = array( 
     229        'id'          => $next_id++, 
     230        'dir'         => $dir, 
     231        'name'        => str_replace('_', ' ', $dir), 
     232        'site_id'     => $site_id, 
     233        'commentable' => $conf['newcat_default_commentable'], 
     234        'uploadable'  => $site_is_remote 
     235          ? false 
     236          : $conf['newcat_default_uploadable'], 
     237        'status'      => $conf{'newcat_default_status'}, 
     238        'visible'     => $conf{'newcat_default_visible'}, 
     239        ); 
    233240 
    234241      if (isset($db_fulldirs[dirname($fulldir)])) 
     
    259266 
    260267      array_push($inserts, $insert); 
    261       array_push($infos, array('path' => $fulldir, 
    262                                'info' => l10n('update_research_added'))); 
     268      array_push( 
     269        $infos, 
     270        array( 
     271          'path' => $fulldir, 
     272          'info' => l10n('update_research_added') 
     273          ) 
     274        ); 
    263275 
    264276      // add the new category to $db_categories and $db_fulldirs array 
     
    276288    else 
    277289    { 
    278       array_push($errors, array('path' => $fulldir, 'type' => 'PWG-UPDATE-1')); 
     290      array_push( 
     291        $errors, 
     292        array( 
     293          'path' => $fulldir, 
     294          'type' => 'PWG-UPDATE-1' 
     295          ) 
     296        ); 
    279297    } 
    280298  } 
     
    339357SELECT id, path 
    340358  FROM '.IMAGES_TABLE.' 
    341   WHERE storage_category_id IN ( 
    342 '.wordwrap(implode(', ', $cat_ids), 80, "\n").') 
     359    INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON image_id = id 
     360  WHERE is_storage = \'true\' 
     361    AND category_id IN ('. 
     362      wordwrap( 
     363        implode(', ', $cat_ids), 
     364        80, 
     365        "\n" 
     366        ). 
     367      ') 
    343368;'; 
    344369    $result = pwg_query($query); 
     
    362387      array_push( 
    363388        $db_unvalidated, 
    364         array_search($row['storage_category_id'], 
    365                      $db_fulldirs).'/'.$row['file'] 
     389        array_search( 
     390          $row['storage_category_id'], 
     391          $db_fulldirs) 
     392        .'/'.$row['file'] 
    366393        ); 
    367394    } 
     
    392419    if (!preg_match('/^[a-zA-Z0-9-_.]+$/', $filename)) 
    393420    { 
    394       array_push($errors, array('path' => $path, 'type' => 'PWG-UPDATE-1')); 
     421      array_push( 
     422        $errors, 
     423        array( 
     424          'path' => $path, 
     425          'type' => 'PWG-UPDATE-1' 
     426          ) 
     427        ); 
     428       
    395429      continue; 
    396430    } 
     
    402436    { 
    403437      // if we found a thumnbnail corresponding to our picture... 
    404       if ( isset($fs[$path]['tn_ext']) ) 
     438      if (isset($fs[$path]['tn_ext'])) 
    405439      { 
    406         $insert{'id'} = $next_element_id++; 
    407         $insert{'file'} = $filename; 
    408         $insert{'storage_category_id'} = $db_fulldirs[$dirname]; 
    409         $insert{'date_available'} = CURRENT_DATE; 
    410         $insert{'tn_ext'} = $fs[$path]['tn_ext']; 
    411         if ( isset($fs[$path]['has_high']) ) 
    412         { 
    413           $insert{'has_high'} = $fs[$path]['has_high']; 
    414         } 
    415         else 
    416         { 
    417           $insert{'has_high'} = null; 
    418         } 
    419         $insert{'path'} = $path; 
    420  
    421         array_push($inserts, $insert); 
    422         array_push($insert_links, 
    423                    array('image_id' => $insert{'id'}, 
    424                          'category_id' => $insert{'storage_category_id'})); 
    425         array_push($infos, array('path' => $insert{'path'}, 
    426                                  'info' => l10n('update_research_added'))); 
     440        $insert = array( 
     441          'id'             => $next_element_id++, 
     442          'file'           => $filename, 
     443          'date_available' => CURRENT_DATE, 
     444          'tn_ext'         => $fs[$path]['tn_ext'], 
     445          'has_high'       => isset($fs[$path]['has_high']) 
     446            ? $fs[$path]['has_high'] 
     447            : null, 
     448          'path'           => $path, 
     449          ); 
     450         
     451        array_push( 
     452          $inserts, 
     453          $insert 
     454          ); 
     455         
     456        array_push( 
     457          $insert_links, 
     458          array( 
     459            'image_id'    => $insert{'id'}, 
     460            'category_id' => $db_fulldirs[$dirname], 
     461            'is_storage'  => 'true', 
     462            ) 
     463          ); 
     464        array_push( 
     465          $infos, 
     466          array( 
     467            'path' => $insert{'path'}, 
     468            'info' => l10n('update_research_added') 
     469            ) 
     470          ); 
    427471      } 
    428472      else 
    429473      { 
    430         array_push($errors, array('path' => $path, 'type' => 'PWG-UPDATE-2')); 
     474        array_push( 
     475          $errors, 
     476          array( 
     477            'path' => $path, 
     478            'type' => 'PWG-UPDATE-2' 
     479            ) 
     480          ); 
    431481      } 
    432482    } 
    433483    else 
    434484    { 
    435       $insert{'id'} = $next_element_id++; 
    436       $insert{'file'} = $filename; 
    437       $insert{'storage_category_id'} = $db_fulldirs[$dirname]; 
    438       $insert{'date_available'} = CURRENT_DATE; 
    439       $insert{'has_high'} = $fs[$path]['has_high']; 
    440       if ( isset($fs[$path]['has_high']) ) 
    441       { 
    442         $insert{'has_high'} = $fs[$path]['has_high']; 
    443       } 
    444       else 
    445       { 
    446         $insert{'has_high'} = null; 
    447       } 
    448       $insert{'path'} = $path; 
    449  
    450       if ( isset($fs[$path]['tn_ext']) ) 
    451       { 
    452         $insert{'tn_ext'} = $fs[$path]['tn_ext']; 
    453       } 
    454       if (isset($fs[$path]['representative_ext'])) 
    455       { 
    456         $insert{'representative_ext'} = $fs[$path]['representative_ext']; 
    457       } 
    458  
    459       array_push($inserts, $insert); 
    460       array_push($insert_links, 
    461                  array('image_id' => $insert{'id'}, 
    462                        'category_id' => $insert{'storage_category_id'})); 
    463       array_push($infos, array('path' => $insert{'path'}, 
    464                                'info' => l10n('update_research_added'))); 
     485      $insert = array( 
     486        'id'             => $next_element_id++, 
     487        'file'           => $filename, 
     488        'date_available' => CURRENT_DATE, 
     489        'path'           => $path, 
     490        'has_high'       => isset($fs[$path]['has_high']) 
     491          ? $fs[$path]['has_high'] 
     492          : null, 
     493        'tn_ext'         => isset($fs[$path]['tn_ext']) 
     494          ? $fs[$path]['tn_ext'] 
     495          : null, 
     496        'representative_ext' => isset($fs[$path]['representative_ext']) 
     497          ? $fs[$path]['representative_ext'] 
     498          : null, 
     499        ); 
     500 
     501      array_push( 
     502        $inserts, 
     503        $insert 
     504        ); 
     505 
     506      array_push( 
     507        $insert_links, 
     508        array( 
     509          'image_id'    => $insert{'id'}, 
     510          'category_id' => $db_fulldirs[$dirname], 
     511          'is_storage'  => 'true', 
     512          ) 
     513        ); 
     514 
     515      array_push( 
     516        $infos, 
     517        array( 
     518          'path' => $insert{'path'}, 
     519          'info' => l10n('update_research_added') 
     520          ) 
     521        ); 
    465522    } 
    466523  } 
     
    471528    { 
    472529      // inserts all new elements 
    473       $dbfields = array( 
    474         'id','file','storage_category_id','date_available','tn_ext' 
    475         ,'representative_ext', 'has_high', 'path' 
    476         ); 
    477       mass_inserts(IMAGES_TABLE, $dbfields, $inserts); 
    478  
    479       // insert all links between new elements and their storage category 
    480       $dbfields = array('image_id','category_id'); 
    481       mass_inserts(IMAGE_CATEGORY_TABLE, $dbfields, $insert_links); 
     530      mass_inserts( 
     531        IMAGES_TABLE, 
     532        array( 
     533          'id', 'file', 'date_available', 'tn_ext', 'representative_ext', 
     534          'has_high', 'path', 
     535          ), 
     536        $inserts 
     537        ); 
     538 
     539      // inserts all links between new elements and their storage category 
     540      mass_inserts( 
     541        IMAGE_CATEGORY_TABLE, 
     542        array( 
     543          'image_id','category_id', 'is_storage', 
     544          ), 
     545        $insert_links 
     546        ); 
    482547    } 
    483548    $counts['new_elements'] = count($inserts); 
     
    533598SELECT id 
    534599  FROM '.IMAGES_TABLE.' 
    535   WHERE storage_category_id = \''.$row['storage_category_id'].'\' 
     600    INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON image_id = id 
     601  WHERE is_storage = \'true\' 
     602    AND category_id = '.$row['storage_category_id'].' 
    536603    AND file = \''.$row['file'].'\' 
    537604;'; 
     
    580647  if (!$simulate) 
    581648  { 
     649    $start = get_moment(); 
     650    check_links('all'); 
     651    echo '<!-- check_links(all) : '; 
     652    echo get_elapsed_time($start,get_moment()); 
     653    echo ' -->'."\n"; 
    582654    $start = get_moment(); 
    583655    update_category('all'); 
  • trunk/include/constants.php

    r1028 r1064  
    6363define('SEARCH_TABLE', $prefixeTable.'search'); 
    6464define('USER_MAIL_NOTIFICATION_TABLE', $prefixeTable.'user_mail_notification'); 
    65  
     65define('CATEGORIES_LINK_TABLE', $prefixeTable.'categories_link'); 
    6666?> 
  • trunk/install/phpwebgallery_structure.sql

    r1041 r1064  
    1 -- MySQL dump 10.9 
    2 -- 
    3 -- Host: localhost    Database: pwg_dev_bsf 
     1-- MySQL dump 9.11 
     2-- 
     3-- Host: localhost    Database: pwg-bsf 
    44-- ------------------------------------------------------ 
    5 -- Server version       4.1.15-nt 
     5-- Server version       4.0.24_Debian-10-log 
    66 
    77-- 
     
    4343 
    4444-- 
     45-- Table structure for table `phpwebgallery_categories_link` 
     46-- 
     47 
     48DROP TABLE IF EXISTS `phpwebgallery_categories_link`; 
     49CREATE TABLE `phpwebgallery_categories_link` ( 
     50  `source` smallint(5) unsigned NOT NULL default '0', 
     51  `destination` smallint(5) unsigned NOT NULL default '0', 
     52  PRIMARY KEY  (`source`,`destination`) 
     53) TYPE=MyISAM; 
     54 
     55-- 
    4556-- Table structure for table `phpwebgallery_comments` 
    4657-- 
     
    128139  `image_id` mediumint(8) unsigned NOT NULL default '0', 
    129140  `category_id` smallint(5) unsigned NOT NULL default '0', 
     141  `is_storage` enum('true','false') default 'false', 
    130142  PRIMARY KEY  (`image_id`,`category_id`), 
    131143  KEY `image_category_i1` (`image_id`), 
     
    296308 
    297309-- 
     310-- Table structure for table `phpwebgallery_user_mail_notification` 
     311-- 
     312 
     313DROP TABLE IF EXISTS `phpwebgallery_user_mail_notification`; 
     314CREATE TABLE `phpwebgallery_user_mail_notification` ( 
     315  `user_id` smallint(5) NOT NULL default '0', 
     316  `check_key` varchar(128) binary NOT NULL default '', 
     317  `enabled` enum('true','false') NOT NULL default 'false', 
     318  `last_send` datetime default NULL, 
     319  PRIMARY KEY  (`user_id`), 
     320  UNIQUE KEY `uidx_check_key` (`check_key`) 
     321) TYPE=MyISAM; 
     322 
     323-- 
    298324-- Table structure for table `phpwebgallery_users` 
    299325-- 
     
    327353) TYPE=MyISAM; 
    328354 
    329 -- 
    330 -- Table structure for table `phpwebgallery_user_mail_notification` 
    331 -- 
    332  
    333 DROP TABLE IF EXISTS `phpwebgallery_user_mail_notification`; 
    334 CREATE TABLE `phpwebgallery_user_mail_notification` 
    335 ( 
    336   `user_id` smallint(5) NOT NULL default '0', 
    337   `check_key` varchar(128) binary NOT NULL, 
    338   `enabled` enum('true','false') NOT NULL default 'false', 
    339   `last_send` datetime default NULL, 
    340   PRIMARY KEY  (`user_id`), 
    341   UNIQUE KEY `uidx_check_key` (`check_key`) 
    342 ) TYPE=MyISAM; 
  • trunk/template/yoga/admin/cat_list.tpl

    r1045 r1064  
    4646  <p> 
    4747    {L_ADD_VIRTUAL} : <input type="text" name="virtual_name" /> 
    48     <input type="hidden" name="rank" value="{NEXT_RANK}"/> 
    4948    <input type="submit" value="{L_SUBMIT}" name="submitAdd" /> 
    5049  </p> 
  • trunk/template/yoga/admin/cat_modify.tpl

    r1045 r1064  
    137137 
    138138</form> 
     139 
     140<form action="{F_ACTION}" method="POST" id="links"> 
     141   
     142<fieldset> 
     143  <legend>{lang:Create a destination category}</legend> 
     144 
     145  <table> 
     146    <tr> 
     147      <td>{lang:virtual category name}</td> 
     148      <td><input type="text" name="virtual_name"></td> 
     149    </tr> 
     150 
     151    <tr> 
     152      <td>{lang:parent category}</td> 
     153      <td> 
     154        <select class="categoryList" name="parent"> 
     155          <!-- BEGIN category_option_parent --> 
     156          <option {category_option_parent.SELECTED} value="{category_option_parent.VALUE}">{category_option_parent.OPTION}</option> 
     157          <!-- END category_option_parent --> 
     158        </select> 
     159      </td> 
     160    </tr> 
     161  </table> 
     162 
     163  <p style="text-align:center;"> 
     164    <input type="submit" value="{lang:Submit}" name="submitAdd" /> 
     165    <input type="reset" value="{lang:Reset}" name="reset" /> 
     166  </p>   
     167 
     168</fieldset> 
     169 
     170<fieldset> 
     171  <legend>{lang:Source/destination links}</legend> 
     172 
     173  <table class="doubleSelect"> 
     174    <tr> 
     175      <td> 
     176        <h3>{lang:Destination categories}</h3> 
     177        <select class="categoryList" name="destination_true[]" multiple="multiple" size="30"> 
     178          <!-- BEGIN destination_option_true --> 
     179          <option {destination_option_true.SELECTED} value="{destination_option_true.VALUE}">{destination_option_true.OPTION}</option> 
     180          <!-- END destination_option_true --> 
     181        </select> 
     182        <p><input type="submit" value="&raquo;" name="destination_falsify" style="font-size:15px;"/></p> 
     183      </td> 
     184 
     185      <td> 
     186        <h3>{lang:Non destination categories}</h3> 
     187        <select class="categoryList" name="destination_false[]" multiple="multiple" size="30"> 
     188          <!-- BEGIN destination_option_false --> 
     189          <option {destination_option_false.SELECTED} value="{destination_option_false.VALUE}">{destination_option_false.OPTION}</option> 
     190          <!-- END destination_option_false --> 
     191        </select> 
     192        <p><input type="submit" value="&laquo;" name="destination_trueify" style="font-size:15px;" /></p> 
     193      </td> 
     194    </tr> 
     195  </table> 
     196 
     197  <table class="doubleSelect"> 
     198    <tr> 
     199      <td> 
     200        <h3>{lang:Source categories}</h3> 
     201        <select class="categoryList" name="source_true[]" multiple="multiple" size="30"> 
     202          <!-- BEGIN source_option_true --> 
     203          <option {source_option_true.SELECTED} value="{source_option_true.VALUE}">{source_option_true.OPTION}</option> 
     204          <!-- END source_option_true --> 
     205        </select> 
     206        <p><input type="submit" value="&raquo;" name="source_falsify" style="font-size:15px;"/></p> 
     207      </td> 
     208 
     209      <td> 
     210        <h3>{lang:Non source categories}</h3> 
     211        <select class="categoryList" name="source_false[]" multiple="multiple" size="30"> 
     212          <!-- BEGIN source_option_false --> 
     213          <option {source_option_false.SELECTED} value="{source_option_false.VALUE}">{source_option_false.OPTION}</option> 
     214          <!-- END source_option_false --> 
     215        </select> 
     216        <p><input type="submit" value="&laquo;" name="source_trueify" style="font-size:15px;" /></p> 
     217      </td> 
     218    </tr> 
     219  </table> 
     220   
     221</fieldset> 
     222</form> 
Note: See TracChangeset for help on using the changeset viewer.