You are here

function feed_import_edit_feed_form in Feed Import 7.2

Same name and namespace in other branches
  1. 7.3 feed_import.module \feed_import_edit_feed_form()
  2. 7 feed_import.module \feed_import_edit_feed_form()

Edit feed form

1 string reference to 'feed_import_edit_feed_form'
feed_import_menu in ./feed_import.module
Implements hook_menu().

File

./feed_import.module, line 1028
User interface, cron functions for feed_import module

Code

function feed_import_edit_feed_form($form, &$form_state, $id) {

  // Get feed.
  $id = (int) $id;
  $feed = FeedImport::loadFeeds(FALSE, $id);
  if (!$feed) {
    drupal_set_message(t("Feed doesn't exist!"), 'error');
    drupal_goto(FEED_IMPORT_PATH);
    return;
  }

  // Set page title.
  drupal_set_title(t('Edit feed @name', array(
    '@name' => $feed['name'],
  )), PASS_THROUGH);

  // Basic feed fields.
  $form['id'] = array(
    '#type' => 'value',
    '#value' => $feed['id'],
  );
  $form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('Feed name'),
    '#description' => t('This usually is source name.'),
    '#default_value' => $feed['name'],
    '#required' => TRUE,
  );
  $options = array();
  $entities = FeedImport::getEntityInfo();
  foreach ($entities as &$entity) {
    $options[$entity['name']] = $entity['name'];
  }
  if (!isset($feed['entity_info']['#entity']) || empty($feed['entity_info']['#entity'])) {
    $feed['entity_info']['#entity'] = 'node';
  }
  $form['entity'] = array(
    '#type' => 'select',
    '#options' => $options,
    '#default_value' => isset($feed['entity_info']['#entity']) ? $feed['entity_info']['#entity'] : 'node',
    '#title' => t('Entity name'),
    '#description' => t('Entity where you want to import content. Ex: "node"'),
    '#required' => TRUE,
    '#disabled' => is_array($feed['xpath']['#items']) ? count($feed['xpath']['#items']) : 0,
  );
  $form['url'] = array(
    '#type' => 'textfield',
    '#title' => t('URL to feed'),
    '#description' => t('Please use a valid url that returns valid content!'),
    '#default_value' => $feed['url'],
    '#required' => TRUE,
  );
  $options = array();
  $functions = FeedImport::processFunctions();
  foreach ($functions as $f => &$func) {
    $options[$f] = $f;
  }
  $form['process_function'] = array(
    '#type' => 'select',
    '#options' => $options,
    '#default_value' => isset($feed['xpath']['#process_function']) ? $feed['xpath']['#process_function'] : reset($options),
    '#title' => t('Select process function'),
    '#ajax' => array(
      'event' => 'change',
      'callback' => 'feed_import_ajax_change_process_function_settings',
      'wrapper' => 'process_function_settings',
      'method' => 'replace',
    ),
  );

  // Process function settings.
  $form['settings'] = array(
    '#type' => 'fieldset',
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
    '#title' => t('Process function settings'),
    '#tree' => TRUE,
    '#attributes' => array(
      'id' => 'process_function_settings',
    ),
  );
  if (isset($form_state['values']['process_function'])) {
    $process_func = $form_state['values']['process_function'];
    $form['settings']['#collapsed'] = FALSE;
  }
  else {
    $process_func = $form['process_function']['#default_value'];
  }

  // Get current process function info.
  $functions = $functions[$process_func];

  // Add settings info.
  if (!empty($functions['settings'])) {
    $form['settings']['info'] = array(
      '#markup' => $functions['info'] . '<br /><u>' . t('If a field value is not valid default value will be used without any warnings!') . '</u>',
    );
    $use_default = $process_func == $feed['xpath']['#process_function'];
    foreach ($functions['settings'] as $field_name => &$field_info) {
      if ($use_default && isset($feed['xpath']['#settings'][$field_name])) {
        $field_info['default'] = $feed['xpath']['#settings'][$field_name];
      }
      $form['settings'][$field_name] = array(
        '#type' => 'textfield',
        '#title' => check_plain($field_info['title']),
        '#description' => check_plain($field_info['description']),
        '#default_value' => $field_info['default'],
      );
      $field_info = NULL;
    }
  }
  else {
    $form['settings']['info'] = array(
      '#markup' => t("This process function doesn't have settings."),
    );
  }
  unset($functions);
  $form['time'] = array(
    '#type' => 'textfield',
    '#title' => t('Keep imported items (seconds)'),
    '#description' => t("This is used to delete items after expiration. 0 means item don't expire."),
    '#default_value' => $feed['time'],
    '#required' => TRUE,
  );
  $form['enabled'] = array(
    '#type' => 'checkbox',
    '#title' => t('Import at cron'),
    '#default_value' => $feed['enabled'],
    '#description' => t('Check this if you want to import feed items when cron runs.'),
  );

  // XPATH settings fieldset.
  $form['xpath'] = array(
    '#type' => 'fieldset',
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
    '#title' => t('XPATH settings'),
  );
  $form['xpath']['root'] = array(
    '#type' => 'textfield',
    '#default_value' => isset($feed['xpath']['#root']) ? $feed['xpath']['#root'] : '',
    '#title' => t('Enter parent item xpath'),
    '#description' => t("Usualy this starts with // and it's base query (context for all items)."),
  );
  $form['xpath']['uniq'] = array(
    '#type' => 'textfield',
    '#default_value' => isset($feed['xpath']['#uniq']) ? $feed['xpath']['#uniq'] : '',
    '#title' => t('Enter xpath to a unique identifier of item'),
    '#description' => t("This is unique per item. Usually it's an ID. If empty then items will not be monitorized."),
  );
  $form['xpath']['skip_imported_items'] = array(
    '#type' => 'checkbox',
    '#title' => t('Skip already imported items'),
    '#default_value' => !empty($feed['xpath']['#skip_imported_items']),
    '#description' => t('This is possible only when items are monitorized.'),
  );

  // XPATH items.
  $form['xpath']['items'] = array(
    '#type' => 'container',
    '#attributes' => array(
      'id' => 'xpath_items',
    ),
    '#prefix' => '<label for="xpath_items">' . t('Current fields') . '</label>',
  );
  $xpaths = array();
  if (isset($form_state['#current_item'])) {
    for ($i = 0; $i <= $form_state['#current_item']; $i++) {
      if (isset($form_state['values']['xpath_' . $i])) {
        $default_val = isset($form_state['values']['xpath_' . $i]) ? $form_state['values']['xpath_' . $i] : '';
        if (is_array($default_val)) {
          $default_val = implode(PHP_EOL, $default_val);
        }
        $vars = array(
          '#field' => $form_state['complete form']['xpath']['items']['container_' . $i]['#title'],
          '#xpath' => $default_val,
          '#default_value' => isset($form_state['values']['default_' . $i]) ? $form_state['values']['default_' . $i] : '',
          '#default_action' => isset($form_state['values']['default_action_' . $i]) ? $form_state['values']['default_action_' . $i] : '',
        );
        $xpaths += feed_import_generate_xpath_item($i, $vars);
      }
    }
  }
  else {
    $form_state['#current_item'] = -1;
    if (!empty($feed['xpath']['#items'])) {
      foreach ($feed['xpath']['#items'] as &$field) {
        $form_state['#current_item']++;
        $xpaths += feed_import_generate_xpath_item($form_state['#current_item'], $field, TRUE);
      }
    }
  }
  $cbk = isset($form_state['triggering_element']['#parents'][0]) ? $form_state['triggering_element']['#parents'][0] : '';
  switch (TRUE) {
    case $cbk == 'add_new_item':
      $form_state['#field_added'] = FALSE;
      $vars = $form_state['values']['add_new_item_mode'] ? 'add_new_item_field' : 'add_new_item_manual';
      $vars = drupal_strtolower($form_state['values'][$vars]);
      if (empty($vars)) {
        break;
      }
      else {
        $i = 0;
        while (isset($form_state['complete form']['xpath']['items']['container_' . $i])) {
          if ($form_state['complete form']['xpath']['items']['container_' . $i]['#title'] == $vars) {
            break 2;
          }
          $i++;
        }
        unset($i);
      }
      $form_state['#field_added'] = TRUE;
      $form_state['#current_item']++;
      $xpaths += feed_import_generate_xpath_item($form_state['#current_item'], array(
        '#field' => $vars,
      ));
      break;
    case preg_match('/remove_container_([0-9]{1,9})/', $cbk, $match):

      // Delete container.
      unset($xpaths['container_' . $match[1]]);
      break;
  }
  $form['xpath']['items'] += $xpaths;
  unset($xpaths);

  // Add new name.
  $fields_options = array();
  foreach ($entities[$feed['entity_info']['#entity']]['columns'] as $f => &$v) {
    if (!isset($feed['xpath']['#items'][$f])) {
      $fields_options[$f] = $f;
    }
  }
  $form['xpath']['add_new_item_mode'] = array(
    '#type' => 'checkbox',
    '#title' => t('Use defined fields'),
    '#default_value' => TRUE,
  );
  $form['xpath']['add_new_item_field'] = array(
    '#type' => 'select',
    '#options' => $fields_options,
    '#title' => t('Select defined field'),
    '#description' => t('Select field name and click "' . t('Add field') . '" button'),
    '#states' => array(
      'visible' => array(
        ':input[name=add_new_item_mode]' => array(
          'checked' => TRUE,
        ),
      ),
    ),
  );
  $form['xpath']['add_new_item_manual'] = array(
    '#type' => 'textfield',
    '#title' => t('Enter field name'),
    '#description' => t('Write field name and click "' . t('Add field') . '" button'),
    '#states' => array(
      'visible' => array(
        ':input[name=add_new_item_mode]' => array(
          'checked' => FALSE,
        ),
      ),
    ),
  );

  // Add new item button.
  $form['xpath']['add_new_item'] = array(
    '#type' => 'button',
    '#value' => t('Add field'),
    '#inline' => TRUE,
    '#ajax' => array(
      'event' => 'click',
      'callback' => 'feed_import_ajax_add_new_item',
      'wrapper' => 'xpath_items',
      'method' => 'append',
    ),
  );

  // Submit buttons.
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save feed'),
  );
  $form['cancel'] = array(
    '#type' => 'submit',
    '#value' => t('Cancel'),
  );

  // Add js.
  $form['#attached'] = array(
    'js' => array(
      drupal_get_path('module', 'feed_import') . '/feed_import.js' => array(
        'type' => 'file',
      ),
    ),
  );
  return $form;
}