ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
class.ilDclSelectionFieldModel.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
9{
10 const SELECTION_TYPE_SINGLE = 'selection_type_single';
11 const SELECTION_TYPE_MULTI = 'selection_type_multi';
12 const SELECTION_TYPE_COMBOBOX = 'selection_type_combobox';
13
14 // those should be overwritten by subclasses
17
21 public function getValidFieldProperties()
22 {
23 return array(static::PROP_SELECTION_OPTIONS, static::PROP_SELECTION_TYPE);
24 }
25
33 public function getRecordQueryFilterObject($filter_value = "", ilDclBaseFieldModel $sort_field = null)
34 {
35 global $DIC;
36 $ilDB = $DIC['ilDB'];
37
38 $join_str =
39 " INNER JOIN il_dcl_record_field AS filter_record_field_{$this->getId()} ON (filter_record_field_{$this->getId()}.record_id = record.id AND filter_record_field_{$this->getId()}.field_id = "
40 . $ilDB->quote($this->getId(), 'integer') . ") ";
41
42 if ($this->isMulti()) {
43 $join_str .= " INNER JOIN il_dcl_stloc{$this->getStorageLocation()}_value AS filter_stloc_{$this->getId()} ON (filter_stloc_{$this->getId()}.record_field_id = filter_record_field_{$this->getId()}.id AND (" .
44 "filter_stloc_{$this->getId()}.value = " . $ilDB->quote("[$filter_value]", 'text') . " OR " .
45 "filter_stloc_{$this->getId()}.value LIKE " . $ilDB->quote("%\"$filter_value\"%", 'text') . " OR " .
46 "filter_stloc_{$this->getId()}.value LIKE " . $ilDB->quote("%,$filter_value,%", 'text') . " OR " .
47 "filter_stloc_{$this->getId()}.value LIKE " . $ilDB->quote("%[$filter_value,%", 'text') . " OR " .
48 "filter_stloc_{$this->getId()}.value LIKE " . $ilDB->quote("%,$filter_value]%", 'text') .
49 ")) ";
50 } else {
51 $join_str .=
52 " INNER JOIN il_dcl_stloc{$this->getStorageLocation()}_value AS filter_stloc_{$this->getId()} ON (filter_stloc_{$this->getId()}.record_field_id = filter_record_field_{$this->getId()}.id AND filter_stloc_{$this->getId()}.value = "
53 . $ilDB->quote($filter_value, 'integer') . ") ";
54 }
55
56 $sql_obj = new ilDclRecordQueryObject();
57 $sql_obj->setJoinStatement($join_str);
58
59 return $sql_obj;
60 }
61
62 public function isMulti()
63 {
64 return ($this->getProperty(static::PROP_SELECTION_TYPE) == self::SELECTION_TYPE_MULTI);
65 }
66
73 {
75
76 $field_props = $this->getValidFieldProperties();
77 foreach ($field_props as $property) {
78 $value = $form->getInput($representation->getPropertyInputFieldId($property));
79
80 // break down the multidimensional array from the multi input
81 // e.g.: { [0] => { [0] => 'x' }, [1] => { [1] => 'y' } } TO { [0] => 'x', [1] => 'y' }
82 if (is_array($value)) {
83 foreach ($value as $k => $v) {
84 if (is_array($v)) {
85 $value[$k] = array_shift($v);
86 }
87 }
88 }
89
90 // save non empty values and set them to null, when they already exist. Do not override plugin-hook when already set.
91 if (!empty($value) || ($this->getPropertyInstance($property) != null && $property != self::PROP_PLUGIN_HOOK_NAME)) {
92 $this->setProperty($property, $value);
93 }
94 }
95 }
96
97
104 {
105 $values = array(
106 'table_id' => $this->getTableId(),
107 'field_id' => $this->getId(),
108 'title' => $this->getTitle(),
109 'datatype' => $this->getDatatypeId(),
110 'description' => $this->getDescription(),
111 'required' => $this->getRequired(),
112 'unique' => $this->isUnique(),
113 );
114
115 $properties = $this->getValidFieldProperties();
116 foreach ($properties as $prop) {
117 if ($prop == static::PROP_SELECTION_OPTIONS) {
119 $prop_values = array();
120 foreach ($options as $option) {
121 // the 'selection_value' is for a correct input
122 $prop_values[$option->getOptId()] = array('selection_value' => $option->getValue());
123 }
124
125 $values['prop_' . $prop] = $prop_values;
126 } else {
127 $values['prop_' . $prop] = $this->getProperty($prop);
128 }
129 }
130
131 $form->setValuesByArray($values);
132
133 return true;
134 }
135
136
141 public function setProperty($key, $value)
142 {
143 $is_update = $this->getProperty($key);
144 switch ($key) {
145 case static::PROP_SELECTION_OPTIONS:
146
148 $sorting = 1;
149 foreach ($value as $id => $val) {
150 ilDclSelectionOption::storeOption($this->getId(), $id, $sorting, $val);
151 $sorting++;
152 }
153 // if the field is not being created reorder the options in the existing record fields
154 if ($is_update) {
155 $this->reorderExistingValues();
156 }
157 break;
158 case static::PROP_SELECTION_TYPE:
159 $will_be_multi = ($value == self::SELECTION_TYPE_MULTI);
160 // if the "Multi" property has changed, adjust the record field values
161 if ($is_update && ($this->isMulti() && !$will_be_multi || !$this->isMulti() && $will_be_multi)) {
162 $this->multiPropertyChanged($will_be_multi);
163 }
164 parent::setProperty($key, $value)->store();
165 break;
166 default:
167 parent::setProperty($key, $value)->store();
168 }
169 }
170
171
175 public function reorderExistingValues()
176 {
178 // loop each record(-field)
179 foreach (ilDclCache::getTableCache($this->getTableId())->getRecords() as $record) {
180 $record_field = $record->getRecordField($this->getId());
181 $record_field_value = $record_field->getValue();
182
183 if (is_array($record_field_value) && count($record_field_value) > 1) {
184 $sorted_array = array();
185 // $options has the right order, so loop those
186 foreach ($options as $option) {
187 if (in_array($option->getOptId(), $record_field_value)) {
188 $sorted_array[] = $option->getOptId();
189 }
190 }
191 $record_field->setValue($sorted_array);
192 $record_field->doUpdate();
193 }
194 }
195 }
196
197
203 protected function multiPropertyChanged($is_multi_now)
204 {
205 foreach (ilDclCache::getTableCache($this->getTableId())->getRecords() as $record) {
206 $record_field = $record->getRecordField($this->getId());
207 $record_field_value = $record_field->getValue();
208
209 if ($record_field_value && !is_array($record_field_value) && $is_multi_now) {
210 $record_field->setValue(array($record_field_value));
211 $record_field->doUpdate();
212 } elseif (is_array($record_field_value) && !$is_multi_now) {
213 $record_field->setValue(array_shift($record_field_value));
214 $record_field->doUpdate();
215 }
216 }
217 }
218
224 public function getProperty($key)
225 {
226 switch ($key) {
227 case static::PROP_SELECTION_OPTIONS:
229 break;
230 default:
231 return parent::getProperty($key);
232 }
233 }
234
235
242 public function getRecordQuerySortObject($direction = "asc", $sort_by_status = false)
243 {
244 global $DIC;
245 $ilDB = $DIC['ilDB'];
246
247 if ($this->isMulti()) {
248 return null;
249 }
250
251 $sql_obj = new ilDclRecordQueryObject();
252
253 $select_str = "sel_opts_{$this->getId()}.value AS field_{$this->getId()}";
254 $join_str = "LEFT JOIN il_dcl_record_field AS sort_record_field_{$this->getId()} ON (sort_record_field_{$this->getId()}.record_id = record.id AND sort_record_field_{$this->getId()}.field_id = "
255 . $ilDB->quote($this->getId(), 'integer') . ") ";
256 $join_str .= "LEFT JOIN il_dcl_stloc{$this->getStorageLocation()}_value AS sort_stloc_{$this->getId()} ON (sort_stloc_{$this->getId()}.record_field_id = sort_record_field_{$this->getId()}.id) ";
257 //if ($this->isMulti()) {
258 // $join_str .= "LEFT JOIN il_dcl_sel_opts as sel_opts_{$this->getId()} ON (sel_opts_{$this->getId()}.opt_id = sort_stloc_{$this->getId()}.value->'$[0]' AND sel_opts_{$this->getId()}.field_id = " . $ilDB->quote($this->getId(), 'integer') . ") ";
259 //} else {
260 $join_str .= "LEFT JOIN il_dcl_sel_opts as sel_opts_{$this->getId()} ON (sel_opts_{$this->getId()}.opt_id = sort_stloc_{$this->getId()}.value AND sel_opts_{$this->getId()}.field_id = " . $ilDB->quote($this->getId(), 'integer') . ") ";
261 //}
262
263
264
265 $sql_obj->setSelectStatement($select_str);
266 $sql_obj->setJoinStatement($join_str);
267 $sql_obj->setOrderStatement("field_{$this->getId()} {$direction}");
268
269
270 return $sql_obj;
271 }
272
273
274 public function cloneProperties(ilDclBaseFieldModel $originalField)
275 {
276 parent::cloneProperties($originalField);
278 foreach ($options as $opt) {
279 $new_opt = new ilDclSelectionOption();
280 $new_opt->cloneOption($opt);
281 $new_opt->setFieldId($this->getId());
282 $new_opt->store();
283 }
284 }
285
286
290 public function doDelete()
291 {
292 foreach (ilDclSelectionOption::getAllForField($this->getId()) as $option) {
293 $option->delete();
294 }
295 parent::doDelete();
296 }
297
298
303 {
304 $will_be_multi = ($form->getInput('prop_' . static::PROP_SELECTION_TYPE) == self::SELECTION_TYPE_MULTI);
305 return $this->isMulti() && !$will_be_multi;
306 }
307
308
313 {
314 global $DIC;
316 $prop_selection_options = $representation->getPropertyInputFieldId(static::PROP_SELECTION_OPTIONS);
317 $prop_selection_type = $representation->getPropertyInputFieldId(static::PROP_SELECTION_TYPE);
318
319 $ilConfirmationGUI = parent::getConfirmationGUI($form);
320 $ilConfirmationGUI->setHeaderText($DIC->language()->txt('dcl_msg_mc_to_sc_confirmation'));
321 $ilConfirmationGUI->addHiddenItem($prop_selection_type, $form->getInput($prop_selection_type));
322 foreach ($form->getInput($prop_selection_options) as $key => $option) {
323 $ilConfirmationGUI->addHiddenItem($prop_selection_options . "[$key][selection_value]", $option['selection_value']);
324 }
325 return $ilConfirmationGUI;
326 }
327}
if(!isset( $_REQUEST[ 'ReturnTo'])) if(!isset($_REQUEST['AuthId'])) $options
Definition: as_login.php:20
An exception for terminatinating execution or to throw for unit testing.
Class ilDclBaseFieldModel.
getPropertyInstance($key)
Return ActiveRecord of property.
getRequired()
Get Required Required.
static getTableCache($table_id=0)
static getFieldRepresentationInstance(ilDclBaseFieldModel $field)
Returns FieldRepresentation from BaseFieldModel.
Class ilDclRecordQueryObject.
Class ilDclSelectionFieldModel.
fillPropertiesForm(ilPropertyFormGUI &$form)
doDelete()
Remove field and properties.
cloneProperties(ilDclBaseFieldModel $originalField)
reorderExistingValues()
sorts record field values by the new order
getConfirmationGUI(ilPropertyFormGUI $form)
called by ilDclFieldEditGUI if isConfirmationRequired returns trueilConfirmationGUI
multiPropertyChanged($is_multi_now)
changes the values of all record fields, since the property "multi" has changed
getRecordQueryFilterObject($filter_value="", ilDclBaseFieldModel $sort_field=null)
Returns a query-object for building the record-loader-sql-query.
storePropertiesFromForm(ilPropertyFormGUI $form)
called when saving the 'edit field' form
getRecordQuerySortObject($direction="asc", $sort_by_status=false)
isConfirmationRequired(ilPropertyFormGUI $form)
called by ilDclFieldEditGUI when updating field properties if you overwrite this method,...
Class ilDclSelectionOption.
This class represents a property form user interface.
$key
Definition: croninfo.php:18
if(isset($_POST['submit'])) $form
global $DIC
Definition: saml.php:7
global $ilDB