Selectbox "incatenate" con AJAX...?

La discussione sul CMS Made Simple in italiano.

Moderator: magallo

Post Reply
nervino
Power Poster
Power Poster
Posts: 448
Joined: Sun Dec 28, 2008 12:15 pm

Selectbox "incatenate" con AJAX...?

Post 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
User avatar
protempore
Power Poster
Power Poster
Posts: 599
Joined: Mon Jan 14, 2008 9:08 pm

Re: Selectbox "incatenate" con AJAX...?

Post by protempore »

c'è il modulo AjaxMadeSimple... però io non sono mica riuscito a farlo funzionare con il modulo sondaggi...  :(
An eye for an eye will make the whole world blind
Mahatma Gandhi (1869-1948)
nervino
Power Poster
Power Poster
Posts: 448
Joined: Sun Dec 28, 2008 12:15 pm

Re: Selectbox "incatenate" con AJAX...?

Post 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..?
nervino
Power Poster
Power Poster
Posts: 448
Joined: Sun Dec 28, 2008 12:15 pm

Re: Selectbox "incatenate" con AJAX...?

Post 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>
nervino
Power Poster
Power Poster
Posts: 448
Joined: Sun Dec 28, 2008 12:15 pm

Re: Selectbox "incatenate" con AJAX...?

Post 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...
nervino
Power Poster
Power Poster
Posts: 448
Joined: Sun Dec 28, 2008 12:15 pm

Re: Selectbox "incatenate" con AJAX...?

Post 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...
Last edited by nervino on Thu Aug 27, 2009 6:24 pm, edited 1 time in total.
Post Reply

Return to “Italian - Italiano”