+ Antworten
Seite 1 von 3 1 2 3 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: Ajax in einer Komponente nutzen

  1. #1
    Neu an Board
    Registriert seit
    21.11.2014
    Beiträge
    10
    Bedankte sich
    1
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard Ajax in einer Komponente nutzen

    Hallo Forennutzer,

    Ich bin Anfänger in Joomla und möchte gern ajax in einer Komponente nutzen. Ich finde zwar viele Beispiele um Ajax in Module oder Plugins zu integrieren aber kein Beipiel wie man dies in einer Komponente integriert. Ich würde gerne die in Joomla 3.3 integrierte com_ajax dafür verwenden.

    Ich habe folgede Datei erstellt: .....administrator/ components/com_mycomponent/helpers/Ajaxhelper.php
    In '...components/com_mycomponent/mycomponent.php
    habe ich ein require auf diese Datei eingetragen.
    Die Class in der erstellten Datei habe ich ajaxHelper genannt.
    In dieser Klasse habe ich die funktion getAjax() integriert. Diese Funktion liefert das Ergebnis zurück.

    Ich hoffe das Einbinden der Funktion ist so Ok?

    Folgende Parameter habe ich im js request angegeben:
    'option': 'com_ajax'

    Was muss ich im request unter Module eintragen damit com_ajax die funktion getAjax() findet?

  2. #2
    Gehört zum Inventar
    Registriert seit
    06.03.2013
    Ort
    /dev/random
    Beiträge
    6.126
    Bedankte sich
    132
    Erhielt 2.283 Danksagungen
    in 2.152 Beiträgen

    Standard

    NOTE: If you are a component developer, you do not need to use com_ajax to implement Ajax functionality in it. You can do so directly in your component.
    Wenn du eine Komponente scheibst, dann implementiere Ajax direkt.

    Im controler einen Task anlegen
    PHP-Code:
     public function getAjax()
     {
               
    $format strtolower(JRequest::getWord('format''raw'));
               
    $app JFactory::getApplication();
               
    $input app->input;
               
    $data $input->get('data''');
               
    $callback=$input->get('callback''not set');
                  
               if(
    $data != "")
               {
                       
    // Have json data
                       
    $json=json_decode($data);
                       
    /*    
                       // ToDo
                       $results=array('success' => true);  // example
                       */
               
    }
               else
               {
                       
    // No json data
                       /*
                       // ToDo
                       $results=array('success' => false); //exsample
                       */
               
    }
      

               switch (
    $format)
               {
                   case 
    'json':      JResponse::setHeader('Content-Type''application/json'true);
                                         if(
    $callback == "not set")
                                         {
                                              echo 
    json_encode($results);
                                         }
                                         else
                                         {
                                              
    JResponse::setHeader('Access-Control-Allow-Origin:''*');
                                              echo 
    $callback'(' json_encode($results) . ')';
                                         }
                                         
    $app->close();
                                         break;

                   case 
    'debug':  echo '<pre>' print_r($resultstrue) . '</pre>';
                                        
    $app->close();
                                        break;

                   case 
    'raw':
                   default:          echo 
    is_array($results) ? implode($results) : $results;
                                        
    // Emulates format=raw by closing $app
                                        
    $app->close();
                                        break;
              }


    Aufruf
    Code:
    var theUrl="http://www.exsample.com/index.php?option=com_XXXXX&task=getAjax&format=json";
    jQuery-Ajax
    PHP-Code:
    ...
               var 
    requests '{"data":{"insert":[{"firstname":"John","lastname":"Doe"},{"firstname":"Jenny","lastname":"doe"}]}}';
               
    // dataType: "json" or dataType: "jsonp"
               
    $.ajax({
                    
    crossDomaintrue,
                    
    type"POST",
                    
    urltheurl,
                    
    data:  requests,
                    
    dataType"json",
                    
    cachefalse
                
    })
                .
    done(function(datatextStatusjqXHR){
                       
    console.log("Ajax completed: " data.success);
                })
                .
    fail(function(jqXHRtextStatuserrorThrown){
                   
    console.log("Ajax problem: " textStatus ". " errorThrown);
                }); 
    Geändert von FINWICK (20.12.2015 um 18:14 Uhr) Grund: ajax aufruf zugefügt
    Gruß FINWICK
    ↶ Danke Button nutzen, wenn es geholfen hat - Kein Suport via PN

  3. Erhielt Danksagungen von:


  4. #3
    Gehört zum Inventar Avatar von Re:Later
    Registriert seit
    21.04.2014
    Ort
    Berlin
    Beiträge
    5.206
    Bedankte sich
    141
    Erhielt 2.037 Danksagungen
    in 1.812 Beiträgen

    Standard

    EDIT: Und wieder ein Post, der 45 Minuten statt 10 gedauert hat. Scheiß Forums-Server! Also jetzt als Ergänzung zu Finwick.


    Com_ajax is generally used when you are not the developer of the component that the module or plugin is interacting with.
    NOTE: If you are a component developer, you do not need to use com_ajax to implement Ajax functionality in it. You can do so directly in your component.
    (https://docs.joomla.org/Using_Joomla_Ajax_Interface)

    In einer eigenen Komponente kannst du direkt JQuery-Ajax-Methoden implementieren, brauchst com_ajax nicht, was ja nur als Mittler zu Modulen und Plugins dient.

    Trotzdem verwende ich häufig AjaxPlugins zum Abarbeiten kleineren PHP-Codes, als Alternative zu einem zusätzlichen View/Controller meiner Komponenten (je nach Aufwand und Umgebung).

    Zum Einarbeiten/Ausprobieren habe ich seinerzeit das Joomla! Ajax Session Plugin (https://github.com/Joomla-Ajax-Inter...Session-Plugin) verwendet. Das Modul benötigt man nicht installiert, schadet aber auch nicht..

    In meiner Komponente dann z.B. ein Formular, das mir bei Klick Daten in die Joomla-Session schreibt. Das Formular und Ausgabe-DIV kannst du z.B. aus dem Modul übernehmen (https://github.com/Joomla-Ajax-Inter...pl/default.php).

    Dann zum Formular das entsprechende JavaScript in meiner Komponente, was das plgAjaxSession aufruft.

    Dies JS ebenfalls aus dem Modul "geklaut". https://github.com/Joomla-Ajax-Inter...od_session.php (Zeile 27 bis Zeile 69).

    Du setzt aber im JS
    Code:
    'plugin' : 'session',
    ...
    'format' : 'debug'
    format kann sein debug|raw|json.

    Das Plugin gibt dir per
    Code:
    return $diesoderdas;
    dein PHP-Ergebnis zurück.

    Statt jQuery-Methode
    Code:
    $.ajax(...)
    kann man je nachdem auch andere JQuery-Ajax Shorthand Methoden verwenden.
    http://api.jquery.com/category/ajax/shorthand-methods/

    Schreibst dir dann dein eigenes Plugin class plgAjaxHolDiesOderDas extends JPlugin und rufst es aus der Komponente via
    Code:
    'plugin' : 'holdiesoderdas',
    ...

  5. #4
    Neu an Board
    Registriert seit
    21.11.2014
    Beiträge
    10
    Bedankte sich
    1
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Ich hatte mich sehr gefreut, dass so schnell eine Antwort kam. Ich bin dann aber erst diese Woche dazu gekommen weiter zu programmieren. Ihr habt mir sehr geholfen, irgentwie hatte ich überlesen das die com_ajax nur für Module und Plugins gedacht ist und habe mich dann völlig "verannt".

    Habe es jetzt mit einem Plugin realisiert. Werde aber später auch mal die in Componenten-Varante testen.

    Herzlichen Dank

  6. #5
    Neu an Board
    Registriert seit
    17.12.2015
    Beiträge
    10
    Bedankte sich
    0
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Hallo zusammen,

    ich hab mich jetzt mal für FINWICKs Lösung entschieden, da ich doch relativ neu bin in allem und mir dies am leichtesten gefallen ist.
    Dennoch hab ich das Problem, dass ich die Fehlermeldung bekomme beim Klicken auf meine input Box.
    "Ajax Problem: error. Internal Server Error."
    Woher diese kommt ist ja klar aber warum anscheinend keine Daten übertragen werden, nicht.

    Anbei mal meine Scripte.
    in meinem site/controller.php Script hab ich nun den erweiterten Task eingefügt .
    Code:
    <?php
    defined('_JEXEC') or die;
    
    class EasyrankingController extends JControllerLegacy
    {
    
    public function getAjax()
     {
               $format = strtolower(JRequest::getWord('format', 'raw'));
               $app = JFactory::getApplication();
    	   $input = $app->input;
                  $data = $input->get('data', '');
               $callback=$input->get('callback', 'not set');
    
               if($data != "")
               {
                       // Have json data
                       $json=json_decode($data);
                       /*    
                       // ToDo
                       $results=array('success' => true);  // example
                       */
               }
               else
               {
                       // No json data
                       /*
                       // ToDo
                       $results=array('success' => false); //exsample
                       */
               }
      
    
               switch ($format)
               {
                   case 'json':      JResponse::setHeader('Content-Type', 'application/json', true);
                                         if($callback == "not set")
                                         {
                                              echo json_encode($results);
                                         }
                                         else
                                         {
                                              JResponse::setHeader('Access-Control-Allow-Origin:', '*');
                                              echo $callback. '(' . json_encode($results) . ')';
                                         }
                                         $app->close();
                                         break;
    
                   				case 'debug':  echo '<pre>' . print_r($results, true) . '</pre>';
                                        	$app->close();
                                        	break;
    
                   				case 'raw':
                   				default:          echo is_array($results) ? implode($results) : $results;
                                        // Emulates format=raw by closing $app
                                        $app->close();
                                        break;
              }
    }  
    
    }
    ?>
    Das Ganze rufe ich dann auf über eine JQuery Function die direkt in der tmpl/default.php steht.

    Code:
    <?php
    
    echo 	'<article class="col col-md-4 col-stars"> 
    		<input name="rating" value="0" id="rating_star_guest" type="hidden" postID="'.$info->id.'" />
    		<div class="overall-rating">(Average Rating <span id="avgrat">'.$average_rating.'</span> Based on <span id="totalrat">'.$info->rating_number.'</span>  rating)</div>';
    ?>
    
    <script language="javascript" type="text/javascript">
    $(function() { 
        jQuery('#rating_star').codexworld_rating_widget({
            starLength: '5',
            initialValue: '<?php echo $average_rating; ?>',
            callbackFunctionName: 'processRating',
            imageDirectory: '<?php echo JURI::base() .'media/com_easyranking/images/' ?>',
            inputAttr: '<?php echo $info->id; ?>'
        });
    
    });
    </script>
    
    <?php
    $url = JURI::base() ."index.php?option=com_easyranking&task=getAjax&format=json";
     ?>
    
    <script language="javascript" type="text/javascript">
    var theUrl='<?php echo $url; ?>';
    var requests = '{"data":[{"insert":[{"firstName":"John","lastName":"Doe"},{"firstName":"Jenny","lastName":"Doe"}]}]}';
    
    function processRating(val, attrVal){           
               // dataType: "json" or dataType: "jsonp"
               $.ajax({
                    crossDomain: true,
                    type: "POST",
                    url: theUrl,
                    data:  requests,
                    dataType: "json",
                    cache: false
                })
                .done(function(data, textStatus, jqXHR){
                       alert("Ajax completed: " + data.success);
                })
                .fail(function(jqXHR, textStatus, errorThrown){
                   alert("Ajax problem: " + textStatus + ". " + errorThrown);
                });  
    }
    </script>
    Das Ganze soll ein Bewertungsystem sein. man klickt auf die Sterne und Daten sollen später in die Datenbank eingetragen werden. Aber soweit bin ich noch nicht. Erst einmal muss hier Ajax laufen

    Eine weitere Frage für mich wäre aber dennoch.
    Wenn ich die Daten in eine Datenbank eintragen möchte, wie funktioniert dies dann? Normalerweise doch in die Datei, die im Ajax script angegeben wird, also die Variable theUrl.
    Aber diese ist ja als Funktion in der controller.php.

    Ich Danke euch für eure Hilfe.

    Gruß
    Levanthis
    Geändert von Levanthis (17.12.2015 um 08:37 Uhr)

  7. #6
    Gehört zum Inventar
    Registriert seit
    06.03.2013
    Ort
    /dev/random
    Beiträge
    6.126
    Bedankte sich
    132
    Erhielt 2.283 Danksagungen
    in 2.152 Beiträgen

    Standard

    Dieses gibts du im requests mit, firstName ist als Beispiel ein Parametername und John die Value. In getAjax bekommst du das dann geliefert und kannst das dann in die Datenbank schreiben. ( https://docs.joomla.org/Inserting,_U...sing_JDatabase )
    Gruß FINWICK
    ↶ Danke Button nutzen, wenn es geholfen hat - Kein Suport via PN

  8. #7
    Neu an Board
    Registriert seit
    17.12.2015
    Beiträge
    10
    Bedankte sich
    0
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Hallo Finwick,

    vielen Dank für deine Antwort.
    Allerdings hab ich immer noch das Problem, dass beim Aufrufen der Ajax Funktion ich den Fehler bekomme,
    Ajax Problem: paersererror, Syntax Error. Ungültiges Zeichen.

    Diese Fehlermeldung bekommen ich weg, indem ich den Datatype weglasse direkt in der Ajax Funktion und in der URL das format=json weglasse.
    Aber anscheinend wird dann meine Controller Datei nicht aufgerufen, da ich keine Ausgabe irgendeiner echo Meldung bekomme.

    Hast du da ggfs. eine Lösung für mich?

    Gruß + Danke
    Lev

  9. #8
    Gehört zum Inventar
    Registriert seit
    06.03.2013
    Ort
    /dev/random
    Beiträge
    6.126
    Bedankte sich
    132
    Erhielt 2.283 Danksagungen
    in 2.152 Beiträgen

    Standard

    Poste mal ein Link zum Problem. Dann kann man mal schauen.
    Gruß FINWICK
    ↶ Danke Button nutzen, wenn es geholfen hat - Kein Suport via PN

  10. #9
    Neu an Board
    Registriert seit
    17.12.2015
    Beiträge
    10
    Bedankte sich
    0
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    http://www.daniswelt.de/joomplate/in...gsystem?desc=1
    Klick auf die Sterne, löst das Problem aus.

    Schau mal drüber.
    Wäre super, wenn du da den Fehler findest.
    Hänge seit Tagen da fest.

    Danke dir.

    Gruß
    Lev

  11. #10
    Gehört zum Inventar
    Registriert seit
    06.03.2013
    Ort
    /dev/random
    Beiträge
    6.126
    Bedankte sich
    132
    Erhielt 2.283 Danksagungen
    in 2.152 Beiträgen

    Standard

    Du sendest keine JSON Antwort, sondern HTML-Code.

    FireBug auf Konsole, dann kannst du den Request sehen und die Antwort die der Server liefert.

    Das liegt daran, dass im Code

    /*
    // ToDo
    $results=array('success' => true); // example
    */

    Das results noch nicht mit leben gefüllt ist und auskommentiert ist.
    Gruß FINWICK
    ↶ Danke Button nutzen, wenn es geholfen hat - Kein Suport via PN

+ Antworten
Seite 1 von 3 1 2 3 LetzteLetzte

Berechtigungen

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