View source
<?php
$plugin = array(
'form' => 'feeds_tamper_conditional_form',
'callback' => 'feeds_tamper_conditional_callback',
'name' => 'Conditional',
'multi' => 'skip',
'category' => 'Other',
);
function feeds_tamper_conditional_form($importer, $element_key, $settings) {
$form = array();
$form['help'] = array(
'#markup' => t('Only writes the field if a condition is met. Condition can be based on the value
of any field.'),
);
$feeds_filemaker = get_class($importer->parser) == 'FeedsFileMakerParser' ? TRUE : FALSE;
$replace = array();
$mappings = $importer->processor->config['mappings'];
foreach ($mappings as $mapping) {
if ($feeds_filemaker) {
$prefix = $importer->config['parser']['config']['mappings'][$mapping['source']]['mapping'] . ' - ';
}
else {
$prefix = '';
}
$replace[$mapping['source']] = $prefix . $mapping['target'] . ' [' . $mapping['source'] . ']';
}
$form['conditional_field'] = array(
'#type' => 'select',
'#title' => t('Field mapping to check'),
'#options' => $replace,
'#required' => TRUE,
'#default_value' => isset($settings['conditional_field']) ? $settings['conditional_field'] : '',
);
$operators = array(
'equals' => 'Equals',
'not_equals' => 'Does not equal',
'begins' => 'Begins with',
'ends' => 'Ends with',
'greater' => 'Greater than',
'greater_equal' => 'Greater than or equal',
'less' => 'Less than',
'less_equal' => 'Less than or equal',
'contains' => 'Contains',
'not_contains' => 'Does not contain',
'empty' => 'Is empty',
'set' => 'Is set',
'null' => 'Is null',
'array' => 'Is array',
'bool' => 'Is boolean',
'int' => 'Is integer',
'float' => 'Is float',
'numeric' => 'Is numeric',
'string' => 'Is string',
);
$form['operator'] = array(
'#type' => 'select',
'#title' => t('Operator'),
'#options' => $operators,
'#default_value' => isset($settings['operator']) ? $settings['operator'] : '',
'#required' => TRUE,
);
$form['negate'] = array(
'#type' => 'checkbox',
'#title' => t('Negate'),
'#default_value' => isset($settings['negate']) ? $settings['negate'] : 0,
'#states' => array(
'visible' => array(
'select[name="settings[operator]"]' => array(
array(
'value' => 'begins',
),
array(
'value' => 'ends',
),
array(
'value' => 'empty',
),
array(
'value' => 'set',
),
array(
'value' => 'null',
),
array(
'value' => 'array',
),
array(
'value' => 'bool',
),
array(
'value' => 'int',
),
array(
'value' => 'float',
),
array(
'value' => 'numeric',
),
array(
'value' => 'string',
),
),
),
),
);
$form['value'] = array(
'#title' => t('Value to check'),
'#default_value' => isset($settings['value']) ? $settings['value'] : '',
'#type' => 'textfield',
'#required' => FALSE,
'#states' => array(
'invisible' => array(
'select[name="settings[operator]"]' => array(
array(
'value' => 'empty',
),
array(
'value' => 'set',
),
array(
'value' => 'null',
),
array(
'value' => 'array',
),
array(
'value' => 'bool',
),
array(
'value' => 'int',
),
array(
'value' => 'float',
),
array(
'value' => 'numeric',
),
array(
'value' => 'string',
),
),
),
),
);
return $form;
}
function feeds_tamper_conditional_callback(&$result, $item_key, $element_key, &$field, $settings, $source) {
$condition_met = FALSE;
$conditional_field_value = $result->items[$item_key][$settings['conditional_field']];
switch ($settings['operator']) {
case 'equals':
$condition_met = $conditional_field_value == $settings['value'] ? TRUE : FALSE;
break;
case 'begins':
if (!isset($settings['negate']) || $settings['negate'] == 0) {
$condition_met = feeds_tamper_conditional_begins_with($conditional_field_value, $settings['value']);
}
else {
$condition_met = !feeds_tamper_conditional_begins_with($conditional_field_value, $settings['value']);
}
break;
case 'ends':
if (!isset($settings['negate']) || $settings['negate'] == 0) {
$condition_met = feeds_tamper_conditional_ends_with($conditional_field_value, $settings['value']);
}
else {
$condition_met = !feeds_tamper_conditional_ends_with($conditional_field_value, $settings['value']);
}
break;
case 'not_equals':
$condition_met = $conditional_field_value != $settings['value'] ? TRUE : FALSE;
break;
case 'greater':
$condition_met = $conditional_field_value > $settings['value'] ? TRUE : FALSE;
break;
case 'greater_equal':
$condition_met = $conditional_field_value >= $settings['value'] ? TRUE : FALSE;
break;
case 'less':
$condition_met = $conditional_field_value < $settings['value'] ? TRUE : FALSE;
break;
case 'less_equal':
$condition_met = $conditional_field_value <= $settings['value'] ? TRUE : FALSE;
break;
case 'contains':
$condition_met = is_int(stripos($conditional_field_value, $settings['value'])) ? TRUE : FALSE;
break;
case 'not_contains':
$condition_met = is_int(stripos($conditional_field_value, $settings['value'])) ? FALSE : TRUE;
break;
case 'empty':
$condition_met = !isset($settings['negate']) || $settings['negate'] == 0 ? empty($conditional_field_value) : !empty($conditional_field_value);
break;
case 'set':
$condition_met = !isset($settings['negate']) || $settings['negate'] == 0 ? isset($conditional_field_value) : !isset($conditional_field_value);
break;
case 'null':
$condition_met = !isset($settings['negate']) || $settings['negate'] == 0 ? is_null($conditional_field_value) : !is_null($conditional_field_value);
break;
case 'array':
$condition_met = !isset($settings['negate']) || $settings['negate'] == 0 ? is_array($conditional_field_value) : !is_array($conditional_field_value);
break;
case 'bool':
$condition_met = !isset($settings['negate']) || $settings['negate'] == 0 ? is_bool($conditional_field_value) : !is_bool($conditional_field_value);
break;
case 'int':
$condition_met = !isset($settings['negate']) || $settings['negate'] == 0 ? is_int($conditional_field_value) : !is_int($conditional_field_value);
break;
case 'float':
$condition_met = !isset($settings['negate']) || $settings['negate'] == 0 ? is_float($conditional_field_value) : !is_float($conditional_field_value);
break;
case 'numeric':
$condition_met = !isset($settings['negate']) || $settings['negate'] == 0 ? is_numeric($conditional_field_value) : !is_numeric($conditional_field_value);
break;
case 'string':
$condition_met = !isset($settings['negate']) || $settings['negate'] == 0 ? is_string($conditional_field_value) : !is_string($conditional_field_value);
break;
}
if (!$condition_met) {
unset($result->items[$item_key][$element_key]);
}
}
function feeds_tamper_conditional_begins_with($haystack, $needle) {
$haystack = strtolower($haystack);
$needle = strtolower($needle);
return substr($haystack, 0, strlen($needle)) === $needle;
}
function feeds_tamper_conditional_ends_with($haystack, $needle) {
$haystack = strtolower($haystack);
$needle = strtolower($needle);
return substr($haystack, -strlen($needle)) === $needle;
}