클래스는 Core Image 모듈로 정의 된 기본 ImageFormatter 플러그인에서 확장되기 때문에 간단 해 보입니다. 우리의 목적을 위해, 우리가 재정의해야 할 것은 필드 데이터의 렌더링 배열을 반환하는 ViewElements () 메소드 만 있습니다. 후자는 $ 항목 목록에서 찾을 수 있으며 렌더링에 사용 및 준비 할 수 있습니다.
이 방법에서 우리가하는 첫 번째 일은 항목의 상위 클래스 메소드를 호출하고이를 변수에 저장하는 것입니다. 그것은 이미 이미지가 평소처럼 렌더링되도록 준비합니다.
기본적으로 ImageFormatter 플러그인 (부모)은 렌더 배열 내부의 image_formatter 테마를 사용하여 이미지 필드 값을 출력합니다. 우리가하는 일은 각 항목에 대해이 테마를 우리 자신의 자체로 바꾸는 것입니다 : image_title_caption_formatter. 그런 다음 부모와 마찬가지로 요소 (렌더 배열)를 반환합니다.
당신은 Drupal 8에서 이것을 많이 알게 될 것입니다 : 우리는 우리가 확장하는 부모 수업에서해야 할 일에 대해 아주 좋은 표시를 얻습니다. 그리고 당신이 나에게 묻는다면, 그것은 마법의 후크 나 기능이 무엇을하는지 알아내는 것보다 훨씬 낫습니다.
테마
<_> 위에서 지정한 image_title_caption_formatter 테마는 지금까지 가상이므로 만들어야합니다. 모듈의 .Module 파일 내부에서는 hook_theme을 구현해야합니다 :
image_title_caption.module :
이것은 Drupal 7과 매우 유사하기 때문에 익숙해 보일 것입니다.이 테마로 전달하는 변수를 확인하십시오. 기본 image_formatter 테마를 무시하려면 여기에도 동일한 변수가 전달되어야합니다. 또한 image_formatter 테마가 전처리되었으므로 테마에 대한 전처리기도 만들어야합니다.
이 사전 처리기에서 우리는 두 가지 조치를 수행합니다 :
우리는 템플릿 파일에 전달 된 변수가 Default Image_Formatter 테마 전처리 기에 의해 먼저 전처리되었는지 확인합니다. 이것은 모든 변수가 정확히 동일하고 이미지가 평소와 같이 표시되는 것입니다.
우리는 이미지 제목의 위생 값을 포함 할 캡션이라는 새로운 변수를 만듭니다.
소아화의 경우, 우리는 Helper String 클래스를 정적으로 사용합니다. 우리는 여전히 .module 파일 내부에 있으므로 주입 할 수는 없지만 파일 상단에서
를 사용해야합니다.name: Image title caption
type: module
description: Uses the image title field as a caption
core: 8.x
dependencies:
- image
템플릿
마지막으로, 우리는 새로운 테마에 대한 템플릿 파일을 만들어야합니다.
/> 템플릿/이미지 타이틀-캡션 -formatter.html.twig :
Drupal 7과 유사 하게이 파일의 이름은 테마 이름을 반영하므로 중요합니다. 내용은 바닥에 인쇄 된 캡션을 제외하고 image_formatter 테마에서 사용하는 템플릿과 거의 동일합니다.
> 작동합니까?
이제 코드를 작성 했으므로 활성화 된 후 코드를 변경 한 경우 모듈을 활성화하고 모든 캐시를 지워야합니다. 이제 테스트 할 시간입니다.
예를 들어 admin/struction/types/manage/article/display의 기사 내용 유형 필드 디스플레이 설정으로 이동하십시오. 이미지 필드의 경우 형식 제목으로 제목 형식에서 캡션을 사용하여 이미지를 선택할 수 있어야합니다. 양식을 저장하고 관리/구조/유형/관리/기사/필드/Node.article.field_image로 이동하여 이미지 필드 제목이 활성화되어 있는지 확인하십시오.
마지막으로 기사를 편집하고 이미지를 업로드하고 제목을 지정할 수 있습니다. 이 제목은 계속해서 행동하지만, 또한 이미지 아래에 캡션으로 표시됩니다. 물론, 당신은 여전히 당신이 원하는대로 스타일을 지정할 수 있습니다.
<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file
</span></span></span><span><span> * Contains \Drupal\image_title_caption\Plugin\Field\FieldFormatter\ImageTitleCaption.
</span></span><span><span> */
</span></span><span>
</span><span><span>namespace Drupal<span>\image_title_caption\Plugin\Field\FieldFormatter</span>;
</span></span><span>
</span><span><span>use Drupal<span>\Core\Field\FieldItemListInterface</span>;
</span></span><span><span>use Drupal<span>\image\Plugin\Field\FieldFormatter\ImageFormatter</span>;
</span></span><span>
</span><span><span>/**
</span></span><span><span> * Plugin implementation of the 'image_title_caption' formatter.
</span></span><span><span> *
</span></span><span><span> * @FieldFormatter(
</span></span><span><span> * id = "image_title_caption",
</span></span><span><span> * label = @Translation("Image with caption from title"),
</span></span><span><span> * field_types = <span>{
</span></span></span><span><span> * "image"
</span></span><span><span> * <span>}
</span></span></span><span><span> * )
</span></span><span><span> */
</span></span><span><span>class ImageTitleCaption extends ImageFormatter {
</span></span><span>
</span><span> <span>/**
</span></span><span><span> * <span>{@inheritdoc}
</span></span></span><span><span> */
</span></span><span> <span>public function viewElements(FieldItemListInterface $items) {
</span></span><span> <span>$elements = <span>parent::</span>viewElements($items);
</span></span><span> <span>foreach ($elements as &$element) {
</span></span><span> <span>$element['#theme'] = 'image_title_caption_formatter';
</span></span><span> <span>}
</span></span><span>
</span><span> <span>return $elements;
</span></span><span> <span>}
</span></span><span>
</span><span><span>}</span></span>
결론
이 기사에서는 Drupal 8에서 필드 포맷터를 만들고 기본 동작을 확장하는 것이 얼마나 쉬운 지 보았습니다.이 플러그인의 ViewElements ()를 재정의하는 데만 접촉했지만 추가 사용자 정의를 위해 훨씬 더 많은 작업을 수행 할 수 있습니다. 것들. 또한 ImageFormatter를 확장 할 필요는 없습니다. 기존 플러그인이 많이 있습니다.
또한 새로운 필드 유형과 위젯도 쉽게 만들 수 있습니다. 비슷한 프로세스이지만 스키마 정보를 고려하고 다른 주석 클래스를 사용하고 더 많은 코드를 작성해야합니다. 그러나 요점은 당신이 그렇게하는 데 매우 유연하다는 것입니다.
Drupal 8
에서 사용자 정의 필드 포맷터 생성에 대해 자주 묻는 질문
Drupal 8에서 사용자 정의 필드 포맷터를 만드는 방법?
Drupal 8에서 사용자 정의 필드 포맷터를 만드는 데 몇 단계가 포함됩니다. 먼저 사용자 정의 모듈이없는 경우 사용자 정의 모듈을 만들어야합니다. 그런 다음 사용자 정의 모듈에서 src/plugin/field/fieldformatter 디렉토리에 새 파일을 만듭니다. 파일은 포함 할 클래스에 따라 명명되어야합니다. 이 파일 내에서는 FormatterBase 클래스를 확장 해야하는 사용자 정의 필드 포맷터 클래스를 정의합니다. 필드 값에 대한 렌더 배열을 생성하는 ViewElements ()를 포함한 여러 방법을 구현해야합니다. Drupal 8의 @fieldformatter 주석의 목적은 무엇입니까? Drupal 8의 @fieldformatter 주석은 필드 포맷터를 정의하는 데 사용됩니다. ID, 레이블 및 Field_types와 같은 속성이 포함됩니다. ID는 Formatter의 고유 식별자이며, 레이블은 사람이 읽을 수있는 이름이며 Field_types는 Formatter가 지원하는 필드 유형 기계 이름입니다.
내 사용자 정의 필드 포맷터를 Drupal 8?
의 필드는 Drupal 8의 필드에 사용자 정의 필드 포맷터를 적용하려면 컨텐츠 유형, 분류 용어 또는 기타 엔터티 유형의 "관리"탭으로 이동해야합니다. 필드. 목록에서 필드를 찾아 "형식"드롭 다운에서 사용자 정의 포맷터를 선택하십시오. 그런 다음 "업데이트"버튼을 클릭하고 변경 사항을 저장합니다.
Drupal 8에서 사용자 정의 필드 포맷터의 출력을 어떻게 제어 할 수 있습니까?
Drupal 8에서 사용자 정의 필드 포맷터의 출력은 IS입니다. Formatter 클래스의 ViewElements () 메소드에 의해 제어됩니다. 이 메소드는 필드 값에 대한 렌더 배열을 반환해야합니다. Drupal의 테마 시스템을 사용하여 출력을 추가로 사용자 정의 할 수 있습니다. Drupal 8의 여러 필드 유형에 맞춤형 필드 포맷터를 사용할 수 있습니까? Drupal 8의 필드 유형. Formatter 클래스의 @fieldformatter 주석에서 Field_types 속성에 필드 유형 기계 이름을 지정할 수 있습니다.
내 사용자 정의 필드 Formatter에 대한 설정 양식을 작성하는 방법 DRUPAL 8? DRUPAL 8에서 사용자 정의 필드 포맷터에 대한 설정 양식을 작성하려면 Formatter 클래스에서 SettingSform () 및 SettingSummary () 메소드를 구현해야합니다. settingsform () 메소드는 설정에 대한 양식 배열을 반환해야하며 settingssummary () 메소드는 설정에 대한 요약 줄 배열을 반환해야합니다.
Drupal에 이미지를 표시하기 위해 사용자 정의 필드 포맷터를 사용하는 방법 8? 사용자 정의 필드 포맷터를 사용하여 Drupal 8에 이미지를 표시하려면 Formatter 클래스가 Formatterbase 대신 ImageFormatterBase 클래스를 확장해야합니다. 이미지 필드 값에 대한 렌더 배열을 생성하려면 ViewElements () 메소드를 구현해야합니다.
Drupal 8에서 사용자 정의 필드 유형에 대한 사용자 정의 필드 포맷터를 만들 수 있습니까? , Drupal 8에서 사용자 정의 필드 유형에 대한 사용자 정의 필드 포맷터를 만들 수 있습니다. Formatter 클래스의 @fieldformatter 주석에서 Field_types 속성에서 사용자 정의 필드 유형의 기계 이름을 지정할 수 있습니다. 사용자 정의 필드 포맷터를 사용하여 Drupal 8에 링크를 표시 할 수 있습니까?
사용자 정의 필드 포맷터를 사용하여 Drupal 8에 링크를 표시하려면 Formatter 클래스가 Formatterbase 대신 Linkformatter 클래스를 확장해야합니다. 링크 필드 값에 대한 렌더 배열을 생성하려면 ViewElements () 메소드를 구현해야합니다. Drupal 8의 다중 값 필드에 대한 사용자 정의 필드 포맷터를 어떻게 만들 수 있습니까?
Drupal 8의 다중 값 필드에 대한 사용자 정의 필드 포맷터를 만들려면 Formatter 클래스가 Formatterbase를 확장해야합니다. ViewElements () 메소드를 클래스하고 구현하십시오. 이 방법은 필드에 여러 값이있을 수 있음을 고려하여 필드 값의 렌더 배열을 반환해야합니다.