기존 양식 변경


12

우리는 Drupal 8로 시작하여 첫 번째 문제에 매우 빨리 부딪 쳤습니다.

Drupal 8에서 기존 양식을 어떻게 변경해야합니까?

노드 양식이 다른 페이지로 경로 재 지정되도록 저장 방법을 변경해야합니다. 우리는 노드 형식을 다단계 형식과 같이 변경하려고합니다. 사용자가 새 콘텐츠를 만든 후에는 추가 정보를 얻기 위해 새 양식 (우리가 만든)으로 리디렉션됩니다.

우리는 구현 문제를 해결했다 hook_entity_type_alter().

function mymodule_entity_type_alter(&$entity_info) {
  $handlers = $entity_info['node']->get('handlers');
  $handlers['form']['default'] =    'Drupal\mymodule\Form\MyExtendedNodeForm';
  $handlers['form']['edit'] = 'Drupal\mymodule\Form\MyExtendedNodeForm';
  $entity_info['node']->set('handlers', $handlers);
}

그런 다음 노드 양식을 확장하고 save 메소드를 변경하는 새 양식 클래스를 작성했습니다.

class MyExtendedNodeForm extends NodeForm {

    public function save(array $form, FormStateInterface $form_state) {
      parent::save($form, $form_state);
      $node = $this->entity;
      $form_state->setRedirect('entity.regions.add_form', ['nid' => $node->id()]);
  }

}

이것은 완벽하게 작동하지만 좋은가요? 다른 모듈이 동일한 작업을 수행하면 코드가 더 이상 실행되지 않습니다.


2
Drupal 8은 여전히을 지원합니다 hook_form_alter(). 양식을 리디렉션해야하는 경우 리디렉션을 수행하는 양식 제출 핸들러를 추가하면 충분합니다.
kiamlaluno

@kiamlaluno 그것은 내가 생각하는 답변이어야합니다 :)
Berdir

@Berdir 그다지 도움이되지는 않을 것입니다. Drupal 8에 대한 나의 지식은 꽤 제한적입니다. 또한 OP는 " save()방법 변경 "이 실제로 의미 하는 바를 분명히해야 합니다. 데이터 저장 방식을 변경하거나 리디렉션 만하는 것을 의미합니까? 첫 번째 경우에는 답이 더 복잡합니다.
kiamlaluno

답은 @kiamlaluno Thx입니다. 이 경우 save () 다음에 리디렉션 만하면 답이 작동합니다. 그러나 나는 올바른 Drupal 8 방식으로 다른 것들을 변경하는 방법에 관심이있었습니다. 예를 들어 저장 방법을 변경하거나 양식에 필드를 추가하는 등.
Jens Steppe

답변:


4

어제 정확히 똑같은 일을해야했지만 여전히 더 Drupal 8 방법을 찾고 있지만 찾지 못했습니다. 나는 이런 식으로 끝내었다.

<?php

/**
 * @file
 * This is my module.
 */

use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\HttpFoundation\Request;

/**
 * Implements hook_form_alter().
 */
function MODULE_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
  if ($form_id == 'user_form') {
    $form['actions']['submit']['#submit'][] = '_MODULE_goto';
  }
}

/**
 * Make the form go to route.id.
 */
function _MODULE_goto($form, FormStateInterface $form_state) {
  $form_state->setRedirect('route.id');
}

나는 여전히 다른 방법으로 관심이 있으며 모듈은 .module 파일없이 깨끗하게 보입니다. :).


3

Drupal 8.1.1을 사용하고 있으며 사용자가 계정을 수정 한 후 (예 : / user / edit 페이지에서 저장 버튼을 클릭) 사용자를 리디렉션하려고했습니다. 나는 처음에 이것을 시도했다 :

/**
 * Implements hook_form_alter().
*/
function MODULE_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
  if ($form_id == 'user_form') {
    $form['#submit'][] = '_MODULE_goto';
  }
}

그게 효과가 있었지만 효과 user_login_form가 없었습니다 user_form. 들어 user_form내가 사용했다

$form['actions']['submit']['#submit'][] = '_MODULE_goto';

나는 그것이 같은 문제를 우연히 발견하는 다른 사람들을 도울 수 있기를 바랍니다!


1

글쎄, site_information_settings일부 필드를 추가 하기 위해 양식 을 변경하고 싶었습니다 .

당신과 같이

  • hook_form_alter(또는 hook_form_FORM_ID_alter)
  • 원래 양식 클래스를 확장

system.site_information_settings경로 _form속성을 변경하여 경로 가입자 서비스를 작성하기 시작하기 위해 OOP를 만들고 싶었습니다 .

그런 다음 SiteInformationForm필드를 확장하고 필드와 유효성 검사기를 추가하고 제출 기능을 확장 한 후 새 클래스 에서.

처음으로, 나는 두 가지 옵션 중 하나를 선택했습니다 ... 내가 잘못된 것을 골랐습니다.

hook_form_alter/ hook_form_FORM_ID_alter기존 양식을 변경하는 가장 좋은 방법 인 것 같습니다.


0

실제로 저장 방법을 변경하는 것이 아니라 노드가 저장 될 때 경로 재 지정을 변경하려는 것처럼 보입니다.

이 상황 hook_form_alter에서 양식 및 요구 사항에 따라 양식 또는 버튼의 사용자 지정 제출 처리기와 함께 Drupal 7과 같은 작업을 수행 하는 것이 좋습니다.

질문에 설명 한 내용도 효과가 있지만 실제로 클래스에서 무언가를 변경하고 싶지 않으면 기본 클래스를 덮어 쓰지 않습니다.

save 메소드는 방금 제출 핸들러로 사용되었으므로 경로 재 지정을 추가하기 위해 겹쳐 쓰는 것은 의미가 없습니다.


0

더 나은 방법은 form_alter 패밀리의 후크 중 하나를 사용하고 제출 핸들러를 첨부 한 다음 그 세트 내에서 리디렉션을 설정하는 것입니다.

이것을하기 위해 기본 수업을 연장하는 것은 제 생각에 털이 있습니다. 특히 기능이 변경되지 않기 때문에 리디렉션 만합니다.


0

당신은 같은 노드 양식을 제출하는 경우는 KernelEvents :: REQUEST 이벤트 수신 새로운 EventSubscriber을 만든 다음 반응 할 수

어쨌든 hook_form_alter 방식은 정상적으로 작동합니다.


0

내가 지금까지 찾은 것 : 양식 변경 후크 구현 및 양식 변경 후크 자체에서 유효성 검증 / 제출 핸들러를 변경하려고하면 $ form [ '# validate] / $ form [#submit'] 핸들러를 변경 한 경우에만 작동합니다. (이것에 대한 form_state 함수를 호출하면 alter hook 자체에서 작동하지 않습니다)

그러나 유효성 검사 핸들러 내 에서이 작업을 시도하면 작동하는 경향이 있습니다.

// Load form submit handlers.
$submit_handlers = $form_state->getSubmitHandlers();

// Drop the core entity submitForm function.
$key_core_submit = array_search('::submitForm', $submit_handlers);
if ($key_core_submit !== FALSE) {
  unset($submit_handlers[$key_core_submit]);
  // Add your own submit handler.
  array_unshift($submit_handlers, 'yourmodule_submit_handler');
}
// Update submit handlers.
$form_state->setSubmitHandlers($submit_handlers);

이는 alter hook 자체의 경우가 아니라 양식이 이제 완전히 구축 되었기 때문입니다.

아이디어는 유효성 검증 핸들러를 마지막으로 추가하고 제출에 존재하는 다른 핸들러를 평가 한 후 바로 변경할 수 있다는 것입니다.

유효성 검사 핸들러도 변경하려면 다른 것보다 먼저 실행하고 유효성 검사 핸들러에서 원하는 것을 변경하십시오.

여전히 더 나은 방법을 찾고 있다면 항상 사용자 등록 양식의 유효성 검사 / 제출 핸들러를 교체해야합니다. 그러나 모듈 구현을 중단시키는 다른 모듈이 존재할 수 있습니다. 그래서 내 모듈은 이것들을 확인할 수 있어야하며, 이것이 가능합니다. 빌드 기능 후 일부 엔티티 형식이 존재하는지 궁금합니다. (양식이 완성되어 전달 될 때 실행되는 것) (이 간단한 경우에는 복잡하지 않습니다)

save () 메소드의 경로 재 지정은 무시할 수 없지만 save () 설정을 해제하는 것은이 방법을 통해 이루어집니다 (+ 직접 구현). 사실 클래스는 더 좋고 객체에 쉽게 액세스 할 수 있지만 핵심 클래스를 재정의하면 실제로 다른 모듈에서 클래스 클래스를 사용하려고 할 때 문제가 발생합니다. 이 코드를 사용하는 경우에는 그렇지 않습니다.


0

이 문제를 확인한 후 이것이 귀하의 경우에 맞는 것으로 나타났습니다.

/**
 * Implements hook_entity_type_alter().
 */
function mymodule_entity_type_alter(&$entity_info) {
 $entity_info['node']->setFormClass('edit','Drupal\mymodule\Form\CustomNodeForm');
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.