分類用語のフィールドをプログラムで変更する方法は?


7

D7では、分類用語にフィールドをプログラムで追加/変更するにはどうすればよいですか?それらは明らかにフィールド化可能であり、UIではノードでフィールドを追加する場合と同じようにフィールドを追加および編集できますが、コードでは簡単な作業ではないことが判明しました。りんごやバナナのような用語でフルーツという名前の語彙があるとします。という名前のフィールドを追加したmain_article_idので、すべての用語には名前、説明、およびメイン記事IDがあります。Fruitボキャブラリー(field_fruit)への参照を持つApplesという名前のノードを作成し、Apples用語が選択されている場合、コードはApples用語を更新し、そのmain_article_idフィールドをに設定する必要があり$node->nidます。これが私のコードです:

//hook_node_insert fires after new node has been inserted into db
function MYMODULE_node_insert($node)
{
    $taxonomy_term_id = $node->field_FRUIT[LANGUAGE_NONE][0]['value'];
    $taxonomy_term = taxonomy_term_load($value['tid']);
    if($taxonomy_term != FALSE)
    {
        //doesn't work
        $taxonomy_term->field_main_article_id[LANGUAGE_NONE][0]['value'] = $node->nid;
        taxonomy_term_save($taxonomy_term);
    }
}

回答:


9

フィールドの列名は常にではありませんvalue。分類用語参照tidの場合は、ノード/エンティティ参照の場合は使用しているモジュールによって異なります。

Referencesモジュールを使用して作成されたフィールドの名前はnidであり、Entity Referenceモジュールを使用して作成されたフィールドの名前はtarget_idです。

次のコードは少し良く機能するはずです。

//hook_node_insert fires after new node has been inserted into db
function MYMODULE_node_insert($node)
{
    $taxonomy_term_id = $node->field_FRUIT[LANGUAGE_NONE][0]['tid'];

    // $value['tid'] isn't defined anywhere in this function scope so I 
    // assume you meant to use $taxonomy_term_id here
    $taxonomy_term = taxonomy_term_load($taxonomy_term_id);
    if($taxonomy_term != FALSE)
    {
        $column_name = 'nid'; // Or 'target_id' if you're using entity reference            

        $taxonomy_term->field_main_article_id[LANGUAGE_NONE][0][$column_name] = $node->nid;
        taxonomy_term_save($taxonomy_term);
    }
}

あなたはについて正しく$value['tid']、コードの誤りをお詫びします。しかし、私のフィールドを作成するためにモジュールを使用していません。語彙フィールドの編集ページで手動で追加しました。UIで編集するときに、taxonomy_termを確認しようとしました。hook_taxonomy_term_presave($ term)$ termの内部では、次のようになっていprint_r()ます:stdClass Object([tid] => 20 [vid] => 6 [name] => Fruit ... [field_main_article_id] => Array([und] => Array([0] => Array([value] => 14))
アリリン

ゴッチャ、それは間違いなくその時でなければならない'value'。ただし、分類用語の参照も間違いなくで'tid'あるため$taxonomy_term_id = $node->field_FRUIT[LANGUAGE_NONE][0]['tid'];、他の行ではなく、その行()を変更するだけでよいのかもしれません
Clive

すでにそれをしました。:-)それでも動作しません。ちなみに、結果taxonomy_term_load($taxonomy_term_id)を見ると次のようになっています:stdClass Object([tid]=> 1 [vid]=> 2 [name]=> Apples [description]=> [format]=> full_html [weight]=> 0 [vocabulary_machine_name]=> fruit [rdf_mapping]=> ...)。私の貴重品field_main_article_idはどこにも見当たりません(ただし、UIで完全に見ることができます)。taxonomy_term_loadこのように操作する必要がありますか?
Ari Linn、

申し訳ありませんが、私の悪いです。私は愚かで間違った場所に目を向けていたので、分類用語に何の変化も見られませんでした。コードが機能します。ありがとう。
Ari Linn、

taxonomy_term_save用語の親を更新するためにも機能する必要がありますか?この目的で使用しようとしていますが、データの更新で問題が発生しています。
ブレントコナー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.