Jquery, Ajax und Datenbankanfrage

Hallo,

ich habe die Shopdatenbank um eine weitere Tabelle erweitert und möchte auf einer neuen CMS Seite diese Daten in Abhängigkeit verschiedener Auswahlmöglichkeiten (Radio-Buttons und Checkboxen) ausgeben. Hierbei geht es um eine Kurzübersicht einiger Produktdaten => Produktempfehlungen.

Dazu habe ich mir die Möglichkeiten mit Jquery und Ajax angeschaut (totales Neuland für mich aber ich bin schon jetzt davon begeistert…). Die Interaktion zwischen Ajax und dem PHP Skript mit einem statischem Datenaustausch aufzubauen war sehr leicht.
Aber noch ist mir nicht klar, wie ich zum Beispiel über ein Oxid-Objekt

$oDb = oxDb::getDb();
$sqlQuery = “…”;
$sqlResult = $oDb->getAll($sqlQuery);

eine Datenbankverbindung aufbauen kann. Wenn ich in einem Template einen PHP-Abschnitt einbinde, kann ich darüber ja direkt Daten aus der Datenbank laden und ausgeben.

Oder ist es sinnvoller über mysql_connect etc. eine Datenbankverbindung aufzubauen? Aber dann würde ich an mehreren Stellen die Zugangsdaten für die Datenbank stehen haben…

Vielleicht sehe auch auch einfach den Wald vor lauter Bäumen nicht bzw. wahrscheinlich habe ich noch nicht so ganz durchschaut wie Oxid funktioniert.

Es wäre nett wenn mir hier jemand auf die Sprünge helfen könnte. Vielen Dank.

Gruß & einen schönen Abend
Alex

Hi,
generell gibts für dein Vorhaben mehrere Ansätze.
PHP im Template einzubinden oder mysql_connect zu benutzen sind aber worst case.

Je nach dem was für Informationen aus der neuen Tabelle kommen sollen (komplett eigene Objekte oder z.B: nur Arrays aus bereits bekannten Objekten) brauchst du mindestens eine eigene View Klasse (Stichwort => PHP MVC), die diese Daten über $oDB aus der Datenbank ausliest.

Hi,
vielen Dank für deine schnelle Antwort. Die ersten beiden Möglichkeiten (PHP im Template bzw. mysql_connect) habe ich in ein paar anderen Ansätzen gesehen. Gefallen tut mir das auch nicht.
Ich habe mir das mit den Views mal angeschaut und auch danach gegooglet aber ein wirklich brauchbares kleines Beispiel habe ich nicht gefunden und mit Rumprobiererei bin ich auch nicht wirklich weitergekommen. Vielleicht kannst du mir ja ein wenig auf die Sprünge helfen.
Angefangen habe ich ohne eine View wie folgt. Die Rückgabe mit statischen Daten und die Ausgabe dieser funktioniert. Da ich die Daten aber nicht in Arrays in der PHP Datei :wink: sondern in einer Extra Datenbanktabelle ablegen mag muss ich nun irgendwie die Verbindung zur Datenbank aufbauen. Momentan wird bei einer Änderung der Radio-Buttons eine Funktion aufgerufen. Das sieht wie folgt aus:
=> JavaScript Block

$(document).ready(function(){
$(“input[name=‘brightness’]”,$(’#checkBrightness’)).change(function(){
updateBoards();
});
});

function updateBoards()
{
var brightness = $(“input[name=‘brightness’]:checked”).val();
$.ajax({
type: “POST”,
url: “…/modules/findboard/findboard.php”,
data: “brightness=”+brightness,
success: function(data){
var json = $.parseJSON(data);

=> weitere Datenausgabe
});
}
=> Ende Javascript

Die PHP Datei habe ich in den Modul-Ordner gelegt wobei es kein richtiges Modul ist…
Wie angedeutet besteht meine Datei momentan nur aus
<? php
… ein paar Arrays …
… finde richtige Daten…
… “Datenrückgabe…” in Form von
echo json_encode($boards);

?>

Aus der Tabelle sollen lediglich ein paar Werte ausgelesen werden, an das Template übermittelt und dort ausgegeben werden.
Hast du vielleicht einen Tipp für mich? Vielen Dank!

Hi,

leider machst du dir das MVC Konzept von OXID nicht zu nutze. Damit würdest du die doppelten Zugangsdaten und das php im Template nicht benötigen.
Deine …/modules/findboard/findboard.php" Datei musst du lediglich als view anlegen, wenn du kann diese class von oxubase ableitest hast auch das OXID Framework mit oxDb::getDb(); zur Verfügung.
Der Aufruf müsste dann so aussehen:

$.ajax({
type: “POST”,
url: “[{shopurl}]/index.php?cl=findboard”,

Hi Alex,

ich hab festgestellt, dass die Ajax Geschichten über MVC eine zu hohe Latenz bekommen, so dass das Feeling des Users wirklich beeinträchtigt würde. Die Views laden einige Komponenten, die man für die pure Datenbankabfrage nicht wirklich benötigt. Man kann aber auch die OXID-Funktionalitäten nutzen, in dem man das Framework einmal eintsprechend lädt. Hier ein kleiner Auszug aus meinem Farbselector:


<?php
 
  require_once getShopBasePath() . 'core/oxfunctions.php';
         
  $colorPosition = oxConfig::getInstance()->getShopConfVar("colorPosition", $sShopId = null );
  $varThumbSize = oxConfig::getInstance()->getShopConfVar("varThumbSize", $sShopId = null );
  $varProductSize = oxConfig::getInstance()->getShopConfVar("varProductSize", $sShopId = null );
  $varZoomSize = oxConfig::getInstance()->getShopConfVar("varZoomSize", $sShopId = null );
             
  $dbxparentid = oxDb::getDb()->qstr('' . $_POST['id'] . '');
  
  $sSelect = "SELECT oxartnum, oxvarselect FROM oxarticles WHERE oxparentid = " . $dbxparentid . " AND oxactive = '1' ORDER BY oxsort";
  $rows  = oxDb::getDb(true)->Execute($sSelect);          
  
  $selectedarray = array();
  $parentpics = array();
  
  if( $rows != false && $rows->recordCount() > 0 ) {
    while(!$rows->EOF) {
    	
      $selected = explode('-', $rows->fields["oxartnum"]);
      $varselected = explode('|', $rows->fields["oxvarselect"]);
    	
      $color = trim(strtolower($selected[0]. "-" . $selected[$colorPosition - 1]) . "-" . $varselected[0]);
    
      if(!in_array($color, $selectedarray))	{ 
    		$selectedarray[] = $color;
    	}
    $rows->moveNext();   
    }
  }

  function getShopBasePath() {
    return dirname(__FILE__) . '/';
  }

Vielleicht hilft Dir das ja weiter…

Hallo Bernd,
Hallo Chris,

vielen Dank für die Infos.

@Bernd:
Ich habe die Datei mittlerweile im view-Ordner drin und rufe diese über
url: “[{ $oViewConf->getSelfLink() }]cl=findboard”,
auf.

Die Findboard.php erweitert oxubase und ich habe dort die Methode render() angelegt. Aber wie bekomme ich die Daten nun übermittelt. Über return bzw. echo bekomme ich die momentan statischen Daten (nur ein Array) nicht übergeben. So wie es aussieht wird der komplette HTML Seiten-Code “übergeben” (auch wenn ich nicht weiß woher) da ein direktes Ausgeben der Daten in ein DIV über
$("#result").html(data);
den kompletten Shop in diesem Div einbindet?!

@Chris:
Vielen Dank auch für deinen Ansatz. Das klingt interessant und es ist gut zu wissen, dass die Views einen gewissen Overkill mit sich bringen. In diesem Fall wäre es dann ja auch wieder egal wo die PHP Datei liegt.

Ich hoffe, dass ich beide Möglichkeiten zum Laufen bekomme um es einfach mal auszutesten. Leider ist die MVC Geschichte ebenfalls Neuland für mich.

Hi,

probier mal echo json_encode( $array ) und dann return null;, hab ich jetzt gerade Fix aus admin/oxajax.php kopiert.
Der Shop wird geladen weil kein gültiges Template vorhanden ist.

Hi Alex,

im Fall ohne MVC habe ich eine durchschnittliche Response Time von ca. 160 ms, inklusive MVC erhöht sich das Ganze auf ca. 800 ms, was der User natürlich merkt. Es flutscht dann einfach nicht mehr so gut und fühlt sich wie gesagt etwas träge an.

Hier kannst Du das mal mit Firebug (Konsole) testen und es wird ein JSON-Objekt zurückgeliefert:

http://www.meinestruempfe.de/Sale/Micro-Satine-50-DEN.html

Die Datei getVariants.php liegt hier im Root Verzeichnis meines Shops. MVC ist natürlich etwas schöner, aber in meinem Fall wars eher kontraproduktiv.

Hi,

ich bin leider nicht früher zum testen gekommen.

@Bernd: Leider ändert sich an der Ausgabe nichts. :-/
Die findboard.php besteht gekürzt jetzt nur noch aus

<?php
    class findboard extends oxubase
    { 
       public function render()
       { 
             parent::render();	
             $boards = array('boards' => "test");		
             echo json_encode($boards);
             return null;
       }
    }
?>

Ach so, die Shopversion ist Oxid 4.4.8 - vielleicht gibt es in dieser irgendwelche Eigenarten zu berücksichtigen?!

@Chris: Vielen Dank für den Link. Die Seite gefällt mir gut und die Response-Time für den Farb-Selektor ist wirklich prima. Die Variante werde ich morgen mal in Angriff nehmen.

Schönen Abend

Hi,

mach das so wie chris beschrieben, ich hab selber immer ein Template als Übergabe. Bin mir gerade auch unsicher ob man das ohne Template machen kann… sorry.

Hi,

@Chris: Funktioniert Deine Methode auch, um auf die Sessionverwaltung von OXID zuzugreifen? Ich habe einen AJAX-Aufruf in einem JQuery Code. Die PHP Datei, die dabei aufgerufen wird, sollte die Session-ID von OXID auslesen können und auch eine neue Sessionvariable anlegen können. Irgendwie verzweifele ich daran gerade…

Viele Grüße

Jochen

Servus Jochen,

gute Frage, ich habe diese Methode ja nicht erfunden, aber prinzipiell solltest Du auf sämtliche Variablen aus dem Framework zugreifen können. Hab jetzt gerade leider keine Zeit, mir die Sache näher anzusehen. Aber sobald ich dazu komme, schau ich mir das natürlich direkt mal an. An welche Daten musst Du denn konkret ran bzw. benötgist Du denn für Dein Vorhaben?

[QUOTE=Alex0903;99752]
In diesem Fall wäre es dann ja auch wieder egal wo die PHP Datei liegt.
[/QUOTE]

Ja, ist völlig wurscht, wo die Dinger liegen. Ich hab die Datei der Einfachheit
halber im Wurzelverzeichnis liegen.

Hi Chris,

vielen Dank für Deine schnelle Antwort!

Ich möchte die Session-ID auslesen, da ich diese benutze, um eine Bilddatei abzuspeichern, deren Name mit der Session-ID beginnt, damit Sie später eindeutig identifiziert werden kann. Den Pfad zu dieser neu erstelten Datei möchte ich dann anschließend wiederum in eine neu angelegte Sessionvariable schreiben.

Viele Grüße

Jochen

Hi Jochen,

wie siehts denn damit aus?


$this->getSession()->setVar("deinwert");
$this->getSession()->getVar("sid");

Session-ID brauchst du ja nicht unbedingt, du kannst dir ja selbst eine unique ID erstellen.

Genau, da hat Frank absolut recht, insofern Du nicht neue Werte der Session hinzufügen möchtest, ist wohl uniqid eine super Lösung:

http://php.net/manual/de/function.uniqid.php

So ists ganz nett:


$unique = md5( uniqid() );

Hi!

Vielen Dank schon einmal für Eure Tipps. Ich bin wirklich Recht neu in der OXID Welt und habe noch viele “Baustellen”. Von daher bin ich für jede Hilfe dankbar!

Das mit der unique ID ist eine schöne Sache, aber wie gesagt, möchte ich den Pfad inkl. Dateinamen in der Session abspeichern.

Die oxfunctions habe ich wie beschrieben per require_once eingebunden, erhalte jetzt aber eine Fehlermeldung:

[B]Fatal error: Call to undefined function getshopbasepath() in …/shop/core/oxfunctions.php on line 49[/B]

Hat jemand von Euch eine Idee?

Grüße

Jochen

Servus Jochen, getshopbasepath hast Du in Deinem Script aber schon definiert? Ansonsten stimmt eventuell der Pfad nicht…

Hallo,

ich habe es auch schon einmal mit einer eigenen View-Klasse versucht, bin aber daran gescheitert, da ich nicht wußte, wie und ob ich meine metadata.php anpassen muss.


<?php
    class create_design extends oxUBase
    {

        public function render()
        {
            $session_id=oxSession::getVar('Sid');
            // normal oder 
			$preview_image_name=$session_id.'test.jpg';
           
            oxSession::setVar('image_name', '/preview/'.$preview_image_name);

            parent::render();

        }
    }


		$.ajax({
			type:  'POST',
                        url: '[{ $oViewConf->getSelfLink() }]cl=create_design',
			data:  ({dataString : dataString, layout : layout}),
			cache: false,
			success: function() {
                        location.href = location.href + '&bestellen=true';
            }
			});