diff --git a/plugins/bean/bean_relevant.inc b/plugins/bean/bean_relevant.inc index afafe72..3a2960f 100644 --- a/plugins/bean/bean_relevant.inc +++ b/plugins/bean/bean_relevant.inc @@ -418,6 +418,29 @@ class RelevantContentBean extends BeanPlugin { $bean->filter_options['taxonomy']['use_vocab'] : 0, ); } + // For translation + if (module_exists('translation')) { + $form['header']['filter_options']['translation'] = array( + '#type' => 'fieldset', + '#tree' => TRUE, + '#title' => t('Translation'), + ); + + $form['header']['filter_options']['translation']['use_language'] = array( + '#type' => 'checkbox', + '#title' => t("Filter on user's language"), + '#description' => t('If enabled, only items with the same language as current user or a translation in that language will be shown.'), + '#default_value' => isset($bean->filter_options['translation']['use_language']) ? + $bean->filter_options['translation']['use_language'] : 0, + ); + } + else { + $form['header']['filter_options']['translation']['use_language'] = array( + '#type' => 'hidden', + '#default_value' => isset($bean->filter_options['translation']['use_language']) ? + $bean->filter_options['translation']['use_language'] : 0, + ); + } return $form; } @@ -471,35 +494,38 @@ class RelevantContentBean extends BeanPlugin { } $relfields = array(); - $relativedates = $bean->filter_options['content']['relative_filter_fields']; - foreach ($relativedates as $node_type => $field_name) { - if ($field_name != 'changed' && $field_name != 'created') { - $field_data = field_info_field($field_name); - if ($field_data) { - $field_table = array_keys($field_data['storage']['details']['sql']['FIELD_LOAD_CURRENT']); - $field_name = $field_data['storage']['details']['sql']['FIELD_LOAD_CURRENT'][$field_table[0]]['value']; - $relfields[$node_type] = array( - 'table' => $field_table[0], - 'field' => $field_name - ); + if ($bean->filter_options['content']['relative_filter']) { + $relativedates = $bean->filter_options['content']['relative_filter_fields']; + foreach ($relativedates as $node_type => $field_name) { + if ($field_name != 'changed' && $field_name != 'created') { + $field_data = field_info_field($field_name); + if ($field_data) { + $field_table = array_keys($field_data['storage']['details']['sql']['FIELD_LOAD_CURRENT']); + $field_name = $field_data['storage']['details']['sql']['FIELD_LOAD_CURRENT'][$field_table[0]]['value']; + $relfields[$node_type] = array( + 'table' => $field_table[0], + 'field' => $field_name + ); + } + else { + // if field is no longer available, default to created + $relfields[$node_type] = array( + 'table' => 'node', + 'field' => 'created' + ); + } } else { - // if field is no longer available, default to created $relfields[$node_type] = array( 'table' => 'node', - 'field' => 'created' + 'field' => $field_name ); } } - else { - $relfields[$node_type] = array( - 'table' => 'node', 'field' => $field_name - ); - } - } - $result->setRelativeFilterFields($relfields); - $result->setRelativeFilterValue($bean->filter_options['content']['relative_filter_value']); + $result->setRelativeFilterFields($relfields); + $result->setRelativeFilterValue($bean->filter_options['content']['relative_filter_value']); + } if ($bean->display_options['sticky'] == 1) { $result->propertyOrderBy('sticky', 'DESC'); @@ -619,6 +645,10 @@ class RelevantContentBean extends BeanPlugin { } } + if (isset($bean->filter_options['translation']) && $bean->filter_options['translation']['use_language'] == 1 && module_exists('translation')) { + $result->setLanguageFilter($GLOBALS['language']->language); + } + $result = $data->execute(); if (isset($result['node'])) { @@ -685,6 +715,14 @@ function bean_relevant_terms_callback($form, $form_state) { */ class EntityFieldQueryRelevant extends EntityFieldQuery { /* + * @param $language + * A string of the language code to filter on + */ + public function setLanguageFilter($language) { + $this->languageFilter = $language; + } + + /* * @param $fields * An array of Relevant Bean sort fields/properties keyed on content type, * with table name and field name @@ -788,6 +826,39 @@ class EntityFieldQueryRelevant extends EntityFieldQuery { } + // Language filter + // Adapted from http://drupal.org/sandbox/daniel.nolde/1404374 + if (isset($this->languageFilter)) { + // Determine base table and base table key of the query. + foreach($select_query->getTables() as $table_key => $table_info) { + if ($table_info['join type'] == NULL) { + $base_table = $table_info['alias']; + } + } + + $language = $this->languageFilter; + $base_schema = drupal_get_schema($base_table); + $base_field = $base_schema['primary key'][0]; + + $field_base_language = $select_query->addField($base_table, 'language'); + $language_condition = db_or()->condition($base_table . '.' . $field_base_language, 'und') + ->condition($base_table . '.' . $field_base_language, $language); + + // If entity_translation is enabled + if (module_exists('entity_translation')) { + $et_table = $select_query->leftJoin('entity_translation', 'et', "et.entity_type = :base_table AND et.entity_id = $base_table.$base_field AND et.language = :language", array(':base_table' => $base_table, ':language' => $language)); + $field_et_language = $select_query->addField($et_table, 'language', 'et_language'); + $field_et_status = $select_query->addField($et_table, 'status', 'et_status'); + $field_et_translate = $select_query->addField($et_table, 'translate', 'et_translate'); + + $language_condition->condition(db_and()->condition($et_table . '.' . 'language' , $language) // $field_et_language + ->condition($et_table . '.' . 'status' , 1) // $field_et_language + ); + } + + $select_query->condition($language_condition); + } + foreach ($select_query->execute() as $partial_entity) { $bundle = isset($partial_entity->bundle) ? $partial_entity->bundle : NULL; $entity = entity_create_stub_entity($partial_entity->entity_type,