2012-11-28 4 views
6

私はモジュールからカスタムコンテンツタイプをプログラムで作成する方法を学びたいと思っています。モジュールのコンテンツタイプに属するフィールドの痕跡を削除するにはどうすればよいですか?

私のモジュールをアンインストールして再インストールした後、作成しようとしていたフィールドの1つ以上が既に存在するため作成できなかったというエラーが表示されました。

私は自分のデータベースをハックして、コンテンツタイプとそれに属するすべてのテーブルを削除しました。

同じ結果 - フィールドは既に存在します。

次は私がフィールドとフィールドのインスタンスを削除する方法を探してDrupalのAPIのウェブサイトに行き、私は削除しようとするためにPHPのページを作っ

field_delete_field() 

field_delete_instance() 

に出くわしました私が作成したフィールドは、削除しようとしていたテーブルが存在しないというエラーが表示されるだけです。

私はちょっと固まっています - フィールドが既に存在していて、フィールドが存在しないため削除できません。

私はモジュールをモデリングしていましたが、コードはDrupal examples moduleの "node_example"セクションにあります。

答えて

4

痛い、手動でデータベーステーブルを削除することは良いアイデアことはありません - Drupalはその寛容ではありません:)

だけでフィールドの作成をラップ、あなたのインストール/有効フックにコードに対処するために:

if (!field_info_field('field_name')) { 
    field_create_field(... 
} 

これにより、問題は再び発生しなくなります。または、そうしたくない場合は、アンインストール/無効化フックでフィールドが削除されていることを確認してください。明らかに、その方法は潜在的にデータ損失を招く。

  • 完全にカスタムモジュール(単に無効にしないで)アンインストールします、現在の問題を解決する、このプロセスに従って

    。矛盾した状態にある場合は、systemテーブルの行を削除してください。

  • フィールドのすべてのトレースをfield_configfield_config_instanceテーブルから削除します。
  • すべてのキャッシュテーブルを手動で切り捨てます(cache_で始まるテーブル)。
  • 厳密には必要ではないが、任意の長引くコンテンツ片付ける:

    $nids = db_query('SELECT nid FROM {node} WHERE type = :type', array(':type' => 'type'))->fetchCol(); 
    node_delete_multiple($nids); 
    

をそれそれを行うべきです。

UIを使用してフィールドを削除するか、プログラマチックにcronを実行するか、field_purge_batch()を呼び出してフィールドを削除する必要があります。

+0

ありがとうございました! – Tyler

関連する問題