form alter에서 새로 작성 노드와 편집 노드의 차이점


24

특정 콘텐츠 유형에 대한 대체 섹션이 있습니다. 양식 변경에서 새 양식을 작성 하는지 또는 양식을 편집 하는지 어떻게 알 수 있습니까?

alter에서 dsm ($ form)을 사용하면 몇 가지 차이점이있는 결과를 얻을 수 있습니다. 서로 구별하는 가장 좋은 방법은 무엇입니까?

이것이 좋은 방법입니까?

    if(isset($form['nid']['#value']))
     'means in edit form'
    else 
     'means in create new from'

답변:


61

당신의 코드를 보면 node_object_prepare () 에서 호출, node_form () (노드 편집에 대한 양식 빌더 / 양식을 만들), 당신은 다음과 같은 코드가 포함되어 표시됩니다

  // If this is a new node, fill in the default values.
  if (!isset($node->nid) || isset($node->is_new)) {
    foreach (array('status', 'promote', 'sticky') as $key) {
      // Multistep node forms might have filled in something already.
      if (!isset($node->$key)) {
        $node->$key = (int) in_array($key, $node_options);
      }
    }
    global $user;
    $node->uid = $user->uid;
    $node->created = REQUEST_TIME;
  }

hook_form_BASE_FORM_ID_alter () 의 구현 에서 다음 코드와 유사한 코드를 사용하면 충분합니다.

function mymodule_form_node_form_alter(&$form, &$form_state) {
  $node = $form_state['node'];

  if (!isset($node->nid) || isset($node->is_new)) {
    // This is a new node.
  }
  else {
    // This is not a new node.
  }
}

노드가 새 노드 인 경우 양식이 노드를 작성 중입니다. 노드가 새 노드가 아닌 경우 양식이 기존 노드를 편집 중입니다.

Drupal 8에서 모든 클래스 구현 EntityInterface( Node클래스 포함 )은 EntityInterface::isNew()메소드를 구현합니다 . 새로운 노드인지 확인하는 것은 호출하는 것만 큼 쉬워집니다 $node->isNew(). Drupal 8에는 $form_state['node']더 이상 존재하지 않으므로 코드는 다음과 같습니다.

function mymodule_form_node_form_alter(&$form, &$form_state) {
  $node = $form_state->getFormObject()->getEntity();

  if ($node->isNew()) {
    // This is a new node.
  }
  else {
    // This is not a new node.
  }
}

두 조건이 모두 필요한 이유는 무엇입니까?
digitgopher

새 노드의 노드 ID를 설정하는 모듈이있을 수 있으므로 추측합니다.
kiamlaluno

!empty($node->is_new)로 설정된 경우 isset($node->is_new)반환 값 으로 사용 하는 것이 좋습니다 . TRUEFALSE
bloke_zero

@bloke_zero Drupal이로 설정 될 것으로 예상하지 않습니다 FALSE. 실제로 설정 FALSE을 해제하는 대신 불량 모듈을 설정 한 경우 코드를 적절하게 변경하는 것이 좋습니다.
kiamlaluno


4
/**
 * Implementation of hook_form_alter().
 */
function MY_MODULE_form_alter(&$form, $form_state, $form_id) {
  if ($form['#node'] && $form['#node']->type .'_node_form' === $form_id) {
    // Is node form.

    if ($form['#node']->nid) {
      // Is node edit form.
    }
  }
}

1

Drupal 8 에서는 form_id변수 가 필요하며 각 경우마다 달라지며 _edit_노드를 편집하는 경우 변수가 포함됩니다

function MODULENAME_form_alter(&$form, &$form_state, $form_id) { 
    if($form_id == '"node_article_edit_form"'){
        //edit form
    }
    if($form_id == 'node_article_form') {
        //create form
    }
}

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