작업 필드 위젯 양식을 자체적으로 표시 할 수 있습니까?


21

전체 노드 편집 양식의 컨텍스트 외부에 필드 위젯 양식을 포함시키는 데 관심이 있습니다.

drupal_get_form을 사용하여 과거에 전체 양식을 표시 했지만 독방 필드 양식에는 적용되지 않는 것 같습니다.

작업 필드 위젯 양식을 표시 할 수 있습니까? 그렇게하는 가장 좋은 방법은 무엇입니까?

필드 위젯과 "정상"양식은 모두 비슷해 보이지 않으므로 이것이 불가능한 경우 위젯 양식을 일반 양식으로 "변경"하려면 무엇이 필요합니까?

질문 은 비슷한 것을 요구하는 것 같지만 대답을 이해하지 못합니다. 이 답변은 hook_field_widget_form_alter ; 내가 이해하지 못하는 것은 일단 작성되면 후크하는 방법이 아닌 필드 양식을 표시하는 방법입니다.

답변:


18

VBO는 modify.action.inc에서 다음과 같은 작업을 수행합니다.

$form_key = 'bundle_' . $bundle_name;
$form[$form_key] = array(
  '#type' => 'fieldset',
  '#title' => $label,
  '#parents' => array($form_key),
);  
field_attach_form($context['entity_type'], $entity, $form[$form_key], $form_state, LANGUAGE_NONE);  

따라서 엔티티 유형, 엔티티 (번들 키 세트 만있는 빈 오브젝트 일 수 있음, 실제로 사용되는 것), 위젯이 추가되는 형식 및 언어가 필요합니다. 위젯을 양식에 더 깊이 포함 시키려면 ($ form이 아니라 $ form [$ form_key]에, 또는 더 깊게), 해당 양식 배열에 #parents를 설정해야합니다.

물론 이것은 해당 엔티티 유형 및 번들에 속하는 모든 필드의 위젯을 포함합니다. 첨부 기능이 작성된 방식입니다. 그렇게하려면 꽤 많은 코드를 다시 만들어야합니다. 무거운 작업을 수행 하는 실제 코드 를 참조하십시오 . 내가하는 일은 필드 인스턴스를 통해 각 $ field_name을 가져 오는 것이며 해당 필드 유형에 관심이 없다면 $form[$form_key][$field_name]['#access'] = FALSE; 위젯을 보이지 않게 설정합니다.

편집 : 좋아, ctools에는 ctools_field_invoke_field ()가있어 이론적으로 필드별로 작업 할 수 있습니다. 나는 그것을 사용한 적이 없다. 위의 텍스트는 나의 직접적인 경험입니다.


멋진 답변입니다. 나는 하루 중 더 좋은 부분을 이것과 함께 보냈고, 원하는대로 작동했습니다. 현상금이 수여되었으며 OP가이를 정답으로 수락하는 것이 좋습니다. 나는이 콘텐츠 #access = FALSE에서 해킹 된 것처럼 보이는 설정 대신 다른 콘텐츠 유형처럼 필드를 제어 할 수 있도록 더미 콘텐츠 유형을 만들었습니다 .
Letharion

내가 두려워했던 것을 확인해 주셔서 감사합니다. 단일 필드 위젯은 실제로 사용할 수 없다는 것입니다.
SMTF

7

ttk가 제안한 기능을 집중적으로 사용하고 있었지만 최근 업데이트로 인해 문제가 발생했다고 생각합니다 ...

다음은 Drupal 7.22 및 ctools 7.x-1.3에서 잘 작동하는 이전 솔루션의 새 버전입니다.

따라서 이전 게시물과 같이 다음과 같이 사용자 정의 함수를 호출합니다.

my_field_attach_form('field_body', 'node', 'blog',  $node, $form, $form_state, LANGUAGE_NONE);

엔티티 번들 은 이제 매개 변수입니다. 이 기능을 사용하여 사용자를 편집했기 때문에이 작업을 수행했습니다. 이런 식으로, 분류 용어 또는 다른 엔티티에도 사용될 수 있습니다.

그리고 my_field_attach_form는 다음과 같이 정의됩니다.

function my_field_attach_form($field_name, $entity_type, $bundle, $entity, &$form, &$form_state, $langcode = NULL) {

  // Set #parents to 'top-level' if it doesn't exist.
  $form += array('#parents' => array());

  // If no language is provided use the default site language.
  $options = array(
    'language' => field_valid_language($langcode),
    'default' => TRUE,
  );

  // Append to the form
  ctools_include('fields');
  $field_instance = field_info_instance($entity_type, $field_name, $bundle);
  $form += (array) ctools_field_invoke_field($field_instance, 'form', $entity_type, $entity, $form, $form_state, $options);
}

이 기능은 많은 시간을 절약 해주었습니다.


5

ctools_field_invoke_field()방법을 사용하는 솔루션은 다음과 같습니다 . 사용자 정의 양식 기능에서 다음을 추가하십시오.

$form = array();
$node = new stdClass();
$node->type = 'blog';
my_field_attach_form('field_body', 'node', $node, $form, $form_state, LANGUAGE_NONE);

여기서 my_field_attach_form함수는 다음과 같이 정의된다

function my_field_attach_form($field_name, $entity_type, $entity, &$form, &$form_state, $langcode = NULL) {
  // Set #parents to 'top-level' if it doesn't exist.
  $form += array('#parents' => array());

  // If no language is provided use the default site language.
  $options = array(
    'language' => field_valid_language($langcode),
    'default' => TRUE,
  );
  module_load_include("inc","ctools","includes/fields");
  $form += (array) ctools_field_invoke_field($field_name, 'form', $entity_type, $entity, $form, $form_state, $options);
}

사이트에서 ctools를 활성화해야합니다. Drupal에 기본적으로 이와 같은 도우미 기능이 포함되어 있지 않은 것은 너무 나쁩니다.


2

나는 ctools 메소드를 작동시킬 수 없었고 대신이 방법을하기로 결정했습니다.

이 코드는 양식 함수 내에 있으므로 $ form 및 $ form_state가 이미 전달되었습니다.

function form_function($form, &$form_state) {

먼저 렌더링하려는 필드가있는 유형의 빈 노드를 만듭니다.

    $entity = new stdClass();
    $entity->title = "Temp Object";
    $entity->type = "node_type";
    node_object_prepare($entity);

원본 변수를 복제하지 않도록 양식 변수를 복제했습니다.

    $temp_form       = $form;
    $temp_form_state = $form_state;
    field_attach_form("node", $entity, $temp_form, $temp_form_state);

찾고있는 필드를 당겨서 양식에 추가하십시오.

    $form["field"] = $temp_form["existing_field"];
}

이 방법을 사용하여 분류 선택 위젯, 분류 확인란 위젯 및 계층 선택 위젯을 사용자 정의 양식 으로 렌더링했습니다 . (Taxonomy 자동 완성 위젯은 제출시 렌더링하지만 오류가 발생합니다)

마지막으로 렌더링 및 인쇄

drupal_render(drupal_get_form("form_function"))

이것은 사용자 정의 양식에서 필드 위젯을 사용하는 쉬운 방법 인 것 같습니다. 기존 번들에 따라 다릅니다. 필자의 경우 필자는 필 요에 따라 필드를 작성하고 구성하는 더미 컨텐츠 유형을 사용합니다. 그것은 약간 해 키지 만 다른 방법에도 필요합니다. 참고 사항 : ctools_field_invoke_field()위에서 설명한 방법도 작동합니다.
Bernhard Fürst

0

나는 indivisual 분야에서 양식을 사용하여 만들었습니다.

field_default_form('entity_type', $entity, $field,$field_instance,LANGUAGE_NONE,$default_value, $form, $form_state);

이것은 필요한 위젯 양식을 반환해야합니다.

 $custom_form['form_element_to_display'] = field_default_form('entity_type', $entity, $field,$field_instance,LANGUAGE_NONE,$default_value, $custom_form, $custom_form_state);

위의 2 매개 변수에 대한 값을 얻으려면 다음을 사용하십시오.

$field = field_info_field($field_name);
$field_instance = field_info_instance('node', $field_name, $node_type);

다른 매개 변수의 경우 여기 에서 API 링크를 확인할 수 있습니다

컨텐츠 유형 필드에 정의 된 기본 위젯 양식을 리턴합니다.

희망이 누군가에게 도움이되기를 바랍니다 :)

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