private function display_install_page() { $flash_id = 'fw_extensions_install'; if (!$this->can_install()) { FW_Flash_Messages::add($flash_id, __('You are not allowed to install extensions.', 'fw'), 'error'); $this->js_redirect(); return; } if (array_key_exists('supported', $_GET)) { $supported = true; $extensions = array_fill_keys(array_keys($this->get_supported_extensions_for_install()), array()); if (empty($extensions)) { FW_Flash_Messages::add($flash_id, __('All supported extensions are already installed.', 'fw'), 'info'); $this->js_redirect(); return; } } else { $supported = false; $extensions = array_fill_keys(array_map('trim', explode(',', FW_Request::GET('extension', ''))), array()); // activate already installed extensions $this->activate_extensions($extensions); } if (!class_exists('_FW_Extensions_Install_Upgrader_Skin')) { fw_include_file_isolated(dirname(__FILE__) . '/includes/class--fw-extensions-install-upgrader-skin.php'); } $skin = new _FW_Extensions_Install_Upgrader_Skin(array('title' => $supported ? _n('Install Compatible Extension', 'Install Compatible Extensions', count($extensions), 'fw') : _n('Install Extension', 'Install Extensions', count($extensions), 'fw'))); $skin->header(); do { $nonce = $this->get_nonce('install'); if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!isset($_POST[$nonce['name']]) || !wp_verify_nonce($_POST[$nonce['name']], $nonce['action'])) { $skin->error(__('Invalid nonce.', 'fw')); } if (!FW_WP_Filesystem::request_access(fw_get_framework_directory('/extensions'), fw_current_url(), array($nonce['name']))) { break; } $install_result = $this->install_extensions($extensions, array('verbose' => $skin)); if (is_wp_error($install_result)) { $skin->error($install_result); } elseif (is_array($install_result)) { $error = array(); foreach ($install_result as $extension_name => $extension_result) { if (is_wp_error($extension_result)) { $error[] = $extension_result->get_error_message(); } } $error = '<ul><li>' . implode('</li><li>', $error) . '</li></ul>'; $skin->error($error); } elseif ($install_result === true) { $skin->set_result(true); } /** @var WP_Filesystem_Base $wp_filesystem */ global $wp_filesystem; $wp_fs_tmp_dir = FW_WP_Filesystem::real_path_to_filesystem_path($this->get_tmp_dir()); if ($wp_filesystem->exists($wp_fs_tmp_dir)) { if (!$wp_filesystem->rmdir($wp_fs_tmp_dir, true)) { $skin->error(sprintf(__('Cannot remove temporary directory: %s', 'fw'), $wp_fs_tmp_dir)); } } $skin->after(array('extensions_page_link' => $this->get_link())); } else { echo '<form method="post">'; wp_nonce_field($nonce['action'], $nonce['name']); $extension_titles = array(); foreach ($extensions as $extension_name => $not_used_var) { $extension_titles[$extension_name] = $this->get_extension_title($extension_name); } fw_render_view(dirname(__FILE__) . '/views/install-form.php', array('extension_titles' => $extension_titles, 'list_page_link' => $this->get_link(), 'supported' => $supported), false); echo '</form>'; } } while (false); $skin->footer(); }
private function display_install_page() { $flash_id = 'fw_extensions_install'; if (!$this->can_install()) { FW_Flash_Messages::add($flash_id, __('You are not allowed to install extensions.', 'fw'), 'error'); $this->js_redirect(); return; } $installed_extensions = $this->get_installed_extensions(); if (array_key_exists('supported', $_GET)) { $supported = true; $this->activate_extensions_if_exists(array_fill_keys(array_keys(fw()->theme->manifest->get('supported_extensions', array())), array())); $install_data = $this->get_install_data(array_keys($this->get_supported_extensions_for_install())); } else { $supported = false; $extension_names = array_map('trim', explode(',', FW_Request::GET('extension', ''))); $this->activate_extensions_if_exists(array_fill_keys($extension_names, array())); $install_data = $this->get_install_data($extension_names); unset($extension_names); } if (is_wp_error($install_data)) { FW_Flash_Messages::add($flash_id, $install_data->get_error_message(), 'error'); $this->js_redirect(); return; } if (!class_exists('_FW_Extensions_Install_Upgrader_Skin')) { fw_include_file_isolated(dirname(__FILE__) . '/includes/class--fw-extensions-install-upgrader-skin.php'); } $skin = new _FW_Extensions_Install_Upgrader_Skin(array('title' => $supported ? _n('Install Compatible Extension', 'Install Compatible Extensions', count($install_data['all']), 'fw') : _n('Install Extension', 'Install Extensions', count($install_data['all']), 'fw'))); $skin->header(); do { $nonce = $this->get_nonce('install'); if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!isset($_POST[$nonce['name']]) || !wp_verify_nonce($_POST[$nonce['name']], $nonce['action'])) { $skin->error(__('Invalid nonce.', 'fw')); } if (!FW_WP_Filesystem::request_access(fw_get_framework_directory('/extensions'), fw_current_url(), array($nonce['name']))) { break; } // increase timeout if (function_exists('set_time_limit') && function_exists('ini_get') && ($timeout = intval(ini_get('max_execution_time')))) { $extensions_count = 0; foreach ($install_data['parents'] as $extension_name => $parent_extensions) { $extensions_count += count($parent_extensions); } set_time_limit($timeout + $extensions_count * 10); } $available_extensions = $this->get_available_extensions(); $extensions_before_install = array_keys($installed_extensions); $activate_extensions = array(); do { /** * Install parent extensions and the extension */ foreach ($install_data['parents'] as $extension_name => $parent_extensions) { $current_extension_path = fw_get_framework_directory(); foreach ($parent_extensions as $parent_extension_name) { $current_extension_path .= '/extensions/' . $parent_extension_name; if (isset($installed_extensions[$parent_extension_name])) { // skip already installed extensions $activate_extensions[$parent_extension_name] = array(); continue; } $skin->feedback(sprintf(__('Downloading the "%s" extension...', 'fw'), $install_data['all'][$parent_extension_name])); $wp_fw_downloaded_dir = $this->download($parent_extension_name, $available_extensions[$parent_extension_name]); if (is_wp_error($wp_fw_downloaded_dir)) { $skin->error($wp_fw_downloaded_dir); break 3; } $skin->feedback(sprintf(__('Installing the "%s" extension...', 'fw'), $install_data['all'][$parent_extension_name])); $merge_result = $this->merge_extension($wp_fw_downloaded_dir, FW_WP_Filesystem::real_path_to_filesystem_path($current_extension_path)); if (is_wp_error($merge_result)) { $skin->error($merge_result); break 3; } $skin->feedback(sprintf(__('%s extension successfully installed.', 'fw'), $install_data['all'][$parent_extension_name])); $activate_extensions[$parent_extension_name] = array(); unset($installed_extensions); $installed_extensions = $this->get_installed_extensions(true); } } $skin->set_result(true); $install_data = false; /** * Collect newly installed extensions required extensions */ do { $new_extensions = array_diff(array_keys($installed_extensions), $extensions_before_install); if (empty($new_extensions)) { break; } $activate_extensions += array_fill_keys($new_extensions, array()); $extensions_before_install = array_keys($installed_extensions); $required_extensions = array(); foreach ($new_extensions as $extension_name) { $extension_required_extensions = fw_akg('requirements/extensions', $installed_extensions[$extension_name]['manifest'], array()); if (empty($extension_required_extensions)) { continue; } foreach ($extension_required_extensions as $required_extension_name => $required_extension_data) { $activate_extensions[$required_extension_name] = array(); if (isset($installed_extensions[$required_extension_name])) { continue; } $required_extensions[$required_extension_name] = true; } } if (empty($required_extensions)) { break; } $required_extensions = array_keys($required_extensions); $install_data = $this->get_install_data($required_extensions); if (is_wp_error($install_data)) { $skin->feedback(sprintf(_n('Installed extensions has required extension: %s.', 'Installed extensions has required extensions: %s.', count($required_extensions), 'fw'), implode(', ', $required_extensions))); $skin->error($install_data); $install_data = false; break 2; } else { $required_extensions_titles = array(); foreach ($required_extensions as $required_extension_name) { $required_extensions_titles[$required_extension_name] = $available_extensions[$required_extension_name]['name']; } $skin->feedback(sprintf(_n('Installed extensions has required extension: %s. Installing...', 'Installed extensions has required extensions: %s. Installing...', count($required_extensions_titles), 'fw'), implode(', ', $required_extensions_titles))); } } while (false); } while (!empty($install_data)); /** @var WP_Filesystem_Base $wp_filesystem */ global $wp_filesystem; $wp_fs_tmp_dir = FW_WP_Filesystem::real_path_to_filesystem_path($this->get_tmp_dir()); if ($wp_filesystem->exists($wp_fs_tmp_dir)) { if (!$wp_filesystem->rmdir($wp_fs_tmp_dir, true)) { $skin->error(sprintf(__('Cannot remove temporary directory: %s', 'fw'), $wp_fs_tmp_dir)); break; } } $skin->after(array('extensions_page_link' => $this->get_link())); } else { echo '<form method="post">'; wp_nonce_field($nonce['action'], $nonce['name']); fw_render_view(dirname(__FILE__) . '/views/install-form.php', array('extension_titles' => $install_data['all'], 'list_page_link' => $this->get_link(), 'supported' => $supported), false); echo '</form>'; } } while (false); if (!empty($activate_extensions)) { $db_active_extensions = fw()->extensions->_get_db_active_extensions(); $db_active_extensions += $activate_extensions; // make sure to activate parents foreach ($activate_extensions as $extension_name => $x) { $current_parent = $extension_name; while ($current_parent = $installed_extensions[$current_parent]['parent']) { $db_active_extensions[$current_parent] = array(); } } update_option(fw()->extensions->_get_active_extensions_db_option_name(), $db_active_extensions); } $skin->footer(); }