셀 보기
많은 애플리케이션에는 페이지마다 또는 페이지의 다른 위치에서 반복될 수 있는 작은 보기 조각이 있습니다. 이는 종종 도움말 상자, 탐색 컨트롤, 광고, 로그인 양식 등입니다. CodeIgniter를 사용하면 View Cells 내에서 이러한 프레젠테이션 블록에 대한 논리를 캡슐화할 수 있습니다. 기본적으로 다른 뷰에 포함될 수 있는 미니 뷰입니다. 여기에는 셀별 표시 논리를 처리하기 위한 논리가 내장되어 있을 수 있습니다. 각 셀의 논리를 자체 클래스로 분리하여 보기를 더 읽기 쉽고 유지 관리하기 쉽게 만드는 데 사용할 수 있습니다.
단순하고 제어되는 셀
CodeIgniter는 단순 뷰 셀과 제어 뷰 셀의 두 가지 유형을 지원합니다.
간단한 보기 셀은 선택한 모든 클래스 및 메서드에서 생성될 수 있으며 문자열을 반환해야 한다는 점을 제외하면 어떤 규칙도 따를 필요가 없습니다.
제어된 뷰 셀은 뷰 셀을 더욱 유연하고 빠르게 사용할 수 있도록 하는 추가 기능을 제공하는 Codeigniter\View\Cells\Cell 클래스를 확장하는 클래스에서 생성되어야 합니다.
뷰 셀 호출
사용 중인 뷰 셀 유형에 관계없이 view_cell() 도우미 함수를 사용하여 모든 뷰에서 이를 호출할 수 있습니다.
첫 번째 매개변수는 (1) 클래스 및 메소드의 이름(단순 셀) 또는 (2) 호출할 클래스 및 선택적 메소드의 이름(제어 셀)이고, 두 번째 매개변수는 메소드에 전달할 매개변수의 배열 또는 문자열입니다.”#: ../../source/outgoing/view_cells.rst:3
// In a View.
// Simple Cell
<?= view_cell('App\Cells\MyClass::myMethod', ['param1' => 'value1', 'param2' => 'value2']) ?>
// Controlled Cell
<?= view_cell('App\Cells\MyCell', ['param1' => 'value1', 'param2' => 'value2']) ?>
Cell이 반환하는 문자열은 view_cell() 함수가 호출된 뷰에 삽입됩니다.
네임스페이스 생략
Added in version 4.3.0.
클래스의 전체 네임스페이스를 포함하지 않으면 App\Cells 네임스페이스에서 찾을 수 있다고 가정합니다. 따라서 다음 예에서는 app/Cells/MyClass.php에서 MyClass 클래스를 찾으려고 시도합니다. 거기에서 발견되지 않으면 발견될 때까지 모든 네임스페이스를 검사하여 각 네임스페이스의 Cells 하위 디렉터리 내에서 검색합니다.
// In a View.
<?= view_cell('MyClass::myMethod', ['param1' => 'value1', 'param2' => 'value2']) ?>
매개변수를 키/값 문자열로 전달하기
매개변수를 키/값 문자열로 전달할 수도 있습니다.
// In a View.
<?= view_cell('MyClass::myMethod', 'param1=value1, param2=value2') ?>
단순 셀
단순 셀은 선택한 메서드에서 문자열을 반환하는 클래스입니다. 간단한 경고 메시지 셀의 예는 다음과 같습니다.
<?php
namespace App\Cells;
class AlertMessage
{
public function show(array $params): string
{
return "<div class=\"alert alert-{$params['type']}\">{$params['message']}</div>";
}
}
다음과 같은 뷰 내에서 호출합니다.
// In a View.
<?= view_cell('AlertMessage::show', ['type' => 'success', 'message' => 'The user has been updated.']) ?>
또한 더 나은 가독성을 위해 메서드의 매개변수 변수와 일치하는 매개변수 이름을 사용할 수 있습니다. 이 방법을 사용하는 경우 모든 매개변수는 항상 뷰 셀 호출에 지정되어야 합니다.
// In a View.
<?= view_cell('Blog::recentPosts', 'category=codeigniter, limit=5') ?>
<?php
// In a Cell.
namespace App\Cells;
class Blog
{
// ...
public function recentPosts(string $category, int $limit): string
{
$posts = $this->blogModel->where('category', $category)
->orderBy('published_on', 'desc')
->limit($limit)
->get();
return view('recentPosts', ['posts' => $posts]);
}
}
제어되는 셀
Added in version 4.3.0.
제어되는 셀에는 두 가지 기본 목표가 있습니다. (1) 셀을 최대한 빠르게 작성하고 (2) 필요한 경우 뷰에 추가 논리와 유연성을 제공하는 것입니다.
클래스는 CodeIgniter\View\Cells\Cell을 확장해야 합니다. 동일한 폴더에 보기 파일이 있어야 합니다. 관례적으로 클래스 이름은 접미사가 Cell인 PascalCase여야 하며 뷰는 접미사가 없는 클래스 이름의 snake_cased 버전이어야 합니다. 예를 들어, MyCell 클래스가 있는 경우 뷰 파일은 my.php이어야 합니다.
참고
v4.3.5 이전에는 생성된 뷰 파일이 _cell.php로 끝납니다. v4.3.5 이상에서는 _cell 접미사 없이 보기 파일을 생성하지만 기존 보기 파일은 계속 찾아서 로드됩니다.
제어되는 셀 만들기
가장 기본적인 수준에서 클래스 내에서 구현해야 하는 것은 공용 속성뿐입니다. 이러한 속성은 뷰 파일에서 자동으로 사용할 수 있게 됩니다.
위에서 AlertMessage를 제어 셀로 구현하면 다음과 같습니다.
<?php
// app/Cells/AlertMessageCell.php
namespace App\Cells;
use CodeIgniter\View\Cells\Cell;
class AlertMessageCell extends Cell
{
public $type;
public $message;
}
// app/Cells/alert_message.php
<div class="alert alert-<?= esc($type, 'attr') ?>">
<?= esc($message) ?>
</div>
// Called in main View:
<?= view_cell('AlertMessageCell', 'type=warning, message=Failed.') ?>
참고
유형이 지정된 속성을 사용하는 경우 초기 값을 설정해야 합니다.
<?php
// app/Cells/AlertMessageCell.php
namespace App\Cells;
use CodeIgniter\View\Cells\Cell;
class AlertMessageCell extends Cell
{
public string $type = '';
public string $message = '';
}
명령을 통해 셀 생성
CLI에서 내장된 명령을 통해 제어 셀을 생성할 수도 있습니다. 명령은 php spark make:cell입니다. 생성할 셀의 이름인 하나의 인수가 필요합니다. 이름은 PascalCase에 있어야 하며 클래스는 app/Cells 디렉터리에 생성됩니다. 보기 파일은 app/Cells 디렉터리에도 생성됩니다.
php spark make:cell AlertMessageCell
다른 보기 사용
클래스에서 view 속성을 설정하여 사용자 정의 보기 파일 경로를 지정할 수 있습니다. 뷰는 일반적인 뷰와 같은 위치에 배치됩니다.
<?php
namespace App\Cells;
use CodeIgniter\View\Cells\Cell;
class AlertMessageCell extends Cell
{
public $type;
public $message;
protected string $view = APPPATH . 'Views/cells/alerts.php';
}
렌더링 사용자 정의
HTML 렌더링에 대해 더 많은 제어가 필요한 경우 render() 메서드를 구현할 수 있습니다. 이 방법을 사용하면 추가 논리를 수행하고 필요한 경우 추가 데이터를 뷰에 전달할 수 있습니다. render() 메서드는 문자열을 반환해야 합니다.
제어되는 셀의 모든 기능을 활용하려면 일반적인 view() 도우미 함수 대신 $this->view()을 사용해야 합니다.
<?php
namespace App\Cells;
use CodeIgniter\View\Cells\Cell;
class AlertMessageCell extends Cell
{
public $type;
public $message;
public function render(): string
{
return $this->view('my/custom/view', ['extra' => 'data']);
}
}
계산된 속성
하나 이상의 속성에 대해 추가 논리를 수행해야 하는 경우 계산된 속성을 사용할 수 있습니다. 이를 위해서는 속성을 protected 또는 private로 설정하고 이름이 get 및 Property로 둘러싸인 속성 이름으로 구성된 공개 메서드를 구현해야 합니다.
// In a View. Initialize the protected properties.
<?= view_cell('AlertMessageCell', ['type' => 'note', 'message' => 'test']) ?>
<?php
// app/Cells/AlertMessageCell.php
namespace App\Cells;
use CodeIgniter\View\Cells\Cell;
class AlertMessageCell extends Cell
{
protected $type;
protected $message;
private $computed;
public function mount(): void
{
$this->computed = sprintf('%s - %s', $this->type, $this->message);
}
public function getComputedProperty(): string
{
return $this->computed;
}
public function getTypeProperty(): string
{
return $this->type;
}
public function getMessageProperty(): string
{
return $this->message;
}
}
// app/Cells/alert_message.php
<div>
<p>type - <?= esc($type) ?></p>
<p>message - <?= esc($message) ?></p>
<p>computed: <?= esc($computed) ?></p>
</div>
중요
셀 초기화 중에 비공개로 선언된 속성은 설정할 수 없습니다. getDataProperty() 및 getViewProperty() 메서드 호출은 사용할 수 없으며 내부 프로세스에만 사용됩니다.
프리젠테이션 방법
때로는 뷰에 대한 추가 로직을 수행해야 하지만 이를 매개변수로 전달하고 싶지 않은 경우가 있습니다. 셀의 보기 자체 내에서 호출되는 메서드를 구현할 수 있습니다. 이는 보기의 가독성에 도움이 될 수 있습니다. 템플릿에서 메서드 호출이 허용될 뿐만 아니라 공용 속성이 있는 전체 Сell 개체를 사용할 수 있다는 것을 눈치챘을 것입니다.
<?php
// app/Cells/RecentPostsCell.php
namespace App\Cells;
use CodeIgniter\View\Cells\Cell;
class RecentPostsCell extends Cell
{
protected $posts;
public function linkPost($post): string
{
return anchor('posts/' . $post->id, $post->title);
}
}
// app/Cells/recent_posts.php
<ul>
<?php foreach ($posts as $post): ?>
<li><?= $this->linkPost($post) ?></li>
<?php endforeach ?>
</ul>
설정 로직 수행
뷰가 렌더링되기 전에 추가 논리를 수행해야 하는 경우 mount() 메서드를 구현할 수 있습니다. 이 메서드는 클래스가 인스턴스화된 직후에 호출되며 추가 속성을 설정하거나 다른 논리를 수행하는 데 사용할 수 있습니다.
<?php
namespace App\Cells;
use CodeIgniter\View\Cells\Cell;
class RecentPostsCell extends Cell
{
protected $posts;
public function mount(): void
{
$this->posts = model('PostModel')->orderBy('created_at', 'DESC')->findAll(10);
}
}
추가 매개변수를 view_cell() 도우미 함수에 배열로 전달하여 mount() 메서드에 전달할 수 있습니다. mount() 메소드의 매개변수 이름과 일치하는 전송된 매개변수는 모두 다음으로 전달됩니다.
<?php
// app/Cells/RecentPostsCell.php
namespace App\Cells;
use CodeIgniter\View\Cells\Cell;
class RecentPostsCell extends Cell
{
protected $posts;
public function mount(?int $categoryId): void
{
$this->posts = model('PostModel')
->when(
$categoryId,
static fn ($query, $categoryId) => $query->where('category_id', $categoryId),
)
->orderBy('created_at', 'DESC')
->findAll(10);
}
}
// Called in main View:
<?= view_cell('RecentPostsCell', ['categoryId' => 5]) ?>
셀 캐싱
세 번째 매개변수로 데이터를 캐시할 시간(초)을 전달하여 뷰 셀 호출의 결과를 캐시할 수 있습니다. 현재 구성된 캐시 엔진을 사용합니다.
// Cache the view for 5 minutes
<?= view_cell('App\Cells\Blog::recentPosts', 'limit=5', 300) ?>
원하는 경우 새 이름을 네 번째 매개변수로 전달하여 자동 생성된 이름 대신 사용할 사용자 정의 이름을 제공할 수 있습니다.
// Cache the view for 5 minutes
<?= view_cell('App\Cells\Blog::recentPosts', 'limit=5', 300, 'newcacheid') ?>