it-swarm-ko.tech

동적으로로드 된 AJAX 양식을 통해 복잡한 엔티티를 어떻게 편집합니까?

"교육"필드가있는 "프로필"엔터티가 있습니다 (시작하기 위해). 이 필드에는 "교육"을 설명하는 다양한 입력 필드가 있습니다. 지금은 "기관"과 "연도"가 있습니다. 전용 모듈에서 Field API를 사용하여 해당 필드를 만들고 "프로필"엔터티 (현재는 profile2 번들)에 연결했습니다. 엔터티 양식이 예상대로 작동하고 "교육"필드 위젯이 포함되어 있으며 여러 "교육"항목을 추가 할 수 있습니다. 엔터티를 볼 수 있고 필드의 형식이 지정되고 엔터티를 편집 할 수 있으며 양식 위젯이 렌더링됩니다.

--profile entity
----education field
------education a
--------institution a
--------year a
------education b
--------institution b
--------year b

그러나 나는 여기에 모든 또는 아무것도 접근하는 것을 좋아하지 않습니다. 다양한 필드가있을 것이며 AJAX를 통해 지정된 필드 양식 위젯을로드해야하는 다양한 "편집"및 "새 항목 추가"버튼이있는 "프로필"엔티티를 표시하고 싶습니다. xing.com의 프로필 페이지는 제가 이루고자하는 일의 좋은 예입니다.

필드 양식 위젯과 필드 API만으로 가능합니까, 아니면 필요한 입력 필드가있는 양식을 반환하는 메뉴 후크를 통해 ajax 콜백을 구현해야합니까? 해당 시나리오에서 내 "교육"필드를 사용할 수도 있습니까? 아니면 엔티티 API 및 데이터베이스 API로 작업해야합니까?

3
Thomas Schuster

FieldAPI가 자동으로 구축 할 수있는 양식은 유용하지만 매우 유연하지는 않습니다. 정말 동적 인 양식을 작성하는 데 관심이 있다면 처음부터 직접 만들고 완성 된 양식이 제출 된 후 프로그래밍 방식으로 엔터티를 생성/저장하는 것이 좋습니다.

1
Eaton

예제 모듈을 보셨습니까? FormAPI를 사용하는 Ajax 양식에 대한 샘플 코드가 있습니다.

0
antgiant

등록에 사용되는 profile2 양식에서 ajax로 계층 구조 선택을 성공적으로 수행했습니다.

// implementation of hook_form_FORM_ID_alter()    
function impact_registration_form_profile2_edit_library_registration_form_alter(&$form, &$form_state) {
$form['profile_library_registration']['field_library_reg_state']['und']['#options'] = _impact_registration_library_states();
$form['profile_library_registration']['field_library_reg_state']['und']['#ajax'] = array(
                          'callback' => 'impact_registration_state_change_callback',
                          'wrapper' => 'name-select',
                        );
        $selected = isset($form_state['values']['profile_library_registration']['field_library_reg_state']['und'][0]['value']) ? $form_state['values']['profile_library_registration']['field_library_reg_state']['und'][0]['value'] : '';
    $form['profile_library_registration']['field_library_reg_system']['und']['#options'] = _impact_registration_library_names($selected);
    $form['profile_library_registration']['field_library_reg_system']['und']['#prefix'] = "<div id='name-select'>";
    $form['profile_library_registration']['field_library_reg_system']['und']['#suffix'] = "</div>";
        }
    function impact_registration_state_change_callback(&$form, $form_state) {
    return $form['profile_library_registration']['field_library_reg_system']['und'];
            }

field_library_reg_state를 선택하면 AJAX는 field_library_reg_systemfield_library_reg_state 값을 기반으로하는 기본값으로 $form_state를 반환합니다. . 이것은 모두 ajax 예제에서 수정되었습니다. 이제 저에게 효과가없는 것은 field_library_reg_system에 추가 ajax 호출을 추가하여 텍스트 상자를 미리 채우는 것입니다.이 작업에 대한 문서는 존재하지 않습니다. , 프로필 2 및 엔티티 양식이 드루팔의 일반 양식과 어떻게 다르게 작동하는지 이해하지 못합니다. 래퍼 및 콜백을 대상으로하는 배열 요소는 무엇입니까?

0
mortona42