/** * Sends all pending changes to the LDAP server * * @param Ldap $ldap * @return Node Provides a fluid interface * @throws Exception\LdapException * @trigger pre-delete * @trigger post-delete * @trigger pre-add * @trigger post-add * @trigger pre-rename * @trigger post-rename * @trigger pre-update * @trigger post-update */ public function update(Ldap $ldap = null) { if ($ldap !== null) { $this->attachLdap($ldap); } $ldap = $this->getLdap(); if (!($ldap instanceof Ldap)) { throw new Exception\LdapException(null, 'No LDAP connection available'); } if ($this->willBeDeleted()) { if ($ldap->exists($this->dn)) { $this->triggerEvent('pre-delete'); $ldap->delete($this->dn); $this->triggerEvent('post-delete'); } return $this; } if ($this->isNew()) { $this->triggerEvent('pre-add'); $data = $this->getData(); $ldap->add($this->_getDn(), $data); $this->loadData($data, true); $this->triggerEvent('post-add'); return $this; } $changedData = $this->getChangedData(); if ($this->willBeMoved()) { $this->triggerEvent('pre-rename'); $recursive = $this->hasChildren(); $ldap->rename($this->dn, $this->newDn, $recursive, false); foreach ($this->newDn->getRdn() as $key => $value) { if (array_key_exists($key, $changedData)) { unset($changedData[$key]); } } $this->dn = $this->newDn; $this->newDn = null; $this->triggerEvent('post-rename'); } if (count($changedData) > 0) { $this->triggerEvent('pre-update'); $ldap->update($this->_getDn(), $changedData); $this->triggerEvent('post-update'); } $this->originalData = $this->currentData; return $this; }