Urdu Español
English English Deutsch Deutsch Español Español Français Français Italiano Italiano Nederlands Nederlands Português Português Русский Русский Ελληνικά Ελληνικά
Login



 
Bienvenue à Jumi! Tutoriel >> >> Location formes d'appel dans un Joomla! teneur

Il ya beaucoup de gens qui souhaitent publier leurs formulaires personnalisés dans un Joomla! contenu.

Pour répondre à leurs besoins, j'ai décidé d'écrire ce tutoriel. Le tutoriel est dédié à Joomla! 1.0.x de codage les débutants, mais ceux intermédiaires peuvent trouver quelques trucs utiles.

Dans cette étape par étape tutoriel, vous apprendrez

  • quelles formes refroidissement de l'auto sont et pour quoi ils servent,
  • certains des plus utiles php et Joomla! Astuces 1.0.x qui sont pertinentes à des formes d'appel auto. EX.:
    • comment un script attrape qu'un utilisateur a envoyé des données,
    • comment reconnaître une adresse URL à laquelle le script s'exécute,
    • comment éteindre le Joomla spécifique! hors cache de la page,
    • ce que Joomla! objet spécifique $ de base de données, my $ sont, où trouver leurs méthodes et leur description,
    • et ainsi de suite

Quelles sont les formes d'appel sont auto et pour quoi ils servent

Toute forme recueille des données à partir de répondeurs.

Les données recueillies ne restent pas dans une forme, mais ils sont - en général après avoir appuyé sur le bouton d'envoi - envoyé quelque part. Ils sont envoyés à un script de traitement qui "siège" sur une autre adresse URL et que - après prétraitement possible - écrit les données dans la base de données et / ou les envoie à une adresse e-mail.

C'est l'approche la plus commune. Et sur cette approche compter Joomla standard! formes de composants.

Mais il est possible de vivre sans composante formes, il est possible d'avoir nos propres formes d'être inclus dans un article contenu. Les formulaires peuvent envoyer des données recueillies à l'auto et de les traiter. Ils sont appelés ainsi les formes d'appel auto.

Il est même possible encore plus: pour afficher les résultats de formulaire dans l'article même contenu.

Dans ce tutoriel, je vais vous montrer comment.

Parce que il doit y avoir un script php là que manipule avec des données de formulaire je ferai usage de plug-in Jumi pour inclure ces scripts dans le contenu. Si vous préférez une autre plugin pour l'inclusion script php dans Joomla! contenu que vous pouvez l'utiliser aussi bien.

Description sous forme de démonstration

Bien que la forme suivante démo est très concret, vous pouvez écrire toutes les formes que vous pouvez imaginer par l'approche expliquée dans ce tutoriel.

Ne pas faire des tests sur votre serveur de production du public, mais sur votre hôte local uniquement!

Supposons que nous voulons

  • un formulaire de vote qui recueille des réponses sur des questions 3 mutuellement exclusives,
  • pour sauver des réponses dans une base de données avec la date et l'heure de la réponse et en même temps que d'identification d'un utilisateur,
  • pour voir "merci" annonce et résumé des résultats, mais uniquement. à ces utilisateurs qui ont voté.

La stratégie de base

Fractionnement du code en plusieurs morceaux, des blocs fonctionnels et logiques offre de nombreux avantages. Bien que je ne vais pas discuté des avantages ici, je vais suivre cette bonne pratique générale ici.

Il existe deux principaux blocs logiques dans notre tâche:

  • Afficher le formulaire + collecter des données + + les vérifier enregistrer des données sur une base de données (sous forme d'appel auto)
  • lire les données à partir d'une base de données et afficher les résultats.

Je vais donc diviser notre application en deux fichiers de script trop: self_call_form.php à ces émotions et de show_results.php.

Nous allons entrer dans les détails dans ce qui suit.

Mais laissez-nous commencer par une première base de données.

Base de données

Que notre nom de la table de base de données est xxx_mytable_test où xxx représente votre site Joomla! préfixe de base de données. Certains Joomla! les utilisateurs ont d'autres préfixes jos ont le préfixe mos. Je vais supposer préfixe jos dans le suivant.

Je le répète, notre tâche est de stocker la date de référence et l'heure, identification de l'utilisateur et une réponse.

Sans entrer dans les bases de données MySQL et les détails de conception de tableaux qui peuvent être trouvés ailleurs la structure de la table décrite dans MySQL langue sera:

CREATE TABLE IF NOT EXISTS `jos_mytable_test` (
`Id` int (11) NOT NULL auto_increment,
`Recordtime` datetime NOT NULL par défaut '0000-00-00 00: 00: 00 »,
`User_id` varchar (15) NOT NULL default 'host',
`Répondre` int (6) NOT NULL default '0 »,
PRIMARY KEY (`id`)
) TYPE = MyISAM;

Le champ id a été ajouté juste pour identification de l'enregistrement de table unique.

Vous devez créer la table dans votre base de données Joomla. Vérifiez que votre préfixe est jos_. Si elle est toujours mos_, changer le préfixe de table.

Vous pouvez créer une table via phpMyAdmin soit manuellement, soit automatiquement par copier-coller de la déclaration ci-dessus MySQL.

Je vais assumer la jos_mytable_test table est créée à partir de maintenant.

self_call_form.php

Il existe essentiellement deux méthodes par lesquelles une forme de communiquer avec son environnement: POST et GET. GET envoie (et lit) les données de l'annexe URL. Nous n'utiliserons pas ici la méthode GET.

La méthode POST écrit les données à php variable globale $ _POST. Nous avons donc un accès complet aux données envoyées ici.

Algorithme général de l'self_call_form.php

S'il n'y a pas de données pertinentes dans $ _POST, c'est à dire qu'il n'ya pas de réponse d'un utilisateur, alors montrez-forme. Si l'utilisateur a répondu, puis le remercier et d'écrire la réponse (et d'autres données) dans la base de données.

L'algorithme ci-dessus traduit en langage php ressemble à ce code:

fonction self_form()
 // Le nom du bouton radio (ici "réponse") doit également être un nom de colonne dans une base de données !!!
{

 $ Ancre = "myform"; / / La variable $ ancre, nous aurons besoin plus tard
 echo " "; / / L'ancre html, nous aurons besoin plus tard
 echo " "; / / Forme de contenant

 if(!isSet($ _POST[«Réponse»])) / / Si la réponse n'est pas alors écrire sous la forme
 {
  Return_url $ = Get_return_url($ Ancre);
  echo " ";
  echo " Avez-vous trouvé ce tutoriel utile? ";
  echo " Absolument pas.\n";
  echo " Comme ci comme ça.\n";
  echo " Oui. Merci pour ça.\n";
  echo " ";
  echo " ";
 }

 d'autre / / Si il ya une réponse merci et à écrire la réponse dans la base de données
 {
  echo " Merci pour votre vote ";
  write_data($ _POST[«Réponse»]);
 }

 echo " ";
}

L'explication et quelques astuces

PHP fonction isset («réponse») vérifie «réponse» temps existe dans $ _POST.

Nous voulons que le formulaire pour envoyer des données à l'auto. Cela signifie que la même adresse URL (forme et son script de traitement peut être trouvé à la même adresse). Nous pouvons utiliser dur adresse URL codé d'une page ou, comme dans notre cas, nous pouvons obtenir le URL de l'environnement de Joomla en utilisant une astuce simple. En utilisant l'astuce est mieux que la première approche codée en dur parce que notre code est réutilisable dans différentes pages sans le toucher.

Donc voici l'astuce contenue dans le get_return_url fonction ($ ancre).

Fonction get_return_url ()
fonction get_return_url($ Ancre)
{
 if ($ QUERY_STRING = MosGetParam( $ _SERVER, 'QUERY_STRING', '' ))

 {
  $ Retour = 'Index.php? . $ QUERY_STRING;
 }
 d'autre
 {

  $ Retour = 'Index.php';
 }
 / / Une url commence par index.php maintenant
 
 // conversion de & en & pour la conformité xtml

 $ Retour = str_replace( '&', '&', $ Retour );
 / / Adjonction d'ancrage à la fin de URL

 $ Retour .="# $ ancre"; / / Ajout d'ancrage à l'url
 / / Prepand http:// au début de l'URL
 retourner sefRelToAbs($ Retour);

}

Il n'ya pas de miracle. La fonction retourne simplement l'adresse URL où il fonctionne (dans notre formulaire). Y compris l'ancre.

Pourquoi j'ai inclus l'ancre (html) dans l'adresse de retour?

Imaginez que notre forme est au fond d'une très longue page. Si ce n'était pas pour l'ancre, puis après l'envoi de données de l'utilisateur verra le haut de la page et doit faire défiler vers le bas. Avec l'utilisateur d'ancrage sera retourner à l'endroit où il a voté.

Je tiens à attirer votre attention sur Joomla! mosGetParam fonction spécifique () aussi. Il est la fonction la plus utile. Et devrait être utilisé en vous formant intensivement.

La description générale de mosGetParam () peut être trouvé ici. Un de l'utilisation pratique suit:

Au lieu d'utiliser:

$ _POST ['Abc']

il est préférable d'utiliser:

mosGetParam ($ _POST, 'abc')

non seulement parce qu'il fait un peu de rognage de l'entrée utilisateur non désirées, mais il ya d'autres options utiles en elle.

Toutefois, si vous avez beaucoup de données à traiter, il peut être plutôt le temps de consommation de retirer toutes les valeurs de $ _POST, un par un: soit par contact direct ou par l'intermédiaire d'y accéder mosGetParam () la fonction. Il ya un truc l'autre: extrait fonction php utilisation ($ _POST) qui construit des variables et leur attribue les noms de tout le contenu de $ _POST.

Remarquez que nous utilisons la variable $ _SERVER dans le get_return_url function (). $ _SERVER Est une autre variable php mondiale comme $ _POST et peut être d'une certaine utilisation de vos scripts trop. Si vous ne connaissez pas le contenu des variables, vous pouvez les afficher dans vos scripts à l'aide var_dump ($ somoevaribale) la fonction.

Fonction checkForm ()

Il s'agit de la fonction de validation javascript qui valide les entrées utilisateur contre certaines règles. Ce courriel est vraiment une adresse e-mail, ce nom n'est pas vide, etc

Encore une fois: vous pouvez trouver des scripts de validation diverses sur des centaines de sources Internet.

Dans notre formulaire démo nous permettra de valider que l'utilisateur a sélectionné un bouton "réponse" de radio. S'il n'ya pas de «réponse» ne présentent pas de données, mais affiche une alerte:

<SCRIPT type="texte / javascript">
fonction checkForm(LaFeuille) {
 var pourquoi = "";
  pour (i=0; je) {

   if (theForm.answer[i]. Vérifier) {
    var checkvalue = theForm.answer[i]. Valeur;
     pause;
    }
  }

  pourquoi + checkRadio =(checkvalue);
  if (pourquoi! = "") {
   pourquoi + = "\nSi vous pensez que c'est notre erreur, faites-le nous savoir s'il vous plaît. ";
   alerter(pourquoi);
   retourner faux;
  }

  retourner véritable;
}
 
fonction checkRadio(checkvalue) {
 var error = "";
  if (!(checkvalue)) {

   error = "Vous n'avez sélectionné aucune option.\n";
   }
   retourner erreur;
}
->

Il n'y a pas des trucs et pas de miracles ici, donc laissez-nous aller à la gravure de données sur la base de données.

Fonction write_data ()

Vous pouvez épargner beaucoup de temps si vous utilisez Joomla! objets et des méthodes au lieu d'utiliser la fonction standard base de données MySQL. Je veux dire en utilisant la base de données-> load ..., base de données-> query, manuel, etc Très descriptif peut être trouvé ici.

fonction write_data($ Valeur)
/ / Si l'utilisateur est connecté sauver son Identifiant contraire sauver «l'hôte»

{
 global Base de données $, My $;
 if (My $->id)
  User_id $ = My $->id;
 d'autre

  User_id $ = "hôte";
 Base de données $->setQuery( "INSERT INTO #__mytable_test (id, recordtime, user_id, answer) VALUES ('', '". données('Y-m-d H: i: s')."','".User_id $."','".$ Valeur."');" );
 Base de données $->question(); / / Écriture de données

}

Rien d'intéressant ici, sauf Joomla mondiale! ma variable $. Il contient l'ID utilisateur, nom, son adresse e-mail, etc Encore une fois: essayez d'utiliser var_dump ($ mon) dans votre code et vous verrez la structure et le contenu.

Validation requête:

Je n'ai pas inclus aucune validation que les données ont été effectivement écrit. Vous pouvez le faire si vous voulez. Il suffit de remplacer la ligne de base de données $-> query (); par
if (!Base de données $->question()) { / / Écriture de données et en cas d'erreur d'alerte

  echo " alert('".Base de données $->getErrorMsg()."'); ";
 }

Nous avons donc tous les éléments constitutifs de notre formulaire appelant l'auto maintenant.

Vous pouvez l'essayer immédiatement (pourvu que vous ayez ou une table jos mos_mytable_test créé).

Mais il ya encore une chose ...

Pas pour nous tous, le comportement de l'application sera aussi généralement attendu: après la soumission du formulaire sera encore visible et il n'y aura pas «merci» annonce.

Cela se produira pour ceux dont Joomla! le cache est activé.

Et voici une autre astuce: éteindre le cache entier Joomla est facile, mais l'arrêt du cache pour l'une des pages Joomla semble être le problème.

Le gros problème avec une solution très simple.

Le hack cache a été décrit dans Joomla! forum:

Modifier / includes / Cache / Lite.php
Vous verrez "save fonction ($ data ..."
modification

fonction enregistrer($ Data, $ Id = NULL, $ Groupe = «Par défaut»)

{
 if ($ This-> _ mise en cache) {

à

fonction enregistrer($ Data, $ Id = NULL, $ Groupe = «Par défaut»)

{
 if(strpos($ Data,' ') ! == faux) {
  $ This-> _ mise en cache = 0;
 }

 if ($ This-> _ mise en cache ) {

puis, créer un module avec


dans le corps, et le publier sur n'importe quelle position affichée (Les utilisateurs n'auront pas le voir) ... Puis il suffit d'activer ce module sur n'importe quelle page vous ne voulez pas en cache ...

Je suis juste en ajoutant que "la directive nocache" peut être inclus dans le contenu ainsi.

Résumé des self_call_form.php

Donc, il ya tout le contenu de self_call_form.php:


défini( «_VALID_MOS ' ) or la( «Accès restreint» ); / / Des raisons de sécurité

?>
<SCRIPT type="texte / javascript">
fonction checkForm(LaFeuille) {
 ...
}
fonction checkRadio(checkvalue) {

...
}
->

 


fonction self_form()
{
...

}
fonction get_return_url($ Ancre){
 ...
}
fonction write_data($ Valeur){
...
}
 

/ / Code de direction commence ici
self_form();
/ / Code de direction se termine ici
?>

NB: l'ensemble du script est "enveloppé" dans le self_form exécutif () fonctions. Pas de variables de script sont définies en dehors des fonctions de sorte qu'il n'ya pas de risque les variables interagissent avec d'autres 3rd partie ou Joomla! variables d'une manière imprévisible.

Uff ...

C'est tout pour la forme d'appel auto: forme show + collecter des données + + les vérifier enregistrer des données sur une base de données.

Maintenant, écrivez dans votre article

{sur la parité salariale [somepathway / self_call_form.php]}

et de le tester.

D'abord, vous verrez

forme jumi entrée

et après votre vote (seulement après le vote), vous pouvez voir le résultat de la deuxième partie (show_results.php):

jumi sortie de forme

La deuxième partie - la présentation des résultats obtenus à partir de la base de données - est beaucoup plus facile, alors la partie précédente.

show_results.php


défini( «_VALID_MOS ' ) or la( «Accès restreint» );

 
fonction show_results()
{
 global Base de données $;
 echo " "; / / Pas nécessaire, mais utile ici

 $ Radios_name = "répondre"; / / Doit être une colonne dans une base de données trop!
 if(isSet($ _POST[$ Radios_name])) {/ / Les résultats montrent pour ceux qui ont voté ne
  echo " ";
  echo " Ce tutoriel était ";
  Base de données $->setQuery( "SELECT $ radios_name, COUNT (id) AS numitems FROM #__myform_test GROUP BY $ radios_name");
  $ Rows = Base de données $->loadObjectList();
  foreach ( $ Rows as $ Row ){ / / Marche à travers des réponses

   interrupteur ($ Row->répondre){
    maisons 1:
     echo "pas utile pour".$ Row->numItems."lecteurs,\n";
    pause;
    maisons 2:
     echo "tellement si utile pour".$ Row->numItems."lecteurs et\n";
    pause;
    maisons 3:
     echo "très utile pour".$ Row->numItems."lecteurs\n";
    pause;
    défaut:
   }

 }
 echo " ";
 }
}
show_results();
?>

Maintenant, écrivez dans votre contenu un peu moins de déclaration du plugin précédente sur la parité salariale:

{sur la parité salariale [somepathway / show_results.php]}

et de le tester.

Je ne pense pas qu'il y est beaucoup pour l'explication, sauf la manipulation de base de données et des objets lignes. Encore une fois: aller à Joomla! Description de l'API.

Conclusion

Tout a été résolu, tout a été écrit. Vous pouvez télécharger le script en entier ici.