CTools 컨텐츠 유형 플러그인에서 AJAX 호출?


10

CTools 패널 컨텐츠 유형 (즉, 노드 유형이 아닌 컨텐츠를 추가 할 때 패널에 삽입하는 것)을 작성 중이며 양식 항목의 #ajax속성을 사용하여 일부 기본값을 설정 하려고 합니다. 아래 코드를 참조하십시오.

그건 my_module_content_type_edit_form($form, &$form_state)그렇고 콘텐츠 유형의 호출 내부에 있습니다.

  $form['link_type'] = array(
    '#type' => 'radios',
    '#title' => t('Link Type'),
    '#ajax' => array(
      'callback' => 'my_module_set_target'
    ),
    '#default_value' => empty($conf['link_type']) ? '_blank' : $conf['link_type'],
    '#options' => array('none'=>t('No Link'), 'internal'=>t('Internal Link'), 'external'=>t('External Link'), 'document'=>t('Document Link')),
  );

내 콜백은 다음과 같습니다.

function my_module_set_target($form, $form_state) {
  watchdog("Test", "Testing callback", array(), WATCHDOG_ALERT);
  $form['link_target']['#default_value'] = '_parent';

  return $form['link_target']['#default_value'];
}

내가 제안하는 수익이 실제로 효과가 있는지 여부에 관계없이 작동 watchdog()하지 않습니다.

CTools가 AJAX로 이상한 일을한다는 것을 알고 있지만 그렇게 이상 할 수는 없습니다. 내가하고 싶은 일을 어떻게하는지에 대한 아이디어가 있습니까?

감사!

또는 이전 양식 옵션의 값을 기반으로 기본값을 설정하는 방법은 무엇입니까?

이 작업을 수행하는 방법을 찾았지만 약간 해킹 적입니다. 각 종속성 포크마다 새 양식 필드를 만듭니다. 그런 다음 hook_content_type_edit_form_submit()처음에 모든 항목을 분기 한 구성 요소에 대해 선택된 값을 사용하여 값을에 병합 할 수 있습니다 .

나는 (그리고 솔직히, 내가 일하는 모든 프로그래머가)이 패널 내용 유형 편집 양식 내에서 AJAX를 사용하는 좋은 방법을 정말로 원하기 때문에 질문을 열어두고 있습니다.

업데이트 : #attached로도 할 수없는 것처럼 보입니다.

$form['link'][$i] = array(
  '#type' => 'fieldset',
  '#title' => t('Link #@num', array('@num' => $i)),
  '#collapsible' => TRUE,
  '#collapsed' => TRUE,
  '#attached' => array(
    'js' => array(
      'alert("Yay.");', 'inline'
    ),
  )
);

Drupal 개발자의 "모든 것을위한 패널"유형이기 때문에 앞으로이 기능을 사용할 수있을 것이라고 생각합니다.
Letharion

와우, 그 현상금은 아무런 언급없이왔다 갔다. 내가 요구하는 것이 불가능하거나 무엇입니까?
aendrew

가치 나는 성공적으로 자바 스크립트를 사용하여 추가 할 수있었습니다 것을주의해야한다 ctools_add_js();또는 drupal_add_js();의 끝에서 hook_content_type_edit_form();. 간단한 UI 관련 작업을 수행하는 경우 가장 좋은 전화 일 것 같습니다 (적어도 누군가 가이 질문에 올바르게 대답 할 때까지).
aendrew

답변:


8

짧은 대답 : #ajax [ 'path']를 사용해야합니다.

긴 대답 :

ctools가 ajax 콜백을 갖는 것은 도움이되지 않습니다. system / ajax에 의해 수행 된 콜백은 완전한 양식 정의를 찾을 수 없으므로 ajax 요청을 처리 할 요소를 찾을 수 없습니다. #ajax [path]를 사용하면 메뉴 항목이 트리거됩니다.

#ajax [callback]을 사용할 때 양식을 덤프하여 스스로 확인할 수 있습니다.

function ajax_form_callback() {
  list($form, $form_state) = ajax_get_form();
  drupal_process_form($form['#form_id'], $form, $form_state);

사용자 자동 완성 위젯과 두 가지 작동하는 필드를 추가하여 simplecontext_content_type_edit_form을 수정했습니다. :)

function simplecontext_content_type_edit_form($form, &$form_state) {
  $conf = $form_state['conf'];

  $form['owner_name'] = array(
    '#type' => 'textfield',
    '#title' => t('Username'),
    '#default_value' => 'admin',
    '#autocomplete_path' => 'user/autocomplete',
    '#size' => '6',
    '#maxlength' => '60',
    '#description' => '$description',
  );

  $form['link_type'] = array(
    '#type' => 'radios',
    '#title' => t('Link Type'),
    '#ajax' => array(
      'path' => 'my_module_set_target'
    ),
    '#default_value' => empty($conf['link_type']) ? '_blank' : $conf['link_type'],
    '#options' => array('none' => t('No Link'), 'internal' => t('Internal Link'), 'external' => t('External Link'), 'document' => t('Document Link')),
  );
...

이제 #ajax 경로를 사용함에 따라 원하는대로 메뉴 항목을 추가해야합니다

<?php

function my_module_menu() {
  $items = array(
    'my_module_set_target' => array(
      'title' => 'AJAX Example',
      'page callback' => 'my_module_set_target',
      'access callback' => TRUE,
      'expanded' => TRUE,
    )
  );
  return $items;
}

function my_module_set_target() {
  drupal_json_output( array('data' => "ABC"));
}

#attached [js]에 대한 힌트 : 인라인 js는 다음과 같이 key => 값이어야합니다.

'#attached' => array(
  'js' => array(
    'alert("Yay.");' => 'inline',
  ),
),

Firebug를 사용하여 결과 효과가 아닌 결과 값을 확인했습니다. 따라서 이것이 문제를 해결하는 데 도움이되기를 바랍니다.


와. 나는이 질문에 대한 답을 마침내 얻었습니다. 조금 시도해 볼 것입니다. #attached 비트에 대한 메모에 감사드립니다. 실제로 내가 처음에했던 것입니다 (그러나 그것이 옳지 않을 것이라고 생각했기 때문에 변경했습니다).
aendrew

그래서 어떤 성공? 현상금이 끝나기 전에 알아야 할 재미있을 것입니다 :)
Letharion

나는 내 현상금을 얻을 수 있기를 바랍니다 : P
Clemens Tolboom

지연되어 죄송합니다. 작동하는 데 약간의 시간이 걸립니다. $ form 배열을 반환하려고하면 유효성 검사 함수가 정의되어 있지 않습니다. 그것은 (콘텐츠 유형 플러그인 파일이 아닌) 내 모듈에서 다시 선언하려고하면 다시 선언한다고 알려줍니다. 나는 그것이 내가해야 할 일이 아니라고 추측하지만 drupal_json_output을 구성하는 방법을 알 수 없으므로 내 양식이 의미있는 응답으로 해석 할 무언가를 출력합니다. 어떤 도움? 더 나은 콜백 예제는 LOT에 도움이 될 것입니다. 감사!
aendrew

귀하의 질문에서 반환 값에 관한 작은 부분을 놓쳤습니다. return $ form [ 'link_target'] [ '# default_value']; 드루팔 양식을 html / javascript 컨텍스트 로 반환하려고합니다 . 작동하지 않습니다. 패널 UI에서 원하는 것과 비슷한 것을 보셨습니까? (엄청나게 많은 시간 ... 어색한 편집이 댓글)을 (나 자신은 비활성화 자바 스크립트는 이제 다음 뷰와 UI는 비 JS 워크 플로우 볼 수)
클레멘스 Tolboom

2

비슷한 문제가있어 미디어 요소 유형을 CTools 컨텐츠 유형 플러그인에 포함시키고 싶었습니다.이 도구는 이미지 선택에 ajax를 사용합니다.

'콜백'설정 대신 자체 아약스 '경로'설정을 사용하지만 이미지를 선택할 때 미디어 요소없이 양식이 다시 작성되었습니다.

drupal_rebuild_form이 CTools 양식 랩퍼 기능이나 실제 설정 양식 기능을 찾을 수 없다는 사실을 추적했습니다. 그래서 ctools 설정 양식에 다음 코드 줄을 추가하여 수정했습니다.

function custom_module_my_content_plugin_content_type_edit_form($form, &$form_state) {

$background_image = isset($conf['background_image']) ? $conf['background_image'] : array();
  $form['background_image'] = array(
    '#title' => t('Background image'),
    '#default_value' => $background_image,
    '#type' => 'media',
    '#input' => TRUE,
    '#extended' => TRUE,
    '#tree' => TRUE,
    '#media_options' => array(),
  );

  // The two function calls below are necessary if we want to use a media
  // element type, because it causes ajax requests, which in turn call
  // drupal_form_rebuild(), and without the below includes, Drupal will
  // not be able to rebuild the form.

  // Include the CTools content type plugin file, because it provides
  // the ctools_content_configure_form_defaults() function, which is needed
  // when rebuilding the form, because of an ajax action, like selecting
  // a media element.
  ctools_form_include($form_state, 'content');

  // Include this plugin file as well, so that when the form is rebuilt, it
  // can successfully retrieve the settings form.
  ctools_form_include($form_state, 'my_content_plugin', 'custom_module', 'plugins/content_types/my_content_plugin');

}

어쩌면 포함 파일이로드되지 않은 이유가 누락되었지만 수동으로 문제를 해결했습니다.


0

내 쪽에서는 .module 파일에 양식 래퍼 함수를 ​​작성하고 다음과 같이 창을 수동으로 포함해야합니다 (원본 양식 내용이 정의 된 위치).

function mymodule_form($form, &$form_state) {
  // include mymodule/panes/mypane.inc
  ctools_include('mypane', 'mymodule', 'panes');
  return mymodule_form_content($form, $form_state);
}

이제 Ajax 호출 중에 Drupal은 내 양식을 검색 할 수 있으므로 표준 AJAX 양식 API를 사용할 수 있습니다.

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