aboutsummaryrefslogblamecommitdiffstats
path: root/Zotlabs/Module/Webpages.php
blob: e2ad7753be3dc7e82e38db2f7881c29170e60092 (plain) (tree)
1
2
3
4
5
6
7
8
     
 

                         
                                    


                                          


                                                

                                                                         
                                                 
                                                                 


                                                     

                               


                                         
 
                                     
         
 
                        


                                                                               


                                           
 
                                 
 
                                                              
 

                                       
                                                 
 
                                               

                                              







































                                                                                                                 
                 


                                                       
                                                 
                                                                 




                                                                           

                              
                                                            
                                                                                                           
                          
                                 


                                                                     
 
                                                                        




                                                              

                               




                                                                                                                               


                                                                                                     

                                                                            

                                                       
                               


                                                                             

                                                                           
                          

                                                                                                                  
                 
 
 
                                                     

                                                                                      
 
                           



                                                                                                                                                                                              
                                                                                                                                                                
                                                      



                                                                  
                                                        




                                                
                                           


                                                        

                                       
                                                         
                                      
                                                       
                                           
                                                                 

 

                                                                                                                  

 
                                                                           
                                                          
 


                                                                                                                    
                                                                                                         
                  





                                                                                                                                 

                        

                                                 
                                                
 
                              

                         
                                         
                                             
                                               
 
                                                                                                                                                
 
                                                     








                                                                         

                                                             






                                                                                                                                 


                                  

 

                                                           
 
                                                                                   











                                                       
                                                          


                                                        
                   
 

                          
 
                         

                                              
                                          

                                            
                                                                                                                                        

                                                      
                                                                                                     
                                                                                                                              









                                                                                                                                                                          

                                                                                              
                                                               






                                                                                                                          
                                                                                                                                               

                                                                       
                                                                                                  
                                                                    

                                                 
 
                                                                                                        
                                                                                                                           
 

                                                                                                              

                                                                                                


                                                                    
                                         
 




                                                                                                                          

                                                                               
                                                        
                                                                         



                                                                                                                      


                                                                                            
                                                                                                                                                
                                                                                                        
                                                                                       
                                                        
                                                                                                         
                                                                                   
                                                 
                                         
 
                                                                                                                                         
                                                                                        

                                                                                                                  
                                         
 
                                              
 
                                                      













                                                                                                                                
                                                                 
















                                                                                                                                  
                                                                 
















                                                                                                                                
                                                                 
                                                         
                                                 

                                                                                                                              
                                                 










                                                                                                                                                             
                                                     







                                                                                                                               
                                                 




                                                                                     
                                                   







                                                                                                                                              
                                             
                                               


















                                                                                                                                   
                                                                                                                                        










































                                                                                                                                                                                                                                                                       
                                                                 


                                                                                                                                                            
                                                 






                                                                                                                                
                                                                                                                                        



















                                                                                                                                                                                                                                                                
                                                                 











                                                                                                                                                              
                                                 
















                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                        






























                                                                                                                                                                                                                                                                                                                             
                                                                                 












































                                                                                                                                                                  
                                                                 
                                                         
                                                 



























                                                                                                                                                              
                                                 








                                                                                                          


                                              

                 
 
 
<?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()) {
			$sys = get_sys_channel();
			if ($sys && intval($sys['channel_id'])) {
				\App::$is_sys = true;
			}
		}

		if (argc() > 1)
			$which = argv(1);
		else
			return;

		profile_load($which);
	}

	function get() {

		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;
		}


		if (\App::$is_sys && is_site_admin()) {
			$sys = get_sys_channel();
			if ($sys && intval($sys['channel_id'])) {
				$uid = $owner = intval($sys['channel_id']);
				$channel = $sys;
				$observer = $sys;
			}
		}

		if (!$owner) {
			// Figure out who the page owner is.
			$r = q("select channel_id from channel where channel_address = '%s'", dbesc($which)
			);
			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);
			return;
		}

		$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)) {
			$channel = \App::get_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']
			);
		} 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')) : ''),
			'permissions' => $channel_acl,
			'showacl' => (($is_owner) ? true : false),
			'visitor' => true,
			'hide_location' => true,
			'hide_voting' => true,
			'profile_uid' => intval($owner),
			'mimetype' => $mimetype,
			'mimeselect' => true,
			'layout' => $layout,
			'layoutselect' => true,
			'expanded' => true,
			'novoting' => true,
			'bbco_autocomplete' => 'bbcode',
			'bbcode' => true
		);

		if ($_REQUEST['title'])
			$x['title'] = $_REQUEST['title'];
		if ($_REQUEST['body'])
			$x['body'] = $_REQUEST['body'];
		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)
		);

//		$r = q("select * from item_id left join item on item_id.iid = item.id 
//			where item_id.uid = %d and service = 'WEBPAGE' and item_type = %d $sql_extra order by item.created desc",
//			intval($owner),
//			intval(ITEM_TYPE_WEBPAGE)
//		);

		if (!$r)
			$x['pagetitle'] = 'home';

		$editor = status_editor($a, $x);

		$pages = null;

		if ($r) {
			$pages = array();
			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']
				);
				$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
				);
			}
		}


		//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'),
			'$pagelink_txt' => t('Page Link'),
			'$title_txt' => t('Page Title'),
			'$created_txt' => t('Created'),
			'$edited_txt' => t('Edited')
		));

		return $o;
	}

	function post() {
		$action = $_REQUEST['action'];
		if ($action) {
			switch ($action) {
				case 'scan':

					// the state of this variable tracks whether website files have been scanned (null, true, false)
					$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'])) {
						$source = $_FILES["zip_file"]["tmp_name"];
						$type = $_FILES["zip_file"]["type"];
						$okay = false;
						$accepted_types = array('application/zip', 'application/x-zip-compressed', 'multipart/x-zip', 'application/x-compressed');
						foreach ($accepted_types as $mime_type) {
							if ($mime_type == $type) {
								$okay = true;
								break;
							}
						}
						if (!$okay) {
							notice(t('Invalid file type.') . EOL);
							return;
						}
						$zip = new \ZipArchive();
						if ($zip->open($source) === true) {
							$tmp_folder_name = random_string(5);
							$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
							$cloud = false;
						} else {
							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'])) {

						$channel = \App::get_channel();
						$dirpath = get_dirpath_by_cloudpath($channel, $_POST['path']);
						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'];
						} else {
							$path = $website;
						}
						$elements['pages'] = scan_webpage_elements($path, 'page', $cloud);
						$elements['layouts'] = scan_webpage_elements($path, 'layout', $cloud);
						$elements['blocks'] = scan_webpage_elements($path, 'block', $cloud);
						$_SESSION['blocks'] = $elements['blocks'];
						$_SESSION['layouts'] = $elements['layouts'];
						$_SESSION['pages'] = $elements['pages'];
						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);
							$_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;
								}
							}
						}
						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;
								}
							}
						}
						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;
								}
							}
						}
						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);
					}
					if (isset($_SESSION['tempimportpath'])) {
						rrmdir($_SESSION['tempimportpath']); // Delete the temporary decompressed files
						unset($_SESSION['tempimportpath']);
					}
					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';
						}
						$_SESSION['zipfilename'] = $filename;
					}

					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;

				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));
							}
						}
					}

					$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($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'));
								}
								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']) {
										$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);
						}
					}
					if (!$success) {
						logger('Error exporting webpage elements', LOGGER_NORMAL);
					}

					rrmdir($zip_folderpath);
					rrmdir($tmp_folderpath);  // delete temporary files

					break;
				default :
					break;
			}
		}
	}

}