我正在尝试使用Laravel,PHP和JQuery Ajax创建动态视图。单击Navbar按钮时,它将向控制器发送AJAX请求,该请求将验证ID发送,获取数据并以HTML格式返回此。
由于可能有多个值发送的值,需要他们自己的htmldiv。因此,我已经尝试使用一个对象。
buttonClicked => ajax请求controller =>获取data =>使用html =>将其放入对象=>返回对象中的ajax请求 - 。
我现在遇到的问题是对象确实返回,但是它不是HTML格式化的数据,它的布尔值设置为true,如Firebug所示。
我是Ajax和jQuery的新手,很抱歉,如果这个问题很多次。
ajax:
function onclickNavbar(id) {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.ajax({
url:'/controller/AjaxController',
type: "POST",
dataType: "json",
beforeSend: function (xhr) {
var token = $('meta[name="csrf_token"]').attr('content');
if (token) {
return xhr.setRequestHeader('X-CSRF-TOKEN', token);
}
},
data: {identifier: id},
success: function(data){
var $Htmlselector = $("#contenthtml");
console.log('succes');
jQuery.each(data.html, function(key, value){
console.log(key + ' : ' + value);
$($Htmlselector).html(value);
});
},
error: function(data){
console.log('Error something went wrong. See response output:');
console.log(data);
}
});
}
控制器:
public function processor(){
if(isset($_POST['identifier'])){
$id = $_POST['identifier'];
$db = new DatabaseController();
$diensten = $db->GetAllDiensten()->where('parentcategory_id', '=', $id);
$htmlObject = array();
$counter = 0;
foreach($diensten as $dienst){
$htmlObject[$counter++] = "
<div class='col-xs-2half card-column'>
<div class='article-list header-card'>
<a href='/dienst/" . $dienst->shortname . "'>
<img src=" . asset( 'assets/img' . $dienst->image ) . "/>
</a>
</div>
<div class=".'article-list'." class=".'body-card'.">
<hr class=".'hr-card'." >
@if(" . strlen($dienst->name) <= 20 . ")
<h3 class='name text-card'>" . $dienst->name . "</h3>
@else
<h3 class='name text-card'>" . $dienst->name . "</h3>
@endif
<hr>
<p class='description idtagA text-card'>" . $dienst->shortdesc . "</p>
</div>
<div class='article-list footer-card'>
<a href='/dienst/". $dienst->shortname ."'>
<button class='btn btn-danger btn-card' type='button' style='padding-bottom:10px;'>
<span>". $dienst->shortname ."</span>
</button>
</a>
</div>
</div>";
}
$htmlObject = json_encode((object)$htmlObject);
return response()->json(['html'=> $htmlObject]);
//return json_encode($html, true);
}else{
return 'Value Identifier not set!';
}
}
注意:我使用的是Laravel 5.6.3,@if @foreach等是刀片的语法。
更新:##根据@Smitraval的代码
{"html":[true]}Array{
"message": "Array to string conversion",
"exception": "ErrorException",
"file": "C:\xampp\htdocs\Development Entric\Entric_website\app\Http\Controllers\AJAXController.php",
"line": 49,
"trace": [
{
"file": "C:\xampp\htdocs\Development Entric\Entric_website\app\Http\Controllers\AJAXController.php",
"line": 49,
"function": "handleError",
"class": "Illuminate\Foundation\Bootstrap\HandleExceptions",
"type": "->"
},
{
"function": "processor",
"class": "App\Http\Controllers\AJAXController",
"type": "->"
},
{
.... It goes on for a while...
更新2:
是这样的更多函数,它们现在就在那里,因此,当某些查询在 ->>> wery或 ->查找时,我可以使用不同的参数来扩展这些功能。dienstencontroller:
use Appdiensten; // This is the model.
class DatabaseController extends Controller
{
function GetAllDiensten(){
return $diensten = diensten::all();
}
为什么您两次编码JSON?
$htmlObject = json_encode((object)$htmlObject);
return response()->json(['html'=> $htmlObject]);
您可以直接使用
return response()->json(['html'=> (object)$htmlObject]);
请在您的代码中尝试一下。
编辑
AJAX调用读取服务器的响应,该响应必须作为某种可读数据渲染,例如application/json
或text/html
。
为了撰写该数据,您需要从服务器中回声。
返回语句不写数据,它只是在服务器级别返回。
尝试这个
echo json_encode(['html'=> (object)$htmlObject]);
die;
更新
foreach($diensten as $dienst){
$htmlObject[] = "
<div class='col-xs-2half card-column'>
<div class='article-list header-card'>
<a href='/dienst/" . $dienst->shortname . "'>
<img src=" . asset( 'assets/img' . $dienst->image ) . "/>
</a>
</div>
<div class=".'article-list'." class=".'body-card'.">
<hr class=".'hr-card'." >
@if(" . strlen($dienst->name) <= 20 . ")
<h3 class='name text-card'>" . $dienst->name . "</h3>
@else
<h3 class='name text-card'>" . $dienst->name . "</h3>
@endif
<hr>
<p class='description idtagA text-card'>" . $dienst->shortdesc . "</p>
</div>
<div class='article-list footer-card'>
<a href='/dienst/". $dienst->shortname ."'>
<button class='btn btn-danger btn-card' type='button' style='padding-bottom:10px;'>
<span>". $dienst->shortname ."</span>
</button>
</a>
</div>
</div>";
}
无需给密钥$counter++
您只需使用$htmlObject[]
更新2
您并没有真正从DB获取数据。
$diensten = $db->GetAllDiensten()->where('parentcategory_id', '=', $id)->get();
使用get()
获取行并存储在$diensten
更新3
$diensten = diensten::where('parentcategory_id', '=', $id)->get();
在您的控制器中添加应用程序/diensten,然后直接使用模型。它应该给您理想的结果。
在您的php控制器更改返回中,echo
更改此
return response()->json(['html'=> $htmlObject]);
通过这个
echo response()->json(['html'=> $htmlObject]);
我一直在逐步重建AJAX请求和控制器函数,并测试代码的每一点以检查其破裂位置。一切都很好,直到创建使用HTML设置数据的对象。
我在HTML中使用了刀片语法,认为这会起作用。好吧,PHP识别出IF语句,但使用String中的数据忽略HTML。因此,它只会检查刀片 @if()
语句是对还是错误,并且由于该代码块在foreach中使用,它将检查对象解析的每个 @if()
,并且将布尔值设置在对象中。
因此,通过删除刀片语法:
@if(" . strlen($dienst->name) <= 20 . ")
<h3 class='name text-card'>" . $dienst->name . "</h3>
@else
<h3 class='name text-card'>" . $dienst->name . "</h3>
@endif
只是写作:
<h3 class='name text-card'>" . $dienst->name . "</h3>
该对象将包含来自数据库数据的HTML。应该知道@if()
会产生问题,因为如果语句使用PHP,则不可能。