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