diff options
Diffstat (limited to 'Zotlabs/Module')
-rw-r--r-- | Zotlabs/Module/Webpages.php | 987 |
1 files changed, 504 insertions, 483 deletions
diff --git a/Zotlabs/Module/Webpages.php b/Zotlabs/Module/Webpages.php index e2ad7753b..effe92614 100644 --- a/Zotlabs/Module/Webpages.php +++ b/Zotlabs/Module/Webpages.php @@ -1,152 +1,156 @@ <?php - namespace Zotlabs\Module; require_once('include/channel.php'); require_once('include/conversation.php'); require_once('include/acl_selectors.php'); + class Webpages extends \Zotlabs\Web\Controller { function init() { - - if (argc() > 1 && argv(1) === 'sys' && is_site_admin()) { + + if(argc() > 1 && argv(1) === 'sys' && is_site_admin()) { $sys = get_sys_channel(); - if ($sys && intval($sys['channel_id'])) { + if($sys && intval($sys['channel_id'])) { \App::$is_sys = true; } } - - if (argc() > 1) + + if(argc() > 1) $which = argv(1); else return; - + profile_load($which); + } - + + function get() { - - if (!\App::$profile) { - notice(t('Requested profile is not available.') . EOL); + + if(! \App::$profile) { + notice( t('Requested profile is not available.') . EOL ); \App::$error = 404; return; } - + $which = argv(1); - + $_SESSION['return_url'] = \App::$query_string; - + $uid = local_channel(); $owner = 0; $observer = \App::get_observer(); - + $channel = \App::get_channel(); switch ($_SESSION['action']) { - case 'import': - $_SESSION['action'] = null; - $o .= replace_macros(get_markup_template('webpage_import.tpl'), array( - '$title' => t('Import Webpage Elements'), - '$importbtn' => t('Import selected'), - '$action' => 'import', - '$pages' => $_SESSION['pages'], - '$layouts' => $_SESSION['layouts'], - '$blocks' => $_SESSION['blocks'], - )); - return $o; - - case 'importselected': - $_SESSION['action'] = null; - break; - case 'export_select_list': - $_SESSION['action'] = null; - if (!$uid) { - $_SESSION['export'] = null; - break; - } - require_once('include/import.php'); - - $pages = get_webpage_elements($channel, 'pages'); - $layouts = get_webpage_elements($channel, 'layouts'); - $blocks = get_webpage_elements($channel, 'blocks'); - $o .= replace_macros(get_markup_template('webpage_export_list.tpl'), array( - '$title' => t('Export Webpage Elements'), - '$exportbtn' => t('Export selected'), - '$action' => $_SESSION['export'], // value should be 'zipfile' or 'cloud' - '$pages' => $pages['pages'], - '$layouts' => $layouts['layouts'], - '$blocks' => $blocks['blocks'], - )); - $_SESSION['export'] = null; - return $o; - - default : - $_SESSION['action'] = null; - break; + case 'import': + $_SESSION['action'] = null; + $o .= replace_macros(get_markup_template('webpage_import.tpl'), array( + '$title' => t('Import Webpage Elements'), + '$importbtn' => t('Import selected'), + '$action' => 'import', + '$pages' => $_SESSION['pages'], + '$layouts' => $_SESSION['layouts'], + '$blocks' => $_SESSION['blocks'], + )); + return $o; + + case 'importselected': + $_SESSION['action'] = null; + break; + case 'export_select_list': + $_SESSION['action'] = null; + if(!$uid) { + $_SESSION['export'] = null; + break; + } + require_once('include/import.php'); + + $pages = get_webpage_elements($channel, 'pages'); + $layouts = get_webpage_elements($channel, 'layouts'); + $blocks = get_webpage_elements($channel, 'blocks'); + $o .= replace_macros(get_markup_template('webpage_export_list.tpl'), array( + '$title' => t('Export Webpage Elements'), + '$exportbtn' => t('Export selected'), + '$action' => $_SESSION['export'], // value should be 'zipfile' or 'cloud' + '$pages' => $pages['pages'], + '$layouts' => $layouts['layouts'], + '$blocks' => $blocks['blocks'], + )); + $_SESSION['export'] = null; + return $o; + + default : + $_SESSION['action'] = null; + break; } - - - if (\App::$is_sys && is_site_admin()) { + + + if(\App::$is_sys && is_site_admin()) { $sys = get_sys_channel(); - if ($sys && intval($sys['channel_id'])) { + if($sys && intval($sys['channel_id'])) { $uid = $owner = intval($sys['channel_id']); $channel = $sys; $observer = $sys; } } - - if (!$owner) { + + if(! $owner) { // Figure out who the page owner is. - $r = q("select channel_id from channel where channel_address = '%s'", dbesc($which) + $r = q("select channel_id from channel where channel_address = '%s'", + dbesc($which) ); - if ($r) { + if($r) { $owner = intval($r[0]['channel_id']); } } - + $ob_hash = (($observer) ? $observer['xchan_hash'] : ''); - - $perms = get_all_perms($owner, $ob_hash); - - if (!$perms['write_pages']) { - notice(t('Permission denied.') . EOL); + + $perms = get_all_perms($owner,$ob_hash); + + if(! $perms['write_pages']) { + notice( t('Permission denied.') . EOL); return; } - - $mimetype = (($_REQUEST['mimetype']) ? $_REQUEST['mimetype'] : get_pconfig($owner, 'system', 'page_mimetype')); - - $layout = (($_REQUEST['layout']) ? $_REQUEST['layout'] : get_pconfig($owner, 'system', 'page_layout')); - + + $mimetype = (($_REQUEST['mimetype']) ? $_REQUEST['mimetype'] : get_pconfig($owner,'system','page_mimetype')); + + $layout = (($_REQUEST['layout']) ? $_REQUEST['layout'] : get_pconfig($owner,'system','page_layout')); + // Create a status editor (for now - we'll need a WYSIWYG eventually) to create pages // Nickname is set to the observers xchan, and profile_uid to the owner's. // This lets you post pages at other people's channels. - - if ((!$channel) && ($uid) && ($uid == \App::$profile_uid)) { + + if((! $channel) && ($uid) && ($uid == \App::$profile_uid)) { $channel = \App::get_channel(); } - if ($channel) { + if($channel) { $channel_acl = array( 'allow_cid' => $channel['channel_allow_cid'], 'allow_gid' => $channel['channel_allow_gid'], - 'deny_cid' => $channel['channel_deny_cid'], - 'deny_gid' => $channel['channel_deny_gid'] + 'deny_cid' => $channel['channel_deny_cid'], + 'deny_gid' => $channel['channel_deny_gid'] ); - } else { - $channel_acl = ['allow_cid' => '', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '']; } - + else { + $channel_acl = [ 'allow_cid' => '', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '' ]; + } + $is_owner = ($uid && $uid == $owner); //$o = profile_tabs($a, $is_owner, \App::$profile['channel_address']); $o = ''; - + $x = array( 'webpage' => ITEM_TYPE_WEBPAGE, 'is_owner' => true, 'nickname' => \App::$profile['channel_address'], 'lockstate' => (($channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'), - 'acl' => (($is_owner) ? populate_acl($channel_acl, false, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_pages')) : ''), + 'acl' => (($is_owner) ? populate_acl($channel_acl,false, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_pages')) : ''), 'permissions' => $channel_acl, 'showacl' => (($is_owner) ? true : false), 'visitor' => true, @@ -158,30 +162,33 @@ class Webpages extends \Zotlabs\Web\Controller { 'layout' => $layout, 'layoutselect' => true, 'expanded' => true, - 'novoting' => true, + 'novoting'=> true, 'bbco_autocomplete' => 'bbcode', 'bbcode' => true ); - - if ($_REQUEST['title']) + + if($_REQUEST['title']) $x['title'] = $_REQUEST['title']; - if ($_REQUEST['body']) + if($_REQUEST['body']) $x['body'] = $_REQUEST['body']; - if ($_REQUEST['pagetitle']) + if($_REQUEST['pagetitle']) $x['pagetitle'] = $_REQUEST['pagetitle']; - - + + // Get a list of webpages. We can't display all them because endless scroll makes that unusable, // so just list titles and an edit link. - - + + /** @TODO - this should be replaced with pagelist_widget */ + $sql_extra = item_permissions_sql($owner); - + $r = q("select * from iconfig left join item on iconfig.iid = item.id where item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'WEBPAGE' and item_type = %d - $sql_extra order by item.created desc", intval($owner), intval(ITEM_TYPE_WEBPAGE) + $sql_extra order by item.created desc", + intval($owner), + intval(ITEM_TYPE_WEBPAGE) ); // $r = q("select * from item_id left join item on item_id.iid = item.id @@ -189,81 +196,81 @@ class Webpages extends \Zotlabs\Web\Controller { // intval($owner), // intval(ITEM_TYPE_WEBPAGE) // ); - - if (!$r) + + if(! $r) $x['pagetitle'] = 'home'; - $editor = status_editor($a, $x); + $editor = status_editor($a,$x); $pages = null; - - if ($r) { + + if($r) { $pages = array(); - foreach ($r as $rr) { + foreach($r as $rr) { unobscure($rr); - + $lockstate = (($rr['allow_cid'] || $rr['allow_gid'] || $rr['deny_cid'] || $rr['deny_gid']) ? 'lock' : 'unlock'); - + $element_arr = array( - 'type' => 'webpage', - 'title' => $rr['title'], - 'body' => $rr['body'], - 'created' => $rr['created'], - 'edited' => $rr['edited'], - 'mimetype' => $rr['mimetype'], - 'pagetitle' => $rr['v'], - 'mid' => $rr['mid'], - 'layout_mid' => $rr['layout_mid'] + 'type' => 'webpage', + 'title' => $rr['title'], + 'body' => $rr['body'], + 'created' => $rr['created'], + 'edited' => $rr['edited'], + 'mimetype' => $rr['mimetype'], + 'pagetitle' => $rr['v'], + 'mid' => $rr['mid'], + 'layout_mid' => $rr['layout_mid'] ); $pages[$rr['iid']][] = array( - 'url' => $rr['iid'], - 'pagetitle' => $rr['v'], - 'title' => $rr['title'], - 'created' => datetime_convert('UTC', date_default_timezone_get(), $rr['created']), - 'edited' => datetime_convert('UTC', date_default_timezone_get(), $rr['edited']), - 'bb_element' => '[element]' . base64url_encode(json_encode($element_arr)) . '[/element]', - 'lockstate' => $lockstate + 'url' => $rr['iid'], + 'pagetitle' => $rr['v'], + 'title' => $rr['title'], + 'created' => datetime_convert('UTC',date_default_timezone_get(),$rr['created']), + 'edited' => datetime_convert('UTC',date_default_timezone_get(),$rr['edited']), + 'bb_element' => '[element]' . base64url_encode(json_encode($element_arr)) . '[/element]', + 'lockstate' => $lockstate ); } } - - + + //Build the base URL for edit links $url = z_root() . '/editwebpage/' . $which; - + $o .= replace_macros(get_markup_template('webpagelist.tpl'), array( - '$listtitle' => t('Webpages'), - '$baseurl' => $url, - '$create' => t('Create'), - '$edit' => t('Edit'), - '$share' => t('Share'), - '$delete' => t('Delete'), - '$pages' => $pages, - '$channel' => $which, - '$editor' => $editor, - '$view' => t('View'), - '$preview' => t('Preview'), - '$actions_txt' => t('Actions'), + '$listtitle' => t('Webpages'), + '$baseurl' => $url, + '$create' => t('Create'), + '$edit' => t('Edit'), + '$share' => t('Share'), + '$delete' => t('Delete'), + '$pages' => $pages, + '$channel' => $which, + '$editor' => $editor, + '$view' => t('View'), + '$preview' => t('Preview'), + '$actions_txt' => t('Actions'), '$pagelink_txt' => t('Page Link'), - '$title_txt' => t('Page Title'), - '$created_txt' => t('Created'), - '$edited_txt' => t('Edited') + '$title_txt' => t('Page Title'), + '$created_txt' => t('Created'), + '$edited_txt' => t('Edited') )); - + return $o; } - + function post() { - $action = $_REQUEST['action']; - if ($action) { + $action = $_REQUEST['action']; + if( $action ){ switch ($action) { - case 'scan': - + case 'scan': + // the state of this variable tracks whether website files have been scanned (null, true, false) - $cloud = null; - + $cloud = null; + // Website files are to be imported from an uploaded zip file - if (($_FILES) && array_key_exists('zip_file', $_FILES) && isset($_POST['w_upload'])) { + if(($_FILES) && array_key_exists('zip_file',$_FILES) && isset($_POST['w_upload'])) { $source = $_FILES["zip_file"]["tmp_name"]; $type = $_FILES["zip_file"]["type"]; $okay = false; @@ -274,8 +281,8 @@ class Webpages extends \Zotlabs\Web\Controller { break; } } - if (!$okay) { - notice(t('Invalid file type.') . EOL); + if(!$okay) { + notice( t('Invalid file type.') . EOL); return; } $zip = new \ZipArchive(); @@ -284,35 +291,36 @@ class Webpages extends \Zotlabs\Web\Controller { $website = dirname($source) . '/' . $tmp_folder_name; $zip->extractTo($website); // change this to the correct site path $zip->close(); - @unlink($source); // delete the compressed file now that the content has been extracted + @unlink($source); // delete the compressed file now that the content has been extracted $cloud = false; } else { - notice(t('Error opening zip file') . EOL); + notice( t('Error opening zip file') . EOL); return null; - } - } + } + } // Website files are to be imported from the channel cloud files - if (($_POST) && array_key_exists('path', $_POST) && isset($_POST['cloudsubmit'])) { + if (($_POST) && array_key_exists('path',$_POST) && isset($_POST['cloudsubmit'])) { $channel = \App::get_channel(); $dirpath = get_dirpath_by_cloudpath($channel, $_POST['path']); - if (!$dirpath) { - notice(t('Invalid folder path.') . EOL); + if(!$dirpath) { + notice( t('Invalid folder path.') . EOL); return null; } $cloud = true; - } + } + // If the website files were uploaded or specified in the cloud files, then $cloud // should be either true or false if ($cloud !== null) { require_once('include/import.php'); $elements = []; - if ($cloud) { - $path = $_POST['path']; + if($cloud) { + $path = $_POST['path']; } else { - $path = $website; + $path = $website; } $elements['pages'] = scan_webpage_elements($path, 'page', $cloud); $elements['layouts'] = scan_webpage_elements($path, 'layout', $cloud); @@ -320,367 +328,380 @@ class Webpages extends \Zotlabs\Web\Controller { $_SESSION['blocks'] = $elements['blocks']; $_SESSION['layouts'] = $elements['layouts']; $_SESSION['pages'] = $elements['pages']; - if (!(empty($elements['pages']) && empty($elements['blocks']) && empty($elements['layouts']))) { + if(!(empty($elements['pages']) && empty($elements['blocks']) && empty($elements['layouts']))) { //info( t('Webpages elements detected.') . EOL); $_SESSION['action'] = 'import'; } else { - notice(t('No webpage elements detected.') . EOL); + notice( t('No webpage elements detected.') . EOL); $_SESSION['action'] = null; } + } - + // If the website elements were imported from a zip file, delete the temporary decompressed files if ($cloud === false && $website && $elements) { $_SESSION['tempimportpath'] = $website; //rrmdir($website); // Delete the temporary decompressed files } - + break; - + case 'importselected': - require_once('include/import.php'); - $channel = \App::get_channel(); - - // Import layout first so that pages that reference new layouts will find - // the mid of layout items in the database - // Obtain the user-selected layouts to import and import them - $checkedlayouts = $_POST['layout']; - $layouts = []; - if (!empty($checkedlayouts)) { - foreach ($checkedlayouts as $name) { - foreach ($_SESSION['layouts'] as &$layout) { - if ($layout['name'] === $name) { - $layout['import'] = 1; - $layoutstoimport[] = $layout; + require_once('include/import.php'); + $channel = \App::get_channel(); + + // Import layout first so that pages that reference new layouts will find + // the mid of layout items in the database + + // Obtain the user-selected layouts to import and import them + $checkedlayouts = $_POST['layout']; + $layouts = []; + if (!empty($checkedlayouts)) { + foreach ($checkedlayouts as $name) { + foreach ($_SESSION['layouts'] as &$layout) { + if ($layout['name'] === $name) { + $layout['import'] = 1; + $layoutstoimport[] = $layout; + } + } + } + foreach ($layoutstoimport as $elementtoimport) { + $layouts[] = import_webpage_element($elementtoimport, $channel, 'layout'); } - } - } - foreach ($layoutstoimport as $elementtoimport) { - $layouts[] = import_webpage_element($elementtoimport, $channel, 'layout'); - } - } - $_SESSION['import_layouts'] = $layouts; - - // Obtain the user-selected blocks to import and import them - $checkedblocks = $_POST['block']; - $blocks = []; - if (!empty($checkedblocks)) { - foreach ($checkedblocks as $name) { - foreach ($_SESSION['blocks'] as &$block) { - if ($block['name'] === $name) { - $block['import'] = 1; - $blockstoimport[] = $block; + } + $_SESSION['import_layouts'] = $layouts; + + // Obtain the user-selected blocks to import and import them + $checkedblocks = $_POST['block']; + $blocks = []; + if (!empty($checkedblocks)) { + foreach ($checkedblocks as $name) { + foreach ($_SESSION['blocks'] as &$block) { + if ($block['name'] === $name) { + $block['import'] = 1; + $blockstoimport[] = $block; + } + } + } + foreach ($blockstoimport as $elementtoimport) { + $blocks[] = import_webpage_element($elementtoimport, $channel, 'block'); } - } - } - foreach ($blockstoimport as $elementtoimport) { - $blocks[] = import_webpage_element($elementtoimport, $channel, 'block'); - } - } - $_SESSION['import_blocks'] = $blocks; - - // Obtain the user-selected pages to import and import them - $checkedpages = $_POST['page']; - $pages = []; - if (!empty($checkedpages)) { - foreach ($checkedpages as $pagelink) { - foreach ($_SESSION['pages'] as &$page) { - if ($page['pagelink'] === $pagelink) { - $page['import'] = 1; - $pagestoimport[] = $page; + } + $_SESSION['import_blocks'] = $blocks; + + // Obtain the user-selected pages to import and import them + $checkedpages = $_POST['page']; + $pages = []; + if (!empty($checkedpages)) { + foreach ($checkedpages as $pagelink) { + foreach ($_SESSION['pages'] as &$page) { + if ($page['pagelink'] === $pagelink) { + $page['import'] = 1; + $pagestoimport[] = $page; + } + } + } + foreach ($pagestoimport as $elementtoimport) { + $pages[] = import_webpage_element($elementtoimport, $channel, 'page'); } - } + } + $_SESSION['import_pages'] = $pages; + if(!(empty($_SESSION['import_pages']) && empty($_SESSION['import_blocks']) && empty($_SESSION['import_layouts']))) { + info( t('Import complete.') . EOL); } - foreach ($pagestoimport as $elementtoimport) { - $pages[] = import_webpage_element($elementtoimport, $channel, 'page'); + if(isset($_SESSION['tempimportpath'])) { + rrmdir($_SESSION['tempimportpath']); // Delete the temporary decompressed files + unset($_SESSION['tempimportpath']); } - } - $_SESSION['import_pages'] = $pages; - if (!(empty($_SESSION['import_pages']) && empty($_SESSION['import_blocks']) && empty($_SESSION['import_layouts']))) { - info(t('Import complete.') . EOL); - } - if (isset($_SESSION['tempimportpath'])) { - rrmdir($_SESSION['tempimportpath']); // Delete the temporary decompressed files - unset($_SESSION['tempimportpath']); - } - break; - + break; + case 'exportzipfile': - - if (isset($_POST['w_download'])) { - $_SESSION['action'] = 'export_select_list'; - $_SESSION['export'] = 'zipfile'; - if (isset($_POST['zipfilename']) && $_POST['zipfilename'] !== '') { - $filename = filter_var($_POST['zipfilename'], FILTER_SANITIZE_ENCODED); - } else { - $filename = 'website.zip'; + + if(isset($_POST['w_download'])) { + $_SESSION['action'] = 'export_select_list'; + $_SESSION['export'] = 'zipfile'; + if(isset($_POST['zipfilename']) && $_POST['zipfilename'] !== '') { + $filename = filter_var($_POST['zipfilename'], FILTER_SANITIZE_ENCODED); + } else { + $filename = 'website.zip'; + } + $_SESSION['zipfilename'] = $filename; + } - $_SESSION['zipfilename'] = $filename; - } - - break; - + + break; + case 'exportcloud': - if (isset($_POST['exportcloudpath']) && $_POST['exportcloudpath'] !== '') { - $_SESSION['action'] = 'export_select_list'; - $_SESSION['export'] = 'cloud'; - $_SESSION['exportcloudpath'] = filter_var($_POST['exportcloudpath'], FILTER_SANITIZE_ENCODED); - } - - break; - + if(isset($_POST['exportcloudpath']) && $_POST['exportcloudpath'] !== '') { + $_SESSION['action'] = 'export_select_list'; + $_SESSION['export'] = 'cloud'; + $_SESSION['exportcloudpath'] = filter_var($_POST['exportcloudpath'], FILTER_SANITIZE_ENCODED); + } + + break; + case 'cloud': case 'zipfile': - - $channel = \App::get_channel(); - - $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; - - $checkedblocks = $_POST['block']; - $blocks = []; - if (!empty($checkedblocks)) { - foreach ($checkedblocks as $mid) { - $b = 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 = 'BUILDBLOCK' order by iconfig.v asc limit 1", dbesc($mid), intval($channel['channel_id']) - ); - if ($b) { - $b = $b[0]; - $blockinfo = array( - 'body' => $b['body'], - 'mimetype' => $b['mimetype'], - 'title' => $b['title'], - 'name' => $b['v'], - 'json' => array( - 'title' => $b['title'], - 'name' => $b['v'], - 'mimetype' => $b['mimetype'], - ) - ); - switch ($blockinfo['mimetype']) { - case 'text/html': - $block_ext = 'html'; - break; - case 'text/bbcode': - $block_ext = 'bbcode'; - break; - case 'text/markdown': - $block_ext = 'md'; - break; - case 'application/x-pdl': - $block_ext = 'pdl'; - break; - case 'application/x-php': - $block_ext = 'php'; - break; - default: - $block_ext = 'bbcode'; - break; - } - $block_filename = $blockinfo['name'] . '.' . $block_ext; - $tmp_blockfolder = $tmp_folderpath . '/blocks/' . $blockinfo['name']; - $block_filepath = $tmp_blockfolder . '/' . $block_filename; - $blockinfo['json']['contentfile'] = $block_filename; - $block_jsonpath = $tmp_blockfolder . '/block.json'; - if (!is_dir($tmp_blockfolder) && !mkdir($tmp_blockfolder, 0770, true)) { - logger('Error creating temp export folder: ' . $tmp_blockfolder, LOGGER_NORMAL); - json_return_and_die(array('message' => 'Error creating temp export folder')); - } - file_put_contents($block_filepath, $blockinfo['body']); - file_put_contents($block_jsonpath, json_encode($blockinfo['json'], JSON_UNESCAPED_SLASHES)); - } + + $channel = \App::get_channel(); + + $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')); } - } - - $checkedlayouts = $_POST['layout']; - $layouts = []; - if (!empty($checkedlayouts)) { - foreach ($checkedlayouts as $mid) { - $l = q("select iconfig.v, iconfig.k, mimetype, title, body from iconfig + $zip_filepath = '/tmp/' . $zip_folder_name . '/' . $zip_filename; + + $checkedblocks = $_POST['block']; + $blocks = []; + if (!empty($checkedblocks)) { + foreach ($checkedblocks as $mid) { + $b = 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($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'], - 'mimetype' => $l['mimetype'], - ) - ); - 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 (!is_dir($tmp_layoutfolder) && !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')); + where mid = '%s' and item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'BUILDBLOCK' order by iconfig.v asc limit 1", + dbesc($mid), + intval($channel['channel_id']) + ); + if($b) { + $b = $b[0]; + $blockinfo = array( + 'body' => $b['body'], + 'mimetype' => $b['mimetype'], + 'title' => $b['title'], + 'name' => $b['v'], + 'json' => array( + 'title' => $b['title'], + 'name' => $b['v'], + 'mimetype' => $b['mimetype'], + ) + ); + switch ($blockinfo['mimetype']) { + case 'text/html': + $block_ext = 'html'; + break; + case 'text/bbcode': + $block_ext = 'bbcode'; + break; + case 'text/markdown': + $block_ext = 'md'; + break; + case 'application/x-pdl': + $block_ext = 'pdl'; + break; + case 'application/x-php': + $block_ext = 'php'; + break; + default: + $block_ext = 'bbcode'; + break; + } + $block_filename = $blockinfo['name'] . '.' . $block_ext; + $tmp_blockfolder = $tmp_folderpath . '/blocks/' . $blockinfo['name']; + $block_filepath = $tmp_blockfolder . '/' . $block_filename; + $blockinfo['json']['contentfile'] = $block_filename; + $block_jsonpath = $tmp_blockfolder . '/block.json'; + if (!is_dir($tmp_blockfolder) && !mkdir($tmp_blockfolder, 0770, true)) { + logger('Error creating temp export folder: ' . $tmp_blockfolder, LOGGER_NORMAL); + json_return_and_die(array('message' => 'Error creating temp export folder')); + } + file_put_contents($block_filepath, $blockinfo['body']); + file_put_contents($block_jsonpath, json_encode($blockinfo['json'], JSON_UNESCAPED_SLASHES)); + } } - file_put_contents($layout_filepath, $layoutinfo['body']); - file_put_contents($layout_jsonpath, json_encode($layoutinfo['json'], JSON_UNESCAPED_SLASHES)); - } } - } - - $checkedpages = $_POST['page']; - $pages = []; - if (!empty($checkedpages)) { - foreach ($checkedpages as $mid) { - - $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']) { + + $checkedlayouts = $_POST['layout']; + $layouts = []; + if (!empty($checkedlayouts)) { + foreach ($checkedlayouts as $mid) { $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']) + 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($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 (!is_dir($tmp_layoutfolder) && !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)); + 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'], + 'mimetype' => $l['mimetype'], + ) + ); + 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 (!is_dir($tmp_layoutfolder) && !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 (!is_dir($tmp_pagefolder) && !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)); } - } } - } - if ($action === 'zipfile') { - // Generate the zip file - \Zotlabs\Lib\ExtendedZip::zipTree($tmp_folderpath, $zip_filepath, \ZipArchive::CREATE); - // Output the file for download - header('Content-disposition: attachment; filename="' . $zip_filename . '"'); - header("Content-Type: application/zip"); - $success = readfile($zip_filepath); - } elseif ($action === 'cloud') { // Only zipfile or cloud should be possible values for $action here - if (isset($_SESSION['exportcloudpath'])) { - require_once('include/attach.php'); - $cloudpath = urldecode($_SESSION['exportcloudpath']); - $channel = \App::get_channel(); - $dirpath = get_dirpath_by_cloudpath($channel, $cloudpath); - if (!$dirpath) { - $x = attach_mkdirp($channel, $channel['channel_hash'], array('pathname' => $cloudpath)); - $folder_hash = (($x['success']) ? $x['data']['hash'] : ''); - - if (!$x['success']) { - logger('Failed to create cloud file folder', LOGGER_NORMAL); - } - $dirpath = get_dirpath_by_cloudpath($channel, $cloudpath); - if (!is_dir($dirpath)) { - logger('Failed to create cloud file folder', LOGGER_NORMAL); + + $checkedpages = $_POST['page']; + $pages = []; + if (!empty($checkedpages)) { + foreach ($checkedpages as $mid) { + + $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']) { + $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 (!is_dir($tmp_layoutfolder) && !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 (!is_dir($tmp_pagefolder) && !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)); + } + } + } + } + if($action === 'zipfile') { + // Generate the zip file + \Zotlabs\Lib\ExtendedZip::zipTree($tmp_folderpath, $zip_filepath, \ZipArchive::CREATE); + // Output the file for download + header('Content-disposition: attachment; filename="' . $zip_filename . '"'); + header("Content-Type: application/zip"); + $success = readfile($zip_filepath); + } elseif ($action === 'cloud') { // Only zipfile or cloud should be possible values for $action here + if(isset($_SESSION['exportcloudpath'])) { + require_once('include/attach.php'); + $cloudpath = urldecode($_SESSION['exportcloudpath']); + $channel = \App::get_channel(); + $dirpath = get_dirpath_by_cloudpath($channel, $cloudpath); + if(!$dirpath) { + $x = attach_mkdirp($channel, $channel['channel_hash'], array('pathname' => $cloudpath)); + $folder_hash = (($x['success']) ? $x['data']['hash'] : ''); + + if (!$x['success']) { + logger('Failed to create cloud file folder', LOGGER_NORMAL); + } + $dirpath = get_dirpath_by_cloudpath($channel, $cloudpath); + if (!is_dir($dirpath)) { + logger('Failed to create cloud file folder', LOGGER_NORMAL); + } + } + + $success = copy_folder_to_cloudfiles($channel, $channel['channel_hash'], $tmp_folderpath, $cloudpath); } - } - - $success = copy_folder_to_cloudfiles($channel, $channel['channel_hash'], $tmp_folderpath, $cloudpath); } - } - if (!$success) { - logger('Error exporting webpage elements', LOGGER_NORMAL); - } - - rrmdir($zip_folderpath); - rrmdir($tmp_folderpath); // delete temporary files - - break; + if(!$success) { + logger('Error exporting webpage elements', LOGGER_NORMAL); + } + + rrmdir($zip_folderpath); rrmdir($tmp_folderpath); // delete temporary files + + break; default : break; } + } + } - + } |