Обработка пользовательского синтаксического анализа и импорта с помощью каналов
Я пробирался через модуль каналов и документацию и по какой-то причине не смог найти наилучший способ сделать это, поэтому я надеюсь, что кто-нибудь сможет указать мне правильное направление.
Мне нужно получить информацию о видеоузле с одного сайта D6 на другой. Я настроил канал через представления на исходном сайте, и я хочу использовать каналы для передачи информации на целевой сайт. Есть две особые вещи, которые мне нужно сделать, и я не могу понять лучший способ сделать это.
На исходном сайте есть два словаря таксономии, которые мне нужны, чтобы перейти к конкретным словарям на целевом сайте. Один из них - словарь тегов, а другой называется Канал (одинаковый на обоих сайтах). Я добавил tid для термина целевого канала в канал как
<channel-map>
, и мне нужно импортировать это значение в назначенный термин канала на целевом узле. Проблема в том, что основной модуль таксономии сбрасывает все термины таксономии, независимо от словарного запаса, в исходный канал как<category>
; единственный способ различать вокабы при импорте элемента канала - посмотреть на атрибут домена, который является URL-адресом для этого термина. В стандартном импортере каналов есть цель тегов, но мне нужно отфильтровать термины канала, а также термины для других вокаб, которые существуют только на исходном сайте.На целевом сайте есть пользовательский форматировщик видео, который воспроизводит встроенное видео с исходного сайта, когда вы вводите URL-адрес исходного сайта в Поле видео на целевом узле в формате http://mysourcesite.com/node /$nid. Я добавил исходный идентификатор nid в канал как
<source-nid>
, поэтому мне просто нужно принять это значение и построить URL-адрес, URL-адрес исходного сайта уже сохранен в переменной на целевом сайте как часть пользовательских настроек форматирования), а затем вставьте его в поле Видео на новом целевом узле.
Итак, я пытаюсь понять, как лучше всего обрабатывать эти экземпляры при импорте ленты. Похоже, что одним из вариантов является написание пользовательского синтаксического анализатора и/или плагина импортера. Однако мне не нужно переписывать все процессы синтаксического анализа и импорта; Мне просто нужно обработать два случая, описанных выше. Для двух полей, в которые мне нужно импортировать, уже определены цели, так что будет ли просто использовать крючок feeds_node_processor_targets_alter()
и переопределить существующий процессор узла? Или мне нужно будет написать свои собственные плагины?
Спасибо.
РЕДАКТИРОВАТЬ: Я попытался создать свой собственный обратный вызов в качестве оболочки для content_taxonomy_feeds_set_target() используется функция hook_feeds_node_processor_targets_alter(), но к этому моменту процесса все, что предоставляется, - это имя термина без дополнительной информации для указания исходного словаря.
1 answers
Наконец-то я получил все необходимое для работы с некоторым кодом вуду и изменением синтаксических анализаторов. Одна вещь, которую я не добавил в исходный вопрос выше в качестве редактирования, заключалась в том, что с помощью обычного синтаксического анализатора синдикации мои пользовательские элементы, которые я добавил в исходный канал, никогда не были доступны. Затем я переключился на использование синтаксического анализатора SimplePie и смог расширить эту функциональность, чтобы делать то, что мне нужно.
В соответствии с документацией модуля Feeds для разработчиков и этим блогом после , вы можете выполнить некоторый пользовательский синтаксический анализ, переопределив метод parseextensions() класса FeedsSimplePieParser. Во-первых, вы должны объявить класс с помощью функции hook_feeds_plugins():
/**
* Implementation of hook_feeds_plugins().
*/
function mymodule_feeds_plugins() {
$info = array();
$info['MyModuleFeedsParser'] = array(
'name' => 'Custom Parser',
'description' => 'Custom parser for my video import.',
'handler' => array(
'parent' => 'FeedsSimplePieParser',
'class' => 'MyModuleFeedsParser',
'file' => 'MyModuleFeedsParser.inc',
'path' => drupal_get_path('module', 'mymodule') . '/plugins/feeds/',
),
);
return $info;
}
Вы также хотите реализовать hook_enable для очистки кэшей.
/**
* Implementation of hook_enable.
*/
function mymodule_enable() {
//clear the cache to display in Feeds as available plugin.
cache_clear_all('plugins:feeds:plugins', 'cache');
}
Затем вы создаете класс.
/**
* Custom Feeds parser class used to parse custom info from source site video feed.
*/
class MyModuleFeedsParser extends FeedsSimplePieParser {
/**
* Add the extra mapping sources provided by this parser.
*/
public function getMappingSources() {
return parent::getMappingSources() + array(
'source-nid' => array(
'name' => t('Video NID - SimplePie'),
'description' => t('.'),
),
'channel-map' => array(
'name' => t('Channel Map - SimplePie'),
'description' => t('Target Channel tid - SimplePie.'),
),
);
}
/**
* Parse the extra mapping sources provided by this parser.
*/
protected function parseExtensions(&$item, $simplepie_item) {
if ($value = $simplepie_item->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'source-nid')) {
$item['source-nid'] = $value[0]['data'];
}
if ($value = $simplepie_item->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'channel-map')) {
$item['channel-map'] = $value[0]['data'];
}
// Filter out non-Tags terms.
$categories = $simplepie_item->get_categories();
// Cycle through the categories and delete any items
// in feed item that aren't tags. The array id values
// are synchronized between $categories and $item['tags'].
foreach($categories as $id => $category) {
if (!strstr($category->scheme, '/tag/')) {
unset($item['tags'][$id]);
}
}
}
}
Этот код выполняет несколько функций:
- getmappingsources() создает пару источников, доступных для сопоставления. Вы устанавливаете их в настройках импортера для вашего процессор.
- Получает значение source-nid из источника канала и добавляет его в элемент.
- Получает значение карты канала из источника канала и добавляет его в элемент.
- Отфильтровывает термины, не относящиеся к тегам, из категорий (они же термины таксономии). Значение схемы - это URL-адрес термина таксономии (например, mysite.com/tag/tag-term), поэтому я использую это для идентификации терминов без тегов и их отмены.
Наконец, я должен создать значения для поля видео и канала запас слов. Это делается с помощью некоторых пользовательских обратных вызовов, определенных в hook_feeds_node_processor_targets_alter().
/**
* Implements hook_feeds_node_processor_targets_alter().
*/
function mymodule_feeds_node_processor_targets_alter(&$targets, $entity_type, $bundle_name) {
$targets['field_source_url'] = array(
'name' => 'Source Video URL',
'description' => 'The URL of the source video',
'callback' => 'mymodule_feeds_set_source_url',
);
$targets['channel'] = array(
'name' => 'Target Channel',
'description' => 'The target video channel',
'callback' => 'mymodule_feeds_set_channel_target',
);
}
И сами обратные вызовы:
/**
* Custom callback to set the video source URL in field_video.
*
* @param $node - The node object being built.
* @param $target - The target field.
* @param $value - The field value from the feed.
*/
function mymodule_feeds_set_source_url(&$node, $target, $value) {
$source_url = variable_get('emvideo_source_domain', '') . '/node/' . $value;
$node->field_video[0]['embed'] = $source_url;
}
/**
* Custom callback to set the target vocabulary term.
*
* @param $node - The node object being built.
* @param $target - The target field.
* @param $value - The field value from the feed.
*/
function mymodule_feeds_set_channel_target(&$node, $target, $value) {
$term = taxonomy_get_term($value);
$node->taxonomy[(int)$value] = $term;
}
Затем вы определяете их как целевые объекты в своем отображении процессора (чтобы они совпадали с приведенными выше исходными значениями), и все готово.