はじめに
この記事では、フロント側からajaxでControllerを呼び出し、その中で読み込んだElementをリターンしてhtmlに追加表示する方法を紹介しています。
結論
ポイントとしては2点になります。
- ajaxのdataTypeをhtmlにする
- Controllerのreturnを
$this->render('Element Path');
にする
検証環境
端末 | バージョン |
---|---|
Mac | Big Sur 11.2.3 |
CakePHP | 3.8.12 |
Docker | |
Nginx |
コード
htmlにはリストと「もっと見る」ボタンがあります。
ボタンを押すとajax経由でサーバサイドのControllerを非同期で呼びだします。
Controllerからreturnされたhtml(Element)をulタグに追加表示します。
<!doctype html>
<html lang="ja">
<head>
</head>
<body>
<ul>
<li>リスト1</li>
<li>リスト2</li>
</ul>
<input type="submit" value="もっと見る">
</body>
</html>
Elementの内容としてはulタグに追加するliタグがあります。
<li>リスト3</li>
結論にも記載したように、dataTypeをhtml
にしています。
<script>
$(function(){
$("input").on("click", function(){
$.ajax({
type : "POST",
url : "Server side url",
dataType : "html"
}).done(function(html) {
// サーバから送られたElement(html)を
// ulタグに追加表示する
$('ul').append(html);
}).fail(function(xhr, status, error) {
console.log(xhr.responseText);
});
});
});
</script>
Controller側のポイントとしては$this->render('/element/Element name');
でElementをreturnしているところです。ajaxのdataTypeをhtmlとしているので、json_encodeではないので注意ください。
public function loadAddingLegacyPosts(){
if(! $this->request->is("ajax")) $this->redirect("/");
$this->layout = false;
$this->autoRender = false;
$this->viewBuilder()->setLayout(false);
$this->set(compact('Elementにパラメターも渡せる'));
$this->render('/element/Element name');
}
参考
jQuery.ajax() | jQuery API Documentation
コメント