다른 필드를 기반으로 필드 자동 완성


10

조언이 필요한 매우 복잡한 상황이 있습니다. my_content필드 형식 필드가 첨부 된 콘텐츠 형식 이 있는데이 필드 field_mycollection에는 사용자를 참조하는 엔터티 참조 필드 field_my_userreference, 전화 필드 field_my_phone, 텍스트 필드 field_my_text및 다른 텍스트 필드가 field_my_anothertext있습니다.

My Content
|_ field_mycollection
   |_ field_my_userreference
   |_ field_my_phone
   |_ field_my_text
   |_ field_my_anothertext

사용자 엔티티는 또한 필드가있다 field_my_phone, field_my_text그리고 field_my_yetanothertext어떤 후자는 다른 컴퓨터 이름을 갖는다.

내가있는 경우 수행 할 작업 my_content에, / 편집 양식을 추가 field_my_userreference사용자가 선택, 다른 필드는 자동으로 채워 선택한 사용자의 데이터에서해야한다. 자동으로 채워진 필드는 여전히 편집 가능해야합니다.

이 목표를 어떻게 달성 할 수 있습니까? 가능한 경우 코드를 사용하여을 사용하여 수행하고 싶습니다 hook_form_FORM_ID_alter().


실시간으로 또는 저장하기 위해 필요합니까?
Mołot

양식에 따라 생활하십시오. 나는 이미 저장했을 때 데이터가 비어 있으면 사용자 엔티티에서 가져 오도록 구현했습니다. 그러나 실제로 나는 그것을 양식에 필요합니다 :(
Елин Й.

좋아, 내 대답을 제기했다.
Mołot

답변:


11

실시간으로 발생하고 모든 필드가 이미 양식에있는 경우 양식 hook_form_FORM_ID_alter()에 다음을 추가 하는 가장 안전한 방법입니다 .

$form['#attached']['js'] = array(
  drupal_get_path('module', 'module_name') . '/js/copy_field_value.js',
);

그런 다음 copy_field_value.js동작 을 만듭니다.

(function($) {
  Drupal.behaviors.moduleNameCopyFieldValue = {
    attach: function (context, settings) {

      // Repeat this for all fields as needed
      $('#source', context).on('blur', function () { 
        // above you can use change instead of blur if element is not changed by another js
        if (!$('#destination').val() || 0 === $('#destination').val().length) {
          $('#destination').val($(this).val());
          // wrap line above in "if no value" like I did, or other condition you like
        }
      });
      // end of "repeat this"
    }
  };
})(jQuery);

소스 필드 hook_form_FORM_ID_alter()#ajax매개 변수 를 추가 하는 데 사용할 수도 있지만 각 필드 사본에서 서버를 호출하는 양식이 작성됩니다. 실제로 데이터베이스를 쿼리해야하는 경우 갈 수있는 방법입니다. 여기에 새로 설명하는 것은 꽤 광범위합니다. 사용자가 $form_state["input"]본 실제 값을 업데이트 하려면 배열 을 변경해야합니다 . isset통지를 피하기 위해 양식 작성 기능으로 랩핑하십시오 .

양식 요소 인 경우 $form["something"]["something"]["element"], 그 값은에있을 것입니다 $form_state["input"]["something"]["something"]["element"]- 당신은 그것을 설정할 수 있습니다 hook_form_alter단지 모두 취할 기억, 모든 권리 $form$form_state참조한다.

참고 : .on()메소드는 jQuery 1.7에 추가되었으므로이 답변을 직접 사용 하거나 코드를 사용 또는 메소드 로 변환 하려면 jQuery 업데이트 가 필요합니다 ..change().blur()


지침에 감사드립니다! Drupal의 JS API에 익숙하지 않습니다. 사용자 엔터티에서 필드 값을 얻는 방법을 설명 하시겠습니까? 예를 들어, 사용자를 선택한 경우이 사용자 정보로 다음 필드를 채우려면 어떻게해야합니까?
Елин Й.

1
@ ЕлинЙ. 여기서 트릭은 PHP 배경에 신경 쓰지 않는 것입니다. <input>즐겨 찾는 브라우저에 Firebug 또는 유사한 도구를 사용하여 태그의 ID 매개 변수를 식별 하십시오. 또는 다른 jQuery 선택기를 사용하십시오. 브라우저에서만 발생하므로 화면에 표시되는 내용이 있습니다. 반면에 실제로 데이터베이스를 쿼리 해야하는 경우 (필자가없는 것처럼 보입니다) #ajax가는 길입니다. 그러나 그것은 꽤 광범위 할 것입니다. 사용자가 $form_state["values"]본 실제 값을 업데이트 하려면 배열 을 변경해야합니다 . isset통지를 피하기 위해 양식 작성 기능으로 랩핑하십시오 .
Mołot

@ Mołot에게 다시 한번 감사드립니다. 내일 또는 오늘 저녁에 구현하려고 노력할 것입니다. 더 이상은 아니지만 실제로 작동하려면 몇 시간이 걸릴 것 같습니다.
Елин Й.

@ ЕлинЙ. 행운을 빌어, 더 많은 질문으로 돌아와서 연결되어 있으면 의견으로 연결하십시오. 조금 업데이트 된 btw.
Mołot

1
좋아, 나는 그것을 조금 실험하고 내 경험을 쓸 것이다.
Елин Й.

4

계산 된 필드 모듈을 사용하여 수행 할 수 있습니다.

컴퓨팅 필드는 컨텐츠 유형에 사용자 정의 "계산 된 필드"를 추가 할 수있는 매우 강력한 CCK 필드 모듈입니다. 이 계산 된 필드는 PHP 코드를 통해 정의한 값으로 채워집니다. 다른 필드, 현재 사용자, 데이터베이스 테이블 등 Drupal에서 사용 가능한 모든 것을 그릴 수 있습니다. (출력을 아직 느끼지 않습니까? :)) 계산 된 필드 값을 다른 컨텐츠 필드와 함께 데이터베이스에 저장할지 또는 노드보기 중에 "계산"할 것인지를 선택할 수도 있습니다. 뷰 사용에는 데이터베이스 저장 값이 필요하다는 점에 유의해야합니다.이 필드는 말 그대로 CCK 필드의 스위스 군용 칼입니다. 따라서 PHP 기반 값을 요리하십시오!


빠른 답변 감사합니다. 매우 유망한 소리. 비록 모듈을 설치하고 싶지는 않지만 코드를 작성하면됩니다. 왜냐하면 해당 형식의 기능 만 필요하고 실제 시스템이 이미 너무 커서 다양한 기능을 위해 많은 모듈이 설치되어 있기 때문입니다.
Елин Й.

둘째,이 모듈을 사용하여 노드를 작성하거나 편집하는 사용자가 자동으로 채워진 필드를 수동으로 대체하고 저장할 수 있습니까? 따라서 사용자 엔티티와 my_content에는 다른 값이 저장됩니다.
Елин Й.

설정 방법에 따라 다릅니다.
4life

@ 4life 덕분에 Mołot의 지침을 사용하여 코딩으로 달성 할 수 없다면 시도해 볼 것입니다.
Елин Й.

2

@ Mołot의 큰 도움 덕분에 어떻게 달성했는지 게시하고 싶습니다.

  1. hook_form_FORM_ID_alter ()를 구현했습니다 .
  2. 필드 콜렉션 주위에 랩핑 div를 추가했습니다.
  3. 내 필드 콜렉션은 다중 값 필드이므로 반복 #ajax하여 필드 의 특성을 설정하십시오 field_my_userreference.
  4. 단순히 필드 콜렉션 항목을 리턴하는 콜백 함수를 작성했습니다.
  5. 필드 콜렉션에 대한 $ form_state가 설정된 경우 hook_form_FORM_ID_alter () 구현에서 확인되었습니다. 그렇다면 사용자 엔티티에서 값을 가져 와서 양식 입력 필드를 해당 값으로 채우십시오.

내 코드는 다음과 같습니다

function MYMODULE_form_my_content_node_form_alter(&$form, &$form_state, $form_id) {
  $form['field_mycollection']['#prefix'] = '<div id="mycollection-wrapper">';
  $form['field_mycollection']['#suffix'] = '</div>';
  foreach ($form['field_mycollection']['und'] as $key => $fc_mycollection) {
    if (is_numeric($key)) {
      $form['field_mycollection']['und'][$key]['field_my_userreference']['und']['#ajax'] = array(
        'callback' => 'MYMODULE_mycollection_callback',
        'wrapper' => 'mycollection-wrapper',
      );
      if (isset($form_state['values']['field_mycollection']['und'][$key]['field_my_userreference']['und'][0]['target_id'])) {
        $user_wrapper = entity_metadata_wrapper('user', $form_state['values']['field_mycollection']['und'][$key]['field_my_userreference']['und'][0]['target_id']);
        $form_state['input']['field_mycollection']['und'][$key]['field_my_text']['und'][0]['value'] = $user_wrapper->field_my_text->value() ? $user_wrapper->field_my_text->value() : '';
        $form_state['input']['field_mycollection']['und'][$key]['field_my_anothertext']['und'][0]['value'] = $user_wrapper->field_my_text->value() ? $user_wrapper->field_my_yetanothertext->value() : '';
      }
    }
  }
}

function MYMODULE_mycollection_callback($form, &$form_state) {
  return $form['field_mycollection'];
}

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