Μεταφορά του ivf-embryo.gr από joomla σε drupal

To ivf-embryo.gr είναι το website παρουσίασης του κέντρου εξωσωματικής γονιμοποίησης "Embio Medical Center" του Θάνου Παράσχου.

Η μονάδα είναι μία από τις πιο γνωστές στην Ελλάδα και το website της είναι από τα μεγαλύτερα, σε όγκο επισκεπτών και ποσότητα περιεχομένου, που κατασκεύασε και φιλοξενεί η netstudio. Συνηθίζουμε χαριτολογώντας να το ονομάζουμε site - εγκυκλοπαίδεια, για τον εξαιρετικά μεγάλο αριθμό άρθρων που διαθέτει.

Το website κατασκευάστηκε το 2007 σε Joomla! 1.0.x, ενώ το το 2009 έγινε μεταφορά σε Joomla! 1.5.x. Στα 4 αυτά χρόνια, καθώς ο όγκος του υλικού μεγάλωνε, χρειάστηκε να γίνουν 2 ανακατασκευές καθώς και συνεχείς τροποποιήσεις και βελτιώσεις.

Έχοντας δει τα οφέλη του Drupal σε σχέση με το Joomla (ταχύτερο φόρτωμα, πιο στιβαρό, καλύτερη κατάταξη στα φυσικά αποτελέσματα, επεκτασιμότητα), επιλέξαμε να μετατρέψουμε και το ivf-embryo.gr σε Drupal. Η μεταφορά ήταν κάθε άλλο παρά εύκολη υπόθεση…

Το site αυτό περιελάμβανε 550 (!!!) στοιχεία στο βασικό μενού, μεταφρασμένα σε 8 (!!!) γλώσσες. Καταλαβαίνετε ότι μιλάμε για ένα τεράστιο μενού συνδεδεμένο με πάρα πολλές διαφορετικές σελίδες (4546 στο σύνολο). Επίσης υπήρχαν μηχανισμοί για φόρμες επικοινωνίας, προβολής βίντεο και μεγέθυνσης φωτογραφιών. Τέλος, το πιο σημαντικό στοιχείο του migration ήταν η ανάγκη για μεταφορά σε επίπεδο url. Δηλαδή κάθε διεύθυνση του joomla site να ταιριάζει με την αντίστοιχη διεύθυνση του drupal, ώστε να μην χάσει το site την κατάταξή του στις μηχανές αναζήτησης.

Για το project εργαστήκαμε 5 από τα 9 μέλη της ομάδας μας και μία συνεργάτης από την πλευρά της ιατρικής μονάδας. Αρχικά ανέλαβε ο Γιάννης την εγκατάσταση και παραμετροποίηση του Drupal και των βασικών module. Στη συνέχεια δημιούργησε το Drupal theme και μετέφερε ακριβώς το design του παλιού site στην νέα εγκατάσταση. Έπειτα εγώ ανέλαβα την μεταφορά περιεχομένου - migration, μενού, κειμένων και φωτογραφιών.

Αρχικά προσπάθησα να χρησιμοποιήσω ένα πολύ χρήσιμο Drupal module που ονομάζεται feeds. Κατάφερα να εισάγω με επιτυχία μεγάλο μέρος του περιεχομένου (αντιστοιχώντας Joomla! articles σε Drupal nodes). Δυστυχώς όμως σε εκείνο το σημείο μπλέχτηκε η πολυγλωσσικότητα. Το feeds απαιτούσε αρκετές παρεμβάσεις με κώδικα, ώστε να επεκταθεί για να υποστηρίζει τις ιδαιτερότητες της συγκεκριμένης μεταφοράς. Καθώς τα χρονικά περιθώρια δεν ήταν επαρκή για να αναπτύξουμε drupal module που να επεκτείνει το feeds, αποκλείσαμε την επιλογή αυτή και ξεκίνησα την δημιουργία ενός module (from scratch), το οποίο θα έκανε συγκεκριμένες ενέργειες. Αυτό μας κόστισε λιγότερο σε χρόνο καθώς δεν ασχοληθήκαμε με τις πολλαπλές περιπτώσεις των λειτουργιών του feeds.

Δείτε ένα παράδειγμα χρήσης του Drupal API για την εισαγωγή Basic Page και μετάφρασης:

<?php
global $user;
// Το joomla ID
$joomla_id = 15;
// Επιλέγουμε τo node που ταριάζει με το Joomla ID.
// Έχουμε πρώτα φροντίσει να δημιουργήσουμε ένα field_joomla_id
$query = new EntityFieldQuery;
$results =  $query->entityCondition('entity_type', 'node')
  ->propertyCondition('language', 'el')
  ->fieldCondition('field_joomla_id', 'value', $joomla_id, '=')->execute();
// Array που συντηρεί τα translations του node
$ex_translations = array();
// Αν υπάρχει ήδη το node θέλουμε να το κάνουμε update
if(!empty($results)){
  $nid = current($results['node'])->nid;
  $newnode = node_load($nid);
  $tnid = $newnode->tnid;
  $ex_translations = translation_node_get_translations($tnid);
}
// Αλλιώς δημιουργούμε νέο
else{
  $newnode = new stdClass();
}
$newnode->language = 'el';
$newnode->type = 'page';
$newnode->name = $user->name;
$newnode->title = 'Ελληνικό Τίλος';
$newnode->body[$newnode->language][0]['summary'] = '';
$newnode->body[$newnode->language][0]['value'] = 'Ελληνικό περιεχόμενο';
$newnode->body[$newnode->language][0]['format'] = 'full_html';
$newnode->field_joomla_id[LANGUAGE_NONE][0]['value'] = $joomla_id;
// Προετοιμάζουμε το node για αποθήκευση
$newnode = node_submit($newnode);
// Αποθηκεύουμε το node
node_save($newnode);
// Για τις μεταφράσεις πρέπει να σετάρουμε το tnid
if(empty($ex_translations)){
  db_update('node')
    ->fields(array(
      'tnid' => $newnode->nid,
      'translate' => 0,
    ))
    ->condition('nid', $newnode->nid)
    ->execute();
}
// Αν υπάρχουν μεταφράσει update them
if(!empty($ex_translations)){
  $tnode = node_load($ex_translations['en']->nid);
}
// Αλλιώς δημιουργία νέας
else{
  $tnode = new StdClass();
}
$tnode->type = 'page';
$tnode->uid = $user->uid;
$tnode->title = 'Μεταφρασμένος Τίτλος';
$tnode->language = 'en';
$tnode->body[$tnode->language][0]['summary'] = '';
$tnode->body[$tnode->language][0]['value'] = 'Μεταφρασμένο Περιεχόμενο';
$tnode->body[$tnode->language][0]['format'] = 'full_html';
$tnode->field_joomla_id[LANGUAGE_NONE][0]['value'] = $joomla_id;
$tnode->promote = 1;
if(empty($tnode->tnid)){
    $tnode->tnid = $newnode->nid;
}
// Αποθήκευση μετάφρασης
node_save($tnode);
?>

Στην απέναντι μεριά (στο Joomla!), δημιουργήθηκε ένα component, που εξήγαγε, σε μορφή json, συσχετισμένη την πληροφορία για μενού, άρθρα και μεταφράσεις.

<?php
// Ο παρακάτω κώδικας είναι τμήμα του component που φτιάχτηκε στο joomla για την εξαγωγή των δεδομένων
$db = JFactory::getDBO();
$q = "
SELECT c.id, c.title, c.introtext, c.fulltext, c.created FROM #__content AS c
WHERE state = 1
ORDER BY c.id
";
$db->setQuery($q);
$articles = $db->loadObjectList();
$export = array();
foreach(

$articles as $i=>$a){
  $export[$i]['id'] = $a->id;
  $export[$i]['title'] = $a->title;
  $export[$i]['introtext'] = $a->introtext;
  $export[$i]['fulltext'] = $a->fulltext;
  $export[$i]['date'] = $a->created;
  $export[$i]['redirect'] = JRoute::_('index.php?option=com_content&view=article&id='.$a->id);
}
echo json_encode($export);
?>

Αυτό το json string ανέλαβε στην συνέχεια το drupal module να χειριστεί και να εισάγει συσχετισμένα τα menu, τα nodes και τα translations στην βάση δεδομένων του Drupal (πάντα βέβαια χρησιμοποιώντας το Drupal API). Η διαδικασία αυτή χρειάστηκε αρκετό χρόνο και κόπο. Μετά από πολλές δοκιμές, πολλές επαναφορές backup του staging server, πολλά «μπινελίκια» προς την οθόνη και πολλά «γιούπι» μετά τις επιτυχίες, κατάφερα να ολοκληρώσω την μεταφορά. Η πληροφορία μεταφέρθηκε με πολύ μεγάλη ακρίβεια και οι διορθώσεις που έπρεπε να γίνουν manually από το interface ήταν λίγες.

Το επόμενο πρόβλημα ήταν οι φωτογραφίες. Οι φωτογραφίες μεταφέρθηκαν στον φάκελο files του drupal, στο σημείο δηλαδή που αποθηκεύονται από το ίδιο το Drupal όλα τα αρχεία. Στην συνέχεια δημιουργήθηκε ένα ακόμη drupal module το οποίο ανέλαβε να χειριστεί την εμφάνιση με lightbox των φωτογραφιών και την δυναμική δημιουργία thumbnail.

Τελευταία εργασία ήταν η αντιστοίχιση των url του joomla σε αυτά του Drupal. Εδώ υπάρχει η ιδανική λύση του redirect (https://www.drupal.org/project/redirect) καθώς προτιμήσαμε να κάνουμε ανακατευθύνσεις και όχι απλή αντιγραφή του path. Ο λόγος είναι απλός: Το Drupal χειρίζεται εξαιρετικά τα url με το pathauto και θέλαμε να μείνει έτσι.

Κάπου εκεί η δική δουλειά μου τελείωσε. Ανέλαβε ο MASTRO Γιώργος να κάνει τις τελευταίες διορθώσεις στο μενού και τα block ενώ παράλληλα η Όλγα έκανε τους δικούς της ελέγχους όσον αφορά το content. Τέλος, ο Παναγιώτης που τρέχει τις καμπάνιες στο Google, έπρεπε να αλλάξει τα landing pages url's των διαφημίσεων.

Αυτή την στιγμή το website είναι σε Drupal! Μπορείτε να το επισκεφτείτε στο https://www.ivf-embryo.gr. Είναι ταχύτερο από ποτέ καθώς χρησιμοποιεί τις απίστευτες τεχνικές caching του drupal 7. Όλοι μας εδώ στη netstudio και κυρίως ο πελάτης είναι ευχαριστημένος από τη μετάβαση και από το νέο περιβάλλον διαχείρισης, ενώ ήδη έχουμε ξεκινήσει δειλά δειλά και βλέπουμε τα οφέλη της καλύτερης κατάταξης στα φυσικά αποτελέσματα του Google!

Ευχαρίστως να απαντήσουμε σε σχετικές ερωτήσεις και σχόλια!

Νίκος

Γράφει ο Νίκος

Technical Director

Σχόλια
avatar

19/10/2011 - 17:57

Αντώνης

Έχετε δοκιμάσει το migrate?

Νίκος

19/10/2011 - 18:07

Νίκος

Δεν είχαμε τα χρονικά περιθώρια για να μάθουμε το άγνωστο σε μας "migration". Το migration δεν καλύπτει by default κάθε μία από τις σπάνιες περιπτώσεις εισαγωγής περιεχομένου που συναντήσαμε στο ivf-embryo.gr και η λύση του custom κώδικα ήταν αρκετά πιο γρήγορη.

avatar

23/02/2012 - 00:27

Δημήτρης

Δεν νομίζω ότι είναι και τόσο φοβερά μεγάλες οι διαφορές για να σπαταλήσει κάποιος χρήματα γι 'αυτό το σκοπό. Επίσης ως open source και τα δύο, σίγουρα υπάρχει δωρεάν αναβάθμιση (update) από το ένα στο άλλο για κάποιον που το επιθυμεί. Οπότε σε γενιές γραμμές δεν το θεωρώ και μεγάλο κατόρθωμα... Άντε καλές δουλειές...

Γιάννης

23/02/2012 - 14:39

Γιάννης

Δημήτρη, κι όμως, οι διαφορές είναι τεράστιες! Στο συγκεκριμένο site, αλλά και σε όλα όσα έχουμε μεταφέρει από Joomla σε Drupal είδαμε θεαματική αύξηση στους επισκέπτες από τα φυσικά αποτελέσματα καθώς και πολύ γρηγορότερο φόρτωμα σελίδας. Επίσης, η ευελιξία του συστήματος αυξήθηκε κατακόρυφα. Δυστυχώς δεν υπάρχει αυτοματοποιημένη διαδικασία μεταφοράς από τη μία πλατφόρμα στην άλλη. Για το συγκεκριμένο site λόγω του όγκου και των λειτουργιών του, μας πήρε 2 μήνες δουλειά.

avatar

08/04/2012 - 22:14

Michalis

Ο χρόνος φόρτωσης που ισχυριζόσαστε οτι είναι ταχύτερος σε drupal είναι μύθος!. Όσο για τα πολλά modules που λέτε ότι έχει το Drupal είναι πραγματικά αστεία! η σύγκριση με το Joomla! .

Γιάννης

08/04/2012 - 23:56

Γιάννης

Μιχάλη, εμείς τα site που μεταφέραμε σε Drupal φορτώνουν πιο γρήγορα. Ο λόγος είναι ότι το Drupal 7 έχει ενσωματωμένες στον πυρήνα του τεχνικές caching. Εννοείται ότι με κατάλληλη παραμετροποίηση (δυστυχώς όχι πάντα εύκολα) μπορεί και το Joomla να γίνει ταχύτατο. Π.χ. το έχουμε βάλει πίσω από Varnish και φυσικά πετάει. Το θέμα είναι όμως ότι το Drupal είναι σχεδιασμένο να ανταποκρίνεται σε περιβάλλοντα υψηλών απαιτήσεων και πολλά από τα θέματα αυτά είναι λυμένα. Όσον αφορά τα modules, δεν ισχυριστήκαμε ότι το Drupal έχει πιο πολλά από το Joomla. Δεν αναφερθήκαμε καθόλου σε αυτό το θέμα (τουλάχιστον σε αυτό το post). Μιας και το αναφέρεις όμως, όντως το Drupal έχει λιγότερα modules, ο λόγος όμως είναι ότι φτιάχνεται κατά κανόνα 1 module για κάθε εργασία και τα modules συνεργάζονται μεταξύ τους, ενώ στο Joomla για κάθε εργασία μπορεί να υπάρχουν και 20 διαφορετικά modules τα οποία όμως δεν συνεργάζονται ούτε αλληλοσυμπληρώνονται, αλλά ανταγωνίζονται. Όπως και να έχει, δεν απορρίπτουμε το Joomla. Με Joomla έχουμε φτιάξει εκατοντάδες site. Απλά όταν το Drupal κάνει καλύτερα τη δουλειά για το οποίο το χρειαζόμαστε, το χρησιμοποιούμε.

avatar

11/05/2012 - 05:25

Periklis

Από όποια άποψη και αν το εξετασεις δεν υπαρχει ο ισχυρισμός ταχύτητα! Οι παραγοντες τις συγκρισης ταχύτητας μόνο απο θέμα δικτυου δίνει εντυπώσεις που ο καθένας μπορεί να ισχυρίζεται ότι θέλει. Εάν γνωρίζεις πως να το φτιάξεις ποτέ δε θα δεις πρόβλημμα. Οι μηχανισμοί caching ξεκινάνε από ποιό βαθειά. Για ψάχτε και τα τραπέζια της βάσης πόσο χώρο δεσμέυουν για αυτή τη μαγεία που αναφέρετε. Κερδίζεις κάτι χάνεις κάτι, πάντα. Μύθοι με milliseconds ανατρέπονται ανα πάσα δεδομένη στιγμή στα δίκτυα!

Γιάννης

11/05/2012 - 08:37

Γιάννης

Η ταχύτητα εξαρτάται όντως από πολλούς παράγοντες (δίκτυο, server, html, php, mysql)... πρέπει να το εξετάζουμε λοιπόν από όλες τις απόψεις. Υπάρχουν εργαλεία που σου επιτρέπουν να μετρήσεις όλα τα παραπάνω με αντικειμενικό τρόπο.

avatar

11/06/2012 - 17:33

Κώστας

Εγω σε ενα θεμα, προβληματιστικα. Αν μπορουσατε να κανετε ακριβη προβλεψη κοστους απο την αρχη. Ειναι δυνατον να μπορεις να υπολογισεις απο την αρχη το κοστος-ωρες για ενα τετοιο προτζεκτ πριν καν το δουλεψεις? Ειναι δυο οι επιλογες? Ειτε να χασεις, εκτιμωντας λιγοτερες ωρες, ειτε να εκτιμησεις πιο μεγαλο κοστος απο την αρχη, ωστε να εχεις ενα μαξιλαρακι ασφαλειας και να μην βγεις χαμενος? Υπαρχει περιπτωση ο πελατης να καταλαβει οτι το κοστος ειναι με την ωρα και να σε πληρωνει με την ωρα? Πως να ξερεις τι θα σου προκυψει? Θα μου πεις απο την εμπειρια. Αλλα τι γινεται με τετοιο προτζεκτ μεγαλου migration, οταν ειναι η πρωτη φορα? Πως να εκτιμησεις σωστα τις ανθρωποωρες? Κατα αλλα σιγουρα το drupal ειναι καλυτερο απο το joomla, δεν το συζηταμε. Δεν ειναι κατι που μπορεις να εξηγησεις στους joomlαδες, μεχρι να το ζησουν. Συγχαρητηρια.

Γιάννης

11/06/2012 - 17:36

Γιάννης

Κώστα, έχεις δίκιο. Αυτό είναι ένα θέμα γενικότερο στη δουλειά μας. Η χρέωση ανά ώρα είναι όντως μια λύση, απαιτεί όμως μια κάποια εμπιστοσύνη και από τα δυο μέρη.

avatar

13/05/2015 - 10:35

Drupalistas

Το site τρέχει με nginx και δεν έχει varnish όπως αναφέρατε παιδιά. Δεν ξέρω ίσως να άλλαξε κάτι από τότε. Ήξερα ότι το Drupal + Apache + Varnish είναι ότι καλύτερο. Πιστεύετε ότι με nginx τρέχει καλύτερα ένα drupal site?

Γιάννης

14/05/2015 - 00:36

Γιάννης

Ναι, έχουν αλλάξει πολλά πράγματα από τότε. Το Varnish είναι μια χαρά, αλλά και ο Nginx σε πολλές περιπτώσεις είναι υπεραρκετός.

Σχολιάστε το άρθρο