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!
Ευχαρίστως να απαντήσουμε σε σχετικές ερωτήσεις και σχόλια!