노드에서 "변경"


9
mysql> select nid, uid, created, changed from node;
+-----+-----+------------+------------+
| nid | uid | created    | changed    |
+-----+-----+------------+------------+
|   1 |   8 | 1336040166 | 1336046390 |
+-----+-----+------------+------------+

node테이블 에 "changed by"열을 갖고 싶습니다 . 정확히 "created by"(uid 필드)가 있습니다. 그러면 해당 노드에서 마지막으로 변경 한 사람을 추적합니다. 나는 이것이 node_revision테이블 에서 파생 될 수 있다는 것을 알고 있지만 이것은 내가 관심있는 콘텐츠 유형에 대해 활성화 된 개정판에 달려 있습니다.

그렇다면 가장 좋은 방법은 무엇입니까? Drupal 코어가 기본적으로 이것을 제공하지 않는 이유는 무엇입니까? "변경"은 CMS가 콘텐츠에 첨부해야하는 매우 표준적인 정보입니다.


2
개정을 사용할 수없는 이유가 있습니까? 필요한 것을 얻는 가장 쉬운 방법 인 것 같습니다. 아마 내가했을 것입니다. 사람들이 노드를 자주 편집하려는 경우 이전 버전의 백업이 있음을 의미합니다.
Chapabu

예, 저는 할수 있습니다. node그래도 메인 테이블 에 넣을 수 있는지 알고 싶습니다 . 더 간단 해 보입니다.
cherouvim

답변:


18

나는 이것이 매우 어려울 것이라고 생각했지만, 꽤 쉽다는 것이 밝혀졌습니다.

설치시 노드 테이블에 열을 추가하고 hook_schema_alter()Drupal이 새 열에 대해 알도록 구현 하고 노드를 저장하기 전에 값을 제공하는 논리를 추가 하는 사용자 정의 모듈 만 작성하면 됩니다.

트릭을 수행하는 작은 모듈이 있습니다.

파일 : node_table_alter.info

name = Node Table Alter
core = 7.x

파일 : node_table_alter.install

function node_table_alter_install() {
  // Add the new field to the node table
  $field = array(
    'description' => 'Stores the user id of the last user to alter the node',
    'type' => 'int',
    'unsigned' => TRUE
  );

  db_add_field('node', 'changed_by', $field);
}

파일 : node_table_alter.module

function node_table_alter_schema_alter(&$schema) {
  // Add the new field to the schema cache
  $schema['node']['fields']['changed_by'] = array(
    'description' => 'Stores the user id of the last user to alter the node',
    'type' => 'int',
    'unsigned' => TRUE
  );
}

function node_table_alter_node_presave($node) {
  // Populate the changed_by column with current user's id
  $node->changed_by = $GLOBALS['user']->uid;
}

설치 제거시 필드를 다시 제거하는 논리를 추가하고 changed_by열의 테이블에 색인을 추가 할 수 db_add_index()있지만 (참조 ) 시작하기에 좋은 장소가됩니다.

이 방법의 장점은 노드에 새 속성을 효과적으로 추가했다는 것입니다. 노드의 다른 표준 속성 인 것처럼 node_load(), EntityFieldQuerys 등 을 사용할 수 있습니다 .

신이 Drupal에게 그렇게 확장 될 수 있도록 축복 해주세요!


BTW 당신은 ​​정확히 같은 논리를 사용 하여 다른 질문 에 대답 할 수 있습니다 .
Clive

2
완전한 엔티티 통합 및 엔티티 API 모듈을 사용중인 경우이 새 특성에 대한 정보를 표시하기 위해 hook_entity_property_info ()를 구현해야합니다.
Pierre Buyle

@PierreBuyle 좋은 지적, 그 생각하지 않았다
Clive

1
이것이 바로 UUID 모듈의 기능입니다. 비슷한 것을보다 완벽하게 구현했는지 확인하십시오. drupal.org/project/uuid
paul-m

자세한 설명과 깨끗한 솔루션에 감사드립니다!
cherouvim

1

field_changed_by_user추적 해야하는 컨텐츠 유형에 엔티티 참조 필드 (호출 )를 추가 할 수 있다고 생각합니다 . 그런 다음 hook_node_presave사용자 ID를 다음과 같이 노드에 저장하는 데 사용할 수 있습니다 .

function hook_node_presave($node) {
  if ($node->nid && $node->type == 'content_type_to_track_changes_for') {
    global $user;
    $node->field_changed_by_user['und'][0]['target_id'] = $user->uid;
  }
}

규칙을 만들어서 사용자의 ID로 필드를 업데이트하는 것도 가능하다고 생각합니다. 자세한 내용은 여기를 참조 하십시오 .

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