Drupal + affärssystem

Hej

Jag skall utveckla en drupalsite gentemot ett externt affärssystem.

En del information om produkten kommer ligga i drupal (som bilder etc) medan t.ex. pris kommer finnas externt.

Så vill man ju då såklart visa alla produkter med dess pris och då använder jag mig såklart(?) av views. Skapar en views_handler_field för mitt prisfält där jag använder mig av pre_render och render för att via det externa affärsystemet hämta upp priset för produkten. skapar min hook_views_data men med fingerat tabellnamn då jag faktiskt inte är intresserad av att lagra prisdatan i drupal.

När jag ligger till mitt nya fält till en display så får man ju självklart en massa fel då det inte finns någon tabell men jag har löst det genom att hook_views_pre_execute skriva in sql hårdkodat.

Och den lösningen den fungerar ju så länge man inte vill ändra något på vyn för då måste man ändra även i modulen.
Nackdelen är ju självklart att vyn inte är förändringsbar och t.ex. så har jag även kopplat på en dynamisk sortering till vyn (dropdown till enduser så denna kan välja sorteringsordnigen) men när sql är satt som den är så fungerar inte det.

För mig känns inte detta som en bra lösning även om den fungerar men skulle gärna ta emot lite tips, idéer på hur detta skall göras istället?

mvh Peter

Groups:
Login or register to post comments

Det känns som en ganska

dixon_'s picture
dixon_ - Thu, 2010-09-02 22:37

Det känns som en ganska "hackig" lösning du föreslog där. Som du själv säger blir lösningen alldeles för hårdkodad för att det ska hålla i längden. Views 2 är inte tänkt att användas så helt enkelt. Och av den enkla anledningen bör du undvika det.

Jag har två förslag:

1) En enkel lösning vore om du synkroniserade in all data i Drupal (pris och allt). Jag tycker det verkar bättre därför att då får en mer normaliserad datastruktur att jobba med. Mitt förslag blir då att synkronisera all din data till Drupal i vanliga CCK-fält (inga egna fält behövs). Jag vet inte om det finns något API eller så. Men Feeds är en bra modul som låter dig läsa in och synkronisera datakällor i olika format (RSS, Atom, CSV eller eget plugin) till Drupal. Feeds ser också till att uppdatera datan i Drupal om källan ändrar sig. Detta gör den på cron.

2) Använd Views 3 och skriv en egen "query backend" för ditt system (endast möjligt i Views 3). Det innebär att Views hämtar datan direkt från din externa datakälla istället för att hämta från en SQL-tabell i Drupals databas. Den externa datakällan kan vara vad som hellst; en SQL-tabell, ett REST API, en XML-fil. You name it. Genom hook_views_data() kan du sedan beskriva relationer mellan den externa datakällan och t.ex. dina noder i Drupal. Detta innebär att du kan hämta datan från två olika ställen på ett korrekt sätt i Views. Views 6.x-3.x är förfånandsvärt stabil men tyvärr något odokumenterad. För mer information om custom "query backends" kan du titta på dessa screencasts:

Du kan också läsa och granska koden från dessa query backends:

Sammanfattning

Även om 2) är coolast så föreslår jag ändå lösning 1) eftersom den är enklast och kan nästan göras helt utan egen kod (beroende på hur din externa datakälla ser ut). Att bygga på Views 3 kan skapa en del problem i såhär tidigt skede, om man inte är beredd på att hoppa in i ärendekön och fixa dom buggar som dyker upp. Vi på NodeOne använder Views 3 i ett projekt. Men då fick modulen patchas för att fungera tillfredsställande.

// Dick Olsson


hej och tack för ett

filijonka - Fri, 2010-09-03 08:47

hej och tack för ett utförligt svar

Även om views 3 låter väldigt lockande så måste jag nog hålla mig till det som går snabbast att göra och om jag förstår dig rätt så blir det med nummer 1. Om jag då förstår dig rätt så skall jag skapa cck fält i min nodtyp som jag vill synca. Själva syncningen gör jag bäst mha feeds modulen. Då det är ett eget API som jag måste använda mig av för att komma åt datan så betyder väl det att jag till feeds behöver bygga min egen pluginmodul, har jag förstått det hela korrekt?

mvh Peter


Till Feeds kommer du

Letharion's picture
Letharion - Fri, 2010-09-03 10:48

Till Feeds kommer du sannolikt att behöva en egen modul, ja. Jag tror att det var det Dick menade med "nästan helt utan egen kod".
(Rätta mig om jag har fel Dick) :)


Claes har helt rätt. Det

dixon_'s picture
dixon_ - Fri, 2010-09-03 11:51

Claes har helt rätt. Det berodde lite på hur din externa datakälla ser ut. Du sa nu att det är något form av API. Då kan det bli lite trixigare med Feeds. Feeds är egentligen mest optimalt när det kommer till datakällor som RSS, Atom, CSV eller andra datakällor av den arten. Men det är absolut möjligt att skriva ett "Fetcher" plugin som hämtar hem datan och ett "Parser" plugin som behandlar datan och exponerar de olika fälten för Feeds. Med Feeds mappar du sedan dessa fält mot din innehållstyp.

Så om din externa källa är mer komplicerad än ett RSS flöde, så får du troligtvis skriva en "Fetcher" och en "Parser".

// Dick Olsson


hej och tack för hjälpen som

filijonka - Sat, 2010-09-04 10:28

hej och tack för hjälpen

som det blivit nu (nackdelen med att jobba som konsult) så har det blivit mer tid över för mig nu att titta mera på detta så kommer nog testa båda lösningarna.