You are here

import.inc in Patterns 7.2

Same filename in this branch
  1. 7.2 includes/io/import.inc
  2. 7.2 includes/forms/import.inc
Same filename and directory in other branches
  1. 7 includes/forms/import.inc

Importing Patterns from a file or using an URL.

File

includes/forms/import.inc
View source
<?php

/**
 * @file
 * Importing Patterns from a file or using an URL.
 */

/**
 * Helper function to be called in one of the import validation handlers.
 */
function _patterns_import_check_dirs($dir = NULL) {

  // Check Patterns Directory.
  if (!_patterns_io_is_patterns_dir_ready($dir, FILE_CREATE_DIRECTORY)) {
    $message = t("Destination folder does not exist or is not writable: %path<br />", array(
      '%path' => $dir,
    ));

    // TODO: move this out for performance
    $link = l(t('status report'), 'admin/reports/status');
    $message .= t('You might want to check the !link to ensure your files directory exists and is writable.', array(
      '!link' => $link,
    ));
    form_set_error('pattern_file', $message);
    return FALSE;
  }
}

/**
 * Helper function to be called in one of the import validation handlers.
 */
function _patterns_import_check_name($name = '') {

  // Name Validation.
  $errors_on_name = _patterns_parser_analyze_pattern_name($name);
  if (!empty($errors_on_name)) {
    form_set_error('name', t('Errors in the name of the pattern: ' . implode(', ', $errors_on_name)));

    // TODO: use proper t()
    return FALSE;
  }
  if ($obj = patterns_db_load_pattern_from_name($name)) {
    form_set_error('name', t('A pattern file with the same name already exists: !name', array(
      '!name' => $name,
    )));
    return FALSE;
  }
}

/**
 * Form constructor for the Pattern import form.
 *
 * @see patterns_import_validate()
 * @see patterns_import_submit()
 * @ingroup forms
 */
function patterns_import_source($form, &$form_state) {
  $form = array();
  if (!patterns_parser_ready()) {
    return $form;
  }
  $def_dir = patterns_path_get_files_dir();
  $text = t('Cut and paste the content of a pattern file in the text area below to import it in the database.');
  $title = t('Import from Source');
  patterns_forms_add_page_header($form, $title, $text);
  $form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('Pattern Identifier'),
    '#description' => t('The new name of the pattern file. If the extension is missing it will be automatically added.'),
    '#required' => TRUE,
  );
  $form = patterns_forms_get_formats_selector($form);
  $form = patterns_forms_get_validation_level_selector($form, PATTERNS_VALIDATE_SYNTAX);

  //Set the field as required for the import source case
  $form['format']['#required'] = TRUE;
  $form['validation_result'] = array(
    '#markup' => 'This pattern has not been validated yet.',
    '#prefix' => '<div id="validation_result"><strong>',
    '#suffix' => '</strong></div>',
  );
  $form['content'] = array(
    '#type' => 'textarea',
    '#rows' => 25,
    '#title' => t('Enter Pattern Source Code'),
    '#description' => t('Imported patterns are not executed until you run them manually.'),
  );

  // TODO: transform in a FILE form
  $form['destination'] = array(
    '#type' => 'textfield',
    '#title' => t('Destination'),
    '#description' => t('Pattern will be saved in this directory. Must be writable. Default dir: @dir', array(
      '@dir' => $def_dir,
    )),
    '#default_value' => $def_dir,
    '#required' => TRUE,
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Import'),
  );
  $form['validate'] = array(
    '#prefix' => '<span style=\'margin-right:10px\'>',
    '#markup' => "<a href='#' id='validate_pattern'>" . t('Validate') . "</a>",
    '#suffix' => '</span> ',
  );

  // ? Double array ?
  $form['#validate'][] = 'patterns_import_validate';
  $form['#submit'][] = 'patterns_import_submit';
  return $form;
}

/**
 * Display the import pattern file form
 */
function patterns_import_file($form, &$form_state) {
  $form = array();
  if (!patterns_parser_ready()) {
    $messages = t('No available patterns parser was found.</br>');
    $messages .= t(' Go to the !modules page to enable more Patterns parsers.', array(
      '!modules' => l(t('modules'), 'admin/modules'),
    ));
    drupal_set_message($messages, 'warning');
    return $form;
  }
  $def_dir = patterns_path_get_files_dir();
  $text = 'Choose a local file to import in the database.';
  $title = 'Import from File';
  patterns_forms_add_page_header($form, $title, $text);
  $form['#attributes']['enctype'] = 'multipart/form-data';
  $form['pattern_uri'] = array(
    '#type' => 'file',
    '#title' => t('Upload Pattern File'),
    '#description' => t('Imported patterns are not executed until you run them manually.'),
    '#size' => 48,
  );
  $form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('Pattern Identifier'),
    '#description' => t('The new name of the pattern file. If the extension is missing it will be automatically added.'),
    '#required' => TRUE,
  );
  $form = patterns_forms_get_formats_selector($form, PATTERNS_FORMAT_UNKNOWN, 'If unknown, it will be determined by the extension.');

  // TODO: transform in a FILE form
  $form['destination'] = array(
    '#type' => 'textfield',
    '#title' => t('Destination'),
    '#description' => t('Pattern will be saved in this directory. Must be writable. Default dir: @dir', array(
      '@dir' => $def_dir,
    )),
    '#default_value' => $def_dir,
    '#required' => TRUE,
  );
  $form['local'] = array(
    '#type' => 'hidden',
    '#value' => TRUE,
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Import'),
  );
  $form['#validate'][] = 'patterns_import_validate';
  $form['#submit'][] = 'patterns_import_submit';
  return $form;
}

/**
 * Display the import pattern url form
 */
function patterns_import_url($form, &$form_state) {

  //$form = array();

  //if (!patterns_parser_ready()) {

  //  $form['noparser'] = array(
  //    '#markup' => t('No Patterns parser found. Impossible to continue. Please enable at least one valid Patterns parser first.'),
  //    '#prefix' => '<strong>',
  //    '#suffix' => '</strong></br>',
  //  );
  //  $form['parsers'] = array(
  //    '#markup' => t('Go to the !modules page to enable more Patterns parsers.', array('!modules' => l(t('modules'), 'admin/modules'))),
  //  );
  //  return $form;

  //}
  $form = array();
  if (!patterns_parser_ready()) {
    $messages = t('No available patterns parser was found.</br>');
    $messages .= t(' Go to the !modules page to enable more Patterns parsers.', array(
      '!modules' => l(t('modules'), 'admin/modules'),
    ));
    drupal_set_message($messages, 'warning');
    return $form;
  }
  $text = 'Insert the uri of a remote file to be downloaded and imported in the database.';
  $title = 'Import from URL';
  patterns_forms_add_page_header($form, $title, $text);
  if (!ini_get('allow_url_fopen')) {
    $form['import_url'] = array(
      // The string 'Feature disabled' is checked inside the test directory
      // do not change or change both
      '#prefix' => '<strong>' . t('Feature disabled:') . '</strong>',
      '#markup' => t('directive "allow_url_fopen" must be enabled in your PHP configuration in order to use this feature.'),
    );
    return $form;
  }
  $def_dir = patterns_path_get_files_dir();
  $form['pattern_uri'] = array(
    '#type' => 'textfield',
    '#title' => t('Specify an URI'),
    '#description' => t('Import a pattern from a remote URL. Imported patterns are not executed until you run them manually.'),
    '#size' => 48,
    '#required' => TRUE,
  );
  $form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('Pattern Identifier'),
    '#description' => t('The new name of the pattern file. If the extension is missing it will be automatically added.'),
    '#required' => TRUE,
  );
  $form = patterns_forms_get_formats_selector($form, PATTERNS_FORMAT_UNKNOWN, 'If unknown, it will be determined by the extension.');
  $form['destination'] = array(
    '#type' => 'textfield',
    '#title' => t('Destination'),
    '#description' => t('Pattern will be saved in this directory. Must be writable. Default dir: @dir', array(
      '@dir' => $def_dir,
    )),
    '#default_value' => $def_dir,
    '#required' => TRUE,
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Import'),
  );

  // Now it has his own
  $form['#validate'][] = 'patterns_import_validate';
  $form['#submit'][] = 'patterns_import_submit';
  return $form;
}
function patterns_import_validate($form, &$form_state) {
  $destination = $form_state['values']['destination'];

  // If not automatically returns
  _patterns_import_check_dirs($destination);
  _patterns_import_check_name($form_state['values']['name']);

  // Retreiving the format
  if (isset($form_state['values']['format']) && $form_state['values']['format'] != PATTERNS_FORMAT_UNKNOWN) {
    $format = $form_state['values']['format'];
  }
  elseif (isset($_FILES['files']['name']['pattern_uri'])) {
    $format = pathinfo($_FILES['files']['name']['pattern_uri'], PATHINFO_EXTENSION);
  }
  elseif (isset($form_state['values']['pattern_uri'])) {
    $format = pathinfo($form_state['values']['pattern_uri'], PATHINFO_EXTENSION);
  }
  else {
    $format = PATTERNS_FORMAT_UNKNOWN;
  }
  if (!patterns_parser_exists($format)) {
    form_set_error('format', t('The pattern format seems to be invalid.'));
    return FALSE;
  }

  // Safety assign
  $form_state['values']['format'] = $format;

  // FILE or URI
  if (!isset($form_state['values']['content'])) {
    $err_file = FALSE;

    // Local
    if (isset($form_state['values']['local'])) {
      $validators = array(
        'file_validate_extensions' => array(
          implode(' ', patterns_parser_get_formats(FALSE)),
        ),
      );
      if ($file = file_save_upload('pattern_uri', $validators)) {
        $form_state['values']['content'] = file_get_contents($file->uri);
        $form_state['pattern_uri'] = $file;
        $form_state['pattern_uri']->destination = $destination;
      }
      else {
        $err_file = TRUE;
      }
    }
    else {
      if (!ini_get('allow_url_fopen')) {
        form_set_error('url', t('allow_url_fopen must be enabled in your php configuration in order to use this feature.'));
        return FALSE;
      }
      if ($content = file_get_contents($form_state['values']['pattern_uri'])) {
        $form_state['values']['content'] = $content;
      }
      else {
        $err_file = TRUE;
      }
    }
    if ($err_file) {
      form_set_error('pattern_uri', t('Failed to retrieve the pattern specified: %uri. Check your file and try again.', array(
        '%uri' => $form_state['values']['pattern_uri'],
      )));
      return FALSE;
    }
  }

  // End FILE or URI
  // Parse
  $pattern = patterns_parser_parse($form_state['values']['content'], $format);
  if (!$pattern) {
    form_set_error('content', t('Pattern could not parsed. Please make sure it is well formed.'));
    return FALSE;
  }
  $patternscan = patterns_scan_pattern($pattern, FALSE, PATTERNS_VALIDATE_TAG_EXISTS);
  if (!_patterns_scan_validate_patternscan($patternscan)) {
    $errors_on_scan = _patterns_scan_analyze_patternscan($patternscan);
    form_set_error('name', t('Error parsing the file: ' . implode(', ', $errors_on_scan)));

    // TODO: proper t()
  }

  // We save here the parsed pattern
  $form_state['values']['pattern'] = $pattern;
  return TRUE;
}
function patterns_import_submit($form, &$form_state) {
  $success = FALSE;
  $name = $form_state['values']['name'];
  $format = isset($form_state['values']['format']) ? $form_state['values']['format'] : PATTERNS_FORMAT_UNKNOWN;
  $content = isset($form_state['values']['pattern']) ? $form_state['values']['pattern'] : $form_state['values']['content'];
  if (!empty($content)) {
    $success = patterns_io_save_pattern($content, $name, $format, $form_state['values']['destination'], $form_state['values']['content']);
  }

  // success message displayed by patterns_io_save_pattern
  if (!$success) {
    drupal_set_message(t('File %name could not be saved on the server. Import failed.', array(
      '%name' => $name,
    )), 'error');
  }
  $form_state['redirect'] = 'admin/patterns';
}

/**
 * Creates a miniminal form_state object to import a pattern into the database.
 *
 * Returns FALSE if $name or $pattern are missing.
 *
 * @param mixed $name the name of the pattern
 * @param mixed $pattern the pattern code as string or array. If array gets
 *  converted to string
 * @param mixed $dest the folder in the file system where the pattern will be
 *  saved. If empty it uses the default patterns files directory.
 */
function patterns_import_build_import_form_state($name = NULL, $pattern = NULL, $dest = NULL) {
  if (is_null($name) || is_null($pattern)) {
    return FALSE;
  }
  if (is_null($dest)) {
    $dest = patterns_path_get_files_dir();
  }
  $form = array();
  $form['values'] = array();
  $form['values']['name'] = $name;
  $form['values']['content'] = $pattern;
  $form['values']['destination'] = $dest;
  return $form;
}

Functions

Namesort descending Description
patterns_import_build_import_form_state Creates a miniminal form_state object to import a pattern into the database.
patterns_import_file Display the import pattern file form
patterns_import_source Form constructor for the Pattern import form.
patterns_import_submit
patterns_import_url Display the import pattern url form
patterns_import_validate
_patterns_import_check_dirs Helper function to be called in one of the import validation handlers.
_patterns_import_check_name Helper function to be called in one of the import validation handlers.