/**
 * Embed XMP metadata into representation media. Embedding is performed on a copy of the representation media and placed
 * into the system tmp directory. The original media is never modified.
 *
 * @param BaseModel $po_object ca_objects instance to pull metadata from for embedding
 * @param BaseModel $po_representation ca_object_representations instance to pull metadata from for embedding
 * @param string $ps_version Version of media to embed into. If omitted "original" version is used.
 * @return string Path to copy of media with embedded metadata. False is returned in the embedding failed.
 */
function caEmbedMetadataIntoRepresentation($po_object, $po_representation, $ps_version = "original")
{
    if (!($vs_media_metadata_config = $po_representation->getAppConfig()->get('media_metadata'))) {
        return false;
    }
    $o_metadata_config = Configuration::load($vs_media_metadata_config);
    $vs_mimetype = $po_representation->getMediaInfo('media', $ps_version, 'MIMETYPE');
    if (!in_array($vs_mimetype, array('image/jpeg'))) {
        return false;
    }
    // Don't try to embed in files other than JPEGs
    $vs_filepath = $po_representation->getMediaPath('media', $ps_version);
    if (!file_exists($vs_filepath)) {
        return false;
    }
    $va_mappings = $o_metadata_config->getAssoc('export_mappings');
    $o_xmp = new XMPParser();
    copy($vs_filepath, $vs_tmp_filepath = caGetTempDirPath() . "/" . time() . md5($vs_filepath));
    $o_xmp->parse($vs_tmp_filepath);
    $o_xmp->initMetadata();
    if (is_object($po_object) && isset($va_mappings['ca_objects']) && is_array($va_mappings['ca_objects'])) {
        $va_mapping = $va_mappings['ca_objects'];
        $vs_type = $po_object->getTypeCode();
        if (isset($va_mapping[$vs_type]) && is_array($va_mapping[$vs_type])) {
            $va_mapping = $va_mapping[$vs_type];
        } else {
            if (isset($va_mapping['__default__']) && is_array($va_mapping['__default__'])) {
                $va_mapping = $va_mapping['__default__'];
            } else {
                return null;
            }
        }
        if (is_array($va_mapping)) {
            foreach ($va_mapping as $vs_xmp => $va_ca) {
                $va_tmp = explode(':', $vs_xmp);
                if (sizeof($va_tmp) > 1) {
                    $vs_xmp = $va_tmp[1];
                }
                foreach ($va_ca as $vs_ca => $va_opts) {
                    if (preg_match('!^static:!', $vs_ca)) {
                        $vs_val = preg_replace('!^static:!', '', $vs_ca);
                    } else {
                        $vs_val = $po_object->get($vs_ca, $va_opts);
                    }
                    if ($vs_val) {
                        $o_xmp->set($vs_xmp, $vs_val);
                    }
                }
            }
        }
    }
    if (is_object($po_representation) && isset($va_mappings['ca_object_representations']) && is_array($va_mappings['ca_object_representations'])) {
        $va_mapping = $va_mappings['ca_object_representations'];
        $vs_type = $po_representation->getTypeCode();
        if (isset($va_mapping[$vs_type]) && is_array($va_mapping[$vs_type])) {
            $va_mapping = $va_mapping[$vs_type];
        } else {
            if (isset($va_mapping['__default__']) && is_array($va_mapping['__default__'])) {
                $va_mapping = $va_mapping['__default__'];
            } else {
                return null;
            }
        }
        if (is_array($va_mapping)) {
            foreach ($va_mapping as $vs_xmp => $va_ca) {
                $va_tmp = explode(':', $vs_xmp);
                if (sizeof($va_tmp) > 1) {
                    $vs_xmp = $va_tmp[1];
                }
                foreach ($va_ca as $vs_ca => $va_opts) {
                    if (preg_match('!^static:!', $vs_ca)) {
                        $vs_val = preg_replace('!^static:!', '', $vs_ca);
                    } else {
                        $vs_val = $po_representation->get($vs_ca, $va_opts);
                    }
                    if ($vs_val) {
                        $o_xmp->set($vs_xmp, $vs_val);
                    }
                }
            }
        }
    }
    $o_xmp->write();
    return $vs_tmp_filepath;
}
Example #2
0
/**
 * 
 *
 * @param BaseModel $pt_subject 
 * @param string $ps_related_table
 * @param array $pa_bundle_settings 
 * @param array $pa_options Supported options are:
 *		
 *
 * @return string
 */
function caGetBundleDisplayTemplate($pt_subject, $ps_related_table, $pa_bundle_settings, $pa_options = null)
{
    $vs_template = null;
    if (strlen(trim($pa_bundle_settings['display_template']))) {
        $vs_template = trim($pa_bundle_settings['display_template']);
    }
    // If no display_template set try to get a default out of the app.conf file
    if (!$vs_template) {
        if (is_array($va_lookup_settings = $pt_subject->getAppConfig()->getList("{$ps_related_table}_lookup_settings"))) {
            if (!($vs_lookup_delimiter = $pt_subject->getAppConfig()->get("{$ps_related_table}_lookup_delimiter"))) {
                $vs_lookup_delimiter = '';
            }
            $vs_template = join($vs_lookup_delimiter, $va_lookup_settings);
        }
    }
    // If no app.conf default then just show preferred_labels
    if (!$vs_template) {
        $vs_template = "^preferred_labels";
    }
    return $vs_template;
}
 /**
  * Called just after record is deleted. Individual editor controllers can override this to implement their
  * own post-deletion cleanup logic.
  *
  * @param BaseModel $pt_subject Model instance of row that was deleted
  * @return bool True if post-deletion cleanup was successful, false if not
  */
 protected function _checkAccess($pt_subject, $pa_options = null)
 {
     //
     // Is record deleted?
     //
     if ($pt_subject->hasField('deleted') && $pt_subject->get('deleted')) {
         if (!caGetOption('dontRedirectOnDelete', $pa_options, false)) {
             $this->response->setRedirect($this->request->config->get('error_display_url') . '/n/2550?r=' . urlencode($this->request->getFullUrlPath()));
         }
         return false;
     }
     //
     // Is record of correct type?
     //
     $va_restrict_to_types = null;
     if ($pt_subject->getAppConfig()->get('perform_type_access_checking')) {
         $va_restrict_to_types = caGetTypeRestrictionsForUser($this->ops_table_name, array('access' => __CA_BUNDLE_ACCESS_READONLY__));
     }
     if (is_array($va_restrict_to_types) && ($pt_subject->get('type_id') && ($pt_subject->getPrimaryKey() && !in_array($pt_subject->get('type_id'), $va_restrict_to_types)))) {
         $this->response->setRedirect($this->request->config->get('error_display_url') . '/n/2560?r=' . urlencode($this->request->getFullUrlPath()));
         return false;
     }
     //
     // Is record from correct source?
     //
     $va_restrict_to_sources = null;
     if ($pt_subject->getAppConfig()->get('perform_source_access_checking') && $pt_subject->hasField('source_id')) {
         if (is_array($va_restrict_to_sources = caGetSourceRestrictionsForUser($this->ops_table_name, array('access' => __CA_BUNDLE_ACCESS_READONLY__)))) {
             if (!$pt_subject->get('source_id') || $pt_subject->get('source_id') && !in_array($pt_subject->get('source_id'), $va_restrict_to_sources) || strlen($vn_source_id = $this->request->getParameter('source_id', pInteger)) && !in_array($vn_source_id, $va_restrict_to_sources)) {
                 $pt_subject->set('source_id', $pt_subject->getDefaultSourceID(array('request' => $this->request)));
             }
             if (is_array($va_restrict_to_sources) && !in_array($pt_subject->get('source_id'), $va_restrict_to_sources)) {
                 $this->response->setRedirect($this->request->config->get('error_display_url') . '/n/2562?r=' . urlencode($this->request->getFullUrlPath()));
                 return;
             }
         }
     }
     //
     // Does user have access to row?
     //
     if ($pt_subject->getAppConfig()->get('perform_item_level_access_checking') && $vn_subject_id) {
         if ($pt_subject->checkACLAccessForUser($this->request->user) < __CA_BUNDLE_ACCESS_READONLY__) {
             $this->response->setRedirect($this->request->config->get('error_display_url') . '/n/2580?r=' . urlencode($this->request->getFullUrlPath()));
             return false;
         }
     }
     return true;
 }