/** * Implementation of core get() logic * * @param string $ps_field bundle specifier * @param null|array $pa_options options array * @return array|null|string */ private function _get($ps_field, $pa_options = null) { if (!is_array($pa_options)) { $pa_options = array(); } $vb_return_as_array = isset($pa_options['returnAsArray']) ? (bool) $pa_options['returnAsArray'] : false; $vb_return_all_locales = isset($pa_options['returnAllLocales']) ? (bool) $pa_options['returnAllLocales'] : false; $vb_return_with_structure = isset($pa_options['returnWithStructure']) ? (bool) $pa_options['returnWithStructure'] : false; if ($vb_return_with_structure) { $pa_options['returnAsArray'] = $vb_return_as_array = true; } // returnWithStructure implies returnAsArray $vs_delimiter = isset($pa_options['delimiter']) ? $pa_options['delimiter'] : ';'; $vb_unserialize = isset($pa_options['unserialize']) ? (bool) $pa_options['unserialize'] : false; $vb_return_url = isset($pa_options['returnURL']) ? (bool) $pa_options['returnURL'] : false; $vb_return_path = isset($pa_options['returnPath']) ? (bool) $pa_options['returnPAth'] : false; $vb_convert_codes_to_display_text = isset($pa_options['convertCodesToDisplayText']) ? (bool) $pa_options['convertCodesToDisplayText'] : false; $vb_convert_codes_to_idno = isset($pa_options['convertCodesToIdno']) ? (bool) $pa_options['convertCodesToIdno'] : false; $vb_use_locale_codes = isset($pa_options['useLocaleCodes']) ? (bool) $pa_options['useLocaleCodes'] : false; if (!($vs_output = isset($pa_options['output']) ? (string) $pa_options['output'] : null)) { if ($vb_convert_codes_to_display_text) { $vs_output = "text"; } if (!$vs_output && $vb_convert_codes_to_idno) { $vs_output = "idno"; } } if (!in_array($vs_output, array('text', 'idno', 'value'))) { $vs_output = 'value'; } $pa_options['output'] = $vs_output; if (!($vb_return_as_link = isset($pa_options['makeLink']) ? (bool) $pa_options['makeLink'] : false)) { $vb_return_as_link = isset($pa_options['returnAsLink']) ? (bool) $pa_options['returnAsLink'] : false; } $pa_options['makeLink'] = $vb_return_as_link; $vn_max_levels_from_top = isset($pa_options['maxLevelsFromTop']) ? (int) $pa_options['maxLevelsFromTop'] : null; $vn_max_levels_from_bottom = isset($pa_options['maxLevelsFromBottom']) ? (int) $pa_options['maxLevelsFromBottom'] : null; $vn_remove_first_items = isset($pa_options['removeFirstItems']) ? (int) $pa_options['removeFirstItems'] : 0; $va_check_access = isset($pa_options['checkAccess']) ? is_array($pa_options['checkAccess']) ? $pa_options['checkAccess'] : array($pa_options['checkAccess']) : null; $vs_template = isset($pa_options['template']) ? (string) $pa_options['template'] : null; $va_path_components = isset(SearchResult::$s_parsed_field_component_cache[$this->ops_table_name . '/' . $ps_field]) ? SearchResult::$s_parsed_field_component_cache[$this->ops_table_name . '/' . $ps_field] : $this->parseFieldPathComponents($ps_field); $va_val_opts = array_merge($pa_options, array('returnAsArray' => $vb_return_as_array, 'returnAllLocales' => $vb_return_all_locales, 'returnWithStructure' => $vb_return_with_structure, 'pathComponents' => $va_path_components, 'delimiter' => $vs_delimiter, 'makeLink' => $vb_return_as_link, 'returnURL' => $vb_return_url, 'returnPath' => $vb_return_path, 'unserialize' => $vb_unserialize, 'convertCodesToDisplayText' => $vb_convert_codes_to_display_text, 'convertCodesToIdno' => $vb_convert_codes_to_idno, 'checkAccess' => $va_check_access, 'template' => $vs_template, 'useLocaleCodes' => $vb_use_locale_codes)); if ($va_path_components['table_name'] != $this->ops_table_name) { $vs_access_chk_key = $va_path_components['table_name'] . ($va_path_components['field_name'] ? '.' . $va_path_components['field_name'] : ''); } else { $vs_access_chk_key = $va_path_components['field_name']; } if ($va_path_components['field_name'] !== 'access' && caGetBundleAccessLevel($va_path_components['table_name'], $vs_access_chk_key) == __CA_BUNDLE_ACCESS_NONE__) { return null; } if (!(($vs_value = $this->opo_engine_result->get($ps_field, $pa_options)) === false)) { if ($vb_return_as_array) { if ($vb_return_all_locales) { return array(1 => $vs_value); } else { return array($vs_value); } } else { return $vs_value; } } if (!($t_instance = SearchResult::$s_instance_cache[$va_path_components['table_name']])) { $t_instance = SearchResult::$s_instance_cache[$va_path_components['table_name']] = $this->opo_datamodel->getInstanceByTableName($va_path_components['table_name'], true); } if (!$t_instance) { return null; } // Bad table $vn_row_id = $this->opo_engine_result->get($this->ops_table_pk); $va_val_opts['primaryKey'] = $t_instance->primaryKey(); if ($va_path_components['hierarchical_modifier']) { if (in_array($va_path_components['field_name'], array('preferred_labels', 'nonpreferred_labels')) && !$va_path_components['subfield_name']) { $va_path_components['subfield_name'] = $va_path_components['components'][2] = $t_instance->getLabelDisplayField(); } switch ($va_path_components['hierarchical_modifier']) { case 'parent': if ($va_path_components['related']) { // [RELATED TABLE PARENT] if (!isset(SearchResult::$opa_hierarchy_parent_prefetch_cache_index[$this->ops_table_name][$vn_row_id][$va_path_components['table_name']])) { $this->prefetchHierarchyParents($va_path_components['table_name'], $this->opo_engine_result->currentRow(), $this->getOption('prefetch'), $pa_options); } $va_ids = SearchResult::$opa_hierarchy_parent_prefetch_cache_index[$this->ops_table_name][$vn_row_id][$va_path_components['table_name']]; } else { // [PRIMARY TABLE PARENT] if (!isset(SearchResult::$opa_hierarchy_parent_prefetch_cache[$va_path_components['table_name']][$vn_row_id])) { $this->prefetchHierarchyParents($va_path_components['table_name'], $this->opo_engine_result->currentRow(), $this->getOption('prefetch'), $pa_options); } $va_ids = array($vn_row_id); } if (!sizeof($va_ids)) { return $pa_options['returnAsArray'] ? array() : null; } $va_hiers = array(); foreach ($va_ids as $vn_id) { $va_parent_ids = array(); if (isset(SearchResult::$opa_hierarchy_parent_prefetch_cache[$va_path_components['table_name']][$vn_id]) && is_array(SearchResult::$opa_hierarchy_parent_prefetch_cache[$va_path_components['table_name']][$vn_id])) { if (!is_array($va_parent_ids = SearchResult::$opa_hierarchy_parent_prefetch_cache[$va_path_components['table_name']][$vn_id])) { return $pa_options['returnAsArray'] ? array() : null; } } $va_parent_ids = array_slice($va_parent_ids, 0, 1); if (!($qr_hier = $t_instance->makeSearchResult($va_path_components['table_name'], $va_parent_ids))) { return $pa_options['returnAsArray'] ? array() : null; } $va_tmp = array($va_path_components['table_name']); if ($va_path_components['field_name']) { $va_tmp[] = $va_path_components['field_name']; } if ($va_path_components['subfield_name']) { $va_tmp[] = $va_path_components['subfield_name']; } $vs_hier_fld_name = join(".", $va_tmp); $vs_pk = $t_instance->primaryKey(); $vm_val = null; if ($qr_hier->nextHit()) { $vm_val = $qr_hier->get($vs_hier_fld_name, $pa_options); } if ($vm_val) { $va_hiers[] = $vb_return_as_array ? array_shift($vm_val) : $vm_val; } } return $vb_return_as_array ? $va_hiers : join($vs_delimiter, $va_hiers); break; case 'hierarchy': // generate the hierarchy if ($va_path_components['related']) { // [RELATED TABLE HIERARCHY] if (!isset(SearchResult::$opa_hierarchy_parent_prefetch_cache_index[$this->ops_table_name][$vn_row_id][$va_path_components['table_name']])) { $this->prefetchHierarchyParents($va_path_components['table_name'], $this->opo_engine_result->currentRow(), $this->getOption('prefetch'), $pa_options); } // ids of related items $va_ids = array_values(SearchResult::$opa_hierarchy_parent_prefetch_cache_index[$this->ops_table_name][$vn_row_id][$va_path_components['table_name']]); } else { // [PRIMARY TABLE HIERARCHY] if (!isset(SearchResult::$opa_hierarchy_parent_prefetch_cache[$va_path_components['table_name']][$vn_row_id])) { $this->prefetchHierarchyParents($va_path_components['table_name'], $this->opo_engine_result->currentRow(), $this->getOption('prefetch'), $pa_options); } $va_ids = array($vn_row_id); } if (!sizeof($va_ids)) { return $pa_options['returnAsArray'] ? array() : null; } $vs_hier_pk_fld = $t_instance->primaryKey(); $va_hiers = $va_hier_ids = array(); $vs_hierarchy_direction = isset($pa_options['hierarchyDirection']) ? strtolower($pa_options['hierarchyDirection']) : 'asc'; if ($t_instance->isHierarchical()) { if ($va_path_components['field_name'] === $vs_hier_pk_fld) { if ($va_path_components['related']) { foreach ($va_ids as $vn_id) { if (is_array(SearchResult::$opa_hierarchy_parent_prefetch_cache[$va_path_components['table_name']][$vn_id])) { $va_hier_id_list = array_merge(array($vn_id), SearchResult::$opa_hierarchy_parent_prefetch_cache[$va_path_components['table_name']][$vn_id]); $va_hier_id_list = array_filter($va_hier_id_list, function ($v) { return $v > 0; }); if ($vs_hierarchy_direction === 'asc') { $va_hier_id_list = array_reverse($va_hier_id_list); } if (!is_null($vn_max_levels_from_top)) { $va_hier_id_list = array_slice($va_hier_id_list, 0, $vn_max_levels_from_top, true); } elseif (!is_null($vn_max_levels_from_bottom)) { if (($vn_start = sizeof($va_hier_id_list) - $vn_max_levels_from_bottom) < 0) { $vn_start = 0; } $va_hier_id_list = array_slice($va_hier_id_list, $vn_start, $vn_max_levels_from_bottom, true); } $va_hier_ids[] = $va_hier_id_list; } } } else { // Return ids from hierarchy in order if (is_array(SearchResult::$opa_hierarchy_parent_prefetch_cache[$va_path_components['table_name']][$vn_row_id])) { $va_hier_ids = array_merge(array($vn_row_id), SearchResult::$opa_hierarchy_parent_prefetch_cache[$va_path_components['table_name']][$vn_row_id]); } else { $va_hier_ids = array($vn_row_id); } if (!is_null($vn_max_levels_from_top)) { $va_hier_ids = array_slice($va_hier_ids, 0, $vn_max_levels_from_top, true); } elseif (!is_null($vn_max_levels_from_bottom)) { if (($vn_start = sizeof($va_hier_ids) - $vn_max_levels_from_bottom) < 0) { $vn_start = 0; } $va_hier_ids = array_slice($va_hier_ids, $vn_start, $vn_max_levels_from_bottom, true); } if ($vs_hierarchy_direction === 'asc') { $va_hier_ids = array_reverse($va_hier_ids); } } return $vb_return_as_array ? $va_hier_ids : join($vs_delimiter, $va_hier_ids); } else { $vs_field_spec = join('.', array_values($va_path_components['components'])); $va_ancestor_id_list = $this->get($va_path_components['table_name'] . '.hierarchy.' . $vs_hier_pk_fld, array_merge($pa_options, array('returnAsArray' => true, 'returnAsLink' => false, 'returnAllLocales' => false))); if (!is_array($va_ancestor_id_list)) { return $vb_return_as_array ? array() : null; } if (!$va_path_components['related']) { $va_ancestor_id_list = array($va_ancestor_id_list); } $va_hier_list = array(); foreach ($va_ancestor_id_list as $va_ancestor_ids) { if ($vn_remove_first_items > 0) { $va_ancestor_ids = array_slice($va_ancestor_ids, $vn_remove_first_items); } $va_hier_item = array(); if ($qr_hier = caMakeSearchResult($va_path_components['table_name'], $va_ancestor_ids)) { while ($qr_hier->nextHit()) { $va_hier_item += $qr_hier->get($vs_field_spec, array('returnWithStructure' => true, 'returnAllLocales' => true, 'useLocaleCodes' => $pa_options['useLocaleCodes'])); } if (!is_null($vn_max_levels_from_top)) { $va_hier_item = array_slice($va_hier_item, 0, $vn_max_levels_from_top, true); } elseif (!is_null($vn_max_levels_from_bottom)) { if (($vn_start = sizeof($va_hier_item) - $vn_max_levels_from_bottom) < 0) { $vn_start = 0; } $va_hier_item = array_slice($va_hier_item, $vn_start, $vn_max_levels_from_bottom, true); } $va_hier_list[] = $va_hier_item; } } } } $va_acc = array(); foreach ($va_hier_list as $vn_h => $va_hier_item) { if (!$vb_return_all_locales) { $va_hier_item = caExtractValuesByUserLocale($va_hier_item); } if ($vb_return_with_structure) { $va_acc[] = $va_hier_item; } else { $va_acc = $this->_flattenArray($va_hier_item, $pa_options); } } return $pa_options['returnAsArray'] ? $va_acc : join($vs_delimiter, $va_acc); break; case 'children': // grab children if ($va_path_components['related']) { // [RELATED TABLE CHILDREN] if (!isset(SearchResult::$opa_hierarchy_children_prefetch_cache_index[$this->ops_table_name][$vn_row_id][$va_path_components['table_name']])) { $this->prefetchHierarchyChildren($va_path_components['table_name'], $this->opo_engine_result->currentRow(), $this->getOption('prefetch'), $pa_options); } $va_ids = SearchResult::$opa_hierarchy_children_prefetch_cache_index[$this->ops_table_name][$vn_row_id][$va_path_components['table_name']]; } else { // [PRIMARY TABLE CHILDREN] if (!isset(SearchResult::$opa_hierarchy_children_prefetch_cache[$this->ops_table_name][$vn_row_id])) { $this->prefetchHierarchyChildren($va_path_components['table_name'], $this->opo_engine_result->currentRow(), $this->getOption('prefetch'), $pa_options); } $va_ids = array($vn_row_id); } $va_hier_list = array(); foreach ($va_ids as $vn_id) { if (!is_array(SearchResult::$opa_hierarchy_children_prefetch_cache[$va_path_components['table_name']][$vn_id]) || !sizeof(SearchResult::$opa_hierarchy_children_prefetch_cache[$va_path_components['table_name']][$vn_id])) { continue; } $qr_hier = $t_instance->makeSearchResult($va_path_components['table_name'], SearchResult::$opa_hierarchy_children_prefetch_cache[$va_path_components['table_name']][$vn_id]); $va_tmp = array($va_path_components['table_name']); if ($va_path_components['field_name']) { $va_tmp[] = $va_path_components['field_name']; } if ($va_path_components['subfield_name']) { $va_tmp[] = $va_path_components['subfield_name']; } $vs_hier_fld_name = join(".", $va_tmp); $vs_pk = $t_instance->primaryKey(); while ($qr_hier->nextHit()) { $vm_val = $qr_hier->get($vs_hier_fld_name, $pa_options); $va_hier_list[$qr_hier->get($va_path_components['table_name'] . '.' . $vs_pk)] = $vb_return_as_array ? array_shift($vm_val) : $vm_val; } } if (!$vb_return_as_array) { return join($vs_delimiter, $va_hier_list); } return $va_hier_list; break; case 'siblings': // grab siblings if ($va_path_components['related']) { // [RELATED TABLE SIBLINGS] if (!isset(SearchResult::$opa_hierarchy_siblings_prefetch_cache_index[$this->ops_table_name][$vn_row_id][$va_path_components['table_name']])) { $this->prefetchHierarchySiblings($va_path_components['table_name'], $this->opo_engine_result->currentRow(), $this->getOption('prefetch'), $pa_options); } $va_ids = SearchResult::$opa_hierarchy_siblings_prefetch_cache_index[$this->ops_table_name][$vn_row_id][$va_path_components['table_name']]; } else { // [PRIMARY TABLE SIBLINGS] if (!isset(SearchResult::$opa_hierarchy_siblings_prefetch_cache[$this->ops_table_name][$vn_row_id])) { $this->prefetchHierarchySiblings($va_path_components['table_name'], $this->opo_engine_result->currentRow(), $this->getOption('prefetch'), $pa_options); } $va_ids = array($vn_row_id); } $va_hier_list = array(); foreach ($va_ids as $vn_id) { if (!is_array(SearchResult::$opa_hierarchy_siblings_prefetch_cache[$va_path_components['table_name']][$vn_id]) || !sizeof(SearchResult::$opa_hierarchy_siblings_prefetch_cache[$va_path_components['table_name']][$vn_id])) { continue; } $qr_hier = $t_instance->makeSearchResult($va_path_components['table_name'], SearchResult::$opa_hierarchy_siblings_prefetch_cache[$va_path_components['table_name']][$vn_id]); $va_tmp = array($va_path_components['table_name']); if ($va_path_components['field_name']) { $va_tmp[] = $va_path_components['field_name']; } if ($va_path_components['subfield_name']) { $va_tmp[] = $va_path_components['subfield_name']; } $vs_hier_fld_name = join(".", $va_tmp); $vs_pk = $t_instance->primaryKey(); while ($qr_hier->nextHit()) { $vm_val = $qr_hier->get($vs_hier_fld_name, $pa_options); $va_hier_list[$qr_hier->get($va_path_components['table_name'] . '.' . $vs_pk)] = $vb_return_as_array ? array_shift($vm_val) : $vm_val; } } if (!$vb_return_as_array) { return join($vs_delimiter, $va_hier_list); } return $va_hier_list; break; } return; } if ($va_path_components['related']) { // // [RELATED TABLE] // $vs_opt_md5 = caMakeCacheKeyFromOptions(array_merge($pa_options, array('dontReturnLabels' => false))); if (!isset(self::$s_rel_prefetch_cache[$this->ops_table_name][$vn_row_id][$va_path_components['table_name']][$vs_opt_md5])) { $this->prefetchRelated($va_path_components['table_name'], $this->opo_engine_result->currentRow(), $this->getOption('prefetch'), array_merge($pa_options, array('dontReturnLabels' => false))); } $va_related_items = self::$s_rel_prefetch_cache[$this->ops_table_name][$vn_row_id][$va_path_components['table_name']][$vs_opt_md5]; if (!is_array($va_related_items)) { return $vb_return_with_structure || $vb_return_as_array ? array() : null; } return $this->_getRelatedValue($va_related_items, $va_val_opts); } else { if (!$va_path_components['hierarchical_modifier']) { // // [PRIMARY TABLE] Created on // if ($va_path_components['field_name'] == 'created') { if (!isset(self::$s_timestamp_cache['created_on'][$this->ops_table_name][$vn_row_id])) { $this->prefetchChangeLogData($this->ops_table_name, $this->opo_engine_result->currentRow(), $this->getOption('prefetch')); } if ($vb_return_as_array) { return self::$s_timestamp_cache['created_on'][$this->ops_table_name][$vn_row_id]; } else { $vs_subfield = $va_path_components['subfield_name'] ? $va_path_components['subfield_name'] : 'timestamp'; $vm_val = self::$s_timestamp_cache['created_on'][$this->ops_table_name][$vn_row_id][$vs_subfield]; if ($vs_subfield == 'timestamp') { $this->opo_tep->init(); $this->opo_tep->setUnixTimestamps($vm_val, $vm_val); $vm_val = $this->opo_tep->getText($pa_options); } return $vm_val; } } // // [PRIMARY TABLE] Last modified on // if ($va_path_components['field_name'] == 'lastModified') { if (!isset(self::$s_timestamp_cache['last_changed'][$this->ops_table_name][$vn_row_id])) { $this->prefetchChangeLogData($this->ops_table_name, $this->opo_engine_result->currentRow(), $this->getOption('prefetch')); } if ($vb_return_as_array) { return self::$s_timestamp_cache['last_changed'][$this->ops_table_name][$vn_row_id]; } else { $vs_subfield = $va_path_components['subfield_name'] ? $va_path_components['subfield_name'] : 'timestamp'; $vm_val = self::$s_timestamp_cache['last_changed'][$this->ops_table_name][$vn_row_id][$vs_subfield]; if ($vs_subfield == 'timestamp') { $this->opo_tep->init(); $this->opo_tep->setUnixTimestamps($vm_val, $vm_val); $vm_val = $this->opo_tep->getText($pa_options); } return $vm_val; } } $vs_opt_md5 = caMakeCacheKeyFromOptions($pa_options); // // [PRIMARY TABLE] Preferred/nonpreferred labels // if (in_array($va_path_components['field_name'], array('preferred_labels', 'nonpreferred_labels')) && $t_instance instanceof LabelableBaseModelWithAttributes) { $vs_label_table_name = $t_instance->getLabelTableName(); if (!isset(self::$s_prefetch_cache[$vs_label_table_name][$vn_row_id][$vs_opt_md5])) { $this->prefetchLabels($va_path_components['table_name'], $this->opo_engine_result->currentRow(), $this->getOption('prefetch'), $pa_options); } return $this->_getLabelValue(self::$s_prefetch_cache[$vs_label_table_name][$vn_row_id][$vs_opt_md5], $t_instance, $va_val_opts); } if ($t_instance->hasField($va_path_components['field_name'])) { $va_val_opts['fieldInfo'] = $t_instance->getFieldInfo($va_path_components['field_name']); // // [PRIMARY TABLE] Plain old intrinsic // if (!isset(self::$s_prefetch_cache[$va_path_components['table_name']][$vn_row_id][$vs_opt_md5])) { $this->prefetch($va_path_components['table_name'], $this->opo_engine_result->currentRow(), $this->getOption('prefetch'), $pa_options); } return $this->_getIntrinsicValue(self::$s_prefetch_cache[$va_path_components['table_name']][$vn_row_id][$vs_opt_md5], $t_instance, $va_val_opts); } elseif (method_exists($t_instance, 'isValidBundle') && !$t_instance->hasElement($va_path_components['field_name']) && $t_instance->isValidBundle($va_path_components['field_name'])) { // // [PRIMARY TABLE] Special bundle // return $t_instance->renderBundleForDisplay($va_path_components['field_name'], $vn_row_id, self::$s_prefetch_cache[$va_path_components['table_name']][$vn_row_id][$vs_opt_md5], $va_val_opts); } else { // // [PRIMARY TABLE] Metadata attribute // if ($t_instance instanceof BaseModelWithAttributes && isset($va_path_components['field_name']) && $va_path_components['field_name'] && ($t_element = $t_instance->_getElementInstance($va_path_components['field_name']))) { $vn_element_id = $t_element->getPrimaryKey(); } else { return $pa_options['returnAsArray'] ? array() : null; } if (!isset(ca_attributes::$s_get_attributes_cache[(int) $this->opn_table_num . '/' . (int) $vn_row_id][(int) $vn_element_id])) { ca_attributes::prefetchAttributes($this->opo_subject_instance->getDb(), $this->opn_table_num, $this->getRowIDsToPrefetch($this->opo_engine_result->currentRow(), $this->getOption('prefetch')), $vn_element_id ? array($vn_element_id) : null, array('dontFetchAlreadyCachedValues' => true)); } $va_attributes = ca_attributes::getAttributes($this->opo_subject_instance->getDb(), $this->opn_table_num, $vn_row_id, array($vn_element_id), array()); return $this->_getAttributeValue($va_attributes[$vn_element_id], $t_instance, $va_val_opts); } } } return null; }
/** * Return raw value of attribute for a given row. The "raw" value is the display value, or values, joined with the specified * delimiter and filtered on the current user locale. * * @param int $pn_row_id row_id attribute is attached to in the table the instance represents * @param mixed $pm_element_code_or_id Element code or element_id of the metadata element to load the attribute for * @param mixed $pm_sub_element_code_or_id Optional sub-element code or element_id to fetch value for. This is used to select a sub-element in complex attributes; if you want the top-level (aka root) element leave this set to null * @param string $ps_delimiter Optional delimiter to use when multiple values are defined. Default is a comma (","). * @return string The "raw" value */ public function getRawValue($pn_row_id, $pm_element_code_or_id, $pm_sub_element_code_or_id = null, $ps_delimiter = ',', $pa_options = null) { $vn_element_id = $this->_getElementID($pm_element_code_or_id); $va_attributes = ca_attributes::getAttributes($this->getDb(), $this->tableNum(), $pn_row_id, array($vn_element_id), array()); if (!is_array($va_attributes = $va_attributes[$vn_element_id])) { return null; } $vn_sub_element_id = $pm_sub_element_code_or_id ? $this->_getElementID($pm_sub_element_code_or_id) : null; $va_ret_values = array(); foreach ($va_attributes as $o_attr) { if ($o_attr->getElementID() == $vn_element_id) { $va_values = $o_attr->getDisplayValues(true, $pa_options); $va_ret_values[][(int) $o_attr->getLocaleID()] = $va_values[$vn_sub_element_id ? $vn_sub_element_id : $vn_element_id]; } } $va_ret_values = array_values(caExtractValuesByUserLocale($va_ret_values)); return join($ps_delimiter, $va_ret_values); }