Page 1 of 1
Selectbox "incatenate" con AJAX...?
Posted: Sun Aug 23, 2009 5:12 pm
by nervino
Sto cercando di realizzare, lato admin, una pagina (che chiamiamo 1) che contenga due SELECT (dropdown) "chained" che caricano dati dal DB.
La prima select carica i dati normalmente e la seconda si riempie in base alla scelta effettuata nella prima (usando AJAX ed una pagina che chiamiamo 2).
Ho fatto delle prove esterne a CMSMS e tutto funziona.
Il problema:
quando importo il codice nel CMS, poiché la chiamata (ajax) alla pagina che valorizza la 2° select (pagina 2) viene effettuata da Javascript, non sono più nell'ambiente di CMSMS (non ho più le variabili Smarty, $gCMS ecc.) e ovviamente in questa pagina non mi funziona l'integrazione con CMSMS (non posso usare CreateInputDropdown ecc).
Qualcuno sa darmi un suggerimento per risolvere? C'è qualcosa di "già pronto" per CMSMS (io non l'ho trovato).
grazie
Re: Selectbox "incatenate" con AJAX...?
Posted: Mon Aug 24, 2009 8:53 am
by protempore
c'è il modulo AjaxMadeSimple... però io non sono mica riuscito a farlo funzionare con il modulo sondaggi...

Re: Selectbox "incatenate" con AJAX...?
Posted: Tue Aug 25, 2009 9:03 am
by nervino
Nell'help di AjaxMadeSimple c'è scritto che funziona solo per il Frontend, per cui non l'ho preso in considerazione.
Ora vedo se riesco ad estrapolare il codice essenziale per presentare il problema qui nel forum, così magari qualcuno riesce a suggerire una possibile soluzione.
L'alternativa è grufolare nel codice di amministrazione delle pagine (quello che permette di riordinare l'ordine delle pagine con il drang&drop) e cercare di capire come funziona. Anche se non credo rispecchi molto il mio problema perché non mi sembra che usi l'oggetto XMLHttpRequest.
Altri moduli che usano Ajax lato admin, per poterli analizzare..?
Re: Selectbox "incatenate" con AJAX...?
Posted: Tue Aug 25, 2009 11:16 am
by nervino
Di seguito il codice essenziale che sto utilizzando.
È relativo a 2 pagine php e ad un template.
Sunto:
action.add_documento.php : è la pagina principale che presenta un form e carica i dati da DB nella Select "tipo_documento". Una volta selezionata una option di questa Select da parte dell'utente, viene attivata la funzione Javascript "getcategory", presente nel template
edit_documento.tpl, che richiama la seconda pagina php,
action.queryAjax.php, la quale (dovrebbe) seleziona i dati corretti dal DB e genera la seconda Select "category".
Gli errori sono generati dalla pagina
action.queryAjax.php e sono rerlativi ad oggetti e variabili non più definiti in questa pagina ($gCms, $db $smarty ecc.) , visto che viene chiamata tramite Javascript
Codice:
action.add_documento.php
Code: Select all
<?php
$IDTipodocumento = array();
$query = "SELECT IDTipodocumento, Tipo_documento, Predefinito
FROM
".cms_db_prefix()."tipidocumenti ORDER BY Tipo_documento";
$dbresult = $db->Execute($query);
while ($dbresult && $row = $dbresult->FetchRow())
{
$tipo_documento[$row['Tipo_documento']] = $row['IDTipodocumento'];
}
$onChangeText="onChange=\"getcategory(this.value);\"";
## - tipo_documento (select)
$this->smarty->assign('tipo_documentotext', $this->Lang('tipo_documento'));
$this->smarty->assign('inputtipo_documento', $this->CreateInputDropdown($id, 'tipo_documento',
$tipo_documento, -1, $tipo_documento_predefinito, $onChangeText));
## - category (select)
$this->smarty->assign('categorytext', $this->Lang('category'));
$this->smarty->assign('inputcategory', $this->CreateInputDropdown($id, 'category',
$category, -1, $category_predefinita));
echo $this->ProcessTemplate('edit_documento.tpl');
?>
action.queryAjax.php
Code: Select all
<?php
$IDTipodocumento=intval($_GET['IDTipodocumento']);
$category = array();
$query = "SELECT * FROM ".cms_db_prefix()."categories
WHERE
IDTipodocumento = $IDTipodocumento";
$dbresult = $db->Execute($query);
while ($dbresult && $row = $dbresult->FetchRow())
{
$category[$row['category']] = $row['IDcategory'];
}
## - category (select)
$this->smarty->assign('inputcategory', $this->CreateInputDropdown($id, 'category',
$category, -1, $category_predefinita));
?>
edit_documento.tpl
Code: Select all
{literal}
<__script__ type="text/javascript">
function getXMLHTTP() {
var xmlhttp=false;
try{
xmlhttp=new XMLHttpRequest();
}
catch(e) {
try{
xmlhttp= new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e){
try{
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e1){
xmlhttp=false;
}
}
}
return xmlhttp;
}
function getcategory(strURL) {
var req = getXMLHTTP();
if (req) {
req.onreadystatechange = function() {
if (req.readyState == 4) {
// only if "OK"
if (req.status == 200) {
document.getElementById('div_IDcategory').innerHTML=req.responseText;
} else {
alert("Problema con XMLHTTP:\n" + req.statusText);
}
}
}
req.open("GET", "../modules/MIOMODULO/action.queryAjax.php?IDTipodocumento="+strURL, true);
req.send(null);
}
}
</__script>
{/literal}
{* tipo_documento *}
<div class="pageoverflow">
<p class="pagetext">{$tipo_documentotext}:</p>
<p class="pageinput">{$inputtipo_documento}</p>
</div>
{* category *}
<div id="div_IDcategory" class="pageoverflow">
<p class="pagetext">{$categorytext}:</p>
<p class="pageinput">{$inputcategory}</p>
</div>
Re: Selectbox "incatenate" con AJAX...?
Posted: Tue Aug 25, 2009 11:56 am
by nervino
Cos'è successo? Avevo inserito un post con il codice ma è sparito.
Alby lo hai rimosso per qualche motivo?
È anche strano che il forum riporta ancora 4 risposte a questo topic, ma ne visualizza 3...
Re: Selectbox "incatenate" con AJAX...?
Posted: Wed Aug 26, 2009 11:00 am
by nervino
(Non ho idea di cosa fosse successo. Ora visualizzo il post con il codice...)
Prendendo spunto dal plugin ajax_search_suggestions (
http://dev.cmsmadesimple.org/projects/search_sug)
ho modificato il codice della pagina
action.queryAjax.php e sembra funzionare. Anche se ho dovuto costruire la select "a mano" perché non ho capito come si fa ad importare la funzione CreateInputDropdown che quindi non è disponibile nella pagina action.queryAjax.php.
Riporto il codice per completezza e per
eventuali suggerimenti circa la sicurezza:
Codice:
action.queryAjax.php
Code: Select all
<?php
//************* AGGIUNTO ****************************************
if(session_id() == "") { @session_start(); }
$path = dirname(dirname(dirname($_SERVER['SCRIPT_FILENAME'])));
require $path . DIRECTORY_SEPARATOR . 'include.php';
$db=&$GLOBALS["gCms"]->db;
$id = filter_var($_GET['id'], FILTER_SANITIZE_STRING);
if (!isset($gCms)) exit;
//***************************************************************
$params['IDTipodocumento']=filter_var($_GET['IDTipodocumento'], FILTER_SANITIZE_NUMBER_INT); // Filtro PHP5
if( isset($params['IDTipodocumento']) )
{
$IDTipodocumento = $params['IDTipodocumento'];
}
$category = array();
$query = "SELECT * FROM ".cms_db_prefix()."categories
WHERE
IDTipodocumento = ?";
$dbresult = $db->Execute($query, array($IDTipodocumento));
while ($dbresult && $row = $dbresult->FetchRow())
{
$category[$row['category']] = $row['IDcategory'];
}
## - category (select)
//$this->smarty->assign('inputcategory', $this->CreateInputDropdown($id, 'category',
//$category, -1, $category_predefinita));
$inputcategory="<p class=\"pagetext\">Category:</p><p class=\"pageinput\">
<select name=\"".$id."category\">
<option value=\"-1\"> ------ </option>";
while ($dbresult && $row = $dbresult->FetchRow())
{
//$category[$row['category']] = $row['IDCategory'];
$inputcategory .="<option value=\"".$row['IDCategory']."\">".$row['Category']."</option>";
}
$inputcategory .="</select></p>";
echo $inputcategory
?>
Nella pagina
action.add_documento.php aggiungere all'inizio:
Code: Select all
<?php
$params['category']= filter_var($_POST['category'], FILTER_SANITIZE_NUMBER_INT);
if( isset($params['category']) )
{
$category= $params['category'];
}
?>
Benvenuta ogni critica...