Pt, 09/30/2019 - 17:45 By Umit
Drupal kullanıcı aktarma

Bugün, kullanıcıların Drupal'a nasıl taşınacağını öğreneceğiz. Örnek kod iki blog yazısında açıklanacaktır. Bu belgede, e-posta, saat dilimi, kullanıcı adı, şifre ve durum geçişini kapsar. Bir sonraki bölümde, oluşturma tarihini, rollerini ve profil resimlerini ele alacağız. Taşınan verilerin geçerli olmasını sağlamak için çeşitli teknikler uygulanacaktır. Örneğin, kullanıcı adlarının kopyalanmadığından emin olmak gibi.

Modul
Kodun tamamını https://github.com/UmitAltun/ud_migrations adresinde bulabilirsiniz .

Bu örnek, Drupal'ın standard kurulum profilini kullanarak kurulduğunu varsayar. Özellikle, kullanıcı varlığına ekli bir Picture ( user_picture) resim alanına bağlıyız. Parantez içindeki kelime , resim alanının makine adını gösterir.

Kaynağı anlama
Kaynak verilerinizin biçimini anlamak çok önemlidir. Bu beklenen hedef formatın üretilmesi için gereken dönüşüm sürecine rehberlik edecektir. Bu örnekte, kullanıcıların alındığı eski sistemin benzersiz kullanıcı adlarına sahip olmadığı varsayılmaktadır. E-postalar kullanıcıları benzersiz bir şekilde tanımlamak için kullanıldı, ancak bu yeni Drupal sitesinde istenmiyor. Bunun yerine, bir public_name kaynak sütundan bir kullanıcı adı oluşturulacak. Drupal kullanıcı adlarının benzersiz olması gerektiğinden, yinelemeyi önlemek için özel önlemler alınacaktır. Dikkate alınması gereken iki şey daha var. İlk olarak, kaynak şifreler düz metin olarak sağlanmıştır (bunu asla yapmayın!) . İkincisi, kaynaklarda roller ve profil resmi gibi bazı öğeler eksik olabilir.

Aşağıdaki kod parçası:

source:
  plugin: embedded_data
  data_rows:
    - legacy_id: 101
      public_name: 'Mustafa'
      user_email: 'mustafa@example.com'
      timezone: 'Turkey/Istanbul'
      user_password: 'totally insecure password 1'
      user_status: 'active'
      member_since: 'January 1, 2011'
      user_roles: 'forum moderator, forum admin'
      user_photo: 'P01'
  ids:
    legacy_id:
      type: integer

Hedef ve bağımlılıkları yapılandırma
Hedef bölüm kullanıcsı bir varlıktır. Bu durumda, isteğe bağlı bir md5_passwords yapılandırma ayarlayabilirsiniz. Ayarlanmışsa true, sistem bir MD5 karma şifresini alacak ve Drupal'ın kullandığı şifreleme algoritmasına dönüştürecektir. Profil resimlerini taşımak için ayrı bir geçiş oluşturulur. Kullanıcının dosyaya bağımlılığı açıkça eklenir.

Aşağıdaki kod pasajı, hedefin nasıl olduğunu gösterirve bağımlılıklar belirlenir:

destination:
  plugin: 'entity:user'
  md5_passwords: true
migration_dependencies:
  required:
    - udm_user_pictures
  optional: []

Alanları işlemek
Bir kullanıcı geçişinin ilginç kısmı alan eşlemesidir. Spesifik dönüşüm kaynağınıza bağlı olacaktır, ancak bazı karmaşık vakalar örnekte ele alınacaktır. Temel bilgilerle başlayalım: sözel olarak kaynaktan hedefe kopyalanır.

Aşağıdaki kod parçası üç eşleme gösterir:

mail: user_email
init: user_email
timezone: user_timezone

mail, init ve timezone varlık özellikleri kaynağından doğrudan kopyalanır. E-posta adreslerinde mail ve init vardır. Aradaki fark, mail mevcut e-postayı init saklarken, hesap ilk oluşturulduğunda kullanılanı saklar. Eski, kullanıcı profilini güncellerse değişebilir, ikincisi ise hiçbir zaman değişmez. Desteklenen saat dilimlerinin bir listesi için bu https://www.php.net/manual/en/timezones.php sayfasına bakın.

name:
  - plugin: machine_name
    source: public_name
  - plugin: make_unique_entity_field
    entity_type: user
    field: name
    postfix: _

Bazı kısıtlamalarla. Dönüştürülen değer şuna gönderilir:make_unique_entity_field. Bu eklenti, belirli bir varlık alanı için giriş değerinin tüm sistemde tekrarlanmadığından emin olur. Bu örnekte, kullanıcı adı benzersiz olacaktır. Eklenti, kontrol etmek istediğiniz varlık tipini ve alanını (özellik) göstermek üzere yapılandırılmıştır . Eşit bir değer zaten mevcutsa, postfixartı bir değer olarak tanımladığınız yeni bir değer oluşturulur . Bu örnekte, ile public_nameayarlanmış iki kayıt vardır. Sonunda, işlem eklentileri zincirinin çalıştırılmasıyla üretilen kullanıcı adları şöyle olacaktır: Mustafa ve mustafa_1 gibi..

process:
  pass:
    plugin: callback
    callable: md5
    source: user_password
destination:
  plugin: 'entity:user'
  md5_passwords: true

pass, bu öğe özelliği kullanıcının parolasını depolar. Bu örnekte, kaynak şifreleri düz metin olarak sunar. Söylemeye gerek bile yok, bu korkunç bir fikirdir. Ama şimdilik bununla çalışalım. Drupal, PhpassHashedPassword tarafından uygulanan taşınabilir PHP şifre karma değerlerini kullanır . Drupal'ın bir algoritmayı diğerine nasıl dönüştürdüğünün ayrıntılarını anlamak meraklı okuyucu için bir alıştırma olarak bırakılacaktır. Bu örnekte, MD5 karma değerlerini otomatik olarak Drupal tarafından kullanılan algoritmaya dönüştürmek için migrate API tarafından sağlanan bir özellikten yararlanacağız. Eklenti kullanmak üzere yapılandırılmış bir karma sürüm içine düz metin şifresini dönüştürmek için PHP işlevi.

Bulmacanın son kısmı, işlem bölümündecallbackmd5md5_passwords yapılandırması true. Bu, zaten md5 karma şifresini Drupal tarafından beklenen değere dönüştürmekle ilgilenir.

Not : MD5 karma şifreleri güvensizdir . Örnekte, şifre yalnızca bir ara adım olarak MD5 ile şifrelenmiştir . Drupal, şifreleri güvenli bir şekilde saklamak için diğer algoritmaları kullanır.

status:
  plugin: static_map
  source: user_status
  map:
    inactive: 0
    active: 1

status, İşletme özelliği , bir kullanıcı aktif bir veya sistemden bloke olup olmadığını saklar. Kaynak user_statusdeğerler dizgedir, ancak Drupal bu verileri bir boolean olarak saklar. Sıfır ( 0 ) değeri kullanıcının engellenmiş olduğunu gösterirken , bir ( 1 ) değeri aktif olduğunu gösterir . static_map Eklenti elle kaynağından hedefe değerleri eşleştirmek için kullanılır. Bu eklenti map, bir dizi anahtar-değer eşlemesi içeren bir konfigürasyon bekler . Kaynaktaki değer soldadır. Drupal tarafından beklenen değer sağda.

Teknik not : Boolean'lar trueveya false değerlerdir. Drupal status özelliği bir boolean olarak görmesine rağmen, dahili olarak tiny int veri tabanında saklanır . Örnekte sıfır veya bir sayının kullanılması nedeni budur. Bu özel durumda, eşlemenin sağ tarafında bir sayı veya bir boolean değeri kullanmak aynı sonucu verir.

Bir sonraki blog yazısında , kullanıcı geçişine devam edeceğiz. Özellikle, kullanıcının yaratma zamanını, rollerini ve profil resimlerini nasıl geçireceğimizi açıklayacağız.

Bugünün blog yayınında neler öğrendiniz? Kullanıcı parolalarını daha önce düz metin olarak mı yoksa karma olarak mı geçirdiniz? Sistemde benzersiz olması gereken değerler için kopyaların nasıl önleneceğini biliyor muydunuz? Değerleri kaynaktan hedefe manuel olarak eşlemenizi sağlayan eklentinin farkında mıydınız? Lütfen yorumlarınızı cevaplarınızı paylaşın. Ayrıca, bu blog gönderisini başkalarıyla paylaştıysanız minnettar olurum.