From a84ea986dea58ef849964ccc8842587614f6ccfd Mon Sep 17 00:00:00 2001 From: protegh Date: Fri, 1 Sep 2023 05:17:34 +0200 Subject: [PATCH] Patch for issue #49 (#228) * Patch for issue #49 * remove lib/Template.php.orig --- lib/PageRender.php | 26 ++++++++++++++++++++++++++ lib/Template.php | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/lib/PageRender.php b/lib/PageRender.php index 196f677a..d01968ae 100644 --- a/lib/PageRender.php +++ b/lib/PageRender.php @@ -360,6 +360,32 @@ class PageRender extends Visitor { else $this->drawTemplateChoice(); + # If mode is modification, use a DefaultForObjectClass template if exaclty 1 matches. Propose the template choice otherwise. + } elseif (($this->getMode() == 'modification') && (! isset($_REQUEST['template']))) { + if (DEBUGTMP) printf('%s:%s
',__METHOD__,'DEFAULTFOROBJECTCLASS template if only 1 template matches.'); + + $dn = $this->getModeContainer(); + $server = $this->getServer(); + $dnojcs = $server->getDNAttrValue($dn,'objectClass'); + $matchingtmplIDs = array(); + $unmatchingtmplIDs = array(); + $tpldefojc = array(); + foreach ($templates->getTemplates($this->getMode(),$this->getModeContainer(),true) as $tpl) { + $tpldefojc = $tpl->getDefaultForObjectClass(); + if (array_intersect($tpldefojc,$dnojcs)) { + array_push($matchingtmplIDs,$tpl->getID()); + } else { + array_push($unmatchingtmplIDs,$tpl->getID()); + } + } + if (count($matchingtmplIDs) == 0) # No matching DefaultForObjectClass found, + return 'none'; # so we use the default template. + elseif (count($matchingtmplIDs) == 1) # Exactly 1 matching DefaultForObjectClass found, + return $matchingtmplIDs[0]; # so we use it. + elseif (count($unmatchingtmplIDs) == 0) # No template found at all, + return 'none'; # so we use the default template. + else # Multiple templates found, + $this->drawTemplateChoice(); # so propose the template choice. } else { if (DEBUGTMP) printf('%s:%s
',__METHOD__,'SELECT a template to use.'); diff --git a/lib/Template.php b/lib/Template.php index 2e4978f1..96e184f7 100644 --- a/lib/Template.php +++ b/lib/Template.php @@ -37,6 +37,8 @@ class Template extends xmlTemplate { private $invalid_reason; # The TEMPLATE structural objectclasses protected $structural_oclass = array(); + # The objectclasses for which this template is the default + protected $defaultfor_oclass = array(); protected $description = ''; # Is this a read-only template (only valid in modification templates) private $readonly = false; @@ -124,6 +126,31 @@ class Template extends xmlTemplate { break; + # Record our defaultFor object Classes from the Template. + case ('defaultforobjectclasses'): + if (DEBUG_ENABLED) + debug_log('Case [%s]',4,0,__FILE__,__LINE__,__METHOD__,$xml_key); + + if (isset($xmldata['template'][$xml_key]['defaultforobjectclass'])) + if (is_array($xmldata['template'][$xml_key]['defaultforobjectclass'])) { + foreach ($xmldata['template'][$xml_key]['defaultforobjectclass'] as $index => $details) { + + # If we havent recorded this objectclass already, do so now. + if (! in_array($details,$this->defaultfor_oclass)) + array_push($this->defaultfor_oclass,$details); + } + + } else { + # XML files with only 1 objectClass dont have a numeric index. + $soc = $xmldata['template'][$xml_key]['defaultforobjectclass']; + + # If we havent recorded this objectclass already, do so now. + if (! in_array($soc,$this->defaultfor_oclass)) + array_push($this->defaultfor_oclass,$soc); + } + + break; + # Build our attribute list from the DN and Template. case ('attributes'): if (DEBUG_ENABLED) @@ -179,6 +206,7 @@ class Template extends xmlTemplate { if ($xml_key == 'invalid' && $xml_value) $this->setInvalid(_('Disabled by XML configuration'),true); + } } @@ -924,6 +952,15 @@ class Template extends xmlTemplate { $this->visible = false; } + /** + * Get the objectclasses for which this template is the default + * + * @return array The objectclasses + */ + public function getDefaultForObjectClass() { + return $this->defaultfor_oclass; + } + public function getRegExp() { if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->regexp);