request->method('post')) { switch($this->request->post('action')) { case 'create': { $filename = $dir.'simpla_'.date("Y_m_d_G_i_s").'.zip'; ##Дамп базы $this->db->dump($dir.'simpla.sql'); chmod($dir.'simpla.sql', 0777); ### Архивируем $zip = new PclZip($filename); $v_list = $zip->create(array('files', $dir.'simpla.sql'), PCLZIP_OPT_REMOVE_PATH, $dir, PCLZIP_CB_PRE_ADD, "myCallBack"); if ($v_list == 0) { trigger_error('Не могу заархивировать '.$zip->errorInfo(true)); } $this->design->assign('message_success', 'created'); break; } case 'restore': { $name = $this->request->post('name'); $archive = $dir.$name; $zip = new PclZip($archive); $this->clean_dir('files'); if (!$zip->extract(PCLZIP_OPT_PATH, '', PCLZIP_OPT_BY_PREG, "/^files\//", PCLZIP_CB_POST_EXTRACT, 'myPostExtractCallBack')) { trigger_error('Не могу разархивировать '.$zip->errorInfo(true)); } elseif (!$zip->extract(PCLZIP_OPT_PATH, $dir, PCLZIP_OPT_BY_NAME, 'simpla.sql')) { trigger_error('Не могу разархивировать '.$zip->errorInfo(true)); } elseif (!is_readable($dir.'simpla.sql')) { trigger_error('Не могу прочитать файл /temp/simpla.sql'); } else { $this->db->restore($dir.'simpla.sql'); unlink($dir.'simpla.sql'); $this->design->assign('message_success', 'restored'); } break; } case 'delete': { $names = $this->request->post('check'); foreach($names as $name) unlink($dir.$name); break; } } } $backup_files = glob($dir."*.zip"); $backups = array(); if(is_array($backup_files)) { foreach($backup_files as $backup_file) { $backup = null; $backup->name = basename($backup_file); $backup->size = filesize($backup_file); $backups[] = $backup; } } $backups = array_reverse($backups); $this->design->assign('backup_files_dir', $dir); if(!is_writable($dir)) $this->design->assign('message_error', 'no_permission'); $this->design->assign('backups', $backups); return $this->design->fetch('backup.tpl'); } private function clean_dir($path) { $path= rtrim($path, '/').'/'; $handle = opendir($path); for (;false !== ($file = readdir($handle));) if($file != "." and $file != ".." ) { $fullpath= $path.$file; if( is_dir($fullpath) ) { $this->clean_dir($fullpath); rmdir($fullpath); } else unlink($fullpath); } closedir($handle); } } function myPostExtractCallBack($p_event, &$p_header) { // проверяем успешность распаковки if ($p_header['status'] == 'ok') { // Меняем права доступа @chmod($p_header['filename'], 0777); } return 1; } function myCallBack($p_event, &$p_header) { $fname = $p_header['stored_filename']; if(preg_match('/^files\/products\/.+/i', $fname)) return 0; return 1; }