Skicka argument från cck nodereference fält till vy

Events happening in the community are now at Drupal community events on www.drupal.org.
taddis's picture

Hejsan!

Jag skulle vilja skicka med i princip vilket cck fält som helst som argument från ett nodereference fält till en vald vy.

Förklaring:
Jag har en innehållstyp som kan referera till en annan innehållstyp (oändligt många) med hjälp utav cck node reference (autocomplete). Jag har valt att node reference ska hämta in den innehållstypen med hjälp utav views. Det går här att sätta "View arguments". Men dessa är alltså fasta värden.

Det jag skulle vilja göra är att kunna skicka med ett taxonomy_content (som är satt för varje nod av den här typen) värde som vyn filtrerar efter.

Jag försökte hooka mig in på formuläret och där sätta 'advanced_view_args' till det aktuella värdet för den noden. Men sen såg jag i nodereference.module (6.x-2.3) att den hämtar in det värdet från databasen vid varje autocomplete anrop (se kodsnutt nedan).

function nodereference_autocomplete($field_name, $string = '') {
  $fields = content_fields();  // <-- här hämtas fälten från tabellen 'content_node_field'.
   ..
   ..
}

Fråga:
Går detta att lösa på något sätt? Jag vill helst inte börja grotta i nodereference.module koden. Det känns som om att det måste vara fler än jag som vill ha denna feature?

Mvh
Fjuk

Comments

Förstår inte riktigt

itangalo's picture

Jag är inte helt säker på vad det är du vill göra.
Vill du ge ett konkret exempel?

//Johan Falk

Du har ett nodreferensfält,

tobiassjosten's picture

Du har ett nodreferensfält, vars möjliga val du vill populera med hjälp av en vy. Vyn ska också anpassa sig efter kontext genom att bara returnera noder, för möjliga val, som har samma term i ett vokabulär som den aktuella noden har. Har jag förstått det rätt?

Det behöver inte vara så knepigt, tack vare Views underbara flexibilitet. :)

Du letar på helt rätt ställe - Views argumenthantering. Något man ofta glömmer är dock att Views faktiskt har en del färdig funktionalitet vad gäller kontext. Testa att lägga till ett argument för Taxonomy: Term ID. Välj Provide default argument och Node ID from URL. Sedan, som validering, väljer du PHP Code (kräver PHP-modulen!). Nu har du ett textfält för PHP-kod, med variabeln $argument som håller argumentet (nid för aktuellt nod) som du kan använda för att slå upp noden och dess valda term i vokabuläret. Sedan sätter du $handler->argument till den ID:et för den termen, vilket slutligen kommer att användas för ditt argument. Voila - du har nu en vy som hämtar noder med samma term som den du befinner dig på!

Att spara kod i databasen är inte att rekommendera. Därför exporterar du självklart din vy till en standardvy, alternativt kopierar du handlern för Taxonomy: Term ID och lägger in din custom-kod direkt där.


Tobias Sjösten | NodeOne

Du har ett nodreferensfält,

taddis's picture

Du har ett nodreferensfält, vars möjliga val du vill populera med hjälp av en vy. Vyn ska också anpassa sig efter kontext genom att bara returnera noder, för möjliga val, som har samma term i ett vokabulär som den aktuella noden har. Har jag förstått det rätt?

Ja, det är precis så.

Jag har testat just det du säger. Jag får till vyn att fungera som jag vill. Men kopplingen mellan vyn och den redigerande nodens ID fungerar ej. Valideringskoden ser ut så här:

$node = node_load($argument);
if (is_object($node) && isset($node->field_channel[0]['value'])) {
  $handler->argument = $node->field_channel[0]['value'];
}
return true;

Säg att nodens ID är 58. Skriver jag in 58 direkt i vyns "test" på redigera vy sidan så väljer den noder med rätt vocabulär term ID (4) SQL-frågan ser då ut så här:

SELECT  DISTINCT(node.nid) AS nid,
   node.title AS node_title,
   node_data_field_date.field_date_value AS node_data_field_date_field_date_value,
   node.type AS node_type,
   node.vid AS node_vid,
   node.created AS node_created
FROM node node
INNER JOIN term_node term_node ON node.vid = term_node.vid
LEFT JOIN content_type_story node_data_field_date ON node.vid = node_data_field_date.vid
WHERE (node.type in ('story')) AND (node.status <> 0 OR node.uid = 1 or 1 = 1) AND (term_node.tid = 4)
   ORDER BY node_data_field_date_field_date_value DESC, node_created DESC, node_title ASC
LIMIT 0, 20

Men är jag på den verkliga noden och redigerar så händer ingentingen och frågan blir så här:

SELECT  DISTINCT(node.nid) AS nid,
   node.title AS node_title,
   node_data_field_date.field_date_value AS node_data_field_date_field_date_value,
   node.type AS node_type,
   node.vid AS node_vid,
   node.created AS node_created
FROM node node
LEFT JOIN term_node term_node ON node.vid = term_node.vid
LEFT JOIN content_type_story node_data_field_date ON node.vid = node_data_field_date.vid
WHERE (node.type in ('story')) AND (node.status <> 0 OR node.uid = 1 or 1 = 1) AND (term_node.tid IS NULL) AND (node.title LIKE '%k%')
   ORDER BY node_data_field_date_field_date_value DESC, node_created DESC, node_title ASC
LIMIT 0, 10

Här ser man att term_node.tid IS NULL, vilket betyder att argumentkoden inte får med ID:et för noden.

Under Advanced - Nodes that can be referenced (View) för den nodtypen har jag bara valt min vy utan några argument. Sätter jag ett argument här så blir det alltid det argumentet och inte dynamiskt för nodetypen.

Något gör jag ju uppenbarligen fel, men vad?

[edit]
Mitt nodereference fält är ett autocomplete fält. Den URI som anropas för att få fram vyn är 'q=nodereference/autocomplete/field_headlines/a' (där 'a' är vad jag skriver i fältet). Hur ska vy-koden veta vilket nod ID som redigeras, det är här problemet är. Jag måste på något sätt kunna skicka med antingen nod ID eller term ID i den URI.

Mvh
Fjuk

Autocomplete ställer till

tobiassjosten's picture

Autocomplete ställer till det, eftersom AHAH-mottagaren inte får, och knappast kan hantera, mer information än just en del av titeln du söker efter. Du kommer att ha samma problem också ifall du inte kör på autocomplete-"widgeten" men vill kunna uppdatera urvalet med AJAX, live, medans du byter taxonomiterm.

Om jag vore dig skulle jag skriva min egen widget för det här fallet. Bästa vore så klart att generalisera nog för att contributa tillbaka. :)

Kanske kan du helt enkelt utöka autocomplete-widgeten och patcha CCK?


Tobias Sjösten | NodeOne

Glömde bort att nämna det,

taddis's picture

Glömde bort att nämna det, men det fanns en patch till nodereference. Den använder sig utav token modulen. Man får ett extra val där man skickar med en token som avancerat argument.

I denna tråd snackas det en del om problemet och längre ned i tråden finns patchen. Det fanns en del nackdelar men för mina behov funkar det.

Mvh
fjuk

Sweden

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds: