it-swarm-ko.tech

텍스트 필드 포맷터가있는 사용자 정의 필드 위젯?

이미지 필드, 텍스트 필드 및 텍스트 영역 필드를 결합하는 Drupal 7에 복합 필드를 만들려고합니다.

이 작업을 성공적으로 수행했지만 이제 텍스트 영역에 텍스트 서식 옵션을 추가하려고하는데 작동하는 데 문제가 있습니다.

위젯의 textarea 필드를 text_format 필드로 변경하면 Drupal 해당 필드를 두 필드 valueformat (참조 : filter_process_format ), 이는 필드를 표시하는 노드가 저장 될 때 필드 값이 아닌 데이터베이스에 배열을 저장함을 의미합니다.

내 위젯은 다음과 같습니다.

/**
  * Implements hook_field_widget_form().
  */
function MYMODULE_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {

    $elements = image_field_widget_form($form, $form_state, $field, $instance, $langcode, $items, $delta, $element);

    foreach (element_children($elements) as $delta) {   
        foreach ($elements[$delta]['#process'] as $key => $process) {
            if($process == 'image_field_widget_process') {
                unset($elements[$delta]['#process'][$key]);
            }
        }   
      $elements[$delta]['#process'][] = 'MYMODULE_widget_process';  
    }

    return $elements;
}

/**
 * Element #process callback function.
 *
 * @param array $element
 * @param arrayreference $form_state
 * @param array $form
 * @return array
 */
function MYMODULE_widget_process($element, &$form_state, $form) {

    $element = @image_field_widget_process($element, $form_state, $form);

    $item = $element['#value'];
    $item['fid'] = $element['fid']['#value'];

  $instance = field_widget_instance($element, $form_state);

    $settings = $instance['settings'];
    $widget_settings = $instance['widget']['settings'];  

    $element['title'] = array(
        '#type' => 'textfield',
        '#title' => 'Title',
        '#default_value' => isset($item['title']) ? $item['title'] : '',
    );

    $element['text'] = array(
        '#type' => 'textarea',
        '#title' => 'Text',
        '#default_value' => isset($item['text']) ? $item['text'] : '',
    );  

    if($instance['settings']['text_processing']) {
      $element['text']['#type'] = 'text_format';
      $element['text']['#format'] = isset($item['format']) ? $item['format'] : NULL;
      $element['text']['#base_type'] = 'textarea';
    }

    return $element;
}

데이터베이스의 필드 값은 사용자가 입력 한 문자열이 아니라 "Array"입니다. 필드가 일반 텍스트 영역으로 설정되면 필드 값이 올바르게 저장됩니다.

나는 이것이 위젯의 ​​구조와 관련이 있다고 생각하지만 그것을 해결할 수 없으며 문서가 존재하지 않습니다.

2
Camsoft

최근에 plupload를 통해 여러 업로드를 처리 할 수 ​​있어야하는 파일 필드 용 위젯을 만들어야했습니다.

어쨌든 모든 것이 작동하도록하는 과정에서 양식 항목에 넣을 수있는 #value_callback 속성을 발견했습니다. 제출 된 데이터의 데이터와 파일의 fid와 같은 추가 정보를 변경할 수 있습니다.

이것은 아직 문서화되지 않았지만 파일 모듈에서 사용되는 것을 살펴볼 수 있습니다. Drupal 이슈 트래커에 대한 issue 가 있지만 아직 문서 예제로 좋은 패치가 생성되지 않았습니다.

이것이 #value_callback의 사용에 좋은 경우인지 확실하지 않지만,이 경우에 유용 할 것 같습니다.

2
googletorp