Exemplo n.º 1
0
 /**
  * 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);
                 }
             }
         }
     }
 }