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
15  const PROP_SELECTION_TYPE = '';
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;
315  $representation = ilDclFieldFactory::getFieldRepresentationInstance($this);
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 }
Class ilDclBaseFieldModel.
This class represents a property form user interface.
Class ilDclRecordQueryObject.
global $DIC
Definition: saml.php:7
static getFieldRepresentationInstance(ilDclBaseFieldModel $field)
Returns FieldRepresentation from BaseFieldModel.
getRecordQueryFilterObject($filter_value="", ilDclBaseFieldModel $sort_field=null)
Returns a query-object for building the record-loader-sql-query.
getPropertyInstance($key)
Return ActiveRecord of property.
cloneProperties(ilDclBaseFieldModel $originalField)
static getTableCache($table_id=0)
fillPropertiesForm(ilPropertyFormGUI &$form)
if(isset($_POST['submit'])) $form
Class ilDclSelectionFieldModel.
getRequired()
Get Required Required.
multiPropertyChanged($is_multi_now)
changes the values of all record fields, since the property "multi" has changed
getInput($a_post_var, $ensureValidation=true)
Returns the value of a HTTP-POST variable, identified by the passed id.
Create styles array
The data for the language used.
getDescription()
Get description.
storePropertiesFromForm(ilPropertyFormGUI $form)
called when saving the &#39;edit field&#39; form
isConfirmationRequired(ilPropertyFormGUI $form)
getRecordQuerySortObject($direction="asc", $sort_by_status=false)
global $ilDB
Class ilDclSelectionOption.
$key
Definition: croninfo.php:18
setValuesByArray($a_values, $a_restrict_to_value_keys=false)
Set form values from an array.
reorderExistingValues()
sorts record field values by the new order
if(!isset($_REQUEST['ReturnTo'])) if(!isset($_REQUEST['AuthId'])) $options
Definition: as_login.php:20
getDatatypeId()
Get datatype_id.
getConfirmationGUI(ilPropertyFormGUI $form)