it-swarm-ja.com

一意の値のみを受け入れるフィールドを作成するにはどうすればよいですか?

Field Collection モジュールを使用しています。これは、フィールド間に複雑な関係があるためです。 nique field モジュールと統合しようとしましたが、成功しませんでした- 一意のフィールド モジュールは フィールドコレクション モジュールではサポートされていません。

値が一意かどうかを確認するより簡単な方法と、値が一意でない場合に検証エラーを表示する方法はありますか?

残念ながら、Drupal 7にはデフォルトでこの機能がないため、これを行う方法が必要です。

4
Ek Kosmos

最後に、@ tostinni、@ stefgosselin、@ uwe999の回答などから提案を適応させ、それに取り組んだ方法を次に示します。

/**
 * implementation of hook_form_alter().
 */
function CUSTOM_MODULE_form_alter(&$form, &$form_state, $form_id) {
    switch ($form_id) {
        case 'MY_FORM_ID':
            // add custom validation callback
            $form['#validate'][] = 'CUSTOM_MODULE_MY_FORM_ID_validate';
            break;
            ...
        default:
            break;
    }
}

次に、私が実装したすべての機能:

/**
 * implementation of hook_form_FORM_ID_alter
 */
function CUSTOM_MODULE_MY_FORM_ID_validate(&$form, &$form_state) {

    //retrieve the value for your field
    $value = $form_state['values']['field_MY_FIELD']['und'][0]['value'];

    //Execute a count query to see if there's other similar values.
    $query = new EntityFieldQuery;
    $query->entityCondition('entity_type', 'field_collection_item')
            ->fieldCondition('field_MY_FIELD', 'value', $value)
            ->count();
    $count = $query->execute();
    if ($count > 0) {
        form_set_error('field_MY_FIELD', 'Unique field value is already used.');
    }
}

私はentity_metadata_wrapperしかし、残念ながら私は成功していません。

回答ありがとうございます。

1
Ek Kosmos

これをカスタムモジュールに実装する必要があります。これを実現するサンプルコードを次に示します。

function custom_node_validate($node, $form) {
  if ($node->type == 'page') {
    //retrieve the value for your field using Entity API
    $wrapper = entity_metadata_wrapper('node', $node);
    $value = $wrapper->field_collection->field_unique->value();

    //Execute a count query to see if there's other similar values.
    $query = new EntityFieldQuery;
    $query->entityCondition('entity_type', 'field_collection_item')
      ->fieldCondition('field_unique', 'value', $value)
      ->count();
    $count = $query->execute();
    if ($count > 1) {
      form_set_error('field_unique', 'Unique field value is already used.');
    }
  }
}

免責事項:

  • 私は本当にその複雑さを備えています フィールド フィールドコレクションAPIを使用しており、値を取得してクエリを作成する方法に関する適切な情報を見つけるのはかなり複雑でした。
  • 私はSQLクエリを本当に楽しんでいます( フィールド設定の範囲を変更する方法 を参照)が、テーブルfield_data_field_uniqueで単純なクエリを実行する代わりにAPIのみを使用しようとしました。ただし、まだ完全ではない場合がありますので、お気軽にご連絡ください。
  • form_set_error() がフィールドを強調表示していないため、正しい名前を見つけることができませんでした。

ここに私が使用したドキュメントがあります:

編集:chxのアドバイスに従って、field_namefieldCondition()に直接渡します。

8
tostinni

モジュールはまだプログラミングしていませんが、form_alterにフックを記述してから、既存の「シリアル番号」フィールドに対してクエリを実行して、一意であることを確認する方が簡単なようです。

4
uwe

基本的にEk Kosmosは基本的な考えを持っています。最も簡単なのは、小さなcustomモジュールを作成することです。これには、構築する機能を分離するという利点があり、#1のルールを覚えています。あなたが本当にそれを避けることができないのでない限り、コアの何かを本当にハックしたくないです。

多くのハウツーは件名に記載されています に示されているように、フォルダ内の.infoファイルと.moduleファイルの準備ができたら、your-module-name_form_alterをモジュールファイルに追加すると、関数が呼び出されることがわかります。

form idに応じて特定のアクションを実行するには、フォーム)alterに依存するswitchステートメントがおそらく必要です。

おそらく、フォーム配列に関数呼び出しを追加する属性(#validate)を追加する必要があります。これは、独自のカスタム検証関数の関数名です。

何かのようなもの:

   // #validate adds callback to custom validator.
   $validators = $form['#validate'][]; // Save existing validation calls. 
   //  Not clear in docs, but this is important!

  // In your case, you may want to add a method callback with this attribute.                                   
  $form['#validate'][] = $validators . ' _custom_validate';

もちろん、検証機能では、エラーをログに記録し、リダイレクトし、エラーメッセージや通知を割り当てることができます。

フォームAPIとフォームの例をダウンロードする を読んでください。

豊富なヘルプと例が必要な場合は、contribモジュールをダウンロードして、他の人がどのように獣に取り組んだかを確認するか、質問をここに投稿してください。

頑張ってください、頑張ってください。

1
stefgosselin

field validation モジュールで試して、一意のバリデーターを使用してください。検証ルールを追加し、一意のスコープ、グローバル、エンティティ、バンドルを選択します。

1
ghr