Code

Added some comments.
[gosa.git] / gosa-core / plugins / admin / departments / class_departmentGeneric.inc
index 4be01cddebe02cf5eb6f97a5aa7a9a312a647b00..78e514f1e2af041e3b302cd4d85cb3c5cc4e9713 100644 (file)
@@ -36,7 +36,7 @@ class department extends plugin
        var $gosaUnitTag= "";
   var $view_logged = FALSE;
 
-  var $type ="ou";
+  var $type ="organizationalUnit";
   var $namingAttr = "ou";
 
        /* Headpage attributes */
@@ -47,14 +47,38 @@ class department extends plugin
        /* attribute list for save action */
        var $attributes= array("ou", "description", "businessCategory", "st", "l", "postalAddress",
                        "telephoneNumber", "facsimileTelephoneNumber", "gosaUnitTag");
-       var $objectclasses= array("top", "gosaDepartment", "organizationalUnit");
-  var $initially_was_tagged = false;
 
+  /* Do not append the structural object classes here, they are added dynamically in the constructor */
+       var $objectclasses= array("top", "gosaDepartment");
+  var $structuralOC = array("organizationalUnit");
+
+  var $initially_was_tagged = false;
   var $orig_base = "";
   var $orig_ou = "";
 
        function department (&$config, $dn)
        {
+    /* Add the default structural obejct class 'locality' if this is a new entry
+     */
+    $ldap = $config->get_ldap_link();
+    $ldap->cd($config->current['BASE']);
+    if($dn == "" || $dn == "new" || !$ldap->dn_exists($dn)){
+      $this->objectclasses = array_merge($this->structuralOC,$this->objectclasses);
+    }else{
+      $ldap->cat($dn, array("structuralObjectClass"));
+      $attrs= $ldap->fetch();
+      if(isset($attrs['structuralObjectClass']['count'])){
+        for($i = 0 ; $i < $attrs['structuralObjectClass']['count'] ; $i++){
+          $this->objectclasses[] = $attrs['structuralObjectClass'][$i];
+        }
+      }else{
+
+        /* Could not detect structural object class for this object, fall back to the default 'locality'
+         */
+        $this->objectclasses = array_merge($this->structuralOC,$this->objectclasses);
+      }
+    }
+    $this->objectclasses = array_unique($this->objectclasses);
 
                plugin::plugin($config, $dn);
                $this->is_account= TRUE;
@@ -159,9 +183,8 @@ class department extends plugin
                }else{
                        $tmp    = array();      
                        foreach($bases as $dn=>$base){
-                               $fixed = str_replace("/","\\",$this->dn);
                                /* Only attach departments which are not a subtree of this one */
-                               if(!preg_match("/".$fixed."/",$dn)){
+        if(!preg_match("/".preg_quote($this->dn)."/",$dn)){
                                        $tmp[$dn]=$base;
                                }
                        }
@@ -186,7 +209,7 @@ class department extends plugin
     $dep_types = departmentManagement::get_support_departments();
     $tpl ="";
     foreach($dep_types as $key => $data){
-      if($data['ATTR'] == $this->type){
+      if($data['OC'] == $this->type){
         $tpl = $data['TPL'];
         break;
       }
@@ -261,8 +284,8 @@ class department extends plugin
         }
       }
 
-      /* If this is the root directory service entry (rootDSE)
-         then avoid changing the naming attribute of this entry.
+      /* If this is the root directory service entry then avoid
+         changing the naming attribute of this entry.
        */
       if($this->dn == $this->config->current['BASE']){
         $this->$nA = $old_nA;
@@ -369,20 +392,18 @@ class department extends plugin
     $this->skipTagging = TRUE;
     plugin::save();
 
-
     /* Remove tag information if needed */
     if (!$this->is_administrational_unit && $this->initially_was_tagged){
       $tmp= array();
 
       /* Remove gosaAdministrativeUnit from this plugin */
-      $has_unit_tag= false;
       foreach($this->attrs['objectClass'] as $oc){
+        if (preg_match("/^gosaAdministrativeUnitTag$/i", $oc)){
+          continue;
+        }
         if (!preg_match("/^gosaAdministrativeUnit$/i", $oc)){
           $tmp[]= $oc;
         }
-        if (preg_match("/^gosaAdministrativeUnitTag$/i", $oc)){
-          $has_unit_tag= true;
-        }
       }
       $this->attrs['objectClass']= $tmp;
       $this->attrs['gosaUnitTag']= array();