public function actionDeleteRecord() { $idObject = HU::post('idObject', null); $idInstance = HU::post('idInstance', null); try { if (!Yii::app()->authManager->checkObject(DaDbAuthManager::OPERATION_DELETE, Yii::app()->user->id, $idObject, $params = array('idInstance' => $idInstance))) { throw new Exception('Доступ на удаление ограничен.'); } $object = DaObject::getById($idObject); if ($object == null) { throw new Exception('Некорректные параметры запроса (не найден объект=' . $idObject . ').'); } $model = $object->getModel()->findByIdInstance($idInstance); if ($model == null) { throw new Exception('Некорректные параметры запроса (не найден экземпляр=' . $idInstance . ').'); } if ($model->delete()) { HU::log_da("Удален (" . $object->getName() . ") id=" . $idInstance); echo CJSON::encode(array('message' => 'Данные успешно удалены.', 'idInstance' => $idInstance)); } else { $c = $model->getCountChild(); if ($c > 0) { throw new Exception("Информация не удалена, т.к. присутствуют дочерние экземпляры (" . $c . ")"); } else { $dependentData = $model->getDependentData(true); if (count($dependentData) > 0) { // экземпляр не был удален. Выводим информацию о зависимых данных $msg = "Информация не удалена, т.к. раздел участвует в других объектах:"; foreach ($dependentData as $idObj => $count) { $obj = DaObject::getById($idObj); $msg .= "\\n" . $obj->getName() . " (количество экземпляров: " . $count . ")"; } throw new Exception($msg); } } } } catch (Exception $e) { echo CJSON::encode(array('error' => $e->getMessage(), 'idInstance' => $idInstance)); } }
/** * Рекурсивное удаление файлов и папок * * @param string Путь к директории, которую надо удалить * @param boolean Удалять ли директорию $dir в конце * @param boolean Вести лог при работе функции * @return boolean */ public static function removeDirectoryRecursive($dir, $removeSelf = true, $log = false, $errorEnable = true, $excludeFiles = array()) { if ($dir == null) { return false; } // если кто-то вызовет метод с пустым значением, то метод затерет все данные на диске $dir = self::addSlashPath($dir); if (strpos(self::normalizePath($dir), self::normalizePath(realpath(Yii::getPathOfAlias('webroot')))) === false) { // и ещё защита, чтоб случано не удалили файлы, которые расположены выше корня сайта return false; } if (!($handle = opendir($dir))) { if ($log) { HU::log_da('Не удалось открыть дирикторию (' . $dir . ')'); } return false; } while ($entry = readdir($handle)) { if ($entry == ".." || $entry == ".") { continue; } if (is_dir($dir . $entry)) { self::removeDirectoryRecursive($dir . $entry, true, $log); } else { if (in_array($entry, $excludeFiles) || in_array($dir . $entry, $excludeFiles)) { continue; } if (!unlink($dir . $entry)) { if ($log) { HU::log_da('Не удалось удалить файл (' . $dir . $entry . ')'); } } } } closedir($handle); if ($removeSelf) { if ($errorEnable && !rmdir($dir) || !$errorEnable && !@rmdir($dir)) { if ($log) { HU::log_da('Не удалось удалить дирикторию (' . $dir . ')'); } return false; } } return true; }