6

モジュール内からプログラムでカスタムコンテンツタイプを作成する方法を学ぼうとしています。

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

そこで、データベースをハッキングして、コンテンツタイプとそれに属するすべてのテーブルを削除しました。

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

次に、Drupal API Webサイトにアクセスして、フィールドとフィールドインスタンスを削除する方法を探しました。

field_delete_field()

field_delete_instance()

作成したフィールドを削除しようとすると、phpページを作成しましたが、削除しようとしたテーブルが存在しないというエラーが表示されました。

だから私はちょっと立ち往生しています-フィールドがすでに存在するために作成できず、フィールドが存在しないために削除できません!

ところで、私がモジュールをモデル化した後のコードは、Drupalサンプルモジュールの「node_example」セクションにあるコードです。

4

1 に答える 1

4

痛い、データベーステーブルを手動で削除することは決して良い考えではありません-Drupalはそれほど寛容ではありません:)

インストール/有効化フックのコードに対処するために、フィールドの作成を次のようにラップします。

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

これにより、問題が再び発生するのを防ぐことができます。または、それを実行したくない場合は、アンインストール/無効化フックでフィールドが削除されていることを確認してください。明らかに、その方法ではデータが失われる可能性があります。

現在の問題に対処するには、次のプロセスに従います。

  • カスタムモジュールを完全にアンインストールします(無効にするだけではありません)。system一貫性のない状態にある場合は、テーブル内のその行を削除するだけです。
  • field_configおよびfield_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()、最初に削除のマークが付けられているだけなので、「hard」を呼び出してフィールドを削除する必要があります。

于 2012-11-28T18:17:53.190 に答える