記事の内部変数が変わってしまった

事象

過去記事の本文を編集できなくなりました。
編集するためには表示されなければできませんが、空白のためなにもできません。
そのまま何もせず保存するとサイト上では本文が表示されていますのでデータが消失してしまったわけではないようです。
 

経緯

このサイトはDrupal6からDrupal7へのアップグレードを実施しています。

あるとき、なんとなく多言語サポート対応にしてみようかと思い、コアの「Content translation」を有効にしました。
それに付随して、「Entity translation」を導入しました。

とりあえず、導入だけすませ放置していました。
その後、Drupalコアのセキュリティアップデートがあったので対応バージョンに更新しました。

当初の記憶では、本文(body)を表示させるには、node-->body[und][0]でよかったのですが、いつからかnode-->body[ja][0]でないと表示されなくなりました。
新規で記事を記載したときに気づきました。

これにより、[und]で保存されている過去記事では編集で本文が空白で表示されるため編集ができません。
また、[ja]で保存さている新規記事ではカスタムテンプレートで本文を表示させている箇所が表示されません。

後者は、カスタムテンプレートで本文を表示させる箇所をnode-->body[und][0]とnode-->body[ja][0]の両方を記述することで対応すればとりあえずは解決します。
※どちらかしかないため条件文を含める必要があります。

こんな面倒なことになるのならと、多言語サポート関連の機能を無効にしてアンインストールしました。
元通りになったと思い、試しに記事の編集をしてみましたが、状況はかわらないままです。
 

調査

調査の結果、node-->languageに設定された値がnode-->body[language][0]に使われるように記事の保存および編集画面表示では変わってしまったようです。
そのため、node-->language=jaであるため、編集画面で表示されるのは常にnode-->body[ja][0]となります。
過去の記事もlanguage=jaなので編集画面でnode-->body[ja][0]の内容を表示しようとしますが、node-->body[und][0]にしか値が入力されていませんので空白が表示されてしまいます。

まとめると
「Content translation」を導入する前は、language=jaでbody[und][0]に本文が保存されました。(過去記事の状態)
「Content translation」を導入した後は、languageを選択するリストが表示され、その選択に併せて、languageの値とbodyの要素([und]の箇所)が保存されました。
languageで選択可能なのは「Locale」(admin/config/regional/language)で追加されている言語([ja]や[en]など)+ニュートラル([und])です。
「Content translation」をアンインストール後は、language=ja、body[ja][0]で保存されました。

多言語サポート関連のモジュールを導入すると言語スイッチャーが導入されるようですが、モジュールをアンインストールしてもそれが残っているかのようです。
bodyだけがjaに変わってしまい、その他のフィールドは[und]のままであるのも気持ち悪い点です。

コンテンツタイプの編集画面の「掲載オプション」に多言語サポートの設定が表示されています。
これは「Content translation」を導入後から表示されているものなのかが不明ですが、導入時は3択あり、アンインストール後は有効と無効の2択だけになりました。
導入時にしか表示されない「有効(翻訳対応)」を選択した状態でアンインストールすると無選択の状態で表示されます。
また、何も変更していないコンテンツタイプは「無効」が選択された状態で表示されます。
 

原因

いつからか、記事の編集時に表示されるbodyの内容がlanguageの値と一致するものだけになったようです。
これが、過去の記事が編集(表示)できない原因です。
 

対処

安易にコンテンツタイプで多言語サポートを有効にして、過去の記事の編集で言語選択でjaを選択し、そのまま保存してしまうと本文の内容は空になってしまいます。
この状態になるともう元には戻せません。このため「chromecast」の記事が消えてしまいました・・・

試しに、保存前に[und]の内容をコピーして貼り付ければ、[ja]と[und]の両方に本文の内容が保存されました。
※コピーはDrupal for firebugを使い、node情報を表示させ、bodyの内容をコピーしました。

一方、言語選択でニュートラルを選択すればbody要素もundになりますが、言語がundになるため、これもまた既存記事の状態と差異が生じます。

このことから、過去記事を今の状態と合わせるのであれば、スクリプト処理でbodyの書き換えが必要になります。

現状でlanguageの値とbody要素が同じになる組み合わせしかなく、以前のlanguageの値がjaでbody要素がundという組み合わせができなくなったのがこのサイトでの不都合です。
過去の記事約600とこれから記述していくであろう記事とに内部状態の差異が発生してしまいます。

今後、Drupalのメジャーバージョンのアップグレードを実施する際には必ず、この点で躓きそうでなんとかしたいとは思いますが、その前に、「多言語サポートは必要なのか?」を決定しなくてないけません。
多言語サポート対応どうこうに関係なく編集ができないわけですから、過去記事の一括変換が必要になるのは間違いありません。
 

原因の原因が判明

どうやら「Internationalization(i18n)」モジュールを導入していたらしく、このモジュールを導入した際にbodyフィールドの管理画面一番下にある「enable translation」を実行してしまったのが原因のようです。
そういえば、i18nモジュールも導入した記憶があります・・・

新規でd7テストサイトを立ち上げ、再現するかを試しましたが、結果は再現できず、何がどうなってこうなったのか行き詰まったときに、検索キーワードを「drupal body[und] body[language]」でやっとそれらしいのがヒットして解決出来ました。

解決のヒントになったのがこのサイトです。
このサイトでは、私の場合と逆で、なぜlanguageの設定と同じにならないのか?といった記事です。

「disable translation」を実行するために、もう一度、i18nモジュールを導入しました。
bodyフィールドの管理画面(admin/structure/types/manage/blog/fields/body)から「disable translation」を実行しました。
※この操作はbodyフィールドが使用されているすべてのコンテンツタイプに影響します。

実行後に過去の記事を編集し、bodyが表示されることを確認しました。
また、新規記事を作成し、bodyの要素がundで作成されていることを確認しました。
body[ja]で作成されてしまった記事は3タイトルほどですので、データベースのfield_revision_bodyとfield_data_bodyのjaとなっているのをundに変更すればよいだけかと思ったら、「disable translation」によってすでにundに変更されたようです。


今回の件で改めて、モジュールをアンインストールする前にまずデフォルトの設定に戻すべきであると感じました。
 

Drupalバージョン

Drupal 7.x