返回到ajaxrequest的PHP对象具有boolean == true而不是数据

时间:2018-03-28 12:05:26

标签: javascript php jquery ajax

我试图使用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等是刀片的语法。

更新:##根据@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:

这样的功能更多,现在它们已经存在,所以当一些查询更常用于 - &gt; where或 - &gt; find时,我可以使用不同的参数扩展这些功能。 Dienstencontroller:

use App\diensten; // This is the model.
class DatabaseController extends Controller
{

function GetAllDiensten(){
    return $diensten = diensten::all();
}

3 个答案:

答案 0 :(得分:3)

为什么要对json进行两次编码?

$htmlObject = json_encode((object)$htmlObject);
return response()->json(['html'=> $htmlObject]);

您可以直接使用

return response()->json(['html'=> (object)$htmlObject]);

请在您的代码中尝试此操作。

修改

ajax调用从服务器读取响应,并且该响应必须呈现为某种类型的可读数据,例如application/jsontext/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[]

即可

更新2

您实际上并不是从db获取数据。

$diensten = $db->GetAllDiensten()->where('parentcategory_id', '=', $id)->get();

使用get()获取行并存储在$diensten

更新3

 $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语句来做。