/** * Renomme un élément et met à jour le serverPath de ses enfants dans le cas d'un dossier * $options est un tableau de booléens avec comme indexes possibles: * - returnImpactedElements à true pour retourner les éléments à modifier * - returnUpdatedElements à true pour retourner les éléments modifiés * On peut se retrouver avec la structure de retour suivante: * array( * 'operationSuccess' => true ou false, * 'error' => 'message d'erreur', * 'impactedElements' => array(), * 'updatedElements' => array(), * 'failedToUpdate' => array() * ) * @author Alban Truc * @param string|MongoId $idElement * @param string|MongoId $idUser * @param string $newName * @param array $options * @return array */ function renameHandler($idElement, $idUser, $newName, $options = array()) { $idElement = new MongoId($idElement); $idUser = new MongoId($idUser); $impactedElements = array(); $updatedElements = array(); $failedToUpdate = array(); $operationSuccess = FALSE; /* * 11 correspond au droit de lecture et écriture. * Si on souhaite accepter la copie avec des droits de plus bas niveau, il suffit d'ajouter les codes correspondant * au tableau en 3e paramètre ci-dessous. */ $hasRight = actionAllowed($idElement, $idUser, array('11')); if (!is_array($hasRight)) { if ($hasRight === TRUE) { //récupère l'élément $elementManager = new ElementManager(); $element = $elementManager->findById($idElement); if (!array_key_exists('error', $element)) { if ($element['state'] == 1) { $criteria = array('state' => (int) 1, 'name' => $newName, 'serverPath' => $element['serverPath'], 'idOwner' => $idUser); $elementsWithSameName = $elementManager->find($criteria); if (is_array($elementsWithSameName) && array_key_exists('error', $elementsWithSameName)) { if ($elementsWithSameName['error'] != 'No match found.') { return $elementsWithSameName; } } else { return array('error' => 'There is already an element with this name.'); } //File Server -- 13/06/2014 $refElementManager = new RefElementManager(); $refElementFieldsToReturn = array('code' => TRUE, 'extension' => TRUE); $refElement = $refElementManager->findById($element['idRefElement'], $refElementFieldsToReturn); if (array_key_exists('error', $refElement)) { return $refElement; } if (preg_match('/^4/', $refElement['code']) || preg_match('/^9/', $refElement['code'])) { $oldCompleteName = $element['name']; $newCompleteName = $newName; } else { $oldCompleteName = $element['name'] . $refElement['extension']; $newCompleteName = $newName . $refElement['extension']; } $FSRenameResult = renameFSElement($idUser, $element['serverPath'], $oldCompleteName, $newCompleteName); if (!is_bool($FSRenameResult) || $FSRenameResult != TRUE) { return $FSRenameResult; } //Fin File Server if ($refElement['code'] != '4002' && preg_match('/^4/', $refElement['code'])) { $serverPath = $element['serverPath'] . $element['name'] . '/'; //récupération des éléments contenus dans le dossier $seekElementsInFolder = array('state' => (int) 1, 'serverPath' => new MongoRegex("/^{$serverPath}/i"), 'idOwner' => $idUser); $elementsInFolder = $elementManager->find($seekElementsInFolder); } if (isset($elementsInFolder) && !array_key_exists('error', $elementsInFolder)) { $impactedElements = $elementsInFolder; } $impactedElements[] = $element; $count = 0; foreach ($impactedElements as $key => $impactedElement) { $updateCriteria = array('_id' => $impactedElement['_id'], 'state' => (int) 1); //préparation de la copie $elementCopy = $impactedElement; if (count($impactedElements) != $key + 1) { $impactedElementPath = $impactedElement['serverPath']; $newPath = preg_replace('/' . $element['name'] . '/i', $newName, $impactedElementPath); $elementCopy['serverPath'] = $newPath; } else { $elementCopy['name'] = $newName; } //mise à jour $updateResult = $elementManager->update($updateCriteria, $elementCopy); //gestion des erreurs if (!is_bool($updateResult)) { $failedToUpdate[$count]['elementToUpdate'] = $impactedElement; $failedToUpdate[$count]['elementUpdated'] = $elementCopy; $failedToUpdate[$count]['error'] = $updateResult['error']; $count++; } elseif ($updateResult == TRUE) { $updatedElements[] = $elementCopy; } } $operationSuccess = TRUE; return prepareRenameReturn($options, $operationSuccess, array(), $impactedElements, $updatedElements, $failedToUpdate); } else { return prepareRenameReturn($options, $operationSuccess, array('error' => 'Element inactivated, nothing to do'), $impactedElements, $updatedElements, $failedToUpdate); } } else { return prepareRenameReturn($options, $operationSuccess, $element, $impactedElements, $updatedElements, $failedToUpdate); } } else { return prepareRenameReturn($options, $operationSuccess, array('error' => 'Access denied'), $impactedElements, $updatedElements, $failedToUpdate); } } else { return prepareRenameReturn($options, $operationSuccess, $hasRight, $impactedElements, $updatedElements, $failedToUpdate); } }
/** * Renomme un élément et met à jour le serverPath de ses enfants dans le cas d'un dossier * $options est un tableau de booléens avec comme indexes possibles: * - returnImpactedElements à true pour retourner les éléments à modifier * - returnUpdatedElements à true pour retourner les éléments modifiés * On peut se retrouver avec la structure de retour suivante: * array( * 'operationSuccess' => true ou false, * 'error' => 'message d'erreur', * 'impactedElements' => array(), * 'updatedElements' => array(), * 'failedToUpdate' => array() * ) * @author Alban Truc * @param string|MongoId $idElement * @param string|MongoId $idUser * @param string $newName * @param array $options * @return array */ function renameHandler($idElement, $idUser, $newName, $options = array()) { $idElement = new MongoId($idElement); $idUser = new MongoId($idUser); $impactedElements = array(); $updatedElements = array(); $failedToUpdate = array(); $operationSuccess = FALSE; /* * 11 correspond au droit de lecture et écriture. * Si on souhaite accepter la copie avec des droits de plus bas niveau, il suffit d'ajouter les codes correspondant * au tableau en 3e paramètre ci-dessous. */ $hasRight = actionAllowed($idElement, $idUser, array('11')); if (!is_array($hasRight)) { if ($hasRight === TRUE) { //récupère l'élément $elementManager = new ElementManager(); $element = $elementManager->findById($idElement); if (!array_key_exists('error', $element)) { if ($element['state'] == 1) { $criteria = array('state' => (int) 1, 'name' => $newName, 'serverPath' => $element['serverPath'], 'idOwner' => $idUser); $elementsWithSameName = $elementManager->find($criteria); if (is_array($elementsWithSameName) && array_key_exists('error', $elementsWithSameName)) { if ($elementsWithSameName['error'] != 'No match found.') { return $elementsWithSameName; } } //@todo rename sur le serveur de fichier et obtention du nouveau hash si l'élément est un dossier. Puis màj de ce hash $isFolder = isFolder($element['idRefElement'], TRUE); if (!is_array($isFolder)) { if ($isFolder == TRUE) { $serverPath = $element['serverPath'] . $element['name'] . '/'; //récupération des éléments contenus dans le dossier $seekElementsInFolder = array('state' => (int) 1, 'serverPath' => new MongoRegex("/^{$serverPath}/i"), 'idOwner' => $idUser); $elementsInFolder = $elementManager->find($seekElementsInFolder); } if (isset($elementsInFolder) && !array_key_exists('error', $elementsInFolder)) { $impactedElements = $elementsInFolder; } $impactedElements[] = $element; $count = 0; foreach ($impactedElements as $key => $impactedElement) { $updateCriteria = array('_id' => $impactedElement['_id'], 'state' => (int) 1); //préparation de la copie $elementCopy = $impactedElement; if (count($impactedElements) != $key + 1) { $impactedElementPath = $impactedElement['serverPath']; $newPath = preg_replace('/' . $element['name'] . '/i', $newName, $impactedElementPath); $elementCopy['serverPath'] = $newPath; } else { $elementCopy['name'] = $newName; } //mise à jour $updateResult = $elementManager->update($updateCriteria, $elementCopy); //gestion des erreurs if (!is_bool($updateResult)) { $failedToUpdate[$count]['elementToUpdate'] = $impactedElement; $failedToUpdate[$count]['elementUpdated'] = $elementCopy; $failedToUpdate[$count]['error'] = $updateResult['error']; $count++; } elseif ($updateResult == TRUE) { $updatedElements[] = $elementCopy; } } $operationSuccess = TRUE; return prepareRenameReturn($options, $operationSuccess, array(), $impactedElements, $updatedElements, $failedToUpdate); } else { return prepareRenameReturn($options, $operationSuccess, $isFolder, $impactedElements, $updatedElements, $failedToUpdate); } } else { return prepareRenameReturn($options, $operationSuccess, array('error' => 'Element inactivated, nothing to do'), $impactedElements, $updatedElements, $failedToUpdate); } } else { return prepareRenameReturn($options, $operationSuccess, $element, $impactedElements, $updatedElements, $failedToUpdate); } } else { return prepareRenameReturn($options, $operationSuccess, array('error' => 'Access denied'), $impactedElements, $updatedElements, $failedToUpdate); } } else { return prepareRenameReturn($options, $operationSuccess, $hasRight, $impactedElements, $updatedElements, $failedToUpdate); } }