Пример #1
0
 public function testComment()
 {
     $vm_ret = $this->opt_object->get('ca_item_comments.comment');
     $this->assertEquals('I like this very much.', $vm_ret);
     $this->assertTrue(!is_numeric($this->opt_object->get('ca_item_comments.created_on')));
     // should always be current date/time as tex
 }
 public function testGets()
 {
     $vm_ret = $this->opt_object->get("ca_objects_x_storage_locations.effective_date");
     $this->assertEquals('January 28 1985', $vm_ret);
     $vm_ret = $this->opt_object->get("ca_objects_x_storage_locations.effective_date", array('getDirectDate' => true));
     $this->assertEquals($vm_ret, '1985.01280000000000000000');
     // try legacy version of same option
     $vm_ret = $this->opt_object->get("ca_objects_x_storage_locations.effective_date", array('GET_DIRECT_DATE' => true));
     $this->assertEquals($vm_ret, '1985.01280000000000000000');
 }
 public function testInterstitialTemplateProcessing()
 {
     // should only be one
     $vn_relation_id = $this->opt_object_left->get('ca_objects_x_objects.relation_id');
     $this->assertTrue(is_numeric($vn_relation_id));
     $va_opts = array('resolveLinksUsing' => 'ca_objects', 'primaryIDs' => array('ca_objects' => array($this->opt_object_left->getPrimaryKey())));
     // we're reading from the left side, so the right side pop up
     $this->assertEquals('Test Dataset', caProcessTemplateForIDs('^ca_objects.preferred_labels', 'ca_objects_x_objects', array($vn_relation_id), $va_opts));
     $this->assertEquals('is related to', caProcessTemplateForIDs('^relationship_typename', 'ca_objects_x_objects', array($vn_relation_id), $va_opts));
     $this->assertEquals('is related to', caProcessTemplateForIDs('<unit relativeTo="ca_objects_x_objects">^relationship_typename</unit>', 'ca_objects', array($this->opt_object_left->getPrimaryKey()), $va_opts));
 }
Пример #4
0
 public function testGets()
 {
     $vm_ret = $this->opt_object->get('ca_entities', array('delimiter' => '; '));
     $this->assertEquals('Homer J. Simpson; Bart Simpson; ACME Inc.', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_entities.preferred_labels', array('delimiter' => '; '));
     $this->assertEquals('Homer J. Simpson; Bart Simpson; ACME Inc.', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_entities.nonpreferred_labels');
     $this->assertEquals('Max Power', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_entities', array('returnWithStructure' => true));
     $vm_ret2 = $this->opt_object->getRelatedItems('ca_entities');
     $this->assertSame($vm_ret, $vm_ret2);
     $vm_ret = $this->opt_object->get('ca_entities', array('restrictToRelationshipTypes' => array('creator')));
     $this->assertEquals('Homer J. Simpson', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_entities', array('restrictToRelationshipTypes' => array('publisher')));
     $this->assertEquals('Bart Simpson', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_entities', array('delimiter' => '; ', 'restrictToTypes' => array('ind')));
     $this->assertEquals('Homer J. Simpson; Bart Simpson', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_entities', array('delimiter' => '; ', 'restrictToTypes' => array('org')));
     $this->assertEquals('ACME Inc.', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_entities', array('delimiter' => '; ', 'restrictToTypes' => array('ind', 'org')));
     $this->assertEquals('Homer J. Simpson; Bart Simpson; ACME Inc.', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_entities', array('delimiter' => '; ', 'excludeRelationshipTypes' => array('creator', 'publisher')));
     $this->assertEquals('ACME Inc.', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_entities', array('delimiter' => '; ', 'excludeTypes' => array('ind')));
     $this->assertEquals('ACME Inc.', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_objects_x_entities.source_info', array('delimiter' => '; '));
     $this->assertEquals('Me; Homer; Bart', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_objects_x_entities.effective_date', array('delimiter' => '; '));
     $this->assertEquals('2015; 2014 - 2015; 2013', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_entities.internal_notes');
     $this->assertEquals('Test notes', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_objects.related.preferred_labels');
     $this->assertEquals('My test dataset', $vm_ret);
     // <unit> with relativeTo to repeat template once per entity (this is different from the old pre-1.6 template behavior)
     $vm_ret = $this->opt_object->get('ca_entities', array('template' => '<unit relativeTo="ca_entities">^ca_entities.preferred_labels.displayname (^ca_entities.internal_notes)</unit>', 'delimiter' => '; '));
     $this->assertEquals('Homer J. Simpson (); Bart Simpson (); ACME Inc. (Test notes)', $vm_ret);
     // Pre-1.6 test without units returns straight text get() output for each tag (this used to return the output in the previous test)
     $vm_ret = $this->opt_object->get('ca_entities', array('template' => '^ca_entities.preferred_labels.displayname (^ca_entities.internal_notes)', 'delimiter' => '; '));
     $this->assertEquals('Homer J. Simpson; Bart Simpson; ACME Inc. (Test notes)', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_entities', array('template' => '^ca_entities.preferred_labels', 'delimiter' => '; ', 'returnAsLink' => true));
     $this->assertRegExp("/\\<a href=[\"\\'](.)+[\"\\']>Homer J. Simpson\\<\\/a\\>/", $vm_ret);
     $this->assertRegExp("/\\<a href=[\"\\'](.)+[\"\\']>Bart Simpson\\<\\/a\\>/", $vm_ret);
     $this->assertRegExp("/\\<a href=[\"\\'](.)+[\"\\']>ACME Inc.\\<\\/a\\>/", $vm_ret);
     $va_entity_relationships = $this->opt_object->get('ca_objects_x_entities.relation_id', array('returnAsArray' => true));
     $qr_entity_relationships = caMakeSearchResult('ca_objects_x_entities', $va_entity_relationships);
     $this->assertEquals(3, $qr_entity_relationships->numHits());
     while ($qr_entity_relationships->nextHit()) {
         $this->assertEquals('0', $qr_entity_relationships->get('ca_objects.deleted'));
         $this->assertEquals('0', $qr_entity_relationships->get('ca_entities.deleted'));
     }
     // there are no related list items
     $vm_ret = $this->opt_object->get('ca_list_items', array('returnAsArray' => true));
     $this->assertEmpty($vm_ret);
 }
 public function testInterstitialTemplateProcessing()
 {
     // should only be one
     $vn_relation_id = $this->opt_homer->get('ca_entities_x_entities.relation_id');
     $this->assertTrue(is_numeric($vn_relation_id));
     $va_opts = array('resolveLinksUsing' => 'ca_entities', 'primaryIDs' => array('ca_entities' => array($this->opt_bart->getPrimaryKey())));
     // we're reading from Bart, so Homer should pop up
     $this->assertEquals('Homer J. Simpson', caProcessTemplateForIDs('^ca_entities.preferred_labels', 'ca_entities_x_entities', array($vn_relation_id), $va_opts));
     // Try getting the rel type from the relationship record
     // We don't need $va_opts to do that, by the way!
     $this->assertEquals('is related to', caProcessTemplateForIDs('^relationship_typename', 'ca_entities_x_entities', array($vn_relation_id)));
     // Try getting the rel type from the Homer record
     // We don't need $va_opts to do that either
     $this->assertEquals('is related to', caProcessTemplateForIDs('<unit relativeTo="ca_entities_x_entities">^relationship_typename</unit>', 'ca_entities', array($this->opt_homer->getPrimaryKey())));
 }
Пример #6
0
 public function testGets()
 {
     $vm_ret = $this->opt_loan_in->get('ca_loans.related');
     $this->assertEquals('New Loan Out', $vm_ret);
     $va_items = $this->opt_loan_in->getRelatedItems('ca_loans');
     $vn_relation_id = array_shift(caExtractArrayValuesFromArrayOfArrays($va_items, 'relation_id'));
     // The relationship we created is Loan Out <-> Loan In, so evaluating with loan in as primary ID should give us the loan out
     $va_opts = array('resolveLinksUsing' => 'ca_loans', 'primaryIDs' => array('ca_loans' => array($this->opt_loan_in->getPrimaryKey())));
     $vm_ret = caProcessTemplateForIDs("^ca_loans.preferred_labels", 'ca_loans_x_loans', array($vn_relation_id), $va_opts);
     $this->assertEquals('New Loan Out', $vm_ret);
     // Now for the other side ...
     $va_opts = array('resolveLinksUsing' => 'ca_loans', 'primaryIDs' => array('ca_loans' => array($this->opt_loan_out->getPrimaryKey())));
     $vm_ret = caProcessTemplateForIDs("^ca_loans.preferred_labels", 'ca_loans_x_loans', array($vn_relation_id), $va_opts);
     $this->assertEquals('New Loan In', $vm_ret);
 }
 public function testDirectivesNestedInStaticHTMLForDisplay()
 {
     // Relative to relationship table as is done for displays
     $va_relation_ids = $this->opt_object->get('ca_objects_x_entities.relation_id', ['returnAsArray' => true]);
     $vm_ret = DisplayTemplateParser::evaluate('<ul style="list-style-type:none"><li><unit relativeTo="ca_entities"><l>^ca_entities.preferred_labels.displayname</l> (^ca_entities.idno)</li></unit></ul>', "ca_objects_x_entities", $va_relation_ids, array('returnAsArray' => true));
     $this->assertInternalType('array', $vm_ret);
     $this->assertCount(2, $vm_ret);
     $this->assertInternalType('string', $vm_ret[0]);
     $this->assertInternalType('string', $vm_ret[1]);
     $this->assertContains("editor/entities/EntityEditor/Summary/entity_id/" . $this->opn_entity_id1 . "\">Homer J. Simpson</a> (hjs)</li></ul>", $vm_ret[0]);
     $this->assertContains("editor/entities/EntityEditor/Summary/entity_id/" . $this->opn_entity_id2 . "\">Bart Simpson</a> (bs)</li></ul>", $vm_ret[1]);
 }
Пример #8
0
 public function testGets()
 {
     $vm_ret = $this->opt_object->get('ca_objects.type_id', array('convertCodesToDisplayText' => true));
     $this->assertEquals('Moving Image', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_objects.preferred_labels');
     $this->assertEquals('My test moving image', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_objects.duration');
     $this->assertEquals('0:23:28', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_objects.access');
     $this->assertEquals('0', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_objects.access', array('convertCodesToDisplayText' => true));
     $this->assertEquals('not accessible to public', $vm_ret);
     $o_tep = new TimeExpressionParser();
     $vn_now = time();
     $vm_ret = $this->opt_object->get('ca_objects.lastModified');
     $this->assertTrue($o_tep->parse($vm_ret));
     $va_modified_unix = $o_tep->getUnixTimestamps();
     //$this->assertEquals($vn_now, $va_modified_unix['start'], 'lastModified timestamp cannot be more than 1 minute off', 60);
 }
Пример #9
0
 public function testGets()
 {
     $vm_ret = $this->opt_object->get('ca_objects.type_id', array('convertCodesToDisplayText' => true));
     $this->assertEquals('Moving Image', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_objects.preferred_labels');
     $this->assertEquals('My test moving image', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_objects.duration');
     $this->assertEquals('0:23:28', $vm_ret);
     $vm_ret = $this->opt_object->get('ca_item_comments.comment');
     $this->assertEquals('I like this very much.', $vm_ret);
     $this->assertTrue(!is_numeric($this->opt_object->get('ca_item_comments.created_on')));
     // should always be current date/time as text
     $o_tep = new TimeExpressionParser();
     $vn_now = time();
     $vm_ret = $this->opt_object->get('ca_objects.lastModified');
     $this->assertTrue($o_tep->parse($vm_ret));
     $va_modified_unix = $o_tep->getUnixTimestamps();
     //$this->assertEquals($vn_now, $va_modified_unix['start'], 'lastModified timestamp cannot be more than 1 minute off', 60);
 }
Пример #10
0
 public function testGets()
 {
     $vm_ret = $this->opt_object->get('ca_objects.type_id', array('convertCodesToDisplayText' => true));
     $this->assertEquals('Image', $vm_ret);
     // it should get the en_US title here because at this point this is our "UI locale"
     $vm_ret = $this->opt_object->get('ca_objects.preferred_labels');
     $this->assertEquals('My test image', $vm_ret);
     // it should get the en_US title here because at this point this is our "UI locale"
     $vm_ret = $this->opt_object->get('ca_object_labels.name');
     $this->assertEquals('My test image', $vm_ret);
     // extract de_DE locale from array
     $vm_ret = $this->opt_object->get('ca_objects.preferred_labels', array('returnWithStructure' => true, 'returnAllLocales' => true));
     $this->assertInternalType('array', $vm_ret);
     $va_vals = array_shift(array_shift(caExtractValuesByLocale(array('preferred' => array('de_DE')), $vm_ret)));
     $this->assertEquals('Testbild', $va_vals['name']);
     // it should get the en_US title here because at this point this is our "UI locale"
     $vm_ret = $this->opt_object->get('ca_objects.nonpreferred_labels');
     $this->assertEquals('Alternative title for test image', $vm_ret);
     // extract de_DE locale from array
     $vm_ret = $this->opt_object->get('ca_objects.nonpreferred_labels', array('returnWithStructure' => true, 'returnAllLocales' => true));
     $this->assertInternalType('array', $vm_ret);
     $va_vals = array_shift(array_shift(caExtractValuesByLocale(array('preferred' => array('de_DE')), $vm_ret)));
     $this->assertEquals('Alternativer Titel für Testbild', $va_vals['name']);
 }
Пример #11
0
 public function testGets()
 {
     $vm_ret = $this->opt_child_object->get('ca_objects.preferred_labels');
     $this->assertEquals('My test still', $vm_ret);
     $vm_ret = $this->opt_child_object->get('ca_objects.parent.preferred_labels');
     $this->assertEquals('My test moving image', $vm_ret);
     $vm_ret = $this->opt_child_object->get('ca_objects.parent.preferred_labels', array('returnAsArray' => true));
     $this->assertTrue(is_array($vm_ret));
     $this->assertEquals(1, sizeof($vm_ret));
     $this->assertEquals('My test moving image', array_shift($vm_ret));
     $vm_ret = $this->opt_child_object->get('ca_objects.parent.preferred_labels', array('returnAsArray' => true));
     $this->assertTrue(is_array($vm_ret));
     $this->assertEquals(1, sizeof($vm_ret));
     //	$this->assertTrue(is_array($vm_ret = array_shift($vm_ret)));
     $this->assertArrayHasKey(0, $vm_ret);
     $this->assertContains('My test moving image', $vm_ret);
     $vm_ret = $this->opt_parent_object->get('ca_objects.children.preferred_labels');
     $this->assertEquals('My test still;Another test still', $vm_ret);
     $vm_ret = $this->opt_parent_object->get('ca_objects.children.preferred_labels', array('returnAsArray' => true));
     $this->assertTrue(is_array($vm_ret));
     $this->assertEquals(2, sizeof($vm_ret));
     $this->assertEquals('My test still', array_shift($vm_ret));
     $this->assertEquals('Another test still', array_shift($vm_ret));
     $vm_ret = $this->opt_parent_object->get('ca_objects.children.preferred_labels', array('returnWithStructure' => true, 'returnAllLocales' => true));
     $this->assertTrue(is_array($vm_ret));
     $this->assertEquals(2, sizeof($vm_ret));
     $this->assertTrue(is_array($vm_item = array_shift($vm_ret)));
     $this->assertArrayHasKey(1, $vm_item);
     $this->assertEquals(1, sizeof($vm_item[1]));
     $this->assertTrue(is_array($vm_subitem = array_shift($vm_item)));
     $this->assertTrue(is_array($vm_values = array_shift($vm_subitem)));
     $this->assertArrayHasKey('name', $vm_values);
     $this->assertEquals('My test still', $vm_values['name']);
     $vm_ret = $this->opt_child_object->get('ca_objects.hierarchy.preferred_labels', array('delimiter' => ' ➔ '));
     $this->assertEquals('My test moving image ➔ My test still', $vm_ret);
     $vm_ret = $this->opt_child_object->get('ca_objects.hierarchy.preferred_labels', array('delimiter' => ' ➔ ', 'hierarchyDirection' => 'desc'));
     $this->assertEquals('My test still ➔ My test moving image', $vm_ret);
     $vm_ret = $this->opt_child_object->get('ca_objects.hierarchy.preferred_labels', array('returnAsArray' => true));
     $this->assertTrue(is_array($vm_ret));
     $this->assertEquals(2, sizeof($vm_ret));
     $this->assertEquals('My test moving image', array_shift($vm_ret));
     $this->assertEquals('My test still', array_shift($vm_ret));
     $vm_ret = $this->opt_child_object->get('ca_objects.hierarchy.preferred_labels', array('returnWithStructure' => true, 'returnAllLocales' => true));
     $this->assertTrue(is_array($vm_ret));
     $this->assertEquals(1, sizeof($vm_ret));
     $this->assertTrue(is_array($vm_items = array_shift($vm_ret)));
     $this->assertEquals(2, sizeof($vm_items));
     $this->assertTrue(is_array($vm_item = array_shift($vm_items)));
     $this->assertArrayHasKey(1, $vm_item);
     $this->assertTrue(is_array($vm_item = array_shift($vm_item)));
     $this->assertEquals(1, sizeof($vm_item));
     $this->assertTrue(is_array($vm_item = array_shift($vm_item)));
     $this->assertEquals(1, sizeof($vm_item));
     $this->assertEquals('My test moving image', $vm_item['name']);
     $this->assertTrue(is_array($vm_item = array_shift($vm_items)));
     $this->assertArrayHasKey(1, $vm_item);
     $this->assertTrue(is_array($vm_item = array_shift($vm_item)));
     $this->assertEquals(1, sizeof($vm_item));
     $this->assertTrue(is_array($vm_item = array_shift($vm_item)));
     $this->assertEquals(1, sizeof($vm_item));
     $this->assertEquals('My test still', $vm_item['name']);
     $vm_ret = $this->opt_child_object->get('ca_objects.siblings.preferred_labels', array('delimiter' => ', '));
     $this->assertEquals('My test still, Another test still', $vm_ret);
     $vm_ret = $this->opt_child_object->get('ca_objects.siblings.preferred_labels', array('returnAsArray' => true));
     $this->assertTrue(is_array($vm_ret));
     $this->assertEquals(2, sizeof($vm_ret));
     $this->assertEquals('My test still', array_shift($vm_ret));
     $this->assertEquals('Another test still', array_shift($vm_ret));
     $vm_ret = $this->opt_child_object->get('ca_objects.siblings.preferred_labels', array('returnWithStructure' => true, 'returnAllLocales' => true));
     $this->assertTrue(is_array($vm_ret));
     $this->assertEquals(2, sizeof($vm_ret));
     $this->assertTrue(is_array($vm_items = array_shift($vm_ret)));
     $this->assertEquals(1, sizeof($vm_items));
     $this->assertTrue(is_array($vm_item = array_shift($vm_items)));
     $this->assertTrue(is_array($vm_item = array_shift($vm_item)));
     $this->assertEquals('My test still', $vm_item['name']);
     $this->assertTrue(is_array($vm_items = array_shift($vm_ret)));
     $this->assertEquals(1, sizeof($vm_items));
     $this->assertTrue(is_array($vm_item = array_shift($vm_items)));
     $this->assertTrue(is_array($vm_item = array_shift($vm_item)));
     $this->assertEquals('Another test still', $vm_item['name']);
 }
 /**
  * Override BundlableLabelableBaseModelWithAttribute::get() to allow getting 
  * annotation properties in simple get()-style notations like
  *   ca_representations_annotations.props.w
  */
 public function get($ps_field, $pa_options = null)
 {
     $va_tmp = explode('.', $ps_field);
     // remove table name if needed
     if (isset($va_tmp[0]) && $va_tmp[0] == $this->tableName()) {
         array_shift($va_tmp);
     }
     if (sizeof($va_tmp) == 2 && isset($va_tmp[0]) && $va_tmp[0] == 'props') {
         $vm_val = $this->getPropertyValue($va_tmp[1]);
         // this should be moved into the property implementation but for now, points is the only occurrence
         // of this kind of thing and getProperty() doesn't support any options so this is a reasonable quick&dirty way.
         if (is_array($vm_val) && !caGetOption('returnAsArray', $pa_options)) {
             switch ($va_tmp[1]) {
                 case 'points':
                     $va_return = array();
                     foreach ($vm_val as $va_point) {
                         $va_return[] = $va_point['x'] . ',' . $va_point['y'];
                     }
                     if (!($vs_delimiter = caGetOption('delimiter', $pa_options))) {
                         $vs_delimiter = '; ';
                     }
                     return join($vs_delimiter, $va_return);
                     break;
                 default:
                     return $vm_val;
             }
         }
         return $vm_val;
     }
     return parent::get($ps_field, $pa_options);
 }
/**
 * Perform mapping of extracted media metadata to CollectiveAccess bundles.
 *
 * @param BundlableLabelableBaseModelWithAttributes $po_instance Model instance to insert extracted metadata into
 * @param array $pa_metadata Extracted metadata
 * @param int $pn_locale_id The current locale as a numeric locale_id
 * @return bool True extracted metadata was mapped and the model changed, false if no change was made to the model
 */
function caExtractEmbeddedMetadata($po_instance, $pa_metadata, $pn_locale_id)
{
    if (!is_array($pa_metadata)) {
        return false;
    }
    $vb_did_mapping = false;
    if (!($vs_media_metadata_config = $po_instance->getAppConfig()->get('media_metadata'))) {
        return false;
    }
    $o_metadata_config = Configuration::load($vs_media_metadata_config);
    $va_mappings = $o_metadata_config->getAssoc('import_mappings');
    $vs_tablename = $po_instance->tableName();
    // set extracted georef?
    $va_georef_elements = $o_metadata_config->getList('extract_embedded_exif_georeferencing_to');
    $va_georef_containers = $o_metadata_config->getAssoc('extract_embedded_exif_georeferencing_to_container');
    $va_date_elements = $o_metadata_config->getList('extract_embedded_exif_creation_date_to');
    $va_date_containers = $o_metadata_config->getAssoc('extract_embedded_exif_creation_date_to_container');
    if (isset($pa_metadata['EXIF']) && is_array($pa_metadata['EXIF']) && (is_array($va_georef_elements) && sizeof($va_georef_elements) || is_array($va_georef_containers) && sizeof($va_georef_containers) || is_array($va_date_elements) && sizeof($va_date_elements) || is_array($va_date_containers) && sizeof($va_date_containers))) {
        $va_exif_data = $pa_metadata['EXIF'];
        if (is_array($va_georef_elements)) {
            if (is_array($va_coords = caParseEXIFLatLong($va_exif_data))) {
                foreach ($va_georef_elements as $vs_element) {
                    $va_tmp = explode('.', $vs_element);
                    $po_instance->addAttribute(array($va_tmp[1] => "[" . $va_coords['latitude'] . ", " . $va_coords['longitude'] . "]", 'locale_id' => $pn_locale_id), $va_tmp[1]);
                }
                $vb_did_mapping = true;
            }
        }
        if (is_array($va_georef_containers)) {
            if (is_array($va_coords = caParseEXIFLatLong($va_exif_data))) {
                foreach ($va_georef_containers as $vs_container => $va_info) {
                    $va_tmp = explode('.', $vs_container);
                    $vs_value_element = array_pop(explode('.', $va_info['value']));
                    $va_data = array($vs_value_element => "[" . $va_coords['latitude'] . ", " . $va_coords['longitude'] . "]", 'locale_id' => $pn_locale_id);
                    if (isset($va_info['map']) && is_array($va_info['map'])) {
                        foreach ($va_info['map'] as $vs_sub_element => $vs_value) {
                            $va_tmp2 = explode('.', $vs_sub_element);
                            $vs_sub_element = array_pop($va_tmp2);
                            if ($t_element = $po_instance->_getElementInstance($vs_sub_element)) {
                                switch ($t_element->get('datatype')) {
                                    case 3:
                                        // List
                                        $t_list = new ca_lists();
                                        $va_data[$vs_sub_element] = $t_list->getItemIDFromList($t_element->get('list_id'), $vs_value);
                                        break;
                                    default:
                                        $va_data[$vs_sub_element] = $vs_value;
                                        break;
                                }
                            }
                        }
                    }
                    $po_instance->addAttribute($va_data, $va_tmp[1]);
                }
                $vb_did_mapping = true;
            }
        }
        if (is_array($va_date_elements)) {
            if (($vs_raw_date = $va_exif_data['IFD0']['DateTimeOriginal']) || ($vs_raw_date = $va_exif_data['EXIF']['DateTimeOriginal']) || ($vs_raw_date = $va_exif_data['ExifIFD']['DateTimeOriginal'])) {
                $va_date_tmp = preg_split('![: ]+!', $vs_raw_date);
                $vs_date = $va_date_tmp[0] . '-' . $va_date_tmp[1] . '-' . $va_date_tmp[2] . 'T' . $va_date_tmp[3] . ':' . $va_date_tmp[4] . ':' . $va_date_tmp[5];
                foreach ($va_date_elements as $vs_element) {
                    $va_tmp = explode('.', $vs_element);
                    if (strlen($po_instance->get($vs_element)) > 0) {
                        $po_instance->addAttribute(array($va_tmp[1] => $vs_date, 'locale_id' => $pn_locale_id), $va_tmp[1]);
                    } else {
                        $po_instance->replaceAttribute(array($va_tmp[1] => $vs_date, 'locale_id' => $pn_locale_id), $va_tmp[1]);
                    }
                }
                $vb_did_mapping = true;
            }
        }
        if (is_array($va_date_containers)) {
            $t_list = new ca_lists();
            if (($vs_raw_date = $va_exif_data['IFD0']['DateTimeOriginal']) || ($vs_raw_date = $va_exif_data['EXIF']['DateTimeOriginal']) || ($vs_raw_date = $va_exif_data['ExifIFD']['DateTimeOriginal'])) {
                $va_date_tmp = preg_split('![: ]+!', $vs_raw_date);
                $vs_date = $va_date_tmp[0] . '-' . $va_date_tmp[1] . '-' . $va_date_tmp[2] . 'T' . $va_date_tmp[3] . ':' . $va_date_tmp[4] . ':' . $va_date_tmp[5];
                foreach ($va_date_containers as $vs_container => $va_info) {
                    $va_tmp = explode('.', $vs_container);
                    $vs_value_element = array_pop(explode('.', $va_info['value']));
                    $va_data = array($vs_value_element => $vs_date, 'locale_id' => $pn_locale_id);
                    if (isset($va_info['map']) && is_array($va_info['map'])) {
                        foreach ($va_info['map'] as $vs_sub_element => $vs_value) {
                            $va_tmp2 = explode('.', $vs_sub_element);
                            $vs_sub_element = array_pop($va_tmp2);
                            if ($t_element = $po_instance->_getElementInstance($vs_sub_element)) {
                                switch ($t_element->get('datatype')) {
                                    case 3:
                                        // List
                                        $va_data[$vs_sub_element] = $t_list->getItemIDFromList($t_element->get('list_id'), $vs_value);
                                        break;
                                    default:
                                        $va_data[$vs_sub_element] = $vs_value;
                                        break;
                                }
                            }
                        }
                    }
                    $po_instance->addAttribute($va_data, $va_tmp[1]);
                }
                $vb_did_mapping = true;
            }
        }
    }
    if (!isset($va_mappings[$po_instance->tableName()])) {
        return $vb_did_mapping;
    }
    $va_mapping = $va_mappings[$vs_tablename];
    $vs_type = $po_instance->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 $vb_did_mapping;
        }
    }
    foreach ($va_mapping as $vs_metadata => $va_attr) {
        $va_tmp = explode(":", $vs_metadata);
        $vs_delimiter = caGetOption('delimiter', $va_attr, false);
        foreach ($va_attr as $vs_attr) {
            if ($vs_attr == 'delimiter') {
                continue;
            }
            $va_metadata =& $pa_metadata;
            foreach ($va_tmp as $vs_el) {
                if (isset($va_metadata[$vs_el])) {
                    $va_metadata =& $va_metadata[$vs_el];
                } else {
                    continue 2;
                }
            }
            if (is_array($va_metadata)) {
                $va_metadata = join(";", $va_metadata);
            }
            if (!is_int($va_metadata)) {
                // pass ints through for values like WhiteBalance = 0
                if (!trim($va_metadata)) {
                    continue 2;
                }
            }
            if (!caSeemsUTF8($va_metadata)) {
                $va_metadata = caEncodeUTF8Deep($va_metadata);
            }
            $va_tmp2 = explode(".", $vs_attr);
            switch ($va_tmp2[0]) {
                case 'preferred_labels':
                    $po_instance->replaceLabel(array($va_tmp2[1] => $va_metadata), $pn_locale_id, null, true);
                    break;
                case 'nonpreferred_labels':
                    $po_instance->replaceLabel(array($va_tmp2[1] => $va_metadata), $pn_locale_id, null, false);
                    break;
                default:
                    if ($po_instance->hasField($vs_attr)) {
                        $po_instance->set($vs_attr, $va_metadata);
                    } else {
                        // try as attribute
                        if (sizeof($va_tmp2) == 2) {
                            // format ca_objects.foo, we only want "foo"
                            if ($vs_delimiter) {
                                $va_m = explode($vs_delimiter, $va_metadata);
                                $po_instance->removeAttributes($va_tmp2[1]);
                                foreach ($va_m as $vs_m) {
                                    $po_instance->addAttribute(array($va_tmp2[1] => trim($vs_m), 'locale_id' => $pn_locale_id), $va_tmp2[1]);
                                }
                            } else {
                                $po_instance->replaceAttribute(array($va_tmp2[1] => $va_metadata, 'locale_id' => $pn_locale_id), $va_tmp2[1]);
                            }
                        }
                    }
            }
            $vb_did_mapping = true;
        }
    }
    return $vb_did_mapping;
}
Пример #14
0
 /**
  * Prepopulate record fields according to rules in prepopulate.conf
  *
  * @param BundlableLabelableBaseModelWithAttributes $t_instance The table instance to prepopulate
  * @param array $pa_options Options array. Available options are:
  * 		prepopulateConfig = override path to prepopulate.conf, e.g. for testing purposes
  * @return bool success or not
  */
 public function prepopulateFields(&$t_instance, $pa_options = null)
 {
     if (!$t_instance->getPrimaryKey()) {
         return false;
     }
     if ($vs_prepopulate_cfg = caGetOption('prepopulateConfig', $pa_options, null)) {
         $this->opo_plugin_config = Configuration::load($vs_prepopulate_cfg);
     }
     if (!($this->opo_plugin_config->get('prepopulate_fields_on_save') || $this->opo_plugin_config->get('prepopulate_fields_on_load'))) {
         return false;
     }
     $va_rules = $this->opo_plugin_config->get('prepopulate_rules');
     if (!$va_rules || !is_array($va_rules) || sizeof($va_rules) < 1) {
         return false;
     }
     global $g_ui_locale_id;
     // we need to unset the form timestamp to disable the 'Changes have been made since you loaded this data' warning when we update() $this
     // the warning makes sense because an update()/insert() is called before we arrive here but after the form_timestamp ... but we chose to ignore it
     //$vn_timestamp = $_REQUEST['form_timestamp'];
     //unset($_REQUEST['form_timestamp']);
     $vb_we_set_transaction = true;
     if (!$t_instance->inTransaction()) {
         $t_instance->setTransaction(new Transaction($t_instance->getDb()));
         $vb_we_set_transaction = true;
     }
     // process rules
     $va_expression_vars = array();
     // we only process those if and when we need them
     foreach ($va_rules as $vs_rule_key => $va_rule) {
         if ($t_instance->tableName() != $va_rule['table']) {
             continue;
         }
         // check target
         $vs_target = $va_rule['target'];
         if (strlen($vs_target) < 1) {
             Debug::msg("[prepopulateFields()] skipping rule {$vs_rule_key} because target is not set");
             continue;
         }
         // check template
         $vs_template = $va_rule['template'];
         if (strlen($vs_template) < 1) {
             Debug::msg("[prepopulateFields()] skipping rule {$vs_rule_key} because template is not set");
             continue;
         }
         $vs_mode = caGetOption('mode', $va_rule, 'merge');
         // respect restrictToTypes option
         if ($va_rule['restrictToTypes'] && is_array($va_rule['restrictToTypes']) && sizeof($va_rule['restrictToTypes']) > 0) {
             if (!in_array($t_instance->getTypeCode(), $va_rule['restrictToTypes'])) {
                 Debug::msg("[prepopulateFields()] skipping rule {$vs_rule_key} because current record type " . $t_instance->getTypeCode() . " is not in restrictToTypes");
                 continue;
             }
         }
         // skip this rule if expression is true
         if ($va_rule['skipIfExpression'] && strlen($va_rule['skipIfExpression']) > 0) {
             $va_tags = caGetTemplateTags($va_rule['skipIfExpression']);
             foreach ($va_tags as $vs_tag) {
                 if (!isset($va_expression_vars[$vs_tag])) {
                     $va_expression_vars[$vs_tag] = $t_instance->get($vs_tag, array('returnIdno' => true, 'delimiter' => ';'));
                 }
             }
             if (ExpressionParser::evaluate($va_rule['skipIfExpression'], $va_expression_vars)) {
                 Debug::msg("[prepopulateFields()] skipping rule {$vs_rule_key} because skipIfExpression evaluated true");
                 continue;
             }
         }
         // evaluate template
         $vs_value = caProcessTemplateForIDs($vs_template, $t_instance->tableNum(), array($t_instance->getPrimaryKey()), array('path' => true));
         Debug::msg("[prepopulateFields()] processed template for rule {$vs_rule_key} value is: " . $vs_value);
         // inject into target
         $va_parts = explode('.', $vs_target);
         // intrinsic or simple (non-container) attribute
         if (sizeof($va_parts) == 2) {
             // intrinsic
             if ($t_instance->hasField($va_parts[1])) {
                 switch (strtolower($vs_mode)) {
                     case 'overwrite':
                         // always set
                         $t_instance->set($va_parts[1], $vs_value);
                         break;
                     case 'addifempty':
                     default:
                         if (!$t_instance->get($va_parts[1])) {
                             $t_instance->set($va_parts[1], $vs_value);
                         } else {
                             Debug::msg("[prepopulateFields()] rule {$vs_rule_key}: intrinsic skipped because it already has value and mode is addIfEmpty or merge");
                         }
                         break;
                 }
                 // attribute/element
             } elseif ($t_instance->hasElement($va_parts[1])) {
                 $va_attributes = $t_instance->getAttributesByElement($va_parts[1]);
                 if (sizeof($va_attributes) > 1) {
                     Debug::msg("[prepopulateFields()] containers with multiple values are not supported");
                     continue;
                 }
                 switch (strtolower($vs_mode)) {
                     case 'overwrite':
                         // always replace first value we find
                         $t_instance->replaceAttribute(array($va_parts[1] => $vs_value, 'locale_id' => $g_ui_locale_id), $va_parts[1]);
                         break;
                     default:
                     case 'addifempty':
                         // only add value if none exists
                         if (!$t_instance->get($vs_target)) {
                             $t_instance->replaceAttribute(array($va_parts[1] => $vs_value, 'locale_id' => $g_ui_locale_id), $va_parts[1]);
                         }
                         break;
                 }
             }
             // "container"
         } elseif (sizeof($va_parts) == 3) {
             // actual container
             if ($t_instance->hasElement($va_parts[1])) {
                 $va_attr = $t_instance->getAttributesByElement($va_parts[1]);
                 switch (sizeof($va_attr)) {
                     case 1:
                         switch (strtolower($vs_mode)) {
                             case 'overwrite':
                                 $vo_attr = array_pop($va_attr);
                                 $va_value = array($va_parts[2] => $vs_value);
                                 foreach ($vo_attr->getValues() as $o_val) {
                                     if ($o_val->getElementCode() != $va_parts[2]) {
                                         $va_value[$o_val->getElementCode()] = $o_val->getDisplayValue();
                                     }
                                 }
                                 $t_instance->_editAttribute($vo_attr->getAttributeID(), $va_value);
                                 break;
                             case 'addifempty':
                                 $vo_attr = array_pop($va_attr);
                                 $va_value = array($va_parts[2] => $vs_value);
                                 $vb_update = false;
                                 foreach ($vo_attr->getValues() as $o_val) {
                                     if ($o_val->getElementCode() != $va_parts[2]) {
                                         $va_value[$o_val->getElementCode()] = $o_val->getDisplayValue();
                                     } else {
                                         if (!$o_val->getDisplayValue()) {
                                             $vb_update = true;
                                         }
                                     }
                                 }
                                 if ($vb_update) {
                                     $t_instance->editAttribute($vo_attr->getAttributeID(), $va_parts[1], $va_value);
                                 }
                                 break;
                             default:
                                 Debug::msg("[prepopulateFields()] unsupported mode {$vs_mode} for target bundle");
                                 break;
                         }
                         break;
                     case 0:
                         // if no container value exists, always add it (ignoring mode)
                         $t_instance->addAttribute(array($va_parts[2] => $vs_value, 'locale_id' => $g_ui_locale_id), $va_parts[1]);
                         break;
                     default:
                         Debug::msg("[prepopulateFields()] containers with multiple values are not supported");
                         break;
                 }
                 // labels
             } elseif ($va_parts[1] == 'preferred_labels' || $va_parts[1] == 'nonpreferred_labels') {
                 $vb_preferred = $va_parts[1] == 'preferred_labels';
                 if (!($t_label = $t_instance->getAppDatamodel()->getInstanceByTableName($t_instance->getLabelTableName(), true))) {
                     continue;
                 }
                 if (!$t_label->hasField($va_parts[2])) {
                     continue;
                 }
                 switch ($t_instance->getLabelCount($vb_preferred)) {
                     case 0:
                         // if no value exists, always add it (ignoring mode)
                         $t_instance->addLabel(array($va_parts[2] => $vs_value), $g_ui_locale_id, null, $vb_preferred);
                         break;
                     case 1:
                         switch (strtolower($vs_mode)) {
                             case 'overwrite':
                             case 'addifempty':
                                 $va_labels = $t_instance->getLabels(null, $vb_preferred ? __CA_LABEL_TYPE_PREFERRED__ : __CA_LABEL_TYPE_NONPREFERRED__);
                                 if (sizeof($va_labels)) {
                                     $va_labels = caExtractValuesByUserLocale($va_labels);
                                     $va_label = array_shift($va_labels);
                                     $va_label = $va_label[0];
                                     $va_label[$va_parts[2]] = $vs_value;
                                     $vb_update = false;
                                     if (strtolower($vs_mode) == 'overwrite') {
                                         $va_label[$va_parts[2]] = $vs_value;
                                         $vb_update = true;
                                     } else {
                                         if (strlen(trim($va_label[$va_parts[2]])) == 0) {
                                             // in addifempty mode only edit label when field is not set
                                             $va_label[$va_parts[2]] = $vs_value;
                                             $vb_update = true;
                                         }
                                     }
                                     if ($vb_update) {
                                         $t_instance->editLabel($va_label['label_id'], $va_label, $g_ui_locale_id, null, $vb_preferred);
                                     }
                                 } else {
                                     $t_instance->addLabel(array($va_parts[2] => $vs_value), $g_ui_locale_id, null, $vb_preferred);
                                 }
                                 break;
                             default:
                                 Debug::msg("[prepopulateFields()] unsupported mode {$vs_mode} for target bundle");
                                 break;
                         }
                         break;
                     default:
                         Debug::msg("[prepopulateFields()] records with multiple labels are not supported");
                         break;
                 }
             }
         }
     }
     $vn_old_mode = $t_instance->getMode();
     $t_instance->setMode(ACCESS_WRITE);
     $t_instance->update();
     $t_instance->setMode($vn_old_mode);
     //$_REQUEST['form_timestamp'] = $vn_timestamp;
     if ($t_instance->numErrors() > 0) {
         foreach ($t_instance->getErrors() as $vs_error) {
             Debug::msg("[prepopulateFields()] there was an error while updating the record: " . $vs_error);
         }
         if ($vb_we_set_transaction) {
             $t_instance->removeTransaction(false);
         }
         return false;
     }
     if ($vb_we_set_transaction) {
         $t_instance->removeTransaction(true);
     }
     return true;
 }