fields('ls', array('lid', 'source')); $select->addTag('tmgmt_sources_search'); $select->addMetaData('plugin', 'locale'); $select->addMetaData('type', $textgroup); $select->condition('ls.textgroup', $textgroup); if (!empty($search_label)) { $select->condition('ls.source', "%$search_label%", 'LIKE'); } if (!empty($missing_target_language) && in_array($missing_target_language, $languages)) { $select->isNull("lt_$missing_target_language.language"); } // Join locale targets for each language. // We want all joined fields to be named as langcodes, but langcodes could // contain hyphens in their names, which is not allowed by the most database // engines. So we create a langcode-to-filed_alias map, and rename fields // later. $langcode_to_filed_alias_map = array(); foreach ($languages as $langcode) { $table_alias = $select->leftJoin('locales_target', db_escape_field("lt_$langcode"), "ls.lid = %alias.lid AND %alias.language = '$langcode'"); $langcode_to_filed_alias_map[$langcode] = $select->addField($table_alias, 'language'); } $select = $select->extend('PagerDefault')->limit(variable_get('tmgmt_source_list_limit', 20)); $rows = $select->execute()->fetchAll(); foreach ($rows as $row) { foreach ($langcode_to_filed_alias_map as $langcode => $field_alias) { $row->{$langcode} = $row->{$field_alias}; unset($row->{$field_alias}); } } return $rows; } /** * Gets overview form header. * * @return array * Header array definition as expected by theme_tablesort(). */ public function overviewFormHeader() { $languages = array(); foreach (language_list() as $langcode => $language) { $languages['langcode-' . $langcode] = array( 'data' => check_plain($language->name), ); } $header = array( 'source' => array('data' => t('Source text')), ) + $languages; return $header; } /** * Implements TMGMTSourceUIControllerInterface::overviewForm(). */ public function overviewForm($form, &$form_state, $type) { $form += $this->overviewSearchFormPart($form, $form_state, $type); $form['items'] = array( '#type' => 'tableselect', '#header' => $this->overviewFormHeader($type), '#empty' => t('No strings matching given criteria have been found.') ); $search_data = $this->getSearchFormSubmittedParams(); $strings = $this->getStrings($type, $search_data['label'], $search_data['missing_target_language']); foreach ($this->getTranslationData($strings, $type) as $id => $data) { $form['items']['#options'][$id] = $this->overviewRow($type, $data); } $form['pager'] = array('#markup' => theme('pager', array('tags' => NULL))); return $form; } /** * Helper function to create translation data list for the sources page list. * * @param array $strings * Result of the search query returned by tmgmt_i18n_string_get_strings(). * @param string $type * I18n object type. * * @return array * Structured array with translation data. */ protected function getTranslationData($strings, $type) { $objects = array(); // Source language of locale strings is always english. $source_language = 'en'; foreach ($strings as $string) { $id = $string->lid; // Get existing translations and current job items for the entity // to determine translation statuses $current_job_items = tmgmt_job_item_load_latest('locale', $type, $id, $source_language); $objects[$id] = array( 'id' => $id, 'object' => $string ); // Load entity translation specific data. foreach (language_list() as $langcode => $language) { $translation_status = 'current'; if ($langcode == $source_language) { $translation_status = 'original'; } elseif ($string->{$langcode} === NULL) { $translation_status = 'missing'; } $objects[$id]['current_job_items'][$langcode] = isset($current_job_items[$langcode]) ? $current_job_items[$langcode] : NULL; $objects[$id]['translation_statuses'][$langcode] = $translation_status; } } return $objects; } /** * Builds search form for entity sources overview. * * @param array $form * Drupal form array. * @param $form_state * Drupal form_state array. * @param $type * Entity type. * * @return array * Drupal form array. */ public function overviewSearchFormPart($form, &$form_state, $type) { $options = array(); foreach (language_list() as $langcode => $language) { $options[$langcode] = $language->name; } $default_values = $this->getSearchFormSubmittedParams(); $form['search_wrapper'] = array( '#prefix' => '