3000 개 이상의 노드에 대한 입력 형식 변경


18

입력 형식을 변경 해야하는 많은 노드가 있습니다. 손으로 직접 할 수는 있지만 2014 년 크리스마스 전에는 완료되지 않습니다.

Drupal은 해당 정보를 어디에 저장합니까? SQL 쿼리를 사용하여 입력 형식을 순식간에 변경하려면 어떻게해야합니까?

답변:


20

이 en-masse를 수행하면 특히 형식을보다 관대 한 필터 세트로 변경하는 경우 잠재적 인 보안 위험이 발생한다고 말하면서이 답변의 서문을 작성하려고합니다. 텍스트 형식은 저장 중에가 아니라 표시 중에 필드 출력을 수정합니다. 예를 들어, 실수로 또는 의도적으로 필터를 전체 HTML 또는 PHP 코드로 설정하면 필드에서 제출 된 이전에 이스케이프 된 HTML 또는 PHP가 렌더링 / 실행됩니다.

이런 이유로 Drupal은 텍스트 형식을 변경할 때 기존의 모든 노드를 자동으로 업데이트하지 않습니다. 비슷한 시나리오에서 텍스트 형식의 동작은 여전히 미해결 문제 입니다.

다시 한번 , 용이 있다는 것을 명심하십시오.

이를 통해 각 필드는 텍스트를이라는 열로 저장합니다 field_foo_format. 여기서 field_foo필드의 시스템 이름입니다. 테이블에서 field_revision_field_foo및 해당 열을 업데이트해야합니다 field_data_field_foo.

열의 값 formatfilter_format테이블 에서 열로 정의 된 시스템 이름 입니다. 따라서 모든 필드를 업데이트하는 것은 다음과 같은 쿼리 문제입니다.

UPDATE field_revision_foo SET field_foo_format = 'new_format';
UPDATE field_data_foo SET field_foo_format = 'new_format';

변경이 필요한 각 필드에 대해

new_format여기서 값 을 결정할 수 있습니다 . http://YOURSITE.com/admin/config/content/formats- 링크 구성 -URL의 숫자 또는 문자열은 new_format.업데이트 후 캐시 지우기입니다.


1
좋은 대답입니다. 또한 field_cache_clear();변경 field_data_...field_revision_...테이블 변경 후 수행해야합니다
milkovsky

4

특정 유형의 모든 노드에 대해 루프를 작성하여이 방법을 시도하십시오.

$node = node_load(nid);
$node->body[$node->language][0]['format'] = 'full_html'; // plain_text
node_save($node);

1

Morten이 여기에서했던 것과 같은 상황에 빠졌고, 입력 형식을 끝내지 않은 D6 => D7 업그레이드를 사용했습니다.

이미 여기에있는 답변보다 더 조잡한 접근 방식을 취하고 DB 스키마를 실행하고 문자열 'format'을 포함하는 모든 열을 업데이트하여 D6 형식 값 (1, 2, 3)을 D7 컴퓨터 이름 ( filtered_html, full_html, plain_text).

https://gist.github.com/xurizaemon/9824872

매핑을 지원하도록 하드 코딩

1 => filtered_html, 
2 => full_html,
3 => plain_text,

또한 'format'이라는 이름의 필드를 다시 쓰려고 할 수 있습니다 (예 : "date_format", 값이 '2'인 날짜 형식이 있으면 문제가됩니다).


1

나를 위해 다음이 효과가있었습니다.

update `field_revision_body` set `body_format` = 'new_body_forma' WHERE `bundle` = 'node_type'
update `field_data_body` set `body_format` = 'new_body_forma' WHERE `bundle` = 'node_type'

물론 new_body_forma와 node_type을 변경해야합니다


이것은 매력처럼 작동했지만 효과를 보려면 캐시를 지워야했습니다. 감사합니다.
shasi kanth

0

entity.module이 설치되어 있으면 다음 코드를 사용할 수 있습니다.

// I'm using node_save($node); 
$wrapper = entity_metadata_wrapper('node', $node->nid); 
$wrapper->body->set(array('value' => body_text, 'format'=>'full_html'));

0

아마도 어떤 필드를 업데이트해야하는지 알고 싶을 것입니다. 이렇게하려면 열이 포함 된 모든 테이블 및 열 이름을 가져옵니다 _format.

select distinct TABLE_NAME, column_name
from information_schema.columns
where TABLE_SCHEMA = 'my_drupal_database_name' and column_name like '%_format';

이 데이터로 무장하면 해당 값과 별도의 쿼리를 작성할 수 있습니다. 먼저 출력을 확인하십시오. 내용 / 개정과 관련이없는 일부 항목을 제거해야 할 수도 있습니다. 정규식 가능 편집기를 사용하여 쿼리를 작성하는 것이 좋습니다. 데이터를 큰 select [...] union문으로 바꾼 다음 업데이트 쿼리를 실행했습니다.

이 접근 방식을 사용하면 수천 개의 노드 / 개정을 업데이트해야 할 때 상당한 시간이 절약되었습니다. 필드 캐시를 지워야합니다 ( drush cc all!

field_cache_clear();

또는 돌진으로 :

drush sqlq "truncate table cache_field;"

텍스트 필터도 제거

텍스트 필터도 폐기하는 경우 나중에 사용한 필드가있는 CT의 기본 텍스트 형식을 변경해야합니다. 이 작업을 수행하지 않으면 사용자는를 사용한 필드 내에서 권한 거부 메시지를 받게됩니다 old_format. 범인을 찾기 위해이 쿼리를 수행했습니다.

select * from field_config_instance where `data` LIKE '%old_format%';

변경 사항을 확인하기 위해 인터페이스를 사용하여 각 필드 설정 페이지를 방문하고 저장을 누릅니다 (데이터는 longblob으로 저장되며 더 나은 형식의 모듈 데이터 주입으로 인해 검색 및 교체하기가 까다로 웠습니다). 텍스트 처리가 설정된 필드조차도 Plain textold_format 을 포함했습니다! 텍스트 처리가로 설정된 필드의 Filtered text (user selects text format)경우 새 기본값을 선택하고 저장을 눌러야합니다.

필터를 제거한 후 필터 캐시를 지우십시오 (다시, drush cc all!로 표시 되지 않음 ).

cache_clear_all('*', 'cache_filter', TRUE);

또는 돌진으로 :

drush sqlq "truncate table cache_filter;"

0
update field_revision_body set body_format = 'full_html' WHERE bundle IN ('book','page');
update field_data_body set body_format = 'full_html' WHERE bundle IN ('book','page');

나를 위해 트릭을했다. 캐시를 지우는 것을 잊지 마십시오

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