[CakePHP]もっと見るボタン押下時にajaxでElementを取得してリストに追加する方法

CakePHP

はじめに

この記事では、フロント側からajaxでControllerを呼び出し、その中で読み込んだElementをリターンしてhtmlに追加表示する方法を紹介しています。

結論

ポイントとしては2点になります。

  • ajaxのdataTypeをhtmlにする
  • Controllerのreturnを$this->render('Element Path');にする

検証環境

端末バージョン
MacBig Sur 11.2.3
CakePHP3.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

コメント

タイトルとURLをコピーしました