ilk eklentim

Events happening in the community are now at Drupal community events on www.drupal.org.
aydos's picture

Eklenti geliştirmeye başlamak için biraz geç kaldım ama olsun... ilk eklentim şekillenmeye başladı. Hem öğreneyim hem de sitemde kullanayım diye geliştirmeye çalıştığım eklenti sözlük yönetimi üzerine. Sisteme birden fazla sözlük ekleyebiliyorsunuz ve her sözlüğün kendi tablosu var. Bu tabloyu drupal_create_schema ile nasıl oluştururum diye düşündüm, çünkü bu fonksiyonu parametrik kullanmam lazımdı ve schema ismi dışında parametre almıyordu. Sorunu global değişkenle çözdüm:

<?php
function dictionaries_dictionary_form_submit($form, &$form_state) {
  global
$globaldid;
  ...
 
$sql = "INSERT INTO {dictionaries} ... ;
 
$sql = "SELECT MAX(did) as did FROM {dictionaries}";
 
$result = db_fetch_object(db_query($sql));
 
$globaldid = $result->did;
  drupal_install_schema('dictionary');
}

function dictionary_schema() {
  global
$globaldid ;
 
$schema['dictionaries_'.$globaldid] = array(
    'fields' => array( ... ),
  );
  return
$schema;
}
?>

Kodda üç nokta olan yerlerde başka kodlar var, sadece gerekli yerleri yazdım. Umarım işinize yarar.

Comments

Hayırlı olsun

pembeci's picture

Benim de bir iki eklentiye bulaşmışlığım, bilhassa FAPI'nin ince ayrıntılarında saç baş yolmuşluğum var. Ama Drupal'in derin kodunu görünce ve kullanınca insanın hayranlığı da artıyor.

Global değişken kullanmakta bir mahzur var mı bilmiyorum ama insanı kıllandıran bir yanı var. Ayrıca bu schema sadece ilk başta eklenti aktif hale geldiğinde tabloları oluşturmak için ve güncellemelerde kullanmak için tasarlanmış diye biliyorum. Bu demek değil ki elbet senin yaptığın yanlış. Hatta belki kimsenin aklına gelmeyen ekstra bir kullanımını keşfetmiş de olabilirsin.

Yine de dayanamayıp, birkaç soru. Öncelikle ayrı ayrı tablolara ihtiyacın olduğuna emin misin? Madem tüm sözlükler aynı schema'ya sahip, ekstradan did'i field olarak ekleyip ve index'e dahil edip tek tabloyla istediğine ulaşamaz mıydın? İnsanın böyle durumlarda ama tablo şişer gibi bir kaygısı oluyor ama tüm select sorgularında did olacağından ve mysql ona göre indeksleyeceğinden çok da kaygılanmaya gerek yok.

Yok illa ayrı tablolar lazımsa, db_create_table iş görür müydü acaba? Yok o da olmuyorsa (illa drupal_install_schema'ya mahkumsak) bari şu global değişkenden kurtulmak için, tabloyu her seferinde aynı isimle yaratıp ama sonra hemen akabinde (drupal_install_schema işini bitirdikten sonra), db_rename_table ile adını değiştirmek (sonuna did'i eklemek) daha mı iyi olurdu acaba?

Drupal'in çekirdek ve eklenti geliştiricilerinin takıldığı bir e-posta listesi var. Gayet sıkı tartışmalar dönüyor. Çekinmeden oraya da sorabilirsin Drupal'a en yatkın alternatif nedir diye. Dediğim gibi daha doğrusu budur gibi bir iddiam yok. Sadece hani alternatif olsun, belki kafana yatar diyerekten aklıma gelenleri söyleyeyim dedim.

db_last_insert_id

pembeci's picture

Ha bir de "SELECT MAX(did) ... " yerine db_last_insert_id kullanabilirsin. Benim de ihtiyacım olmuştu buna ulaşmak ve o zaman farketmiştim.

çok teşekkürler

aydos's picture

çok teşekkürler pembeci,

global değişken açıkçası beni de işkillendirmişti. yazının sonunu drupal'e en uygun çözüm nedir diye değiştireyim diyordum, bu çok faydalı yorum geldi, tekrar sağol.

birden fazla sözlüğüm var, türkçe, ingilizce, japonca, çince, ispanyolca, yunanca... mümkün olursa yenilerini eklemek isterim. biden fazla tablo ile çalışmak daha temiz bir iş gibi geldi. her sözlüğü bulduğumda csv dosyası yapıyor ve mysql'in "load data local infile" komutu ile tabloyu dolduruyorum. biliyorum drupal uygun bir yöntem değil (postgre de ne olacak).

... kendi işimi yaptığım için eğlenelim/öğrenelim modundayım biraz :) biliyorum, daha profesyonel bir projede daha detaylı çalışmak gerekecek, mesela seslisozluk'un yaptığı gibi kullanıcıların kelime girmelerine izin verildiğinde, vb.

bu konuda iki kitap okuduğumu söylemiştim, ama kolları sıvayıp işin içine dalmayında dışarıdan olmuyor, yapmak istediğimi yapmış bir eklenti buluyorum, nasıl yapmış kopya ediyorum, bu nedenle değişik çözümler gözden kaçabiliyor.

sonuç olarak db_table_rename aklıma yattı :)

kafa nereden çıktı yahu

pembeci's picture

işe yaramasına sevindim. sonuçta dediğin gibi herkesin kullanacağı bir eklenti değilse şu aşamada çok da kasmaya gerek yok.
nasıl çalıştığını bildiğin diğer eklentilerin kodunu incelemek bence de drupal usulu işler nasıl yapılırmışı öğrenmenin en temiz yolu. bildiklerimin çoğunu ben de öyle öğrendim.