Konvertera nyheter från gammalt system till Drupal 7

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

Jag har försökt konvertera c:a 2500 korta nyhetsartiklar (1-4 paragrafer) i ett gammalt ASP-system till Drupal 7.

Jag skapade en Artikel med PHP-kod enligt nedan:

<?php
    $dbhost
= 'myhost';
   
$dbuser = 'myuser';
   
$dbpass = 'mypassword';

   
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql');

   
$dbname = 'mydb';
   
mysql_select_db($dbname);

   
$query  = "SELECT ID,LagID, Datum, Rubrik, Nyhet FROM nyheter";
   
$result = mysql_query($query);

    while(
$row = mysql_fetch_array($result, MYSQL_ASSOC))
    {
       
$node = new stdClass();
       
$node->type = 'article';
       
node_object_prepare($node);

               
$rubrik = $row['Rubrik'];
       
$nyhet = $row['Nyhet'];
               
$date = $row['Datum'];
       
$id = $row['ID'];

       
$node->title    = $rubrik;
       
$node->language = LANGUAGE_NONE;

       
$node->body[$node->language][0]['value']   = $nyhet;
       
$node->body[$node->language][0]['summary'] = $rubrik;
       
$node->body[$node->language][0]['format']  = 'filtered_html';
 
       
$path = 'content/nyhet_' . $id;
       
$node->path = array('alias' => $path);

               
$node->created = strtotime($date);
               
$node->changed = strtotime($date);

       
node_save($node);   
    }

   
mysql_close($conn);
?>

Efter att ha bråkat lite med formatet på indatat resp databasen, fungerar nu importen bra.

Jag ska säga att jag har en helt ren och standard Drupal7-installation i utgångsläget.

Problemet jag har är att Alla 2500 artiklarna får samma "updated at"-tid, dvs tiden när jag kör scriptet. Detta medför att alla får status "new". Alla hamnar också på förstasidan vilket medför att den tar flera minuter att uppdatera.

Hur får jag "updated" att vara samma värde som "created"?

Finns det nåt övrigt att säga om ovanstående kod? Det känns lite konstigt att knacka in PHP-kod i en artikel och "köra" den genom att välja att visa artikeln. Ibland anropas koden direkt när jag sparar artikeln, vilket lett till att jag flera gånger fått dubbla eller redubbla antalet artiklar. Finns det nåt smartare sätt att köra egen php-kod?? OBS php-artikeln är inte publicerad!

Sen saknar jag en funktion att ta bort allt content, hur gör man det enklast? Det fanns en modul men bara till D6.....

En liten kommentar är att jag upplever D7 som långsamt med dessa 2500 artiklar i databasen... hur trimmar jag upp responstiden??

Tack på förhand,
Peter

Comments

Updated kommer alltid att

johnste's picture

Updated kommer alltid att sättas till nuvarande tid om du sparar en nod med node_save(). För att komma runt det skulle du kunna implementera node-hookar
som t.ex. hook_node_presave().

Var har du lagt in koden? Du bör skapa en modul och lägga in koden där för att möjligjöra att enbart köra den när du önskar, t.ex. om skapa ett formulär som du kan submitta för att bestämma när du vill importera dina gamla artiklar.

Kolla in modulen Migrate. I

frjo's picture

Kolla in modulen Migrate. I D6 importerade jag många tusen poster av olika slag med den modulen.

Tack för förslagen!

fshsweden's picture

Bra tips, modulen Migrate hade jag också missat! Nu ska jag inte låta otacksam, men de föreslagna lösningarna låter som att kalla in en Haubits-77 för att slå ihjäl en fluga!

Är det principellt nåt fel på min lösning ovan? Vi pratar ju rena Artiklar här, utan CCK, udda tillägg mm. Borde vara gjort på en pisskvart som man säger härikring.

Måste jag lära mig API:et, hur man gör en modul mm för att lösa detta lilla problem?

Det som fungerar fungerar

jonne_jvl's picture

Det som fungerar fungerar :)

Snyggast sätt att köra egen kod på det sättet tycker jag är att via en egen modul tillhandahålla egna drush kommandon, blir framförallt enklare när man vill köra importer exempelvis i dev, stage, prod och liknande och veta att allt görs likadant och i rätt ordning.

Ett annat sätt är att göra en egen root fil. Alltså titta på index.php eller cron.php, man behöver bara en include och anropa en bootstrap, sen är det bara att köra vad för egen kod man vill. Och det är enkelt att ta bort eller exludera den filen vid en deploy. Det hade jag gjort istället för php kod i noder. (php input filter är förbjudet i min mening)

Cck gör det inte särskilt krångligare. Sätt upp den nodtyp du vill ha och fyll den med info. kör en dsm eller print_r på den noden, så ser man hur man ska bygga upp noden programmatiskt för att kunna skicka in den i node_save. Det enda som kan vara lite svårt att få till i början är attachade filer. Dom ska ju in i files tabellen och kopieras in i files mappen och så.

Men det stämmer i stort som du säger, 15min -> kör -> färdigt.

Det är ju i detaljerna jobbet ligger. Allt tar längre tid när man gör det ordentligt. Importerar man massor med noder får man passa memory limit och sådant, batcha upp i flera steg, minnas vart man var, relationer ska bevaras, filer ska kopieras, gamla urler ska tas om hand och då behöver man spara gammalt id -> node id och så vidare.

ps
Updated som du nämner har jag aldrig orkat hitta något bra sätt. node_save är skriven för att alltid sätta updated tills när den blir updated. Men det är bara att slänga in en update query efter node save.

Migrate är ju ett mycket

johnste's picture

Migrate är ju ett mycket bättre tips än det jag föreslog, och borde vara rätt enkelt att komma igång med.

Gällande att radera alla

adamgerthel's picture

Gällande att radera alla noder på en gång kan du använda VBO (http://drupal.org/project/views_bulk_operations)

/Adam Gerthel - Projektledare, Odd Hill

Kan du få in data in MySQL?

itangalo's picture

Om du kan få in din data i en MySQL-tabell kommer du att ha mycket vunnet – jag tror att det är något av de enklaste sätten att importera med Migrate (men det var ett tag sedan jag använde den).

Att använda Migrate kan tyckas som overkill, men du vinner mycket på att investera i att lära dig hur olika ramverk i Drupal fungerar – moduler så väl som API:er. Första gången du stöter på ett problem känns det kanske inte värt det, men tredje gången har du lätt fått tillbaka tiden du investerat. (Och inte omöjligt även efter första gången.)

Lycka till!
//Johan Falk, NodeOne

Edit: Ett alternativt verktyg för att skapa noder från importerad data är Feeds.
**
Vill du lära dig mer om Drupal? Kolla in samlingen av tips och guider!
Har du en fråga om Drupal? Missa inte FAQ-sidan på forumet!
Kolla in min senaste guide: Taming the Beast – Learn Views with NodeOne

Sweden

Group notifications

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