Elxis CMS Forum

Ελληνικό Forum => Πρόσθετα => Topic started by: Dimitris Kanatas on December 25, 2012, 11:11:34

Title: Αποστολή στοιχείων φόρμας
Post by: Dimitris Kanatas on December 25, 2012, 11:11:34
Χρόνια πολλά παιδιά,

Θα ήθελα να ρωτήσω ποια είναι η σύνταξη του κώδικα μιας αυτοσχέδιας φόρμας (μέσω επιλογών του CKEditor) για την αποστολή των στοιχείων της σε προσωπικό e-mail.

Σας ευχαριστώ!
Title: Re: Αποστολή στοιχείων φόρμας
Post by: datahell on December 27, 2012, 09:30:31
Η φόρμα αυτή καθεαυτή δεν μπορεί να στείλει κανένα email. Για να στείλεις email χρειάζεσε μία server based γλώσσα προγραμματισμού, στην περίπτωσή μας την PHP.
Η όποια φόρμα υποβάλει τα περιεχόμενα των πεδίων σε μία σελίδα που αναγράφεται στο action της, σε αυτή την σελίδα γράφεις ένα script php για να σου κάνει ότι ενέργεια θες (να σου στείλει email, να γράψει τα στοιχεία σε μία βάση ή σε ένα αρχείο text, ή κάτι άλλο).

Code: [Select]
<form name="myform" method="post" action="http://www.example.com/test.php">
<input type="text" name="fullname" value="" />
...
</form>
Στο test.php εφόσον η μέθοδος της φόρμας είναι post λαμβάνουμε τις τιμές (value) των πεδίων από το superglobal array $_POST:
Code: [Select]
$fullname = $_POST['fullname'];Αν η μέθοδος ήταν get θα τις πέρναμε έτσι:
Code: [Select]
$fullname = $_GET['fullname'];
Στο Elxis 4.x χρησιμοποιούμε την συνάρτηση filter_input:
Code: [Select]
$fullname = filter_input(INPUT_POST, 'fullname', FILTER_SANITIZE_STRING, FILTER_VAR_STRIP_LOW);
Title: Re: Αποστολή στοιχείων φόρμας
Post by: Dimitris Kanatas on December 27, 2012, 20:58:16
Γιάννη, θα το δοκιμάσω και θα γράψω σχετικά. Σ` ευχαριστώ για τις πληροφορίες.
Title: Re: Αποστολή στοιχείων φόρμας
Post by: datahell on December 27, 2012, 21:51:58
Στο elxis 4.x υπάρχει το contact plugin που τα κάνει όλα μόνο του.
Στο 2009.x υπάρχει το bot eforms και το akforms του acampall.
Γιατί δεν χρησιμοποιείς αυτές τις έτοιμες λύσεις;
Title: Re: Αποστολή στοιχείων φόρμας
Post by: Dimitris Kanatas on December 27, 2012, 23:00:54
Γιάννη, στο elxis 4 μιας και διαθέτει δυνατότητα ενσωμάτωσης φόρμας μέσω του άρθρου (κι όχι μόνο για επικοινωνία) θεωρώ πως καλό είναι να το χρησιμοποιήσουμε. Για παράδειγμα στην υποβολή ενός κειμένου - άρθρου από κάποιο μέλος ή η αποστολή (ή ανέβασμα) ενός αρχείου.

Το κατάφερα...

Με την αποστολή εμφανίζονται ξανά τα στοιχεία που υποβλήθηκαν από το χρήστη

Code: [Select]
<?php
echo "<p>Σας ευχαριστώ, <b>".$_POST["name"]."</b>, για το μήνυμά σας!</p>";
echo 
"<p>Το e-mail σας είναι: <b>".$_POST["email"]."</b>.</p>";
echo 
"<p>Το μήνυμά σας είναι:<br />";
echo 
$_POST["perilipsi"]." </p>";
//Δημιουργία περιεχομένου για αποστολή
$msg "Name:    ".$_POST["name"]."\n";
$msg .= "E-Mail:  ".$_POST["email"]."\n";
$msg .= "Perilipsi: ".$_POST["perilipsi"]."\n";
//Στοιχεία μηνύματος και παραλήπτη
$recipient "χχχχχχχ@yahoo.gr";
$subject "Υποβολή περιεχομένου";
$mailheaders "From: Φόρμα υποβολής περιεχομένου <ΧΧΧΧ@yahoo.gr OK> \n";
$mailheaders .= "Reply-To: ".$_POST["email"];
//Αποστολή e-mail
mail($recipient$subject$msg$mailheaders);
?>

 με δύο όμως προβλήματα....

1) Το μήνυμα επιβεβαίωσης εμφανίζεται εκτός του περιβάλλοντος του elxis

2) Η εκτέλεση του κώδικα πραγματοποιείται ανεξάρτητα από τη φόρμα. Δηλαδή e-mail (με κενά στοιχεία) στέλνεται γράφοντας απλά τη διεύθυνση του αρχείου π.χ. test.php Μάλλον πρέπει να φτιάξω και κάποιο if... γεγονός που θα με οδηγήσει να ανοίξω και κάποιο βιβλίο (που χρόνος δεν υπάρχει).

Γιάννη, κάποιες σύντομες συμβουλές;
Title: Re: Αποστολή στοιχείων φόρμας
Post by: datahell on December 28, 2012, 10:03:18
Το $_POST['xxx'] είναι θεωρητικό, στην πράξη ποτέ δεν το χρησιμοποιούμε έτσι κατευθείαν.
Πρέπει πρώτα να κάνουμε validation, γι αυτό ανέφερα την συνάρτηση filter_input.
Το validation απαιτείται για να βεβαιωθείς πως τα στοιχεία που υποβλήθηκαν ειναι σωστά και πλήρη.
Εννοείται ότι αν δεν κάνεις validation κυνδινεύεις από hackers. Αν η φόρμα στέλνει ένα email δεν υπάρχει κύνδινος, άντε να σου στείλουν κάνα spam, αν όμως ανεβάζεις αρχεία όπως θες να κάνεις ο κύνδινος είναι τεράστιος. Αν ανεβάσουν ένα αρχείο php με 2 γραμμές κώδικα μπορούν να σου χακέψουν το site.
Γι αυτό σου είπα να χρησιμοποιήσεις κάποια έτοιμη λύση.

Όταν κάνεις κάτι echo όπου να ναι εννοείται ότι θα εμφανιστεί όπου να ναι, ακόμα και έξω από την html του site.

Για να στείλουμε email στο Elxis 4.x χρησιμοποιούμε την μέθοδο sendmail του Elxis framework.
Τεκμηρίωση και παραδείγματα για την αποστολή email (https://www.elxis.net/docs/el/developers/tutorials/sending-emails.html).

Για την δημιουργία φορμών το Elxis 4.x έχει την βιβλιοθήκη elxisForm. Δυστυχώς δεν έχουμε γράψει ακόμα τεκμηρίωση για την elxisForm αλλά υπάρχουν πάρα πολλά παραδείγματα μέσα στο Elxis που μπορείς να κοιτάξεις.

Για να γράψεις ένα μήνυμα σε μία σελίδα του Elxis πάνω από το component μπορείς να το περάσεις μέσω της url με την παράμετρο elxmsg (γενικό μήνυμα) ή την elxerror (σφάλμα).
Code: [Select]
http://www.example.com/something/?elxmsg=My+message
http://www.example.com/something/?elxerror=My+error
Μπορείς, καλύτερα, να πεις στο Elxis να ανακατευθείνει σε μία σελίδα με το αντίστοιχο μήνυμα.
Code: [Select]
$elxis = eFactory::getElxis();
$elxis->redirect('http://mplampla', 'όλα καλά', false); //ανακατεύθυνση με εμφάνιση γενικού μηνύματος
$elxis->redirect('http://mplampla', 'όλα χάλια', true); //ανακατεύθυνση με εμφάνιση μηνύματος σφάλματος
Title: Re: Αποστολή στοιχείων φόρμας
Post by: Dimitris Kanatas on December 28, 2012, 17:20:43
Πολύ καλή τεκμηρίωση για τη μέθοδο sendmail που δυστυχώς δεν την είδα νωρίτερα. Νομίζω πως με κάλυψες και με το παραπάνω.  Θα επανέλθω βέβαια στο θέμα...
Title: Re: Αποστολή στοιχείων φόρμας
Post by: Dimitris Kanatas on December 29, 2012, 12:21:06
Γιάννη θα ήθελα να μου θυμίσεις (από τα σεμινάρια για module) πώς εισάγουμε βιβλιοθήκες (eFactory) και συναρτήσεις του elxis σε αρχείο php έτσι ώστε να αναγνωρίζονται από την php, όταν εκτελούνται.
Title: Re: Αποστολή στοιχείων φόρμας
Post by: datahell on December 29, 2012, 13:39:56
Η ερώτηση είναι λίγο ασαφής οπότε μπορεί να απαντήσω λάθος.
Οι πιο σημαντικές βιβλιοθήκες φορτώνονται με το factory eFactory::getSomething();

Παραδείγματα
$eLang = eFactory::getLang(); //γλώσσα
$elxis = eFactory::getElxis(); //elxis framework
$db = eFactory::getDB(); //βάση δεδομένων
$eFiles = eFactory::getFiles(); //διαχείριση αρχείων
Περισσότερα για το eFactory (https://www.elxis.net/docs/developers/libraries/efactory.html)

Όλα τα άλλα αρχεία php φορτώνονται με τον loader του elxis:

elxisLoader::loadFile('relative/path/to/file.php');

Παράδειγμα
elxisLoader::loadFile('components/com_user/controllers/account.php');

Ο loader διασφαλίζει ότι το κάθε αρχείο θα φορτωθεί μόνο μία φορά ανεξαρτήτως πόσες φορές θα το καλέσουμε (σαν την συνάρτηση require_once). Επίσης λόγω των σχετικών διαδρομών κάνει τον κώδικά μας πλήρως φορητό (portable) πράγμα στο οποίο δίνουμε μεγάλη σημασία στο Elxis 4.x

Κάποια αρχεία φορτώνονται μόνα τους μέσω autoloader. Για παράδειγμα οι πίνακες των προκαθορισμένων πινάκων στη βάση δεδομένων.

Παράδειγμα (αλλαγή ονόματος του χρήστη με uid = 1)
$row = new usersDbTable();
$row->load(1);
$row->firstname = 'Elena';
$row->lastname = 'Paparizou';
$row->update();

Δεν χρειάζεται δηλαδή να συμπεριλάβουμε πρώτα το σχετικό db table, το elxis θα το φορτώσει αυτόματα (includes/libraries/elxis/database/tables/users.db.php).

Άλλο παράδειγμα (εγκατάσταση template)
$row = new templatesDbTable();
$row->title = 'Test template';
$row->template = 'test';
$row->section = 'frontend';
$row->insert();

Τέλος οι helpers (includes/libraries/elxis/helpers/) φορτώνονται μέσω του elxis framework.

Παράδειγμα
$zip = eFactory::getElxis()->obj('zip');
Title: Re: Αποστολή στοιχείων φόρμας
Post by: Dimitris Kanatas on December 29, 2012, 15:18:57
Γιάννη, η συνάρτηση mail () αναγνωρίζεται από την php και εκτελείται κανονικά σε ένα ανεξάρτητο php αρχείο. Η βιβλιοθήκη eFactory (και δε ξέρω και η sendmail)  δεν μπορεί να αναγνωριστεί από την php (μιας και την ψάχνει στο αρχείο) εμφανίζοντας το μήνυμα:

Code: [Select]
Fatal error: Class 'eFactory' not found in /home/schlabor/public_html/new/testform/testsendmail.php on line 8
Χρειάζεται κάπου, κάπως να δηλωθεί και να αναζητηθεί στο elxis. Πώς όμως;

Βασικά ένα τέτοιο αρχείο php με κατάλληλη σύνταξη θα ξεκλείδωνε τις δυνατότητες του CKEditor για δημιουργία φορμών μέσω των άρθρων, χωρίς την χρήση κάποιου άλλου πρόσθετου ή κώδικα. Μια τέτοια λειτουργία π.χ. στην εκπαίδευση θα ήταν η εύκολη δημιουργία φόρμας αιτήσεων εκπαιδευτικών προς ένα σχολείο ή μια διεύθυνση.

 
Title: Re: Αποστολή στοιχείων φόρμας
Post by: datahell on December 30, 2012, 20:14:21
Εδώ παρέχουμε υποστήριξη για το Elxis, συνεπώς ότι γράφουμε ισχύει για το elxis. Και επειδή το Elxis έχει έτοιμες βιβλιοθήκες για πάρα πολλά πράγματα είναι πολύ εύκολο να κάνεις κάτι μέσα από το Elxis χωρίς φοβερές γνώσεις προγραμματισμού. Σε αντίθετη περίπτωση, εκτός elxis, μιλάμε για ελεύθερο προγραμματισμό, και εκεί είτε ξέρεις και το φτιάχνεις είτε δεν ξέρεις και αλληλο-παιδευόμαστε τσάμπα. Επίσης δεν μας έχεις εξηγήσει τι θες να κάνεις. Από την μία αναφέρεις τον editor του elxis και από την άλλη εξωτερικά script. Ο editor βασικά είναι για αρθογραφία, δεν είναι για πολλά πολλά. Προσωπικά δεν θα έφτιαχνα ποτέ φόρμα μέσα από τον editor, χωρίς αυτό να σημαίνει ότι δεν γίνεται. Η φόρμα όμως που θα φτιάξεις θα είναι νεκρή χωρίς ένα php script να επεξεργαστεί τα δεδομένα που υποβάλει. Αν θες να στείλεις email από ένα php script (γενικά) χρησιμοποιείς την συνάρτηση mail.

Επειδή φαντάζομαι ότι θες να φτιάξεις μία custom φόρμα, αυτό που θα έκανα στη θέση σου είναι να φτιάξω ένα plugin σαν το ενσωματωμένο contact με τα πεδία που θέλω.
Οδηγός κατασκευής plugin (https://www.elxis.net/docs/el/developers/tutorials/plugins-guide.html)
Title: Re: Αποστολή στοιχείων φόρμας
Post by: Dimitris Kanatas on December 30, 2012, 22:40:09
Ναι, όλο το θέμα ήταν η δημιουργία μιας custom φόρμας με τα εργαλεία του editor με σκοπό να αποστέλλονται τα δεδομένα της σε κάποιο e-mail. Η αφορμή ήταν η παρουσία των εργαλείων στον editor (αλλιώς δε θα άνοιγα αυτό το θέμα, ούτε θα επέμενα τόσο).
Με εντυπωσίασε ο εύκολος τρόπος σχεδίασης μιας φόρμας που να "εμπλέκεται" τόσο δημιουργικά με τα περιεχόμενα ενός άρθρου. Δεν ήθελα να ξεφύγω από τα πλαίσια του elxis (και να σε μπερδέψω), μιας και αυτό, όπως όλοι μας γνωρίζουμε, δεν εξασφαλίζει την ασφάλεια των διαχειρίσιμων δεδομένων. Το μόνο που μπορούσα να σκεφτώ ήταν να δημιουργήσω ένα script που να παίρνει τα στοιχεία της φόρμας και να τα στέλνει σε ένα email στόχο χρησιμοποιώντας τη συνάρτηση mail, δυστυχώς εκτός elxis και χωρίς validation. Βέβαια θα το παλέψω... με βάση τις πολύτιμες οδηγίες που μας έδωσες σ` αυτό το θέμα.

Νομίζω πως το θέμα αξίζει μια θέση στο προσωπικό μας bookmark   ;)
Title: Re: Αποστολή στοιχείων φόρμας
Post by: datahell on December 30, 2012, 23:24:47
Καλά έκανες, απλά θεωρώ λάθος το να φτιάξεις την φόρμα μέσα στον editor.
Ο συνιστώμενος τρόπος είναι να την εμφανίσεις με κάποιο plugin.
Αν θες να εμφανίσεις μία φόρμα όλη και όλη το plugin απλά θα περιέχει τον κώδικα της φόρμας. Η υποβολή θα οδηγεί στην ίδια σελίδα και σε αυτή την περίπτωση το ίδιο plugin θα στέλνει και το email.

Οι φόρμες φτιάχνονται πολύ εύκολα με την βιθβλιοθήκη elxisForm (δεν υπάρχει τεκμηρίωση ακόμα).

Ένα γρήγορο παράδειγμα

Code: [Select]
elxisLoader::loadFile('includes/libraries/elxis/form.class.php');
$action = $elxis->makeURL('content:mycategory/myarticle.html');

$formOptions = array('name' => 'cform', 'action' => $action, 'idprefix' => 'my', 'label_width' => 200, 'label_align' => 'left', 'label_top' => 0, 'tip_style' => 2);

$form = new elxisForm($formOptions);
$form->addText('name', '', 'Your name', array('required' => 1, 'dir' => 'rtl', 'maxlength' => 60));
$form->addEmail('email', '', 'Your email', array('required' => 1, 'size' => 30, 'tip' => 'Please write your email address'));
$form->addURL('website', '', 'Your web site (if any)', array('size' => 35, 'maxlength' => 120));
$form->addDate('birthdate', '', 'Your Birthdate');
$form->addButton('mysubmit', 'Submit', 'submit');
$form->render();

Η elxisForm θα δημιουργήσει την html φόρμα και την javascript που χρειάζεται για το validation. Αν παρατηρήσατε πχ στο email δεν χρησμοποιήσαμε το addText (γενικό πεδίο input) αλλά addEmail. Οπτικά δεν υπάρχει διαφορά, στο validation όμως υπάρχει τεράστια διαφορά καθώς το elxis στο πεδίο που προστέθηκε με το addEmail θα κάνει έλεγχο αν συμπληρώθηκε ένα σωστό email και όχι γενικά αν συμπληρώθηκε το πεδίο. Ομοίως και για τα addURL και addDate.

Με την elxisForm δημιουργείς φόρμες πολύ πιο εύκολα και χωρίς να μπλέκεις καθόλου με html, css και javascript. Το validation είναι σίγουρο ότι είναι σωστό. Υπάρχουν πάρα πολλές επιλογές για κάθε πεδίο αλλά και την φόρμα την ίδια. Ο κώδικας είναι μεταφέρσιμος και συμπαγής. Μπορείς να βάλεις captcha, κρυφά πεδία, πολυγλωσσικά πεδία, ενώ αυτόματα το elxis προσθέτει και ένα κρυφό token για να αποφευχχθεί η φόρμα να υποβληθεί από άλλο site (προστασία από session hijack attempts).

Περισσότερα όταν γράψουμε τη σχετική τεκμηρίωση...
Title: Re: Αποστολή στοιχείων φόρμας
Post by: Dimitris Kanatas on December 31, 2012, 00:21:22
Αυτό που παρατήρησα είναι πως στο contact plugin δεν χρησιμοποίησες την βιβλιοθήκη elxisForm και δυστυχώς δεν "έχουμε το βηματισμό μας" - αν και κατάλαβα τη λογική του - (χρειάζεται σύνθεση plugin, elxisForm και php). Όταν με το καλό έχεις χρόνο, κι αν είναι στις προθέσεις σου -εσύ είσαι το αφεντικό, φτιάξε την τεκμηρίωση της elxisForm με μορφή ρεαλιστικού παραδείγματος (όπως έκανες και με το module (https://www.elxis.net/docs/el/developers/tutorials/modules-guide.html) - η καλύτερη με διαφορά) επισυνάπτοντας και το σχετικό αρχείο. Έτσι με οδηγό το παράδειγμα να μπορεί, ακόμα και μωρό παιδί, να δημιουργεί custom φόρμα βάζοντας μέσα στο κώδικα του παραδείγματος ό,τι καλούδια επιθυμεί.