+ Antworten
Ergebnis 1 bis 5 von 5

Thema: Ajax-Aufruf innerhalb von Joomla

  1. #1
    Neu an Board
    Registriert seit
    23.07.2008
    Ort
    Oranienburg
    Beiträge
    17
    Bedankte sich
    5
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard Ajax-Aufruf innerhalb von Joomla

    Hallo zusammen,
    ich bin dabei ein Modul zu schreiben, das Daten aus einer Datenbankabfrage in ein Formular lädt und die Änderungen wieder in die Datenbank zurück schreibt. Den Job, die Daten zurück zu schreiben, soll eine PHP-Datei übernehmen, die über einen Ajax-Aufruf angesprochen wird. Das Datenbankhandling soll dabei auf die Joomla-API zurück greifen können und die Datei soll auch die Joomla-Umgebung erkennen.
    Hier als Beispiel die Codeausschnitte:
    Code:
    <?php
    defined('_JEXEC') or die('kein Zugriff');
    $index=JRequest::getVar('index');
    $db=& JFactory::getDBO();
    $query="SELECT testtext1,testtext2 FROM testtabelle WHERE testindex=".$index;
    $db->setQuery($query);
    if(!$db->query()){
      $error=$db->getErrorMsg();
      }
    else{
      $result=$db->loadObjectList();
    }
    ?>
    <div id="content">
    <form name="testform" id="testform" method="post">
    <input type="hidden" name="index" value="<?php echo($index);?>" />
    <input type="text" name="testext1" id="tt1" size=30 value="<?php echo $result->testtext1;?>" /><br />
    <input type="text" name="testext2" id="tt2" size=30 value="<?php echo $result->testtext2;?>" /><br />
    <input type="button" value="OK" onclick="javascript:save_data()">
    </div>
    <div id="result" style="display:none"><!--hier kommt das Ergebnis rein--></div>
    Soweit das Formular, das aus einer Liste aufgerufen wird, die den Index als Parameter übergibt. Das funktioniert. Hier das Javascript dazu:
    Hier ist jquery geladen
    Code:
    MAjax.aufruf=function(adresse,handler,methode,parameter){
    	var xml_http;
    	var ms_xml= new Array(
    	"Microsoft.XMLHTTP",
    	"MSXML2.XMLHTTP.6.0",
    	"MSXML2.XMLHTTP",
    	"MSXML2.XMLHTTP.5.0",
    	"MSXML2.XMLHTTP.4.0",
    	"MSXML2.XMLHTTP.3.0",
    	"MSXML2.XMLHTTP.2.0");
    	if(window.XMLHttpRequest){
    		try{
    			xml_http= new XMLHttpRequest();
    			}
    			catch(e){
    			}
    		}
    	else if(window.ActiveXObject){
    		for(var typ in ms_xml){
    			try{
    			xml_http=new ActiveXObject(ms_xml[typ]);
    			break;
    			}
    			catch(e){
    			}
    			}
    		}
    	else{
    		throw Exception("Ajax funktioniert hier nicht!");
    		return false;
    		}
    	if(parameter != null){
    		var parameterstr="";
    		for(ele in parameter){
    			parameterstr+=ele + '='+ parameter[ele]+'&';
    			}
    		parameterstr=parameterstr.substring(0,parameterstr.length-1);
    		xml_http.open(methode,adresse,true);
    		xml_http.setRequestHeader("Content-Type","application/x-www-urlencoded");
    		}
    		xml_http.onreadystatechange= function(){
    			//alert(xml_http.statusText+"\n"+xml_http.status);             // gibt OK 200 aus
    			if(xml_http.readyState==4 && xml_http.status==200){
    				mahandler(xml_http.responseText);
    				}
    			}
    		xml_http.send(parameterstr);
    	}
    	//Hier ist jquery geladen//
    	function mahandler(ausgabe){
    		$("#result").html(ausgabe);
    		$("#result").css('display','block');
    		$("#result").fadeIn();
    		}
     function save_data(){
      var params=new Object();
      params.test_index=$("#index").val();
      params.test_text1=$(" #tt1").val();
      params.test_text2=$("#tt2").val();
      MAjax.aufruf('modules/mod_meinmodul/tmpl/save_it.php','mahandler','POST',params);
     }
    Jetzt die verarbeitende Datei save_it.php
    Code:
    <?php
    defined('_JEXEC') or die('Kein Zugriff');
    $tindex= JRequest::getVar('index');
    $testtext_1= JRequest::getVar('test_text1');
    $testtext_2= JRequest::getVar('test_text2');
    $db=& JFactory::getDBO();
    $query="UPDATE testtabelle SET testtext1='$testtext_1', testtext2='$testtext_2' WHERE testindex=$tindex";
    $db->setQuery($query);
    if(! $db->query()){
      $ret= $db->getErrorMsg()."<br />";
      }
    else{
      $ret="Update war erfolgreich!<br />";
      $ret.="<a href="http://index.php?option=....>zur&uuml;ck</a>
      }
    Soweit der Code zur Illustration. Das Ergebnis ist ernüchternd. Der Ajaxaufruf wird ausgeführt und kommt auch mit Daten an. Leider erkennt die Datei save_it.php die '_JEXEC'-Konstante nicht, was zum Abbruch führt.
    Nehme ich die Sicherheitsabfrage raus, scheitert der Rest daran, dass die API-Classes nicht gefunden werden (JRequest etc.).
    Wie kann ich die Datei so ins System einbinden, dass '_JECEX' und die API-Bibliotheken zur Verfügung stehen?
    Ich habe ein Joomla! V. 1.5.18 auf einem XAMPP-System laufen.

    Gruß
    Jury
    Geändert von jury2001 (06.07.2010 um 10:28 Uhr)

  2. #2
    Neu an Board
    Registriert seit
    23.07.2008
    Ort
    Oranienburg
    Beiträge
    17
    Bedankte sich
    5
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Ist hier wirklich niemand, der mir einen Tipp geben kann? Es würde ja fast schon reichen, wenn mir jemand sagt, dass ich total auf dem Holzweg bin mit dem, was ich mache.
    Habe mich mal mit mootools befaßt, weil man damit auch Ajax-Abfragen machen kann und es in Joomla integriert sein soll, wie ich in der Joomla-Doku gelesen habe.
    Wenn ich den Javascript-Bereich dazu in meine Formulardatei einfüge, läuft das ganze Script nicht mehr und terminiert mit der Fehlermeldung, unerwartetes $end bei 621, das ist am Ende der Datei. Ich habe niergendwo eine offene Schleife oder ein offenes if gefunden.
    Das Javascript habe ich mit
    Code:
    $ajax=<<<EOD
    /* <! [CDATA[ */
    window.addEvent('domready', function(){
      $('ajax_save').addEvent('click', function(event){
      event.stop();
      var req= new Request.HTML({
        method:'get',
        url: $('ajax_save').get('href'),
        data: {'index':'+$("#index").val()+','testtext1':'+$("#tt1").val()+','testtext2':'+$("#tt2").val()+'},        //Die Daten stammen aus dem Formular und werden per jquery Methode .val() ausgelesen.
        onRequest: function(){
           alert("Speichern läuft. Bitte warten...");},
        update:$('msg_div');
        onComplete: function(response){
            var resp=Json.evaluate(response);
            $('msg_div').setStyle('display','block');
             }
           }).send();
       });
    });
    /* ]]> */
    EOD;
    $doc= & JFactory::getDocument();
    $doc->addScriptDeclaration($ajax);
    eingebunden. Auch dies stammt von der Joomla-Dokumentation.
    $('ajax_save') ist der Link zum PHP-Script, das das Speichern erledigen soll.
    Das führt, wie gesagt nicht zum Ziel.
    Lagert man das Javascript in eine externe Datei aus, wird einfach nur die verlinkte PHP-Datei aufgerufen, die dann aber keine Daten zum Verarbeiten hat und deshalb leer bleibt.
    Was mache ich falsch?
    Gruß
    Jury
    Geändert von jury2001 (23.06.2010 um 16:10 Uhr)

  3. #3
    Neu an Board
    Registriert seit
    23.07.2008
    Ort
    Oranienburg
    Beiträge
    17
    Bedankte sich
    5
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard Problem gelöst

    Hallo zusammen,
    zunächst Danke für die vielen nützlichen Tipps...
    Inzwischen habe ich mein Problem selbst gelöst und zwar mit jQuery. Allerdings musste ich dabei auf die Nutzung der Joomla API weitgehend verzichten. Deshalb weiß ich nicht, ob das besonders eleganter Stil ist, aber es funktioniert.
    Das Modul sieht jetzt ungefähr so aus:
    mod_mymodule.php ist die Grunddatei und sammelt die Daten ein:
    PHP-Code:
    defined('_JEXEC') or die("Restricted Area");
    $index=JRequest::getVar('index'); //dieser Parameter hängt an dem aufrufenden Link
    require_once(dirname(__FILE__).DS.'helper.php');
    $datensatz=ModHelper::GetDataset($index); 
    ... 
    Die helper.php:
    PHP-Code:
    defined('_JEXEC') or die("Restricted Area");
    class 
    ModHelper{
       public function 
    GetDataSet($idx){
          
    $db= & JFactory::getDBO();
          
    $query="SELECT testtext1,testtext2 FROM testtabelle WHERE testindex=".$idx;
          
    $db->setQuery($query);
          if(!
    $db->query()){
             
    $error=$db->getErrorMsg();
             }
       else{
             
    $result=$db->loadObjectList();
             }
       }
    ...
     } 
    Die default.php im Verzeichnis /tmpl/
    (Die jQuery-Bibliothek ist bereits geladen)
    Code:
    <script type="text/javascript">
    <!--
    function save_data(){
      var xhrData=$("#testform").serialize();
      var ErrorHandler= function(xhr,errmsg,err){
            $("#result").text("Es ist ein Fehler aufgetreten! "+errmsg).css('display','block');
            }
      $.ajaxSetup({
          cache:false,
          error:ErrorHandler,
          beforeSend: function(){
             $("#result").html('<p>Speichern beginnt...</p>').slideDown();
             };
       $.get('/modules/mod_mymodule/tmpl/savedata.php',xhrData,function(res,stat){
                 $("#result").empty().html(res).slideDown('slow');
                  },'html');
    }
    -->
    </script>
    HTML-Code:
    <div id="content">
    <form name="testform" id="testform" method="post">
    <input type="hidden" name="index" value="<?php echo($datensatz[0]->index);?>" />
    <input type="text" name="testext1" id="tt1" size=30 value="<?php echo $datensatz->testtext1;?>" /><br />
    <input type="text" name="testext2" id="tt2" size=30 value="<?php echo $datensatz->testtext2;?>" /><br />
    <input type="button" value="OK" onclick="javascript:save_data()">
    </div>
    <div id="result" style="display:none"><!--hier kommt das Ergebnis rein--></div>
    Zu guter Letzt die savedata.php
    PHP-Code:
    $index=$_GET['index'];
    $testext1=$_GET['testtext1'];
    $testtext2=$_GET['testtext2'];
    $host="localhost";      //man kann hier leider nicht auf JFactory::getDBO() zurückgreifen
    $user="dbuser";
    $pwd="mypassword";
    $database="mydatabase";
    $dbconnect=mysql_connect($host,$user,$pwd);
    $dbselect=mysql_select_db($database);
    $query="UPDATE testtabelle SET testtext1='$testtext1', testtext2='$testtext2' WHERE testindex=$index";
    $updatesql=mysql_query($query);
    if(
    $updatesql){
      
    $ret="Datensatz wurde gespeichert."
      
    }
    else{
      
    $ret="Datensatz wurde nicht gespeichert.<br />".mysql_error();
     }
    mysql_close();
    echo 
    $ret
    Bitte beachtet, dass dieses Script nur das Prinzip beschreibt, wie ich das Problem für mich gelöst habe. Sicherheitsaspekte habe ich vernachlässigt.
    Vielleicht hilft das ja jemandem weiter. Wenn jemand findet, dass das völliger Schwachsinn ist und eine bessere Idee hat, dann wäre ich sehr gespannt, die zu erfahren.

    Gruß
    Jury

  4. #4
    Verbringt hier viel Zeit
    Registriert seit
    24.01.2006
    Beiträge
    594
    Bedankte sich
    108
    Erhielt 359 Danksagungen
    in 203 Beiträgen

    Standard

    XHR und Ajax

    funktioniert bei mir tadellos. Zusätzlich werden die Ajax Requests auf format=raw aufgerufen (entsprechende Datei muss natürlich vorhanden sein)

  5. #5
    Neu an Board
    Registriert seit
    27.12.2008
    Beiträge
    48
    Bedankte sich
    2
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Danke,

    genau das habe ich die letzten Stunden gesucht,

    klappt wunderbar.
    Bin immer auf der suche nach Linkpartnern, gerne im Reise Bereich.

+ Antworten

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein