1 installer.manager.inc installer_manager_install_form_validate($form, &$form_state)

Form validation handler for installer_manager_install_form().

See also

installer_manager_install_form_submit()

Related topics

File

core/modules/installer/installer.manager.inc, line 664
Administrative screens and processing functions of the Installer module.

Code

function installer_manager_install_form_validate($form, &$form_state) {
  if (!empty($form_state['values']['bulk'])) {
    // Prepare entered names.
    $project_names = explode("\n", $form_state['values']['bulk']);
    $project_names = array_map('trim', $project_names);
    $project_names = array_filter($project_names, 'strlen');
    if (empty($project_names)) {
      form_set_error('bulk', t('Sorry, none of the submitted names are valid.'));
    }

    // This repetitious bit here exists because there is no way to query all
    // projects at once from the server. So we compromise by searching each
    // project type using a large 'items_per_page' value to get all results.
    // Since we can only query the server by project, we ask for all modules
    // first, check if any of the submitted project names are not modules, then
    // check themes, then layouts. Anything left over after this is not a valid
    // project on the server.
    $not_found = array();
    module_load_include('inc', 'installer', 'installer.browser');

    $modules = installer_browser_fetch_results(array('items_per_page' => 999, 'type' => 'module'));
    $all_projects = $modules['projects'];
    if (!empty($modules)) {
      $listed_projects = array_keys($modules['projects']);
      $not_found = array_diff($project_names, $listed_projects);
      if ($not_found) {
        $themes = installer_browser_fetch_results(array('items_per_page' => 999, 'type' => 'theme'));
        if (!empty($themes)) {
          $all_projects = array_merge($all_projects, $themes['projects']);
          $listed_projects = array_keys($themes['projects']);
          $not_found = array_diff($not_found, $listed_projects);
          if ($not_found) {
            $layouts = installer_browser_fetch_results(array('items_per_page' => 999, 'type' => 'layout'));
            if (!empty($layouts)) {
              $all_projects = array_merge($all_projects, $layouts['projects']);
              $listed_projects = array_keys($layouts['projects']);
              $not_found = array_diff($not_found, $listed_projects);
            }
          }
        }
      }
    }
    else {
      // If there was no return from the server assume it is offline.
      form_set_error('bulk', t('Sorry, the project server is offline.'));
    }

    // If some of the submitted names were not valid projects first check to
    // see if any at all were valid. If some were valid, we proceed with a
    // warning. If not were valid, we terminate with error.
    if ($not_found) {
      $project_names = array_diff($project_names, $not_found);
      backdrop_set_message(t('Sorry, the following projects were not recognized: %names', array('%names' => implode(', ', $not_found))));
    }
    // Check if any remaining names are already installed.
    foreach ($project_names as $project_name) {
      $project = $all_projects[$project_name];
      // Check not already downloaded.
      $already_enabled = array();
      if (backdrop_get_filename($project['type'], $project_name)) {
        $already_enabled[] = $project_name;
      }
      if (!empty($already_enabled)) {
        $project_names = array_diff($project_names, $already_enabled);
        backdrop_set_message(t('The following projects are already installed: %names', array('%names' => implode(', ', $already_enabled))));
      }
    }

    // If there are no valid projects left, stop here
    if (!$project_names) {
      form_set_error('bulk', t('Sorry, none of the submitted names are valid projects.'));
    }

    // If we got this far, we have at least one valid project, so save in
    // $form_state.
    $projects = array();
    foreach ($project_names as $project_name) {
      $projects[$project_name] = $all_projects[$project_name];
    }

    $form_state['projects'] = $projects;
  }
  elseif (!($form_state['values']['project_url'] XOR !empty($_FILES['files']['name']['project_upload']))) {
    form_set_error('project_url', t('You must either provide project names, a URL, or upload an archive file to install.'));
  }
}