답변:
이 en-masse를 수행하면 특히 형식을보다 관대 한 필터 세트로 변경하는 경우 잠재적 인 보안 위험이 발생한다고 말하면서이 답변의 서문을 작성하려고합니다. 텍스트 형식은 저장 중에가 아니라 표시 중에 필드 출력을 수정합니다. 예를 들어, 실수로 또는 의도적으로 필터를 전체 HTML 또는 PHP 코드로 설정하면 필드에서 제출 된 이전에 이스케이프 된 HTML 또는 PHP가 렌더링 / 실행됩니다.
이런 이유로 Drupal은 텍스트 형식을 변경할 때 기존의 모든 노드를 자동으로 업데이트하지 않습니다. 비슷한 시나리오에서 텍스트 형식의 동작은 여전히 미해결 문제 입니다.
다시 한번 , 용이 있다는 것을 명심하십시오.
이를 통해 각 필드는 텍스트를이라는 열로 저장합니다 field_foo_format
. 여기서 field_foo
필드의 시스템 이름입니다. 테이블에서 field_revision_field_foo
및 해당 열을 업데이트해야합니다 field_data_field_foo
.
열의 값 format
은 filter_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.
업데이트 후 캐시 지우기입니다.
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'인 날짜 형식이 있으면 문제가됩니다).
나를 위해 다음이 효과가있었습니다.
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을 변경해야합니다
아마도 어떤 필드를 업데이트해야하는지 알고 싶을 것입니다. 이렇게하려면 열이 포함 된 모든 테이블 및 열 이름을 가져옵니다 _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 text
old_format 을 포함했습니다! 텍스트 처리가로 설정된 필드의 Filtered text (user selects text format)
경우 새 기본값을 선택하고 저장을 눌러야합니다.
필터를 제거한 후 필터 캐시를 지우십시오 (다시, drush cc all
!로 표시 되지 않음 ).
cache_clear_all('*', 'cache_filter', TRUE);
또는 돌진으로 :
drush sqlq "truncate table cache_filter;"
field_cache_clear();
변경field_data_...
및field_revision_...
테이블 변경 후 수행해야합니다