1<?php 2 3require_once "Services/ADT/classes/Bridges/class.ilADTSearchBridgeMulti.php"; 4 5class ilADTEnumSearchBridgeMulti extends ilADTSearchBridgeMulti 6{ 7 protected $multi_source; // [bool] 8 protected $search_mode; // [int] 9 10 const SEARCH_MODE_ALL = 1; 11 const SEARCH_MODE_ANY = 2; 12 13 public function setSearchMode($a_mode) 14 { 15 $this->search_mode = (int) $a_mode; 16 } 17 18 protected function isValidADTDefinition(ilADTDefinition $a_adt_def) 19 { 20 return ($a_adt_def instanceof ilADTEnumDefinition || 21 $a_adt_def instanceof ilADTMultiEnumDefinition); 22 } 23 24 protected function convertADTDefinitionToMulti(ilADTDefinition $a_adt_def) 25 { 26 if ($a_adt_def->getType() == "Enum") { 27 $this->multi_source = false; 28 $def = ilADTFactory::getInstance()->getDefinitionInstanceByType("MultiEnum"); 29 $def->setNumeric($a_adt_def->isNumeric()); 30 $def->setOptions($a_adt_def->getOptions()); 31 return $def; 32 } else { 33 $this->multi_source = true; 34 return $a_adt_def; 35 } 36 } 37 38 public function loadFilter() 39 { 40 $value = $this->readFilter(); 41 if ($value !== null) { 42 $this->getADT()->setSelections($value); 43 } 44 } 45 46 47 // form 48 49 public function addToForm() 50 { 51 global $DIC; 52 53 $lng = $DIC['lng']; 54 55 $def = $this->getADT()->getCopyOfDefinition(); 56 57 $options = $def->getOptions(); 58 asort($options); // ? 59 60 $cbox = new ilCheckboxGroupInputGUI($this->getTitle(), $this->getElementId()); 61 $cbox->setValue($this->getADT()->getSelections()); 62 63 foreach ($options as $value => $caption) { 64 $option = new ilCheckboxOption($caption, $value); 65 $cbox->addOption($option); 66 } 67 68 $this->addToParentElement($cbox); 69 } 70 71 public function importFromPost(array $a_post = null) 72 { 73 $post = $this->extractPostValues($a_post); 74 75 if ($post && $this->shouldBeImportedFromPost($post)) { 76 if ($this->getForm() instanceof ilPropertyFormGUI) { 77 $item = $this->getForm()->getItemByPostVar($this->getElementId()); 78 $item->setValue($post); 79 } elseif (array_key_exists($this->getElementId(), $this->table_filter_fields)) { 80 $this->table_filter_fields[$this->getElementId()]->setValue($post); 81 $this->writeFilter($post); 82 } 83 84 if (is_array($post)) { 85 $this->getADT()->setSelections($post); 86 } 87 } else { 88 $this->getADT()->setSelections(); 89 } 90 } 91 92 93 // db 94 95 public function getSQLCondition($a_element_id) 96 { 97 global $DIC; 98 99 $ilDB = $DIC['ilDB']; 100 101 if (!$this->isNull() && $this->isValid()) { 102 $type = ($this->getADT() instanceof ilADTMultiEnumText) 103 ? "text" 104 : "integer"; 105 106 if ($this->multi_source) { 107 include_once "Services/ADT/classes/Types/MultiEnum/class.ilADTMultiEnumDBBridge.php"; 108 109 // #16827 / #17087 110 $mode_concat = ($this->search_mode == self::SEARCH_MODE_ANY) 111 ? " OR " 112 : " AND "; 113 114 $parts = array(); 115 foreach ($this->getADT()->getSelections() as $item) { 116 $item = "%" . ilADTMultiEnumDBBridge::SEPARATOR . 117 $item . 118 ilADTMultiEnumDBBridge::SEPARATOR . "%"; 119 $parts[] = $ilDB->like($a_element_id, "text", $item, false); 120 } 121 return "(" . implode($mode_concat, $parts) . ")"; 122 } 123 124 return $ilDB->in($a_element_id, $this->getADT()->getSelections(), "", $type); 125 } 126 } 127 128 public function isInCondition(ilADT $a_adt) 129 { 130 assert($a_adt instanceof ilADTMultiEnum); 131 132 $current = $this->getADT()->getSelections(); 133 if (is_array($current) && 134 sizeof($current)) { 135 // #16827 / #17087 136 if ($this->search_mode == self::SEARCH_MODE_ANY) { 137 foreach ((array) $a_adt->getSelections() as $value) { 138 if (in_array($value, $current)) { 139 return true; 140 } 141 } 142 } else { 143 // #18028 144 return !(bool) sizeof(array_diff($current, (array) $a_adt->getSelections())); 145 } 146 } 147 return false; 148 } 149 150 151 // import/export 152 153 public function getSerializedValue() 154 { 155 if (!$this->isNull() && $this->isValid()) { 156 return serialize($this->getADT()->getSelections()); 157 } 158 } 159 160 public function setSerializedValue($a_value) 161 { 162 $a_value = unserialize($a_value); 163 if (is_array($a_value)) { 164 $this->getADT()->setSelections($a_value); 165 } 166 } 167} 168