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



我正在尝试使用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/jsontext/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,则不可能。

相关内容

最新更新