/** * Query data for given object records * * @param * @return */ public static function queryForRecords($a_obj_id, $a_subtype, $a_records, $a_obj_id_key, $a_obj_subid_key, array $a_amet_filter = null) { $result = array(); if (!is_array($a_obj_id)) { $a_obj_id = array($a_obj_id); } $sub_obj_ids = array(); foreach ($a_records as $rec) { $sub_obj_ids[] = $rec[$a_obj_subid_key]; } // preload adv data for object id(s) ilADTFactory::getInstance()->initActiveRecordByType(); ilADTActiveRecordByType::preloadByPrimary("adv_md_values", array("obj_id" => array("integer", $a_obj_id), "sub_type" => array("text", $a_subtype), "sub_id" => array("integer", $sub_obj_ids))); $record_groups = array(); foreach ($a_records as $rec) { $obj_id = $rec[$a_obj_id_key]; $sub_id = $rec[$a_obj_subid_key]; // only active amet records for glossary foreach (ilAdvancedMDRecord::_getSelectedRecordsByObject(ilObject::_lookupType($obj_id), $obj_id, $a_subtype) as $adv_record) { $record_id = $adv_record->getRecordId(); if (!isset($record_groups[$record_id])) { $defs = ilAdvancedMDFieldDefinition::getInstancesByRecordId($record_id); $record_groups[$record_id] = ilAdvancedMDFieldDefinition::getADTGroupForDefinitions($defs); $record_groups[$record_id] = ilADTFactory::getInstance()->getDBBridgeForInstance($record_groups[$record_id]); $record_groups[$record_id]->setTable("adv_md_values"); } // prepare ADT group for record id $record_groups[$record_id]->setPrimary(array("obj_id" => array("integer", $obj_id), "sub_type" => array("text", $a_subtype), "sub_id" => array("integer", $sub_id))); // multi-enum fakes single in adv md foreach ($record_groups[$record_id]->getElements() as $element) { if ($element->getADT()->getType() == "MultiEnum") { $element->setFakeSingle(true); } } // read (preloaded) data $active_record = new ilADTActiveRecordByType($record_groups[$record_id]); $active_record->setElementIdColumn("field_id", "integer"); $active_record->read(); $adt_group = $record_groups[$record_id]->getADT(); // filter against amet values if ($a_amet_filter) { foreach ($a_amet_filter as $field_id => $element) { if ($adt_group->hasElement($field_id)) { if (!$element->isInCondition($adt_group->getElement($field_id))) { continue 3; } } } } // add amet values to glossary term record foreach ($adt_group->getElements() as $element_id => $element) { if (!$element->isNull()) { // we are reusing the ADT group for all $a_records, so we need to clone $pb = ilADTFactory::getInstance()->getPresentationBridgeForInstance(clone $element); $rec["md_" . $element_id] = $pb->getSortable(); $rec["md_" . $element_id . "_presentation"] = $pb; } else { $rec["md_" . $element_id] = null; } } } $results[] = $rec; } return $results; }
/** * Search * * @param ilADTSearchBridge $a_adt_search * @param ilQueryParser $a_parser * @param array $a_object_types * @param string $a_locate * @param string $a_search_type * @return array */ public function searchObjects(ilADTSearchBridge $a_adt_search, ilQueryParser $a_parser, array $a_object_types, $a_locate, $a_search_type) { // :TODO: search type (like, fulltext) include_once 'Services/ADT/classes/ActiveRecord/class.ilADTActiveRecordByType.php'; $condition = $a_adt_search->getSQLCondition(ilADTActiveRecordByType::SINGLE_COLUMN_NAME, ilADTTextSearchBridgeSingle::SQL_LIKE, $a_parser->getQuotedWords()); if ($condition) { $objects = ilADTActiveRecordByType::find("adv_md_values", $this->getADT()->getType(), $this->getFieldId(), $condition, $a_locate); if (sizeof($objects)) { return $this->parseSearchObjects($objects, $a_object_types); } return array(); } }
public function update() { if (sizeof($this->confirmed_objects)) { // we need the "old" options for the search $def = $this->getADTDefinition(); $def = clone $def; $def->setOptions(array_combine($this->old_options, $this->old_options)); $search = ilADTFactory::getInstance()->getSearchBridgeForDefinitionInstance($def, false, false); ilADTFactory::initActiveRecordByType(); foreach ($this->confirmed_objects as $old_option => $item_ids) { // get complete old values $old_values = array(); foreach ($this->findBySingleValue($search, $old_option) as $item) { $old_values[$item[0] . "_" . $item[1] . "_" . $item[2]] = $item[3]; } foreach ($item_ids as $item => $new_option) { $parts = explode("_", $item); $obj_id = $parts[0]; $sub_type = $parts[1]; $sub_id = $parts[2]; if (!$new_option) { // remove existing value $primary = array("obj_id" => array("integer", $obj_id), "sub_type" => array("text", $sub_type), "sub_id" => array("integer", $sub_id), "field_id" => array("integer", $this->getFieldId())); ilADTActiveRecordByType::deleteByPrimary("adv_md_values", $primary, "MultiEnum"); } else { // update existing value (with changed option) if (isset($old_values[$item])) { // find changed option in old value $old_value = explode(ilADTMultiEnumDBBridge::SEPARATOR, $old_values[$item]); // remove separators array_shift($old_value); array_pop($old_value); $old_idx = array_keys($old_value, $old_option); if (sizeof($old_idx)) { // switch option $old_idx = array_pop($old_idx); $old_value[$old_idx] = $new_option; $new_value = array_unique($old_value); // add separators $new_value = ilADTMultiEnumDBBridge::SEPARATOR . implode(ilADTMultiEnumDBBridge::SEPARATOR, $new_value) . ilADTMultiEnumDBBridge::SEPARATOR; $primary = array("obj_id" => array("integer", $obj_id), "sub_type" => array("text", $sub_type), "sub_id" => array("integer", $sub_id), "field_id" => array("integer", $this->getFieldId())); ilADTActiveRecordByType::writeByPrimary("adv_md_values", $primary, "MultiEnum", $new_value); } } } if ($sub_type == "wpg") { // #15763 - adapt advmd page lists include_once "Modules/Wiki/classes/class.ilPCAMDPageList.php"; ilPCAMDPageList::migrateField($obj_id, $this->getFieldId(), $old_option, $new_option, true); } } } $this->confirmed_objects = array(); } parent::update(); }
public function update() { parent::update(); if (sizeof($this->confirmed_objects)) { ilADTFactory::initActiveRecordByType(); foreach ($this->confirmed_objects as $old_option => $item_ids) { foreach ($item_ids as $item => $new_option) { $item = explode("_", $item); $obj_id = $item[0]; $sub_type = $item[1]; $sub_id = $item[2]; if (!$new_option) { // remove existing value $primary = array("obj_id" => array("integer", $obj_id), "sub_type" => array("text", $sub_type), "sub_id" => array("integer", $sub_id), "field_id" => array("integer", $this->getFieldId())); ilADTActiveRecordByType::deleteByPrimary("adv_md_values", $primary, "Enum"); } else { // update existing value $primary = array("obj_id" => array("integer", $obj_id), "sub_type" => array("text", $sub_type), "sub_id" => array("integer", $sub_id), "field_id" => array("integer", $this->getFieldId())); ilADTActiveRecordByType::writeByPrimary("adv_md_values", $primary, "Enum", $new_option); } if ($sub_type == "wpg") { // #15763 - adapt advmd page lists include_once "Modules/Wiki/classes/class.ilPCAMDPageList.php"; ilPCAMDPageList::migrateField($obj_id, $this->getFieldId(), $old_option, $new_option); } } } } }
/** * Read values by (partial) primary key * * @param string $a_table * @param array $a_primary */ public static function preloadByPrimary($a_table, array $a_primary) { global $ilDB; $where = self::buildPartialPrimaryWhere($a_primary); if (!$where) { return false; } self::$preloaded = array(); foreach (array_keys(self::getTablesMap()) as $table) { $sql = "SELECT * FROM " . $a_table . "_" . $table . " WHERE " . $where; $set = $ilDB->query($sql); while ($row = $ilDB->fetchAssoc($set)) { self::$preloaded[$table][] = $row; } } return true; }
/** * Search objects * * @param ilADTSearchBridge $a_adt_search * @param ilQueryParser $a_parser * @param array $a_object_types * @param string $a_locate * @param string $a_search_type * @return array */ public function searchObjects(ilADTSearchBridge $a_adt_search, ilQueryParser $a_parser, array $a_object_types, $a_locate, $a_search_type) { // search type only supported/needed for text include_once 'Services/ADT/classes/ActiveRecord/class.ilADTActiveRecordByType.php'; $condition = $a_adt_search->getSQLCondition(ilADTActiveRecordByType::SINGLE_COLUMN_NAME); if ($condition) { $objects = ilADTActiveRecordByType::find("adv_md_values", $this->getADT()->getType(), $this->getFieldId(), $condition, $a_locate); if (sizeof($objects)) { return $this->parseSearchObjects($objects, $a_object_types); } return array(); } }
public function update() { parent::update(); if (sizeof($this->confirmed_objects)) { ilADTFactory::initActiveRecordByType(); foreach ($this->confirmed_objects as $old_option => $obj_ids) { foreach ($obj_ids as $obj_id => $new_option) { if (!$new_option) { // remove existing value $primary = array("obj_id" => array("integer", $obj_id), "field_id" => array("integer", $this->getFieldId())); ilADTActiveRecordByType::deleteByPrimary("adv_md_values", $primary, "Enum"); } else { // update existing value $primary = array("obj_id" => array("integer", $obj_id), "field_id" => array("integer", $this->getFieldId())); ilADTActiveRecordByType::writeByPrimary("adv_md_values", $primary, "Enum", $new_option); } } } } }