- Timestamp:
- Jan 17, 2011, 10:16:42 PM (14 years ago)
- Location:
- trunk/include
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/functions_search.inc.php
r8611 r8726 232 232 $query .= "\n AND ".$images_where; 233 233 } 234 if (empty($tag_items) or $search['mode']=='AND') 235 { // directly use forbidden and order by 236 $query .= $forbidden.' 234 $query .= $forbidden.' 237 235 '.$conf['order_by']; 238 }239 236 $items = array_from_query($query, 'id'); 240 237 } … … 242 239 if ( !empty($tag_items) ) 243 240 { 244 $need_permission_check = false;245 241 switch ($search['mode']) 246 242 { … … 248 244 if (empty($search_clause)) 249 245 { 250 $need_permission_check = true;251 246 $items = $tag_items; 252 247 } … … 264 259 ) 265 260 ); 266 if ( $before_count < count($items) )267 {268 $need_permission_check = true;269 }270 261 break; 271 }272 if ($need_permission_check and count($items) )273 {274 $query = '275 SELECT DISTINCT(id)276 FROM '.IMAGES_TABLE.' i277 INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id278 WHERE id IN ('.implode(',', $items).') '.$forbidden;279 if (!empty($images_where))280 {281 $query .= "\n AND ".$images_where;282 }283 $query .= '284 '.$conf['order_by'];285 $items = array_from_query($query, 'id');286 262 } 287 263 } -
trunk/include/functions_tag.inc.php
r6652 r8726 161 161 * @param array tag ids 162 162 * @param string mode 163 * @return array 164 */ 165 function get_image_ids_for_tags($tag_ids, $mode = 'AND') 166 { 167 switch ($mode) 168 { 169 case 'AND': 170 { 171 // strategy is to list images associated to each tag 172 $tag_images = array(); 173 174 foreach ($tag_ids as $tag_id) 175 { 176 $query = ' 177 SELECT image_id 178 FROM '.IMAGE_TAG_TABLE.' 179 WHERE tag_id = '.$tag_id.' 180 ;'; 181 $tag_images[$tag_id] = array_from_query($query, 'image_id'); 182 } 183 184 // then we calculate the intersection, the images that are associated to 185 // every tags 186 $items = array_shift($tag_images); 187 foreach ($tag_images as $images) 188 { 189 $items = array_intersect($items, $images); 190 } 191 return $items; 192 break; 193 } 194 case 'OR': 195 { 196 $query = ' 197 SELECT DISTINCT image_id 198 FROM '.IMAGE_TAG_TABLE.' 199 WHERE tag_id IN ('.implode(',', $tag_ids).') 200 ;'; 201 return array_from_query($query, 'image_id'); 202 break; 203 } 204 default: 205 { 206 die('get_image_ids_for_tags: unknown mode, only AND & OR are supported'); 207 } 208 } 163 * @param string extra_images_where_sql - optionally apply a sql where filter to retrieved images 164 * @param string order_by - optionally overwrite default photo order 165 * @return array 166 */ 167 function get_image_ids_for_tags($tag_ids, $mode='AND', $extra_images_where_sql='', $order_by='') 168 { 169 global $conf; 170 if (empty($tag_ids)) 171 { 172 return array(); 173 } 174 175 $query = 'SELECT id 176 FROM '.IMAGES_TABLE.' i 177 INNER JOIN '.IMAGE_CATEGORY_TABLE.' ic ON id=ic.image_id 178 INNER JOIN '.IMAGE_TAG_TABLE.' it ON id=it.image_id 179 WHERE tag_id IN ('.implode(',', $tag_ids).')' 180 .get_sql_condition_FandF 181 ( 182 array 183 ( 184 'forbidden_categories' => 'category_id', 185 'visible_categories' => 'category_id', 186 'visible_images' => 'id' 187 ), 188 "\n AND" 189 ) 190 .(empty($extra_images_where_sql) ? '' : " \nAND (".$extra_images_where_sql.')') 191 .' 192 GROUP BY id'; 193 194 if ($mode=='AND' and count($tag_ids)>1) 195 { 196 $query .= ' 197 HAVING COUNT(DISTINCT tag_id)='.count($tag_ids); 198 } 199 $query .= "\n".(empty($order_by) ? $conf['order_by'] : $order_by); 200 201 return array_from_query($query, 'id'); 209 202 } 210 203 -
trunk/include/section_init.inc.php
r8665 r8726 322 322 $items = get_image_ids_for_tags($page['tag_ids']); 323 323 324 // permissions depends on category, so to only keep images that are325 // reachable to the connected user, we need to check category326 // associations327 if (!empty($items) )328 {329 $query = '330 SELECT DISTINCT image_id331 FROM '.IMAGE_CATEGORY_TABLE.' INNER JOIN '.IMAGES_TABLE.' ON image_id=id332 WHERE image_id IN ('.implode(',', $items).')333 '.$forbidden.334 $conf['order_by'].'335 ;';336 $items = array_from_query($query, 'image_id');337 }338 339 324 $page = array_merge( 340 325 $page, -
trunk/include/ws_functions.inc.php
r8464 r8726 1559 1559 1560 1560 1561 $image_ids = array(); 1561 $where_clauses = ws_std_image_sql_filter($params); 1562 if (!empty($where_clauses)) 1563 { 1564 $where_clauses = implode( ' AND ', $where_clauses); 1565 } 1566 $image_ids = get_image_ids_for_tags( 1567 $tag_ids, 1568 $params['tag_mode_and'] ? 'AND' : 'OR', 1569 $where_clauses, 1570 ws_std_image_sql_order($params) ); 1571 1572 1573 $image_ids = array_slice($image_ids, (int)($params['per_page']*$params['page']), (int)$params['per_page'] ); 1574 1562 1575 $image_tag_map = array(); 1563 1564 if ( !empty($tag_ids) ) 1576 if ( !empty($image_ids) and !$params['tag_mode_and'] ) 1565 1577 { // build list of image ids with associated tags per image 1566 if ($params['tag_mode_and']) 1567 { 1568 $image_ids = get_image_ids_for_tags( $tag_ids ); 1569 } 1570 else 1571 { 1572 $query = ' 1578 $query = ' 1573 1579 SELECT image_id, GROUP_CONCAT(tag_id) AS tag_ids 1574 1580 FROM '.IMAGE_TAG_TABLE.' 1575 WHERE tag_id IN ('.implode(',',$tag_ids).') 1581 WHERE tag_id IN ('.implode(',',$tag_ids).') AND image_id IN ('.implode(',',$image_ids).') 1576 1582 GROUP BY image_id'; 1577 $result = pwg_query($query); 1578 while ( $row=pwg_db_fetch_assoc($result) ) 1579 { 1580 $row['image_id'] = (int)$row['image_id']; 1581 array_push( $image_ids, $row['image_id'] ); 1582 $image_tag_map[ $row['image_id'] ] = explode(',', $row['tag_ids']); 1583 } 1583 $result = pwg_query($query); 1584 while ( $row=pwg_db_fetch_assoc($result) ) 1585 { 1586 $row['image_id'] = (int)$row['image_id']; 1587 array_push( $image_ids, $row['image_id'] ); 1588 $image_tag_map[ $row['image_id'] ] = explode(',', $row['tag_ids']); 1584 1589 } 1585 1590 } 1586 1591 1587 1592 $images = array(); 1588 if ( !empty($image_ids)) 1589 { 1590 $where_clauses = ws_std_image_sql_filter($params); 1591 $where_clauses[] = get_sql_condition_FandF( 1592 array 1593 ( 1594 'forbidden_categories' => 'category_id', 1595 'visible_categories' => 'category_id', 1596 'visible_images' => 'i.id' 1597 ), 1598 '', true 1599 ); 1600 $where_clauses[] = 'id IN ('.implode(',',$image_ids).')'; 1601 1602 $order_by = ws_std_image_sql_order($params); 1603 if (empty($order_by)) 1604 { 1605 $order_by = $conf['order_by']; 1606 } 1607 else 1608 { 1609 $order_by = 'ORDER BY '.$order_by; 1610 } 1611 1612 $query = ' 1613 SELECT DISTINCT i.* FROM '.IMAGES_TABLE.' i 1614 INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON i.id=image_id 1615 WHERE '. implode(' 1616 AND ', $where_clauses).' 1617 '.$order_by.' 1618 LIMIT '.(int)$params['per_page'].' OFFSET '.(int)($params['per_page']*$params['page']); 1619 1620 $result = pwg_query($query); 1593 if (!empty($image_ids)) 1594 { 1595 $rank_of = array_flip($image_ids); 1596 $result = pwg_query(' 1597 SELECT * FROM '.IMAGES_TABLE.' 1598 WHERE id IN ('.implode(',',$image_ids).')'); 1621 1599 while ($row = pwg_db_fetch_assoc($result)) 1622 1600 { 1623 1601 $image = array(); 1602 $image['rank'] = $rank_of[ $row['id'] ]; 1624 1603 foreach ( array('id', 'width', 'height', 'hit') as $k ) 1625 1604 { … … 1665 1644 array_push($images, $image); 1666 1645 } 1646 usort($images, 'rank_compare'); 1647 unset($rank_of); 1667 1648 } 1668 1649 … … 2545 2526 global $template; 2546 2527 2547 if (!is_admin() || is_adviser())2528 if (!is_admin()) 2548 2529 { 2549 2530 return new PwgError(401, 'Access denied');
Note: See TracChangeset
for help on using the changeset viewer.