mirror of
https://codeberg.org/streams/streams.git
synced 2024-09-19 23:55:19 +00:00
Export of pages and their layouts to a zip file works. Bug on importing the exported zip file for pages.
This commit is contained in:
parent
cf93d9c3b4
commit
80ed05d45d
5 changed files with 242 additions and 10 deletions
57
Zotlabs/Lib/ExtendedZip.php
Normal file
57
Zotlabs/Lib/ExtendedZip.php
Normal file
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
namespace Zotlabs\Lib;
|
||||
|
||||
/**
|
||||
* Description of ExtendedZip
|
||||
*
|
||||
* @author andrew
|
||||
*/
|
||||
class ExtendedZip extends \ZipArchive {
|
||||
|
||||
// Member function to add a whole file system subtree to the archive
|
||||
public function addTree($dirname, $localname = '') {
|
||||
if ($localname)
|
||||
$this->addEmptyDir($localname);
|
||||
$this->_addTree($dirname, $localname);
|
||||
}
|
||||
|
||||
// Internal function, to recurse
|
||||
protected function _addTree($dirname, $localname) {
|
||||
$dir = opendir($dirname);
|
||||
while ($filename = readdir($dir)) {
|
||||
// Discard . and ..
|
||||
if ($filename == '.' || $filename == '..')
|
||||
continue;
|
||||
|
||||
// Proceed according to type
|
||||
$path = $dirname . '/' . $filename;
|
||||
$localpath = $localname ? ($localname . '/' . $filename) : $filename;
|
||||
if (is_dir($path)) {
|
||||
// Directory: add & recurse
|
||||
$this->addEmptyDir($localpath);
|
||||
$this->_addTree($path, $localpath);
|
||||
}
|
||||
else if (is_file($path)) {
|
||||
// File: just add
|
||||
$this->addFile($path, $localpath);
|
||||
}
|
||||
}
|
||||
closedir($dir);
|
||||
}
|
||||
|
||||
// Helper function
|
||||
public static function zipTree($dirname, $zipFilename, $flags = 0, $localname = '') {
|
||||
$zip = new self();
|
||||
$zip->open($zipFilename, $flags);
|
||||
$zip->addTree($dirname, $localname);
|
||||
$zip->close();
|
||||
}
|
||||
|
||||
}
|
|
@ -70,7 +70,6 @@ class Webpages extends \Zotlabs\Web\Controller {
|
|||
require_once('include/import.php');
|
||||
|
||||
$elements = get_webpage_elements($channel, 'pages');
|
||||
logger(json_encode($elements), LOGGER_DEBUG);
|
||||
$o .= replace_macros(get_markup_template('webpage_export_list.tpl'), array(
|
||||
'$title' => t('Export Webpage Elements'),
|
||||
'$exportbtn' => t('Export selected'),
|
||||
|
@ -405,20 +404,151 @@ class Webpages extends \Zotlabs\Web\Controller {
|
|||
if(isset($_POST['w_download'])) {
|
||||
$_SESSION['action'] = 'export_select_list';
|
||||
$_SESSION['export'] = 'zipfile';
|
||||
if(isset($_POST['filename'])) {
|
||||
$filename = filter_var($_POST['filename'], FILTER_SANITIZE_ENCODED);
|
||||
if(isset($_POST['zipfilename']) && $_POST['zipfilename'] !== '') {
|
||||
$filename = filter_var($_POST['zipfilename'], FILTER_SANITIZE_ENCODED);
|
||||
} else {
|
||||
$filename = 'website.zip';
|
||||
}
|
||||
$_SESSION['zipfilename'] = $filename;
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'zipfile':
|
||||
|
||||
$tmp_folder_name = random_string(10);
|
||||
$zip_folder_name = random_string(10);
|
||||
$zip_filename = $_SESSION['zipfilename'];
|
||||
$tmp_folderpath = '/tmp/' . $tmp_folder_name;
|
||||
$zip_folderpath = '/tmp/' . $zip_folder_name;
|
||||
if (!mkdir($zip_folderpath, 0770, false)) {
|
||||
logger('Error creating zip file export folder: ' . $zip_folderpath, LOGGER_NORMAL);
|
||||
json_return_and_die(array('message' => 'Error creating zip file export folder'));
|
||||
}
|
||||
$zip_filepath = '/tmp/' . $zip_folder_name . '/' . $zip_filename;
|
||||
|
||||
$checkedpages = $_POST['page'];
|
||||
$pages = [];
|
||||
if (!empty($checkedpages)) {
|
||||
foreach ($checkedpages as $mid) {
|
||||
|
||||
$channel = \App::get_channel();
|
||||
$p = q("select * from iconfig left join item on iconfig.iid = item.id
|
||||
where item.uid = %d and item.mid = '%s' and iconfig.cat = 'system' and iconfig.k = 'WEBPAGE' and item_type = %d",
|
||||
intval($channel['channel_id']),
|
||||
dbesc($mid),
|
||||
intval(ITEM_TYPE_WEBPAGE)
|
||||
);
|
||||
|
||||
if($p) {
|
||||
foreach ($p as $pp) {
|
||||
// Get the associated layout
|
||||
$layoutinfo = array();
|
||||
if($pp['layout_mid']) {
|
||||
// TODO: Should we check for ownership here if the layout is already associated with the page?
|
||||
$l = q("select iconfig.v, iconfig.k, mimetype, title, body from iconfig
|
||||
left join item on item.id = iconfig.iid
|
||||
where mid = '%s' and item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'PDL' order by iconfig.v asc limit 1",
|
||||
dbesc($pp['layout_mid']),
|
||||
intval($channel['channel_id'])
|
||||
);
|
||||
if($l) {
|
||||
$l = $l[0];
|
||||
$layoutinfo = array(
|
||||
'body' => $l['body'],
|
||||
'mimetype' => $l['mimetype'],
|
||||
'description' => $l['title'],
|
||||
'name' => $l['v'],
|
||||
'json' => array(
|
||||
'description' => $l['title'],
|
||||
'name' => $l['v'],
|
||||
)
|
||||
);
|
||||
switch ($layoutinfo['mimetype']) {
|
||||
case 'text/bbcode':
|
||||
default:
|
||||
$layout_ext = 'bbcode';
|
||||
break;
|
||||
}
|
||||
$layout_filename = $layoutinfo['name'] . '.' . $layout_ext;
|
||||
$tmp_layoutfolder = $tmp_folderpath . '/layouts/' . $layoutinfo['name'];
|
||||
$layout_filepath = $tmp_layoutfolder . '/' . $layout_filename;
|
||||
$layoutinfo['json']['contentfile'] = $layout_filename;
|
||||
$layout_jsonpath = $tmp_layoutfolder . '/layout.json';
|
||||
if (!mkdir($tmp_layoutfolder, 0770, true)) {
|
||||
logger('Error creating temp export folder: ' . $tmp_layoutfolder, LOGGER_NORMAL);
|
||||
json_return_and_die(array('message' => 'Error creating temp export folder'));
|
||||
}
|
||||
file_put_contents($layout_filepath, $layoutinfo['body']);
|
||||
file_put_contents($layout_jsonpath, json_encode($layoutinfo['json'], JSON_UNESCAPED_SLASHES));
|
||||
}
|
||||
}
|
||||
switch ($pp['mimetype']) {
|
||||
case 'text/html':
|
||||
$page_ext = 'html';
|
||||
break;
|
||||
case 'text/bbcode':
|
||||
$page_ext = 'bbcode';
|
||||
break;
|
||||
case 'text/markdown':
|
||||
$page_ext = 'md';
|
||||
break;
|
||||
case 'application/x-pdl':
|
||||
$page_ext = 'pdl';
|
||||
break;
|
||||
case 'application/x-php':
|
||||
$page_ext = 'php';
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
$pageinfo = array(
|
||||
'title' => $pp['title'],
|
||||
'body' => $pp['body'],
|
||||
'pagelink' => $pp['v'],
|
||||
'mimetype' => $pp['mimetype'],
|
||||
'contentfile' => $pp['v'] . '.' . $page_ext,
|
||||
'layout' => ((x($layoutinfo,'name')) ? $layoutinfo['name'] : ''),
|
||||
'json' => array(
|
||||
'title' => $pp['title'],
|
||||
'pagelink' => $pp['v'],
|
||||
'mimetype' => $pp['mimetype'],
|
||||
'layout' => ((x($layoutinfo,'name')) ? $layoutinfo['name'] : ''),
|
||||
)
|
||||
);
|
||||
$page_filename = $pageinfo['pagelink'] . '.' . $page_ext;
|
||||
$tmp_pagefolder = $tmp_folderpath . '/pages/' . $pageinfo['pagelink'];
|
||||
$page_filepath = $tmp_pagefolder . '/' . $page_filename;
|
||||
$page_jsonpath = $tmp_pagefolder . '/page.json';
|
||||
$pageinfo['json']['contentfile'] = $page_filename;
|
||||
if (!mkdir($tmp_pagefolder, 0770, true)) {
|
||||
logger('Error creating temp export folder: ' . $tmp_pagefolder, LOGGER_NORMAL);
|
||||
json_return_and_die(array('message' => 'Error creating temp export folder'));
|
||||
}
|
||||
file_put_contents($page_filepath, $pageinfo['body']);
|
||||
file_put_contents($page_jsonpath, json_encode($pageinfo['json'], JSON_UNESCAPED_SLASHES));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// TODO: Generate zipped file and return for download
|
||||
|
||||
//create_zip_file($tmp_folderpath, $zip_filepath, true);
|
||||
|
||||
\Zotlabs\Lib\ExtendedZip::zipTree($tmp_folderpath, $zip_filepath, \ZipArchive::CREATE);
|
||||
|
||||
header('Content-disposition: attachment; filename="' . $zip_filename . '"');
|
||||
header("Content-Type: application/zip");
|
||||
readfile($zip_filepath);
|
||||
rrmdir($zip_folderpath);
|
||||
rrmdir($tmp_folderpath);
|
||||
break;
|
||||
default :
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1534,3 +1534,46 @@ function get_webpage_elements($channel, $type = 'all') {
|
|||
}
|
||||
return $elements;
|
||||
}
|
||||
|
||||
/* creates a compressed zip file */
|
||||
|
||||
function create_zip_file($files = array(), $destination = '', $overwrite = false) {
|
||||
//if the zip file already exists and overwrite is false, return false
|
||||
if (file_exists($destination) && !$overwrite) {
|
||||
return false;
|
||||
}
|
||||
//vars
|
||||
$valid_files = array();
|
||||
//if files were passed in...
|
||||
if (is_array($files)) {
|
||||
//cycle through each file
|
||||
foreach ($files as $file) {
|
||||
//make sure the file exists
|
||||
if (file_exists($file)) {
|
||||
$valid_files[] = $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//if we have good files...
|
||||
if (count($valid_files)) {
|
||||
//create the archive
|
||||
$zip = new ZipArchive();
|
||||
if ($zip->open($destination, $overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
|
||||
return false;
|
||||
}
|
||||
//add the files
|
||||
foreach ($valid_files as $file) {
|
||||
$zip->addFile($file, $file);
|
||||
}
|
||||
//debug
|
||||
//echo 'The zip archive contains ',$zip->numFiles,' files with a status of ',$zip->status;
|
||||
//close the zip -- done!
|
||||
$zip->close();
|
||||
|
||||
//check to make sure the file exists
|
||||
return file_exists($destination);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,7 +17,9 @@
|
|||
<h4>Pages</h4>
|
||||
<div>
|
||||
<table class="table-striped table-responsive table-hover" style="width: 100%;">
|
||||
<tr><td>Export?</td><td>Page Title</td><td>Page Link</td><td>Type</td></tr>
|
||||
<thead>
|
||||
<tr><th>Export?</th><th>Page Title</th><th>Page Link</th><th>Type</th></tr>
|
||||
</thead>
|
||||
{{foreach $pages as $page}}
|
||||
<tr>
|
||||
<td>
|
||||
|
@ -27,7 +29,7 @@
|
|||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class='desc'>
|
||||
<div class="desc">
|
||||
{{$page.title}}<br>
|
||||
</div>
|
||||
</td>
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
<div class="form-group">
|
||||
|
||||
<div class="input-group">
|
||||
<input class="widget-input" type="text" name="filename" title="{{$filename_hint}}" placeholder="{{$filename_desc}}" />
|
||||
<input class="widget-input" type="text" name="zipfilename" title="{{$filename_hint}}" placeholder="{{$filename_desc}}" value="" />
|
||||
<div class="input-group-btn">
|
||||
<button class="btn btn-default btn-sm" type="submit" name="w_download" value="w_download"><i class="fa fa-download generic-icons"></i></button>
|
||||
</div>
|
||||
|
|
Loading…
Reference in a new issue