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