Changeset 1739 for sites/trunk/translate.wordpress.org/includes/gp-plugins/wporg-routes/routes/locale.php
- Timestamp:
- 07/14/2015 05:42:00 AM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sites/trunk/translate.wordpress.org/includes/gp-plugins/wporg-routes/routes/locale.php
r1734 r1739 15 15 */ 16 16 public function get_locale_projects( $locale_slug, $set_slug = 'default', $project_path = 'wp' ) { 17 global $gpdb; 18 19 $per_page = 20; 20 $page = (int) gp_get( 'page', 1 ); 21 $search = gp_get( 's', '' ); 22 17 23 $locale = GP_Locales::by_slug( $locale_slug ); 18 24 if ( ! $locale ) { … … 25 31 } 26 32 27 $sub_projects = $this->get_active_sub_projects( $project ); 28 if ( ! $sub_projects ) { 29 return $this->die_with_404(); 30 } 31 32 usort( $sub_projects, array( $this, '_sort_name_callback' ) ); 33 $paged_sub_projects = $this->get_paged_active_sub_projects( 34 $project, 35 array( 36 'page' => $page, 37 'per_page' => $per_page, 38 'orderby' => 'name', 39 'search' => $search, 40 'set_slug' => $set_slug, 41 'locale' => $locale_slug, 42 ) 43 ); 44 45 if ( ! $paged_sub_projects ) { 46 return $this->die_with_404(); 47 } 48 49 $sub_projects = $paged_sub_projects['projects']; 50 $pages = $paged_sub_projects['pages']; 51 unset( $paged_sub_projects ); 33 52 34 53 $project_status = $project_icons = array(); 35 54 foreach ( $sub_projects as $key => $sub_project ) { 36 $status = $this->get_project_status( $sub_project, $locale_slug, $set_slug ); 37 if ( ! $status->all_count ) { 38 unset( $sub_projects[ $key ] ); 39 } 40 41 $project_status[ $sub_project->id ] = $status; 55 $project_status[ $sub_project->id ] = $this->get_project_status( $sub_project, $locale_slug, $set_slug ); 42 56 $project_icons[ $sub_project->id ] = $this->get_project_icon( $project, $sub_project ); 43 57 } 58 59 $project_ids = array_keys( $project_status ); 60 $project_ids[] = $project->id; 61 $project_ids = array_merge( 62 $project_ids, 63 $gpdb->get_col( "SELECT id FROM {$gpdb->projects} WHERE parent_project_id IN(" . implode(', ', $project_ids ) . ")" ) 64 ); 44 65 45 66 $contributors_count = wp_cache_get( 'contributors-count', 'wporg-translate' ); … … 51 72 usort( $top_level_projects, array( $this, '_sort_reverse_name_callback' ) ); 52 73 53 $variants = $this->get_locale_variants( $locale_slug, array_keys( $project_status ) ); 74 $variants = $this->get_locale_variants( $locale_slug, $project_ids ); 75 // If there were no results for the current variant in the current project branch, it should still show it. 76 if ( ! in_array( $set_slug, $variants, true ) ) { 77 $variants[] = $set_slug; 78 } 54 79 55 80 $this->tmpl( 'locale-projects', get_defined_vars() ); … … 119 144 case 'wp': 120 145 return '<div class="wordpress-icon"><span class="dashicons dashicons-wordpress-alt"></span></div>'; 146 case 'wp-themes': 147 $screenshot = gp_get_meta( 'wp-themes', $sub_project->id, 'screenshot' ); 148 if ( $screenshot ) { 149 return '<div class="theme icon"><img src="https://i0.wp.com/' . $screenshot . '?w=' . $size . '&strip=all"></div>'; 150 } else { 151 return '<div class="default-icon"><span class="dashicons dashicons-admin-appearance"></span></div>'; 152 } 121 153 case 'bbpress': 122 154 case 'buddypress': … … 255 287 } 256 288 289 /** 290 * Retrieves active sub projects with paging. 291 * 292 * This method is horribly inefficient when there exists many sub-projects, as it can't use SQL. 293 * 294 * @param GP_Project $project The parent project 295 * @param array $args { 296 * @type int $per_page Number of items per page. Default 20 297 * @type int $page The page of results to view. Default 1. 298 * @type string $orderby The field to order by, id or name. Default id. 299 * @type string $order The sorting order, ASC or DESC. Default ASC. 300 * @type string $search The search string 301 * @type string $set_slug The translation set to view. 302 * @type string $locale The locale of the translation set to view. 303 * } 304 * @return array List of sub projects. 305 */ 306 private function get_paged_active_sub_projects( $project, $args = array() ) { 307 global $gpdb; 308 309 $defaults = array( 310 'per_page' => 20, 311 'page' => 1, 312 'orderby' => 'id', 313 'order' => 'ASC', 314 'search' => false, 315 'set_slug' => '', 316 'locale' => '', 317 ); 318 $r = wp_parse_args( $args, $defaults ); 319 extract( $r, EXTR_SKIP ); 320 321 $order = ( 'ASC' === $order ) ? 'ASC' : 'DESC'; 322 $orderby = ( in_array( $orderby, array( 'id', 'name' ) ) ? $orderby : 'id' ); 323 324 $limit_sql = ''; 325 if ( $per_page ) { 326 $limit_sql = $gpdb->prepare( 'LIMIT %d, %d', ( $page - 1 ) * $per_page, $per_page ); 327 } 328 $search_sql = ''; 329 if ( $search ) { 330 $esc_search = '%%' . like_escape( $search ) . '%%'; 331 $search_sql = $gpdb->prepare( 'AND ( tp.name LIKE %s OR tp.slug LIKE %s )', $esc_search, $esc_search ); 332 } 333 334 /* 335 * Find all child projects with translation sets that match the current locale/slug. 336 * 337 * 1. We need to fetch all sub-projects of the current project (so, if we're at wp-plugins, we want akismet, debug bar, importers, etc) 338 * 2. Next, we fetch the sub-projects of those sub-projects, that gets us things like Development, Readme, etc. 339 * 3. Next, we fetch the translation sets of both the sub-projects(1), and any sub-sub-projects(2). 340 * Once we have the sets in 3, we can then check to see if there exists any translation sets for the current (locale, slug) (ie. en-au/default) 341 * If not, we can simply filter them out, so that paging only has items returned that actually exist. 342 */ 343 $translation_sets_table = GP::$translation_set->table; 344 $_projects = $project->many( " 345 SELECT SQL_CALC_FOUND_ROWS tp.* 346 FROM {$project->table} tp 347 LEFT JOIN {$project->table} tp_sub ON tp.id = tp_sub.parent_project_id AND tp_sub.active = 1 348 LEFT JOIN {$translation_sets_table} sets ON sets.project_id = tp.id AND sets.locale = %s AND sets.slug = %s 349 LEFT JOIN {$translation_sets_table} sets_sub ON sets_sub.project_id = tp_sub.id AND sets_sub.locale = %s AND sets_sub.slug = %s 350 WHERE 351 tp.parent_project_id = %d 352 AND tp.active = 1 353 AND ( sets.id IS NOT NULL OR sets_sub.id IS NOT NULL ) 354 $search_sql 355 GROUP BY tp.id 356 ORDER BY tp.$orderby $order 357 $limit_sql 358 ", $locale, $set_slug, $locale, $set_slug, $project->id ); 359 360 $results = (int) $project->found_rows(); 361 $pages = (int)ceil( $results / $per_page ); 362 363 $projects = array(); 364 foreach ( $_projects as $project ) { 365 $projects[ $project->id ] = $project; 366 } 367 368 return array( 369 'pages' => compact( 'pages', 'page', 'per_page', 'results' ), 370 'projects' => $projects, 371 ); 372 } 373 257 374 private function _sort_reverse_name_callback( $a, $b ) { 258 375 return - strcasecmp( $a->name, $b->name );
Note: See TracChangeset
for help on using the changeset viewer.