it-swarm-tr.com

Yalnızca benzersiz değerleri kabul eden bir alanı nasıl oluştururum?

Alanlar arasında bazı karmaşık ilişkilerim olduğu için Field Collection modülünü kullanıyorum ve Benzersiz alan modülü ile bütünleştirmeyi denedim, çünkü - Benzersiz alan modül Alan Koleksiyon modül tarafından desteklenmez.

Değerin benzersiz olup olmadığını ve değer benzersiz değilse doğrulama hatasını görüntülemek için daha basit bir yöntem var mı?

Ne yazık ki, Drupal 7 varsayılan olarak bu özelliğe sahip değildir, bu nedenle bunu yapmak için bir yöntem olmalıdır.

4
Ek Kosmos

Son olarak, @tostinni, @stefgosselin, @ uwe999 cevapları ve diğerlerinden önerileri uyarlama ve yapıştırma yöntemini şöyle yaptım:

/**
 * 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;
    }
}

sonra uyguladığım tüm işlevler:

/**
 * 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 İle çalışmaya çalıştım ama maalesef başarılı olamadım.

Cevaplarınız için teşekkür ederim.

1
Ek Kosmos

Bunu özel bir modülde uygulamalısınız, işte bunu başarmak için örnek bir kod:

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.');
    }
  }
}

Birkaç sorumluluk reddi:

  • Ben gerçekten karmaşıklığı ile stoklanmayacaktır Alan Alan Toplama API'sıdır ve değerlerin nasıl alınacağı ve sorguların nasıl yapılacağı hakkında iyi bilgiler bulmak oldukça karmaşıktı.
  • Gerçekten SQL sorguları yapmaktan zevk alıyorum (bkz Alan ayarlarının ayarını nasıl değiştirebilirim ) ama tablo field_data_field_unique basit bir sorgu yapmak yerine sadece API kullanmaya çalıştım. Ancak henüz mükemmel olmayabilir, bu yüzden lütfen içeri girmekten çekinmeyin.
  • form_set_error () alanı vurgulamıyor, doğru adı bulamadım.

Kullandığım belgeler:

Düzenleme: Chx tavsiyesini takiben, doğrudan field_name 'i fieldCondition()' a geçirmek için.

8
tostinni

Henüz bir modül programlamadım ama form_alter üzerine bir kanca yazmak ve daha sonra benzersiz olduğundan emin olmak için mevcut "seri numarası" alanına karşı sorgulamak daha kolay olabilir gibi geliyor.

4
uwe

Temel olarak Ek Kosmos'un temel fikri vardır. En kolayı küçük özel bir modül oluşturmak olacaktır, bu oluşturmak istediğiniz özelliği izole etme ve # 1 kuralını hatırlama avantajına sahiptir, gerçekten hiçbir şeyi kesmek istemezsiniz. aslında, bundan kaçınamıyorsanız.

.İnfo dosya kurulumunuzu bir klasörde ve .module dosyanızı konuyla ilgili birçok nasıl yapılır belirtildiği gibi gitmeye hazır hale getirdikten sonra, modül dosyanızdaki modül-adınız _form_alter ve bu işlevin çağrılacağını bilirsiniz.

Muhtemelen form kimliğine bağlı olarak belirli eylemleri gerçekleştirmek için forma bağlı bir switch deyimine ihtiyacınız olacaktır.

Muhtemelen, form dizisine işlev çağrısı ekleyen ve kendi özel doğrulama işlevinizin işlev adı olan bir özellik (#validate) eklemeyi denemeniz gerekir.

Gibi bir şey:

   // #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';

Elbette, doğrulama fonksiyonunuzda hataları kaydedebilir, yeniden yönlendirebilir, hata mesajları veya bildirimler atayabilirsiniz.

api formunu okuyun ve form örneklerini indirin .

Yardıma ve örneklere ihtiyacınız varsa, katkıda bulunan modülleri indirin ve başkalarının canavarı nasıl ele aldığını görün veya ilerledikçe sorularınızı buraya gönderin.

Mutlu kınama, iyi şanslar.

1
stefgosselin

alan doğrulaması modülü ile deneyin, benzersiz doğrulayıcı kullanın. Bir doğrulama kuralı ekleyin, benzersiz kapsam, genel, varlık, paket seçin.

1
ghr