[D6] How to - Filtrare incoming feeds by node-title

Scrivo questa mini guida sperando che possa essere utile a qualcuno e perchè ne rimanga traccia, dovessi dimenticarmi qualcosa.

OGGETTO
Inserimento nel content di un blocco feeds che filtri gli items in base titolo del nodo.

DESCRIZIONE
Non è stato facile per due motivi. Il primo è che il modulo Feeds utilizzato non supporta apparentemente
il node-reference e poi perchè in questo caso il node-reference dovrebbe in teoria essere inverso. Il tagging
ottenuto attraverso Extractor non poteva essere utilizzato in alcun modo per essere "referenziato" al titolo del nodo.

HOW TO
Abbiamo usato i seguenti moduli:
Extractor (opzionale se si vuole anche taggare i feeds, altrimenti si può tralasciare)
Feeds
Reverse Node Reference

Extractor
Partendo dal presupposto che Feeds sia già impostato, impostiamo Extractor .Una piccola guida visto che
esiste pochissima documentazione) :
Il modulo ha un bug , corretto in una patch ma non ancora implementato nella versione downloadable:
Applicare la seguente patch

<?php
 
@@ -94,7 +94,7 @@ function _extractor_simple_lookup($word)
}
}
if (!
$loaded) {
- if (empty(
$vid)) {
+ if (empty(
$vids)) {
$result = db_query_range("SELECT td.tid, td.name FROM {term_data} td JOIN {extractor_lookup} e ON td.tid = e.tid", 0, 2000);
}
else {
?>

1) Creiamo un vocabolario che ci servirò per taggare il contenuto "Tags"
2) Lo associamo al content-type "Feeds_miei_items"
3) Popoliamo il vocabolario "Tags" con i termini che vogliamo recuperare dal Title e dal Body dei feeds (3a)
4) Andiamo sul content-type "Feeds_miei_items" ed aggiungiamo un semplicetext-field "my_tags_feeds"
Per "number of values" quelli che vi servono.
5) Ora andiamo al Feed Importers e cambiamo 'Common syndication parser' in 'Common syndication parser with term extraction'
6) In Mapping associamo la Source "Extracted term name" al Target "my_tags_feeds" (il campo da noi creato).
7) Eliminate e ricaricate i feeds e nel campo "my_tags_feeds" troverete tutti i termini che hanno matchato col vocabolario.

(3a) Nel nostro caso il termine da estrarre corrisponde al titolo di un contenuto Aziende; per fare in modo che i dati siano sempre coerenti, abbiamo automatizzato
l'inserimento con NAT e Unique Field. Quando inseriamo un contenuto Azienda, vengono aggiornati automaticamente i due vocabolari "Tags e "Aziende".
Con Unique Field possiamo evitare senza fatica i doppioni sia nel contenuto che nei vocabolari stessi.

A questo punto, con views possiamo filtrare in tanti modi i nostri feeds , ma non ancora associarli al node-title…proprio perchè manca una "referenza" tra i due.

Feeds:
Il thread riferito al nodereference.inc per Feeds:http://drupal.org/node/724536
La patch: http://drupal.org/files/issues/feeds-mapper-nodereference-724536-115.patch

1) Scarichiamo la patch e posizioniamola all'interno della cartella all/modules/feeds/mappers
2) Ricaviamo il file nodereference.inc . da terminale e nella directory corretta: patch <feeds-mapper-nodereference-724536-115.patch

ATTENZIONE: Di default il file nodereference.inc utilizza il filtro "equals" che se nei casi di valori numerici va bene, nel nostro no.
Rintracciamo il case della funzione che stiamo utilizzando, in questo caso, title:

<?php
 
case 'title':
 
// Validate title.
 
if ((is_string($v) && $v !== '') || is_numeric($v)) {
   
// Lookup potential exact matches for the value.
   
$nids = array_keys(_nodereference_potential_references($field_info, $v, 'equals', array()));
  }
  break;
?>

e modifichiamo 'equals' con 'contains'.

3) Svuotiamo la cache del sito
4) Torniamo sul nostro content-type "Feeds_miei_items" e creiamo un altro campo "feeds_title_reference", di tipo nodereferencee, settiamo il widget-type in "Autocomplete text field".
Anche qui impostiamo il numero di valori che ci servono ed indichiamo in "Content types that can be referenced:" il nodo che deve essere referenziato.
Nel nostro caso "Aziende"
5) Torniamo in Feed Importers e in Mapping aggiungiamo un ulteriore Source "Extracted term name"
al Target "feeds_title_reference (by title)" (5a)

6) Ricancellate e ricaricate i feeds e, se tutto è andato bene dovreste vedere gli stessi feeds sia nel campo "my_tags_feeds" che in quello "feeds_title_reference".
Solo che quelli nel campo "feeds_title_reference" saranno blu invece che neri, proprio perchè è stato associato loro il"nid" del contenuto "Aziende"

Infatti se andiamo a controllare nel content-type "Feeds_miei_items", il campo "my_tags_feeds" conterrà [Apple] mentre "feeds_title_reference" conterrà [Apple[:1234]]

(5a) In nodereference.inc sono stati impostati degli array a seconda del contenuto da matchare. Troverete quindi nella select list del Targert : "feeds_title_reference (by title)", "feeds_title_reference (by Nid)", "feeds_title_reference (by Feeds Url)", "feeds_title_reference (by Feeds GUID)"
Noi abbiamo impostato a "feeds_title_reference (by title)".

Dopo questo già importante risultato, abbiamo l'ultimo ostacolo da superare.

In questo caso abbiamo un node-reference inverso; i nodes del content-type "Feeds_miei_items" si comportano come "parent" ed hanno come "child"
il node Azienda che in realtà è già "parent" di altri "childs" . Il che non ci permette di avere il risultato sperato. Dovremmo invertire la relazione.

Per fortuna la ricerca non è stata lunga e "quasi" facilmente riusciamo a trovare in nostro soccorso il modulo " Reverse Node reference " il quale si occupa esplicitamente di fornire a view un reference-node invertito.

Una volta installato, avremo nelle selezioni della view sia la voce generale "content reverse reference", che il reverse del nostro "feeds_title_reference".

1) Aggiungiamo una nuova view ed in Relationship selezioniamo content reverse references , selezioniamo il campo "feeds_title_reference reverse reference" e flagghiamo "require this relationship"
2) Aggiungiamo "block" -> Add display
3) Andiamo su Arguments, aggiungiamo "node" -> node:nid.
Configure Argument Node: Nid : Relationship:(do not use this relationship) --> Action to take if argument is not present:(provide default argument) -->Default argument type:(node ID from URL)
4) Andiamo su Filters e selezioniamo quale content type "Azienda".
5) Non ci resta che inserire alla voce Fields i campi che ci interessa visualizzare.
Aggiungete node:title --> Configure field Node: Title --> Relationship:(feeds_miei_items reverse reference) , flag "link the title to his node"
Aggiungete node:body --> Configure field Node: body --> Relationship:(feeds_miei_items reverse reference) .
e tutti gli altri che volete senza dimenticarvi di specificare la relationship.

A questo punto sul vostro parent-node dovreste avere dei risultati come da allegati.

Ora rimane l'ultima sfida che è quella di capire se si riesce a raggruppare gli stessi feeds per term "parent". Cioè
se ho associato i nodes "iTunes" "iPod" "iPad" al Taxonomy term "Apple" , vederli tutti sotto il nodo aziende/apple.
Mah...

Spero di essere stato esaustivo e di poter essere di utilità a qualcuno, ma soprattutto mi auguro che con il nuovo supporto ad inno db ed alle foreign keys, diventi estremamente più facile gestire relazioni tra i dati.

Argomenti: