0

デフォルトの Drupal 登録フォームにフックして変更するモジュールを作成しました。フォームが処理されると、(DOM 解析を介して) 外部 Web ページから情報を取得し、重複を防ぐために、取得するデータが既存のユーザーのプロファイル フィールドに既に存在するかどうかを確認します。解析スクリプト自体が必要な情報を取得しています (この情報はエラー メッセージに表示されます)。私の人生では、データベース内の適切なプロファイル フィールドをスキャンしてデータを取得するためのクエリを取得できません。

ここに私が書いた関数があります:

function CustomVerify_CheckName($name, $server){

$result = db_select('field_data_field_character_first_name','u')
    ->fields('u',array('field_character_first_name'))
    ->condition('field_character_first_name', $name)
    ->condition('field_character_server', $server)
    ->range(0,1)
    ->execute()

if($result->rowCount > 0):

    return TRUE;

endif;}

いくつかのバリエーションを試しました。「field_data_field_character_first_name」を「users」に置き換え、「data」フィールドのフィールドを交換します (これは、適切なグループ化がユーザーのプロファイル テーブル エントリに記録される場所だと思いますか?)。

エラーメッセージは次のとおりです。

PDOException: SQLSTATE[42S22]: 列が見つかりません: 1054 不明な列 'u.field_character_first_name' in 'field list': SELECT u.field_character_first_name AS field_character_first_name FROM {field_data_field_character_first_name} u WHERE (field_character_first_name = :db_condition_placeholder_0) AND (field_character_server = :db_condition_placeholder_1)リミット 1 オフセット 0; CustomVerify_CheckName() の配列 ( [:db_condition_placeholder_0] => David Mortimer [:db_condition_placeholder_1] => Saturn ) (C:\xampp\htdocs\drupal\sites\all\modules\customverify\customverify.module の 78 行目)。

このメッセージを使用して、いくつかのバリエーションを試しましたが、すべて同じ結果になりました。条件プレースホルダーから、ユーザーのプロファイル データがオフサイト DOM から取得されていることがわかります。

明らかに、私の問題は、必要な情報を取得するためにこのクエリを構造化する方法を完全に理解していないことです。フィールドは、'field_character_first_name' および 'field_character_server' としてユーザーのデフォルト プロファイル (私はカスタム プロファイル モジュールを使用していません) にアタッチされています - 人々は異なるサーバーで同じ名前を持つことができるため、キャラクター名が異なることを確認する必要があります。解析 DOM オブジェクトが返すサーバー上に存在します。繰り返しますが、DOM オブジェクト部分は完全に機能しています。

4

1 に答える 1

4

Drupal データベース API のドキュメントを少し読んだ後、この問題の答えは実行にあります。エンティティ データ (ユーザー プロファイル フィールド、ノード フィールドなど) を取得するために db_select を使用するのはやり過ぎであり、必要ありません。を使用EntityFieldQueryして、よりわかりやすい用語とよりわかりやすいマークアップで上記の両方を実現できます。

将来この機能が必要になる人のために、次のようにします。

    $query = new EntityFieldQuery();
    $query->entityCondition('entity_type', 'user')
    ->fieldCondition('field_character_first_name', 'value', $CheckName)
    ->fieldCondition('field_character_server', 'value', $CheckServer)
    ->count()
    ->range(0,1);

私の場合、実際にデータを出力するのではなく、行が存在するかどうかを確認したい。このcount()条件により、クエリは結果の数を返します。シンプルな

    if($result > 0):

        form_set_error('link','Username taken!');

    endif;

一致する行が見つかった場合、フォーム検証コールバック関数に添付され、必要なエラーが追加されます。

于 2013-07-05T09:33:50.890 に答える