/**
  *
  */
 public function getValuesForExport($pa_options = null)
 {
     $va_data = parent::getValuesForExport($pa_options);
     // get intrinsics and attributes
     $t_locale = new ca_locales();
     $t_list = new ca_lists();
     // get labels
     $va_preferred_labels = $this->get($this->tableName() . ".preferred_labels", array('returnAsArray' => true, 'returnAllLocales' => true));
     if (is_array($va_preferred_labels) && sizeof($va_preferred_labels)) {
         $va_preferred_labels_for_export = array();
         foreach ($va_preferred_labels as $vn_id => $va_labels_by_locale) {
             foreach ($va_labels_by_locale as $vn_locale_id => $va_labels) {
                 if (!($vs_locale = $t_locale->localeIDToCode($vn_locale_id))) {
                     $vs_locale = 'NONE';
                 }
                 $va_preferred_labels_for_export[$vs_locale] = $va_labels[0];
                 unset($va_preferred_labels_for_export[$vs_locale]['form_element']);
             }
         }
         $va_data['preferred_labels'] = $va_preferred_labels_for_export;
     }
     $va_nonpreferred_labels = $this->get($this->tableName() . ".nonpreferred_labels", array('returnAsArray' => true, 'returnAllLocales' => true));
     if (is_array($va_nonpreferred_labels) && sizeof($va_nonpreferred_labels)) {
         $va_nonpreferred_labels_for_export = array();
         foreach ($va_nonpreferred_labels as $vn_id => $va_labels_by_locale) {
             foreach ($va_labels_by_locale as $vn_locale_id => $va_labels) {
                 if (!($vs_locale = $t_locale->localeIDToCode($vn_locale_id))) {
                     $vs_locale = 'NONE';
                 }
                 $va_nonpreferred_labels_for_export[$vs_locale] = $va_labels;
                 foreach ($va_nonpreferred_labels_for_export[$vs_locale] as $vn_i => $va_label) {
                     unset($va_nonpreferred_labels_for_export[$vs_locale][$vn_i]['form_element']);
                 }
             }
         }
         $va_data['nonpreferred_labels'] = $va_nonpreferred_labels_for_export;
     }
     return $va_data;
 }
 /**
  * Returns list of metadata element codes applicable to the current row. If there is no loaded row and $pn_type_id
  * is not set then all attributes applicable to the model as a whole (regardless of type restrictions) are returned.
  *
  * Normally only top-level attribute codes are returned. This is good: in general you should only be dealing with attributes
  * via the top-level element. However, there are a few cases where you might need an inventory of *all* element codes that can
  * be attached to a model, even those that are part of an element hierarchy. Setting the $pb_include_sub_element_codes to true
  * will include sub-elements in the returned list.
  */
 public function getApplicableElementCodes($pn_type_id = null, $pb_include_sub_element_codes = false, $pb_dont_cache = true)
 {
     if (!$pb_dont_cache && is_array($va_tmp = BaseModelWithAttributes::$s_applicable_element_code_cache[$this->tableNum() . '/' . $pn_type_id . '/' . ($pb_include_sub_element_codes ? 1 : 0)])) {
         return $va_tmp;
     }
     $vs_type_sql = '';
     if (isset($this->ATTRIBUTE_TYPE_ID_FLD) && ($pn_type_id || ($pn_type_id = $this->get($this->ATTRIBUTE_TYPE_ID_FLD)) > 0)) {
         $va_ancestors = array();
         if ($t_type_instance = $this->getTypeInstance()) {
             $va_ancestors = $t_type_instance->getHierarchyAncestors(null, array('idsOnly' => true, 'includeSelf' => true));
             if (is_array($va_ancestors)) {
                 array_pop($va_ancestors);
             }
             // remove hierarchy root
         }
         if (sizeof($va_ancestors) > 1) {
             $vs_type_sql = '((camtr.type_id = ' . intval($pn_type_id) . ') OR (camtr.type_id IS NULL) OR ((camtr.include_subtypes = 1) AND camtr.type_id IN (' . join(',', $va_ancestors) . '))) AND ';
         } else {
             $vs_type_sql = '((camtr.type_id = ' . intval($pn_type_id) . ') OR (camtr.type_id IS NULL)) AND ';
         }
     } elseif (is_subclass_of($this, "BaseRelationshipModel")) {
         if (!$pn_type_id) {
             $pn_type_id = self::get('type_id');
         }
         if ($pn_type_id > 0) {
             $vs_type_sql = '((camtr.type_id = ' . intval($pn_type_id) . ') OR (camtr.type_id IS NULL)) AND ';
         }
     }
     $o_db = $this->getDb();
     $qr_res = $o_db->query("\n \t\t\t\tSELECT camtr.element_id, came.element_code, cmel.name, cmel.description, cmel.locale_id\n \t\t\t\tFROM ca_metadata_type_restrictions camtr\n \t\t\t\tINNER JOIN ca_metadata_elements AS came ON camtr.element_id = came.element_id\n \t\t\t\tINNER JOIN ca_metadata_element_labels AS cmel ON cmel.element_id = came.element_id\n \t\t\t\tWHERE\n \t\t\t\t\t{$vs_type_sql} (camtr.table_num = ?) AND came.parent_id IS NULL\n \t\t\t", (int) $this->tableNum());
     $va_codes = array();
     $va_element_labels_by_locale = array();
     while ($qr_res->nextRow()) {
         $vn_element_id = (int) $qr_res->get('element_id');
         $vs_element_code = (string) $qr_res->get('element_code');
         $vn_locale_id = (int) $qr_res->get('locale_id');
         $va_element_labels_by_locale[$vn_element_id][$vn_locale_id] = $va_element_labels_by_locale[$vs_element_code][$vn_locale_id] = $qr_res->getRow();
         if (isset($va_codes[$vn_element_id])) {
             continue;
         }
         $va_codes[$vn_element_id] = $vs_element_code;
     }
     if (!is_array(BaseModelWithAttributes::$s_element_label_cache)) {
         BaseModelWithAttributes::$s_element_label_cache = array();
     }
     BaseModelWithAttributes::$s_element_label_cache += caExtractValuesByUserLocale($va_element_labels_by_locale);
     if ($pb_include_sub_element_codes && sizeof($va_codes)) {
         $qr_res = $o_db->query("\n\t\t\t\t\tSELECT came.element_id, came.element_code\n\t\t\t\t\tFROM ca_metadata_elements came\n\t\t\t\t\tWHERE\n\t\t\t\t\t\tcame.hier_element_id IN (" . join(',', array_keys($va_codes)) . ")\n\t\t\t\t");
         while ($qr_res->nextRow()) {
             $va_codes[$qr_res->get('element_id')] = $qr_res->get('element_code');
         }
     }
     BaseModelWithAttributes::$s_applicable_element_code_cache[$this->tableNum() . '/' . $pn_type_id . '/' . ($pb_include_sub_element_codes ? 1 : 0)] = $va_codes;
     return $va_codes;
 }