Bir alanı içerik türünden ayırmanın en iyi yolu


21

Drupal 7 alanını GUI ile tanımlanan bir içerik türünden kaldırmanın en iyi yolu nedir? Hook_update_N kullanmak istiyorum, böylece değişiklikler update.php'yi çalıştırdıktan sonra birden fazla sunucuya yayılabilir. Ancak bir çözüm bulamıyorum. db_drop_table (), özel tanımlı şemalar için bana anlamlı gelir, ancak GUI aracılığıyla tanımlanan bir içerik türü / alanı için anlam ifade etmez.


içerik türünü tanımlamak için özel bir modül oluşturdunuz mu?
iStryker

iStryker: İçerik türünü yönetici arayüzü aracılığıyla oluşturdu, bazı alanlar ekledi, ardından Özellik aracılığıyla dışa aktarıldı. Ama şimdi bu alanlardan birini programlı olarak kaldırmak istiyorum.
amatör barista

D5'in burada ve burada belgelenen bir content_field_instance_delete () işlevi sağladığını , ancak bu işlev D7 için geçerli olmadığını belirtti. Ayrıca, D7 çekirdeğindeki field.install'ın alanları silmek için kullandığı alan da ilginçtir: _update_7000_field_delete_instance () - başkalarının kullanması için uygun olmayan özel bir "dahili" işlev. Alanlar kadar önemli bir şey için, bana öyle geliyor ki, bir yerlerde "ortak" bir işlev olmalı, ve aradığım şey de bu.
amatör barista

Şu anda benim "aday" kamusal işlevim field_delete_instance ().
amatör barista

Yanıtlar:


18

Alanları silmek için iki api işlevi vardır:

Alanı yeniden kullanmak istemiyorsanız, söz konusu içerik türündeki örneğini silmek yerine tüm alanı silmek biraz daha temiz olabilir. Sadece sen bunun hakimi olabilirsin.


2
Bir cazibe gibi çalıştı. İşlev herhangi bir argüman döndürmez, bu yüzden hook_update_N () ile birlikte kullanıldığında güncelleme değişikliklerinizi kaydetmek için bir bekçi köpeği () yapmanızı tavsiye ederim.
amatör barista

9

Evet, field_delete_instance () , alan örneklerini silme işlevidir.

Kalan bir örnek yoksa , field_delete_instance()otomatik olarak çağrı yapıldığını unutmayın field_delete_field(), bu field_delete_instance()nedenle büyük olasılıkla ihtiyacınız olan her şeydir .

_update_7000_field_delete_instance()çekirdek güncelleme işlevleri için tasarlanmıştır. Örnek: güncelleme fonksiyonunda x_update_7000()kullanıyorsunuz field_delete_instance(). Sonra x_update_7001(), {field_config}masayı tutarsız bir şekilde field_delete_instance()değiştirirsiniz ve tabii ki de değiştirilmesi gerekir.

Fakat şimdi x_update_7000()çağrısı field_delete_instance()bir hataya yol açacaktır çünkü tablo hala eski yapıdadır. Bununla birlikte, katkıda bulunan modüllerin durumu farklıdır, çünkü her zaman tüm temel güncellemelerden sonra yürütülmeleri gerekir ve bu nedenle en son ana sürümle çalışmaları gerekir.

Ancak bu, güncelleme işlevlerinde kullandığınız kendi API işlevleriniz için kullanmak isteyebileceğiniz bir kalıptır.

Ek olarak, bu _update işlevleri, sonuç tahmin edilebilir olmadığından kancaları yürütmez (örneğin, güncellemenin çalıştırıldığı modül devre dışı bırakılabileceği için).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.