J'ai un formulaire qui doit être posté sur un autre formulaire (qui est un formulaire extérieur). J'ai la 1ère forme mis en place avec l'action à l'URL et la méthode post. Cependant, il utilise JForm
. Il fonctionne bien sur le premier formulaire et est enregistré dans la base de données et ouvert pour édition. Cependant, il y a une deuxième action via javascript qui permet de poster une nouvelle page avec une nouvelle page.
Après le chargement de la page, j'inspecte le POST et il indique:
Headers Post HTML Cache Cookies
Parts multipart/form-data
jform[id] 0
jform[state] 1
jform[created_by] 23
jform[grant_type] A
jform[cycle]
jform[salutation] M
jform[first_name] vrvervtervtgbver
jform[last_name] rtrgver
jform[title] rvert
jform[company_name] trvrvetrb
jform[email_address] [email protected]
Je ne peux pas pour la vie de moi, saisissez ces données post. J'ai essayé tout ce que je pouvais penser en utilisant jinput
et $_POST
, Mais rien ne semble fonctionner. Il affiche soit Array(0){[id]=>"" ...
, soit NULL
, soit simplement ARRAY
. Je ne peux pas utiliser la base de données, pour cette action car elle doit venir par la poste.
Est-ce que quelqu'un a des suggestions?
Voici mon code à partir de maintenant:
<?php
/**
* @version 1.2.0
* @package com_sfinnovate
* @copyright Copyright (C) 2014. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @author Matt Dray <[email protected]> - http://www.aespire.com
*/
// no direct access
defined('_JEXEC') or die;
$doc =& JFactory::getDocument();
$doc->addStyleSheet('components/com_sfinnovate/innovatestyle.css');
JHtml::_('behavior.keepalive');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
JHtml::_('formbehavior.chosen', 'select');
//Load admin language file
$lang = JFactory::getLanguage();
$lang->load('com_sfinnovate', JPATH_ADMINISTRATOR);
$doc = JFactory::getDocument();
$doc->addScript(JUri::base() . '/components/com_sfinnovate/assets/js/form.js');
if($this->item->id) {
$canState = JFactory::getUser()->authorise('core.edit.state','com_sfinnovate.innofundapp');
} else {
$canState = JFactory::getUser()->authorise('core.edit.state','com_sfinnovate.innofundapp.'.$this->item->id);
}
$jinput = JFactory::getApplication()->input;
$fooValues = $jinput->get('jform', NULL, NULL);
var_dump($fooValues);
?>
<script type="text/javascript">
getScript('//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js', function() {
jQuery(document).ready(function() {
jQuery('#form-innofundapp').submit(function(event) {
});
});
});
</script>
<div class="innofundapp-edit front-end-edit">
<?php if (!empty($this->item->id)): ?>
<h1>Edit <?php echo $this->item->id; ?></h1>
<?php else: ?>
<h1>Add</h1>
<?php endif; ?>
Lorsque vous envoyez un formulaire en utilisant le style d'administration standard de Joomla, une requête POST) sera envoyée au serveur. Le serveur traitera ensuite le task
du formulaire (qui est généralement "enregistrer" ou quelque chose de similaire) pour enregistrer le formulaire dans la base de données.
À la fin de la sauvegarde, Joomla effectue automatiquement une redirection vers la vue formulaire ou la vue liste (selon qu'il s'agit d'une action "enregistrer et fermer" ou "enregistrer"). Une fois cette redirection effectuée, vous n'êtes plus dans une demande POST), mais vous êtes maintenant dans une demande GET.
Vous pouvez vérifier que cela s'est produit en actualisant la page résultante. Votre navigateur vous a-t-il demandé de renvoyer les données de formulaire? Si non, il y avait alors une redirection entre votre message et la réponse que vous avez finalement reçue du serveur. Une fois cette redirection effectuée, aucune donnée ne sera accessible par $_POST
ou toute autre méthode sur la page résultante.
Donc, si vous avez vraiment besoin d’une copie exacte de la $_POST
sous la forme résultante, votre meilleur choix serait de l'insérer dans la session pendant le processus de sauvegarde. Puis extraire de la session au lieu des données de publication (car celles-ci n'existent plus).
Dans la fonction de sauvegarde, procédez comme suit:
$session = JFactory::getSession();
$session->set('post-data', $_POST);
Ensuite, dans votre formulaire, vous pouvez saisir ceci comme ceci:
$session = JFactory::getSession();
$post = $session->get('post-data');
// clear the data so we don't process it again
$session->clear('post-data');
S'étendant sur la réponse de David. La technique suivante utilise la méthode spécialement conçue pour le problème à résoudre. La solution consiste à utiliser les méthodes JApplication::setUserState()
et JApplication::getUserState()
. Le code suivant montre l'utilisation
//In the save function, do this:
JFactory::getApplication()->setUserState('post-data', $_POST, array());
//In the form , do this to retrieve the value:
JFactory::getApplication()->getUserState('post-data');
//do following to clear the value
JFactory::getApplication()->setUserState('post-data', null);
Vous pouvez également utiliser JApplication::getUserStateFromRequest()
. Cette fonction préfère charger la valeur à partir de la requête, puis l'enregistre également dans la session utilisateur . Ainsi, la prochaine fois que vous appelez cette fonction sans que des données soient demandées, les données de la session seront chargées.
https://docs.joomla.org/How_to_use_user_state_variables
J'espère que ça aide quelqu'un.