我试图使用laravel,php和jquery ajax创建动态视图。 单击导航栏按钮时,它会向控制器发送一个ajax请求,该请求将验证id发送,获取数据并以html格式返回。
由于可能会有多个值发回,需要自己的html div。所以我尝试使用一个对象。
buttonclicked =>对控制器的ajax请求=>获取数据=>使用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等是刀片的语法。
{"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...
这样的功能更多,现在它们已经存在,所以当一些查询更常用于 - &gt; where或 - &gt; find时,我可以使用不同的参数扩展这些功能。 Dienstencontroller:
use App\diensten; // This is the model.
class DatabaseController extends Controller
{
function GetAllDiensten(){
return $diensten = diensten::all();
}
答案 0 :(得分:3)
为什么要对json进行两次编码?
$htmlObject = json_encode((object)$htmlObject);
return response()->json(['html'=> $htmlObject]);
您可以直接使用
return response()->json(['html'=> (object)$htmlObject]);
请在您的代码中尝试此操作。
ajax调用从服务器读取响应,并且该响应必须呈现为某种类型的可读数据,例如application/json
或text/html
。
为了编写该数据,您需要使用PHP从服务器回显它。
return语句不会写入数据,只是在服务器级别返回。
试试这个
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[]
您实际上并不是从db获取数据。
$diensten = $db->GetAllDiensten()->where('parentcategory_id', '=', $id)->get();
使用get()
获取行并存储在$diensten
$diensten = diensten::where('parentcategory_id', '=', $id)->get();
在控制器中添加App / diensten并直接使用该模型。它应该给你想要的结果。
答案 1 :(得分:1)
在php控制器中通过echo
更改返回更改此
return response()->json(['html'=> $htmlObject]);
由此
echo response()->json(['html'=> $htmlObject]);
答案 2 :(得分:0)
我一直在逐步重建ajax请求和控制器功能,并测试代码的每一位以检查它的中断位置。一切都很好,直到创建使用Html设置数据的对象。
我在Html中使用了Blade语法,认为这样可行。好吧,有点做了,PHP识别if语句,但忽略了字符串中的数据的Html。因此,它只检查Blade @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 if语句来做。