2

外部ソースからDrupalインストールにデータを同期します。新しく作成したノードに分類用語の関係を追加するときに問題が発生します。

車を同期していますが、メーカー名(コードでは$ name)が語彙に含まれていない場合は、追加されます。すでに存在する場合は、tidがノードにアタッチされています。

これは、フェラーリやフォルクスワーゲンなどの用語で完全に機能します。しかし、それからメルセデスベンツがあります。何らかの理由で、EntityFieldQueryは語彙からそれを見つけられないようです。これは、このコードがループで実行されると、メルセデスベンツの用語が何度も作成されるためです。

問題は単語間のダッシュだと思います。EntityFieldQueryの背後にあるSQL句を見たいのですが、これを実行しているときに完全なdrupalセットアップがないため、Develなどのモジュールがロードされません。また、SQLを他の方法で検査する方法がわかりません。

デバッグ方法やこれを解決する方法の提案に感謝しています。すべてのリンクをいただければ幸いです。

これが私のコードです:

$query = new EntityFieldQuery();
$result = $query
    ->entityCondition('entity_type', 'taxonomy_term')
    ->propertyCondition('name', $name) // $name = manufacturer, like "Ferrari"
    ->propertyCondition('vid', 2)
    ->execute();

if(!empty($result))
{
    $tmp = array_pop($result['taxonomy_term']);
    $node->field_brand[LANGUAGE_NONE][0]['tid'] = $tmp->tid;
}
else
{
    $term = new stdClass();
    $term->vid = 2;
    $term->name = $name
    taxonomy_term_save($term);
    $node->field_brand[LANGUAGE_NONE][0]['tid'] = $term->tid;
}
4

1 に答える 1

0

taxonomy_get_term_by_name()で同じことを行う方法はありますが、これは好ましくない方法であり、問​​題で説明されている解決策はこれに適しているはずです。

ここでDrupalのバグが発生していると思います。しかし、それを行おうとしている他の人のために、ここに解決策があります:

$test = taxonomy_get_term_by_name($name);
// It should be full of unique names, so no need to go through all of them
if(!empty($test))
{
    $tmp = array_pop($test);
    $node->field_brand[LANGUAGE_NONE][0]['tid'] = $tmp->tid;
}
else
{
    $term = new stdClass();
    $term->vid = 2;
    $term->name = $name;
    taxonomy_term_save($term);
    $node->field_brand[LANGUAGE_NONE][0]['tid'] = $term->tid;
}
于 2012-06-04T09:38:09.127 に答える