registerAction('folderaction', 'KTBulkExportAction', 'ktstandard.bulkexport.action');
}
}
require_once(KT_LIB_DIR . '/actions/folderaction.inc.php');
class KTBulkExportAction extends KTFolderAction {
var $sDisplayName = 'Bulk Export';
var $sName = 'ktstandard.bulkexport.action';
var $sPermissionName = "ktcore.permissions.read";
function do_main() {
$this->oPage->template = "kt3/minimal_page";
$this->handleOutput("");
$oStorage =& KTStorageManagerUtil::getSingleton();
$aQuery = $this->buildQuery();
$this->oValidator->notError($aQuery);
$aDocumentIds = DBUtil::getResultArrayKey($aQuery, 'id');
$sTmpPath = tempnam('/tmp', 'kt_export');
unlink($sTmpPath);
mkdir($sTmpPath, 0700);
$this->sTmpPath = $sTmpPath;
$aPaths = array();
foreach ($aDocumentIds as $iId) {
$oDocument = Document::get($iId);
$sParentFolder = sprintf('%s/%s', $sTmpPath, $oDocument->getFullPath());
$newDir = $this->sTmpPath;
foreach (split('/', $oDocument->getFullPath()) as $dirPart) {
$newDir = sprintf("%s/%s", $newDir, $dirPart);
if (!file_exists($newDir)) {
mkdir($newDir, 0700);
}
}
$sOrigFile = $oStorage->temporaryFile($oDocument);
$sFilename = sprintf("%s/%s", $sParentFolder, $oDocument->getFileName());
copy($sOrigFile, $sFilename);
$aPaths[] = sprintf("%s/%s", $oDocument->getFullPath(), $oDocument->getFileName());
}
$sManifest = sprintf("%s/%s", $this->sTmpPath, "MANIFEST");
file_put_contents($sManifest, join("\n", $aPaths));
$sZipFile = sprintf("%s/%s.zip", $this->sTmpPath, $this->oFolder->getName());
$_SESSION['bulkexport'] = KTUtil::arrayGet($_SESSION, 'bulkexport', array());
$sExportCode = KTUtil::randomString();
$_SESSION['bulkexport'][$sExportCode] = array(
'file' => $sZipFile,
'dir' => $this->sTmpPath,
);
$sZipCommand = KTUtil::findCommand("import/zip", "zip");
$aCmd = array(
$sZipCommand,
"-r",
$sZipFile,
".",
"-i@MANIFEST",
);
$sOldPath = getcwd();
chdir($this->sTmpPath);
$aOptions = array('popen' => 'r');
$fh = KTUtil::pexec($aCmd, $aOptions);
$last_beat = time();
while(!feof($fh)) {
if ($i % 1000 == 0) {
$this_beat = time();
if ($last_beat + 1 < $this_beat) {
$last_beat = $this_beat;
print " ";
}
}
$contents = fread($fh, 4096);
if ($contents) {
print nl2br($contents);
}
$i++;
}
pclose($fh);
$url = KTUtil::addQueryStringSelf(sprintf('action=downloadZipFile&fFolderId=%d&exportcode=%s', $this->oFolder->getId(), $sExportCode));
printf('Go here to download the zip file if you are not automatically redirected there', $url);
printf('', $url);
printf("\n");
exit(0);
}
function buildQuery() {
$oUser = User::get($_SESSION['userID']);
$res = KTSearchUtil::permissionToSQL($oUser, $this->sPermissionName);
if (PEAR::isError($res)) {
return $res;
}
list($sPermissionString, $aPermissionParams, $sPermissionJoin) = $res;
$aPotentialWhere = array($sPermissionString, 'D.parent_folder_ids = ? OR D.parent_folder_ids LIKE ?', 'D.status_id = 1');
$aWhere = array();
foreach ($aPotentialWhere as $sWhere) {
if (empty($sWhere)) {
continue;
}
if ($sWhere == "()") {
continue;
}
$aWhere[] = $sWhere;
}
$sWhere = "";
if ($aWhere) {
$sWhere = "\tWHERE " . join(" AND ", $aWhere);
}
$sSelect = KTUtil::arrayGet($aOptions, 'select', 'D.id');
$sQuery = sprintf("SELECT %s FROM %s AS D
LEFT JOIN %s AS DM ON D.metadata_version_id = DM.id
LEFT JOIN %s AS DC ON DM.content_version_id = DC.id
%s %s",
$sSelect, KTUtil::getTableName("documents"),
KTUtil::getTableName("document_metadata_version"),
KTUtil::getTableName("document_content_version"),
$sPermissionJoin, $sWhere);
$aParams = array();
$aParams = array_merge($aParams, $aPermissionParams);
$aParentFolderIds = split(',', $this->oFolder->getParentFolderIds());
$aParentFolderIds[] = $this->oFolder->getId();
if ($aParentFolderIds[0] == 0) {
array_shift($aParentFolderIds);
}
$sParentFolderIds = join(',', $aParentFolderIds);
$aParams[] = $sParentFolderIds;
$aParams[] = $sParentFolderIds . ",%";
return array($sQuery, $aParams);
}
function do_downloadZipFile() {
$sCode = $this->oValidator->validateString($_REQUEST['exportcode']);
$aData = KTUtil::arrayGet($_SESSION['bulkexport'], $sCode);
$this->oValidator->notEmpty($aData);
$sZipFile = $aData['file'];
header("Content-Type: application/zip");
header("Content-Length: ". filesize($sZipFile));
header("Content-Disposition: attachment; filename=\"" . $this->oFolder->getName() . ".zip" . "\"");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: must-revalidate");
readfile($sZipFile);
$sTmpDir = $aData['dir'];
KTUtil::deleteDirectory($sTmpDir);
exit(0);
}
}
$oPluginRegistry =& KTPluginRegistry::getSingleton();
$oPluginRegistry->registerPlugin('KTBulkExportPlugin', 'ktstandard.bulkexport.plugin', __FILE__);
?>