필드 유형 목록을 얻는 방법?


10

Drupal 7에서 Drupal 8로 모듈을 포팅하고 있습니다.이 모듈의 구성 설정에서 현재 존재하는 필드 유형 목록을 가져와야합니다.

Drupal 7에서는이 field_info_field_types()기능을 사용하여이 작업을 수행했습니다 .

Drupal 8 (8.0.0-rc3)에서 Drupal API 참조 도움말 페이지에 명시되어있는 정보에도 불구하고 "기능이 존재하지 않습니다"라는 오류가 발생 합니다.

그런 다음 조사 결과 DrupalContrib 페이지가 발견되었습니다.이 페이지 에서 함수가 더 이상 사용되지 않는 것으로 선언되어 현재 사용할 것을 제안합니다 Drupal::service('plugin.manager.entity.field.field_type')->getDefinitions().

그러나 이것을 사용하면 "Unknown service plugin.manager.entity.field.field_type"이라는 오류가 발생합니다. 다행히 "plugin.manager.field.field_type?"

그래서 사용 Drupal::service('plugin.manager.field.field_type')->getDefinitions()하고 와우를 시도했습니다 : 예상되는 필드 유형 배열을 얻었습니다.

그러나 각 배열 구성원 (하나의 필드 유형)은 이제 자식 배열 대신 객체이며 찾고있는 데이터는 보호 된 속성 내에 중첩되어 있으므로 액세스 할 수 없습니다.

이 단계에서 나는 붙어 있습니다. 필자는 이러한 데이터를 탐색하기 위해 확장 할 수있는 클래스가있을 수 있다고 생각했지만 운이 없었습니다. 필드 유형 정의가 집중되어있는 Drupal 8의 구성 요소를 파악할 수 없었습니다.


더 업데이트 된 api.drupal.org를 보는 것이 좋습니다. 실제로 해당 기능에 대한 페이지가 없습니다 .
kiamlaluno

팁 "api.drupal.org를보십시오"에 감사합니다. 반면에 (약간의 메타와 관련이 있습니다. 죄송합니다), 약어를 편집 한 것을 쉽게 이해한다면 (D7-> Drupal 7) 왜 제목에 "Drupal 8"을 떨어 뜨 렸는지 궁금합니다. 나는 그것이 "8"태그와 중복된다고 말하는 규칙이 있다고 생각하는 경향이있다. 그러나 독자로서 나는 태그보다 제목으로 훨씬 더 확실하게 정보를 얻는 데 사용합니다. 내 눈에 태그는 본질적으로 검색 프로세스를 다루며 순차적으로 읽는 동안 거의주의를 기울이지 않습니다.
cFreed

제목이 태그를 반복 할 필요는 없습니다. 태그는 질문이 나열된 모든 곳에 항상 표시되기 때문입니다. 스택 Exchange 사용자는 태그에주의를 기울입니다.
kiamlaluno

답변:


16

첫 번째 수준은 배열입니다. 키는 플러그인 ID입니다. 당신은 그들을 나열 할 수 있습니다 :

$defs = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $defs as $key => $value ) {
   echo $key, "\n";
}

결과는 다음과 같습니다.

comment
datetime
file
image
link
list_string
list_float
list_integer
path
text_with_summary
text
text_long
email
boolean
created
changed
timestamp
string_long
language
decimal
uri
float
password
string
integer
entity_reference
uuid
map
taxonomy_term_reference

하나를 선택하고 플러그인 정의를 덤프 할 수 있습니다.

var_dump($defs['comment']);

특별한 물건에 관심이 있다면 api.drupal.org의 도움으로 더 깊이 파고들 수 있습니다. 그러나 핵심 디렉토리에서 플러그인을 검색하면 더 쉬울 것입니다.

객체에 액세스하려면 var_dump에서 객체를 찾아 메소드를 사용하십시오.

$defs['comment']['description']->render();

이 경우 번역 된 문자열에 액세스하기 위해 render 메소드를 갖는 객체 TranslatableMarkup 입니다.


고마워하지만 이것은 내가 이미 한 일입니다. 그 외에도 내 문제는 여전히 남아 있습니다 : 어떻게 프로그래밍 방식으로 이러한 객체 내부 의 데이터에 액세스 할 수 있습니까?
cFreed

필드 정의에서 무엇을 찾고 싶습니까? 일반적으로 api에서 객체의 속성과 메소드를 찾은 다음`-> '으로 액세스합니다. 소스에서 필드 정의를보다 쉽게 ​​찾을 수 있습니다.
4k4

나는 추출 label, descriptionmodule사용자가 내 모듈 (하고자하는 사람 확인할 수있는 구성 형태를 표시 MMS를 관련 분야에 대한 토큰을 복제 만듭니다).
cFreed

예를 추가합니다.
4k4

죄송합니다! 마지막 의견을 보았지만 편집 내용을 보지 못했기 때문에 계속 기다렸습니다. 나는 당신의 제안을 시도합니다. 감사.
cFreed

4

t ()를 통해 전달 된 모든 문자열은 이제 객체입니다. 실제로 문자열로 액세스 할 수 있습니다.

배열 키와 같은 객체를 그대로 사용할 수없는 예외는 거의 없습니다. 예를 들어 문자열로 캐스팅해야합니다. 다른 것들은 작동해야합니다.

PS : 공식 API 문서는 http://api.drupal.org/api/drupal/8 입니다. 코어에 사용하십시오.

또 다른 좋은 자원이 변경 기록은 다음과 같습니다 https://www.drupal.org/list-changes/published?keywords_description=field_info_field_types&to_branch=&version=&created_op=%3E%3D&created%5Bvalue%5D=&created%5Bmin%5D=&created%5Bmax% 5D =

편집 : 귀하의 의견에 답변, 나는 당신이 무슨 뜻인지 이해하지 못합니다. 필요한 모든 정보가 있습니다. 바로 사용하십시오.

$definitions = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $definitions as $field_type => $definition) {
  print $definition['label'];
  print $definition['description'];
  print $definition['provider'];
}

다시 말하지만, 레이블 / 설명은 객체라는 것을 무시하십시오. 인쇄 / 사용시 자동으로 호출되는 __toString () 메소드가 있습니다.


이 답변에 감사드립니다. 마지막 제안 된 링크는 매우 유망한 것으로 보이며이 정보를 바탕으로 조사하겠습니다. 간단히 말해서 나는 내 요구에 대한 것을 생각하면 내가 잘못했다 (추출 label, description, module각 필드 형의 문자열) 내가한다 : 1)에서 목록을 Drupal::service('plugin.manager.field.field_type')->getDefinitions()아직 같은; 2) 그런 다음 필요한 정보를 얻는 방법을 제공하는 특정 클래스를 호출하기 위해 반환 된 배열의 각 키 (필드 유형 이름)를 사용하십시오 (어느 쪽과 어디서 더 깊이 조사해야합니까?). 이 정밀도를위한 TIA.
cFreed

내 답변을 업데이트했습니다.
Berdir

죄송합니다 ... 이해가 안됩니다! 편집에서 제안한 것은 단지 D7에서 한 것입니다. D8에서는 $definition문자열 배열이 아니라 객체 배열 이기 때문에 D8에서는 작동하지 않습니다 ! dpm ()을 사용하여 검사했으며 필요한 각 문자열이 다음과 같이 중첩 된 것으로 나타났습니다 'label' => array(..., 'label' => Drupal\Core\StringTranslation\TranslatableMarkup Object {..., string, ...}, ...). 나는 분명한 것을 놓치고 있습니까?
cFreed

방금 4k4의 마지막 편집을 발견했습니다. 실제로 저에게 문제는 TranslatableMarkup수업을 어디에서 찾을 수 있고 render()방법 의 유용성 을 아는 것이 었습니다 . 마지막으로 내 데이터를 얻는 올바른 방법은 print $definition['label']->render();입니다. 그럼에도 불구하고 다른 정보에 감사드립니다.
cFreed

아니요, 다시 -render ()가 필요 하지 않습니다 . $ definition [ 'label']을 사용하라. 그냥 작동한다. 나를 믿어 라 :)
Berdir

1

@Berdir 답변의 버전이 업데이트되었습니다. 쉘에서 사용하십시오.

$definitions = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $definitions as $field_type => $definition) {
  print 'Label: '. $definition['label']. PHP_EOL;
  print 'Machine name: '. $field_type. PHP_EOL;
  print 'Descritpion: '. $definition['description']. PHP_EOL;
  print 'Provider: '. $definition['provider']. PHP_EOL . ' ---' . PHP_EOL;
}

여기에 출력 : https://gist.github.com/sobi3ch/70635cc62defff606242


1

Google은 이들을 검색 할 때이 질문을 찾는 것 같습니다

Drupal Console을 사용하는 경우 다음을 사용할 수도 있습니다.

drupal plugin:debug field.field_type

Drupal.org에도 다음이 도움이 될 수 있습니다.

컨텐트 엔터티 필드 정의 정의 및 사용

사용 가능한 예제를 찾는 것은 쉽지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.