iT邦幫忙

1

PHP echo html的大板塊 該怎麼輸出比較好?

  • 分享至 

  • xImage

前情提要

我使用ajax 針對不同<a>的連結做出不同的回應
一共有三頁 要輸出不同的內容 像是SPA那樣

php的寫法

<?php

session_start();

if ($_GET['token'] <> $_SESSION['token']){
    echo json_encode(['auth'=>false]);
}else{
    $item = $_GET['item'];
    echo json_encode(['auth'=>true,'content'=>"<b>This is the content for ${item}</b>."]);
}

?>

這邊丟回一個content,裡面送出html,最後ajax那邊會有一個:

$('#content').html(data.content);

讓我主頁有一塊content裡面去放不同內容。

問題請教

想問一下 針對不同的 $item 我是否要用if else去做Event Flow呢?
(讓頁面一 頁面二 頁面三 encode不同的content)

或是用switch其他的條件判斷?

關於php丟回來的content,該怎麼輸出大量的html比較好呢?

因為我ajax是用json接收

 let data = JSON.parse(res);

虛擬代碼如下:


if 頁面一

echo content='<div class="w-50 p-3 mx-auto">'
echo content='<form id="loginform">'
echo content='<div class="another">'

if 頁面二

echo content='<div class="w-50 p-3 mx-auto">'
echo content='<form id="loginform">'
echo content='<div class="two">'

if 頁面N....


如果我要丟比較多行的html,難道要多行的echo,手動好幾行加上雙括號?
這樣的字串很不易編輯,又要小心單引號、雙引號的問題,
似乎是個難題。

以上,感謝各位前後端前輩。

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
淺水員
iT邦大師 6 級 ‧ 2023-04-08 17:47:52
最佳解答

提供參考
下面是邏輯跟樣板分開的作法
(雖然現在很多框架都幫我們處理了)

test.php?test=a 會輸出 a.php 頁面,a.php 可以接收一個 $text 的參數,當作字串輸出
test.php?test=b 會輸出 b.php 頁面,b.php 可以接收一個 $arr 的參數,輸出成列表

test.php

<?php

function response($data, $param = []) {
    switch(gettype($data)) {
        case 'string':
            if(file_exists($data)) {
                extract($param);
                include($data);
            } else {
                echo $data;
            }
            break;
        case 'array':
            header('Content-Type: application/json');
            echo json_encode($data);
            break;
        default:
            http_response_code(500);
    }
    exit();
}

$text = '測試';
$arr = ['Hello', 'world'];

if(isset($_GET['test'])) {
    switch($_GET['test']) {
        case 'a':
            response('a.php', [
                'text' => '這段文字來自參數'
            ]);
            break;
        case 'b':
            response('b.php', [
                'arr' => [
                    'Happy',
                    'Day'
                ]
            ]);
            break;
    }
}

response([
    'status' => 'error'
]);

a.php

<!DOCTYPE html>
<html lang="zh-Hant-TW">
<head>
    <meta charset="UTF-8">
    <title>a.php</title>
</head>
<body>
    text 的值為 「<?php echo $text;?>」
</body>
</html>

b.php

<!DOCTYPE html>
<html lang="zh-Hant-TW">
<head>
    <meta charset="UTF-8">
    <title>b.php</title>
</head>
<body>
    <ol>
    <?php foreach($arr as $str):?>
        <li><?php echo $str;?></li>
    <?php endforeach;?>
    </ol>
</body>
</html>

謝謝你提供程式碼 感謝你 很有幫助 感恩
這次就選您為最佳解答
當然也要非常感謝㊣浩瀚星空㊣ 專業的分析 認知提高非常多!

2

想問一下 針對不同的 $item 我是否要用if else去做Event Flow呢?
(讓頁面一 頁面二 頁面三 encode不同的content)
或是用switch其他的條件判斷?

多個且單一判斷的話用 switch
多重判斷還是使用IF ELSE
如果條件判斷很固定規則的話,就是寫成 function 。

關於php丟回來的content,該怎麼輸出大量的html比較好呢?
因為我ajax是用json接收

一般會建議用text來接受html格式資料。比較不容易出事。
json要轉換html後又要轉換回來會有點麻煩。

不過,其實現在也盡量不要直接取得html後再更換掉。
瀏覽器容易爆。
盡量還是單純點,只取得資料。html固定。
學一下 template 這個元件的用法。
這無論在 JQUERY 或是VUE都會用的到。

先用 template 去建立好可能會用到的html
在AJAX上只取資料出來後。再帶入對應的 template 後才秀出。

盡量不要用後端去送出 html。

哇嗚!(。◕∀◕。)

發問後果然有新的層次能學,學到很好的方向跟觀念!
謝謝大師,回答速度真快,講解卻又清楚又完整。
我會去研究這一方面的,真的需要多做功課。

0
jason07
iT邦新手 5 級 ‧ 2023-04-11 20:37:12

Template literals (Template strings)

謝謝

我要發表回答

立即登入回答