|
Moodle
2.2.1
http://www.collinsharper.com
|
00001 <?php 00002 00003 // This file is part of Moodle - http://moodle.org/ 00004 // 00005 // Moodle is free software: you can redistribute it and/or modify 00006 // it under the terms of the GNU General Public License as published by 00007 // the Free Software Foundation, either version 3 of the License, or 00008 // (at your option) any later version. 00009 // 00010 // Moodle is distributed in the hope that it will be useful, 00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 // GNU General Public License for more details. 00014 // 00015 // You should have received a copy of the GNU General Public License 00016 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 00017 00030 abstract class setting_dependency { 00031 00039 const DISABLED_VALUE = 0; 00040 const DISABLED_NOT_VALUE = 1; 00041 const DISABLED_TRUE = 2; 00042 const DISABLED_FALSE = 3; 00043 const DISABLED_CHECKED = 4; 00044 const DISABLED_NOT_CHECKED = 5; 00045 const DISABLED_EMPTY = 6; 00046 const DISABLED_NOT_EMPTY = 7; 00047 00052 protected $setting; 00057 protected $dependentsetting; 00062 protected $defaultvalue; 00067 protected $lastvalue; 00074 public function __construct(base_setting $setting, base_setting $dependentsetting, $defaultvalue = false) { 00075 $this->setting = $setting; 00076 $this->dependentsetting = $dependentsetting; 00077 $this->defaultvalue = $defaultvalue; 00078 $this->lastvalue = $dependentsetting->get_value(); 00079 } 00080 00084 public function destroy() { 00085 // No need to destroy anything recursively here, direct reset 00086 $this->setting = null; 00087 $this->dependentsetting = null; 00088 } 00089 00096 final public function process_change($changetype, $oldvalue) { 00097 // Check the type of change requested 00098 switch ($changetype) { 00099 // Process a status change 00100 case base_setting::CHANGED_STATUS: return $this->process_status_change($oldvalue); 00101 // Process a visibility change 00102 case base_setting::CHANGED_VISIBILITY: return $this->process_visibility_change($oldvalue); 00103 // Process a value change 00104 case base_setting::CHANGED_VALUE: return $this->process_value_change($oldvalue); 00105 } 00106 // Throw an exception if we get this far 00107 throw new backup_ui_exception('unknownchangetype'); 00108 } 00114 protected function process_visibility_change($oldvisibility) { 00115 // Store the current dependent settings visibility for comparison 00116 $prevalue = $this->dependentsetting->get_visibility(); 00117 // Set it regardless of whether we need to 00118 $this->dependentsetting->set_visibility($this->setting->get_visibility()); 00119 // Return true if it changed 00120 return ($prevalue != $this->dependentsetting->get_visibility()); 00121 } 00126 abstract protected function process_status_change($oldstatus); 00130 abstract protected function process_value_change($oldvalue); 00135 public function get_setting() { 00136 return $this->setting; 00137 } 00142 public function get_dependent_setting() { 00143 return $this->dependentsetting; 00144 } 00148 abstract public function enforce(); 00154 abstract public function get_moodleform_properties(); 00159 abstract public function is_locked(); 00160 } 00161 00169 class setting_dependency_disabledif_equals extends setting_dependency { 00174 protected $value; 00183 public function __construct(base_setting $setting, base_setting $dependentsetting, $value, $defaultvalue = false) { 00184 parent::__construct($setting, $dependentsetting, $defaultvalue); 00185 $this->value = ($value)?(string)$value:0; 00186 } 00191 public function is_locked() { 00192 // If the setting is locked or the dependent setting should be locked then return true 00193 if ($this->setting->get_status() !== base_setting::NOT_LOCKED || $this->setting->get_value() == $this->value) { 00194 return true; 00195 } 00196 // Else return based upon the dependent settings status 00197 return ($this->dependentsetting->get_status() !== base_setting::NOT_LOCKED); 00198 } 00204 protected function process_value_change($oldvalue) { 00205 $prevalue = $this->dependentsetting->get_value(); 00206 // If the setting is the desired value enact the dependency 00207 if ($this->setting->get_value() == $this->value) { 00208 // The dependent setting needs to be locked by hierachy and set to the 00209 // default value. 00210 $this->dependentsetting->set_status(base_setting::LOCKED_BY_HIERARCHY); 00211 $this->dependentsetting->set_value($this->defaultvalue); 00212 } else if ($this->dependentsetting->get_status() == base_setting::LOCKED_BY_HIERARCHY) { 00213 // We can unlock the dependent setting 00214 $this->dependentsetting->set_status(base_setting::NOT_LOCKED); 00215 } 00216 // Return true if the value has changed for the dependent setting 00217 return ($prevalue != $this->dependentsetting->get_value()); 00218 } 00224 protected function process_status_change($oldstatus) { 00225 // Store the dependent status 00226 $prevalue = $this->dependentsetting->get_status(); 00227 // Store the current status 00228 $currentstatus = $this->setting->get_status(); 00229 if ($currentstatus == base_setting::NOT_LOCKED) { 00230 if ($prevalue == base_setting::LOCKED_BY_HIERARCHY && $this->setting->get_value() != $this->value) { 00231 // Dependency has changes, is not fine, unlock the dependent setting 00232 $this->dependentsetting->set_status(base_setting::NOT_LOCKED); 00233 } 00234 } else { 00235 // Make sure the dependent setting is also locked, in this case by hierarchy 00236 $this->dependentsetting->set_status(base_setting::LOCKED_BY_HIERARCHY); 00237 } 00238 // Return true if the dependent setting has changed. 00239 return ($prevalue != $this->dependentsetting->get_status()); 00240 } 00245 public function enforce() { 00246 // This will be set to true if ANYTHING changes 00247 $changes = false; 00248 // First process any value changes 00249 if ($this->process_value_change($this->setting->get_value())) { 00250 $changes = true; 00251 } 00252 // Second process any status changes 00253 if ($this->process_status_change($this->setting->get_status())) { 00254 $changes = true; 00255 } 00256 // Finally process visibility changes 00257 if ($this->process_visibility_change($this->setting->get_visibility())) { 00258 $changes = true; 00259 } 00260 return $changes; 00261 } 00267 public function get_moodleform_properties() { 00268 return array( 00269 'setting'=>$this->dependentsetting->get_ui_name(), 00270 'dependenton'=>$this->setting->get_ui_name(), 00271 'condition'=>'eq', 00272 'value'=>$this->value 00273 ); 00274 } 00275 } 00276 00284 class setting_dependency_disabledif_not_equals extends setting_dependency_disabledif_equals { 00289 public function enforce() { 00290 // This will be set to true if ANYTHING changes 00291 $changes = false; 00292 // First process any value changes 00293 if (!$this->process_value_change($this->setting->get_value())) { 00294 $changes = true; 00295 } 00296 // Second process any status changes 00297 if ($this->process_status_change($this->setting->get_status())) { 00298 $changes = true; 00299 } 00300 // Finally process visibility changes 00301 if ($this->process_visibility_change($this->setting->get_visibility())) { 00302 $changes = true; 00303 } 00304 return $changes; 00305 } 00311 public function get_moodleform_properties() { 00312 return array( 00313 'setting'=>$this->dependentsetting->get_ui_name(), 00314 'dependenton'=>$this->setting->get_ui_name(), 00315 'condition'=>'notequal', 00316 'value'=>$this->value 00317 ); 00318 } 00319 } 00320 00321 //with array 00322 class setting_dependency_disabledif_equals2 extends setting_dependency { 00327 protected $value; 00336 public function __construct(base_setting $setting, base_setting $dependentsetting, array $value, $defaultvalue = false) { 00337 parent::__construct($setting, $dependentsetting, $defaultvalue); 00338 $this->value = $value; 00339 } 00344 public function is_locked() { 00345 // If the setting is locked or the dependent setting should be locked then return true 00346 if ($this->setting->get_status() !== base_setting::NOT_LOCKED || in_array($this->setting->get_value(), $this->value)) { 00347 return true; 00348 } 00349 // Else return based upon the dependent settings status 00350 return ($this->dependentsetting->get_status() !== base_setting::NOT_LOCKED); 00351 } 00357 protected function process_value_change($oldvalue) { 00358 $prevalue = $this->dependentsetting->get_value(); 00359 // If the setting is the desired value enact the dependency 00360 if (in_array($this->setting->get_value(), $this->value)) { 00361 // The dependent setting needs to be locked by hierachy and set to the 00362 // default value. 00363 $this->dependentsetting->set_status(base_setting::LOCKED_BY_HIERARCHY); 00364 $this->dependentsetting->set_value($this->defaultvalue); 00365 } else if ($this->dependentsetting->get_status() == base_setting::LOCKED_BY_HIERARCHY) { 00366 // We can unlock the dependent setting 00367 $this->dependentsetting->set_status(base_setting::NOT_LOCKED); 00368 } 00369 // Return true if the value has changed for the dependent setting 00370 return ($prevalue != $this->dependentsetting->get_value()); 00371 } 00377 protected function process_status_change($oldstatus) { 00378 // Store the dependent status 00379 $prevalue = $this->dependentsetting->get_status(); 00380 // Store the current status 00381 $currentstatus = $this->setting->get_status(); 00382 if ($currentstatus == base_setting::NOT_LOCKED) { 00383 if ($prevalue == base_setting::LOCKED_BY_HIERARCHY && !in_array($this->setting->get_value(), $this->value)) { 00384 // Dependency has changes, is not fine, unlock the dependent setting 00385 $this->dependentsetting->set_status(base_setting::NOT_LOCKED); 00386 } 00387 } else { 00388 // Make sure the dependent setting is also locked, in this case by hierarchy 00389 $this->dependentsetting->set_status(base_setting::LOCKED_BY_HIERARCHY); 00390 } 00391 // Return true if the dependent setting has changed. 00392 return ($prevalue != $this->dependentsetting->get_status()); 00393 } 00398 public function enforce() { 00399 // This will be set to true if ANYTHING changes 00400 $changes = false; 00401 // First process any value changes 00402 if ($this->process_value_change($this->setting->get_value())) { 00403 $changes = true; 00404 } 00405 // Second process any status changes 00406 if ($this->process_status_change($this->setting->get_status())) { 00407 $changes = true; 00408 } 00409 // Finally process visibility changes 00410 if ($this->process_visibility_change($this->setting->get_visibility())) { 00411 $changes = true; 00412 } 00413 return $changes; 00414 } 00420 public function get_moodleform_properties() { 00421 return array( 00422 'setting'=>$this->dependentsetting->get_ui_name(), 00423 'dependenton'=>$this->setting->get_ui_name(), 00424 'condition'=>'eq', 00425 'value'=>$this->value 00426 ); 00427 } 00428 } 00429 00430 00438 class setting_dependency_disabledif_checked extends setting_dependency_disabledif_equals { 00439 public function __construct(base_setting $setting, base_setting $dependentsetting, $defaultvalue = false) { 00440 parent::__construct($setting, $dependentsetting, true, $defaultvalue); 00441 $this->value = true; 00442 } 00448 public function get_moodleform_properties() { 00449 return array( 00450 'setting'=>$this->dependentsetting->get_ui_name(), 00451 'dependenton'=>$this->setting->get_ui_name(), 00452 'condition'=>'checked' 00453 ); 00454 } 00455 } 00456 00464 class setting_dependency_disabledif_not_checked extends setting_dependency_disabledif_equals { 00465 public function __construct(base_setting $setting, base_setting $dependentsetting, $defaultvalue = false) { 00466 parent::__construct($setting, $dependentsetting, false, $defaultvalue); 00467 $this->value = false; 00468 } 00474 public function get_moodleform_properties() { 00475 return array( 00476 'setting'=>$this->dependentsetting->get_ui_name(), 00477 'dependenton'=>$this->setting->get_ui_name(), 00478 'condition'=>'notchecked' 00479 ); 00480 } 00481 } 00482 00490 class setting_dependency_disabledif_not_empty extends setting_dependency_disabledif_equals { 00491 public function __construct(base_setting $setting, base_setting $dependentsetting, $defaultvalue = false) { 00492 parent::__construct($setting, $dependentsetting, false, $defaultvalue); 00493 $this->value = false; 00494 } 00500 public function get_moodleform_properties() { 00501 return array( 00502 'setting'=>$this->dependentsetting->get_ui_name(), 00503 'dependenton'=>$this->setting->get_ui_name(), 00504 'condition'=>'notequal', 00505 'value'=>'' 00506 ); 00507 } 00513 protected function process_value_change($oldvalue) { 00514 $prevalue = $this->dependentsetting->get_value(); 00515 // If the setting is the desired value enact the dependency 00516 $value = $this->setting->get_value(); 00517 if (!empty($value)) { 00518 // The dependent setting needs to be locked by hierachy and set to the 00519 // default value. 00520 $this->dependentsetting->set_status(base_setting::LOCKED_BY_HIERARCHY); 00521 if ($this->defaultvalue === false) { 00522 $this->dependentsetting->set_value($value); 00523 } else { 00524 $this->dependentsetting->set_value($this->defaultvalue); 00525 } 00526 } else if ($this->dependentsetting->get_status() == base_setting::LOCKED_BY_HIERARCHY) { 00527 // We can unlock the dependent setting 00528 $this->dependentsetting->set_status(base_setting::NOT_LOCKED); 00529 } 00530 // Return true if the value has changed for the dependent setting 00531 return ($prevalue != $this->dependentsetting->get_value()); 00532 } 00533 00538 public function is_locked() { 00539 // If the setting is locked or the dependent setting should be locked then return true 00540 if ($this->setting->get_status() !== base_setting::NOT_LOCKED || !empty($value)) { 00541 return true; 00542 } 00543 // Else return based upon the dependent settings status 00544 return ($this->dependentsetting->get_status() !== base_setting::NOT_LOCKED); 00545 } 00546 } 00547 00555 class setting_dependency_disabledif_empty extends setting_dependency_disabledif_equals { 00556 public function __construct(base_setting $setting, base_setting $dependentsetting, $defaultvalue = false) { 00557 parent::__construct($setting, $dependentsetting, false, $defaultvalue); 00558 $this->value = false; 00559 } 00565 public function get_moodleform_properties() { 00566 return array( 00567 'setting'=>$this->dependentsetting->get_ui_name(), 00568 'dependenton'=>$this->setting->get_ui_name(), 00569 'condition'=>'notequal', 00570 'value'=>'' 00571 ); 00572 } 00578 protected function process_value_change($oldvalue) { 00579 $prevalue = $this->dependentsetting->get_value(); 00580 // If the setting is the desired value enact the dependency 00581 $value = $this->setting->get_value(); 00582 if (empty($value)) { 00583 // The dependent setting needs to be locked by hierachy and set to the 00584 // default value. 00585 $this->dependentsetting->set_status(base_setting::LOCKED_BY_HIERARCHY); 00586 if ($this->defaultvalue === false) { 00587 $this->dependentsetting->set_value($value); 00588 } else { 00589 $this->dependentsetting->set_value($this->defaultvalue); 00590 } 00591 } else if ($this->dependentsetting->get_status() == base_setting::LOCKED_BY_HIERARCHY) { 00592 // We can unlock the dependent setting 00593 $this->dependentsetting->set_status(base_setting::NOT_LOCKED); 00594 } 00595 // Return true if the value has changed for the dependent setting 00596 return ($prevalue != $this->dependentsetting->get_value()); 00597 } 00602 public function is_locked() { 00603 // If the setting is locked or the dependent setting should be locked then return true 00604 if ($this->setting->get_status() !== base_setting::NOT_LOCKED || empty($value)) { 00605 return true; 00606 } 00607 // Else return based upon the dependent settings status 00608 return ($this->dependentsetting->get_status() !== base_setting::NOT_LOCKED); 00609 } 00610 }