Moodle  2.2.1
http://www.collinsharper.com
C:/xampp/htdocs/moodle/backup/util/settings/setting_dependency.class.php
Go to the documentation of this file.
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 }
 All Data Structures Namespaces Files Functions Variables Enumerations