PDA

Visualizza la versione completa : MVC e ajax


leaf
06-04-2017, 16:39
Ciao, mi sto avvicinando a PHP OOP, MVC e Ajax ma ho un problema.
In una delle mie view c'e una select e in base alla selezione voglio fare una chiamata ad un metodo php e mostrare i dati. ma mi sono perso da qualche parte e non riesco a capire quale sia il percorso giusto che deve fare il codice. Credo sia abbastanza semplice da risolvere ma non capisco che metodo chiamare nella richiesta ajax e soprattutto se mi serve un nuovo metodo nel controller o no.
Grazie :)

Questa e la mia view



<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Load Cars By Choice</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
$(document).ready(function (){
$('#select').change(function (){

//debug
var model = $(this).val();

var str = "";

$("select option:selected").each(function(){
str += "<br/><div><b>Company Name: </b>" + $(this).text() + "</div><br/>";

var selection = $(this).text();

var carModelUrl = ".../my_mvc/index.php/loadCarsByChoice";

$.getJSON(carModelUrl, selection, function(json){
console.log("JSON: ", json);
str += "<table>";

for (var i = 0; i < json.length; i++) {
str += "<tr><td>" + (i+1) + " - " + json[i].BrandName +
"</td><td>" + json[i].Model +
"</td><td>" + json[i].Colour +
"</td><td><img src='../assets/" + json[i].BrandName + ".jpg'></img></td></tr>";
}

str += "</table>";

document.getElementById("placeholder").innerHTML=str;

});
});
});
})
</script>
</head>
<body>
<h1>Choose a car to see details</h1>
<form>
<select id="select">
<?php
for ($i=0; $i < count($data); $i++) {
echo "<option value='".$data[$i]."'>".$data[$i]."</option>";
}
?>
</select>
</form>

<div id="placeholder"></div>
</body>
</html>


questo e il controller



function loadCarsByChoice(){
$data = $this->model->getBrandNames();
$this->load->view('loadCarsByChoice', $data);
}


e questi sono due metodi che ho nel model (il primo getBrandNames() serve per mostrare i dati nella select, il secondo deve ricevere la richiesta ajax con il valore selezionato e ritornare i dati)



public function getBrandNames(){

try{

$sql = "SELECT DISTINCT BrandName FROM Cars";
$stmt = $this->dbHandler->query($sql);

$data = $stmt->fetch();

$result = null;

$i = 0;


while($data = $stmt->fetch()){
$result[$i] = $data['BrandName'];
$i++;
}

}catch(PDOEXception $e){
print new Exception($e->getMessage());
}

$this->dbHandler = NULL;

return $result;

}

public function getCarDetails(){

$carName = $_GET;

try{

$sql = "SELECT * FROM Cars WHERE BrandName = '". $carName . "'";
$stmt = $this->dbHandler->query($sql);

$result = null;
$i = 0;

while($data = $stmt->fetch()){
$result[$i]['BrandName'] = $data['BrandName'];
$result[$i]['Model'] = $data['Model'];
$result[$i]['Colour'] = $data['Colour'];

$i++;
}

}catch(PDOEXception $e){
print new Exception($e->getMessage());
}

$this->dbHandler = NULL;

return json_encode($result);
}

Alhazred
06-04-2017, 17:18
Stai usando CodeIgniter?

Comunque, il giro da fare è: ajax chiama il metodo del controller, il controller chiama il metodo nel model, il model restituisce al controller i dati recuperati dal db opportunamente formattati (un array JSON va bene), il controller finisce con un echo dei dati ricevuti dal model, non con la chiamata di una view.

Affinché AJAX riceva dei dati utilizzabili, questi vanno stampati con un echo, non devi chiamare nessuna view, perché resti su quella che ha effettuato la chiamata, AJAX si usa proprio per evitare di ricaricare la pagina.

leaf
10-04-2017, 10:35
Affinché AJAX riceva dei dati utilizzabili, questi vanno stampati con un echo, non devi chiamare nessuna view, perché resti su quella che ha effettuato la chiamata, AJAX si usa proprio per evitare di ricaricare la pagina.

grazie, questo era il pezzo che mi mancava! Appena ho un attimo provo.
No, non sto usando codeigniter..seguendo un tutorial ho costruito un MVC da zero..

leaf
12-04-2017, 16:27
eccomi..dunque..
come faccio a recuperare il dato che appendo alla chiamata ajax?

lo invio nella richiesta (è il "selection")



$.getJSON(carModelUrl, selection, function(json){
...
}


ma dall'altra parte, nel metodo del model, come recupero quel valore? se uso $_GET["selection"] mi da errore

grazie! :)

fermat
12-04-2017, 16:37
si ma come lo crei il selection?
deve avere una struttura tipo questa:


var data = {
"nome": "NOME",
"cognome": "COGNOME",
"eta": 20
};

$.getJSON(URL, data, function (result) {
......
});

leaf
12-04-2017, 20:33
si ma come lo crei il selection?
deve avere una struttura tipo questa:


var data = {
"nome": "NOME",
"cognome": "COGNOME",
"eta": 20
};

$.getJSON(URL, data, function (result) {
......
});


nel primo post c'è il codice completo. lo riporto qui. la select funziona correttamente



<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Load Cars By Choice</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
$(document).ready(function (){
$('#select').change(function (){

//debug
var model = $(this).val();

var str = "";

$("select option:selected").each(function(){
str += "<br/><div><b>Company Name: </b>" + $(this).text() + "</div><br/>";

var selection = $(this).text();

var carModelUrl = ".../my_mvc/index.php/loadCarsByChoice";

$.getJSON(carModelUrl, selection, function(json){
console.log("JSON: ", json);
str += "<table>";

for (var i = 0; i < json.length; i++) {
str += "<tr><td>" + (i+1) + " - " + json[i].BrandName +
"</td><td>" + json[i].Model +
"</td><td>" + json[i].Colour +
"</td><td><img src='../assets/" + json[i].BrandName + ".jpg'></img></td></tr>";
}

str += "</table>";

document.getElementById("placeholder").innerHTML=str;

});
});
});
})
</script>
</head>
<body>
<h1>Choose a car to see details</h1>
<form>
<select id="select">
<?php
for ($i=0; $i < count($data); $i++) {
echo "<option value='".$data[$i]."'>".$data[$i]."</option>";
}
?>
</select>
</form>

<div id="placeholder"></div>
</body>
</html>

leaf
16-04-2017, 13:14
up (e buona pasqua!)

leaf
21-04-2017, 13:20
nessuno?

luca200
21-04-2017, 17:17
Ti hanno già risposto. Il secondo parametro di getJSON() deve essere un oggetto con le coppie chiave-valore da inviare al server

leaf
22-04-2017, 12:51
ok ma non mi è chiaro come leggerlo dall'altra parte (cioè nel metodo che chiamo)..con un $_GET[] ?

Loading