Bagaimana cara memindahkan modul yang diinstal dari / sites / all / modules / * ke / sites / all / contrib / modules / *

34

Saya telah mencari jawaban untuk pertanyaan ini tanpa hasil sama sekali. Dari apa yang saya amati dalam struktur database, lokasi ke modul ditentukan dalam tabel 'sistem'. Satu-satunya solusi yang saya miliki adalah menulis kueri SQL untuk memperbarui kolom 'nama file'.

Apakah ada solusi yang lebih baik / lebih bersih dalam menyelesaikan ini, misalnya, modul contrib?

Logi
sumber

Jawaban:

27

Anda hanya perlu memindahkan modul ke lokasi baru Anda dan membangun kembali pendaftaran. Ketika registri membangun kembali jalur ke modul akan diperbarui. Periksa registry_rebuild().

Memindai ulang semua kode dalam modul atau termasuk direktori, menyimpan lokasi setiap antarmuka atau kelas dalam database.

Meskipun, saya akan merekomendasikan Anda untuk membuat cadangan basis data Anda sebelum menguji ini.

Jika Anda menggunakan drush, Anda juga dapat membangun kembali registri menggunakan perintah berikut:

drush cc registry

Anda juga dapat menginstal registry_rebuildperintah untuk drush:

// install registry_rebuild
drush dl registry_rebuild
// rebuild the registry
drush rr
Cyclonecode
sumber
Jika saya memahaminya dengan benar, Anda juga dapat memotong registry_filetabel Anda , yang akan memaksa drupal untuk memindai ulang semua file dan membangun kembali tabel.
Cyclonecode
3
Memotong tabel kedengarannya seperti ide yang buruk dan kemungkinan besar akan menghasilkan situs yang benar-benar rusak.
Berdir
@Berdir - Setuju bahwa itu terdengar seperti ide yang buruk. Tapi, baru mencobanya dan sepertinya berhasil. Pertama saya mengambil cadangan dan memotong seluruh tabel menggunakan DELETE FROM registry_file;dan menambahkan panggilan ke rebuild_registry()dalam page.tpl.php.
Cyclonecode
Ini terlalu rumit, lakukan saja apa yang dikatakan John Laine , selalu berhasil untuk saya.
Jim Kirkpatrick
1
@ Jimkirkpatrick - Anda benar, tidak perlu menonaktifkan modul.
Cyclonecode
10

Saya memulihkan cadangan dari produksi secara lokal dan mencoba untuk memindahkan barang-barang dan menekan admin / modul atau untuk menjalankan registry_rebuild () tetapi tidak menghentikan kesalahan fatal yang dilemparkan. Ini masuk akal bagi saya karena beberapa modul dapat menggunakan include atau apa pun di hook_init () mereka, atau Anda mungkin memiliki set path router menu yang tergantung pada sebuah modul atau menyertakan Drupal yang tidak dapat ditemukan pada bootstrap. Pada akhirnya, inilah yang saya lakukan (jalur Anda mungkin berbeda):

Langkah 1: Ganti situs / semua / modul dengan situs / semua / modul / contrib

UPDATE system SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');

Langkah 2: Ganti situs / semua / modul / contrib dengan situs / semua / modul / custom untuk modul dengan spasi nama kustom

UPDATE system SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE name LIKE 'my_custom_namespace_%';
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE name LIKE 'my_custom_namespace_%';
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE filename LIKE '%my_custom_namespace_%';

Langkah 3: Pindahkan modul dev ke situs / semua / modul / dev

UPDATE system SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE name LIKE 'devel%';
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE name LIKE 'devel%';
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE filename LIKE '%devel%';

Langkah 4: Bersihkan cache sehingga semuanya bisa bootstrap dengan benar

TRUNCATE TABLE cache
TRUNCATE TABLE cache_bootstrap
TRUNCATE TABLE cache_menu
TRUNCATE TABLE cache_page
TRUNCATE TABLE cache_path

Catatan: Jika Anda menggunakan modul khusus atau kontribus seperti LoginToboggan untuk menangani 403 (akses ditolak) dan Anda telah logout selama proses ini, Anda mungkin perlu memperbarui include_filekolom di menu_rotertabel untuk menggunakan jalur baru untuk file include. . Ini mungkin kejadian langka.

UPDATE menu_router SET include_file = 'sites/all/modules/custom/my_custom_namespace/includes/foo.inc' WHERE path = 'access-denied'

Setelah kueri ini dijalankan - yang hanya membutuhkan waktu sepersekian detik - tekan admin / config / pengembangan / kinerja dan kosongkan cache sehingga jalur menu dibangun kembali.

Charlie Schliesser
sumber
Terima kasih untuk ini! Saya mencoba langkah-langkah yang disebutkan dalam jawaban teratas, tetapi itu tidak membantu dalam kasus saya. Saya curiga ada orang di situs yang di-hosting Pantheon perlu melakukan pernyataan db ini dalam jawaban Anda dan kemudian melakukan "drush registry-rebuild" dan "drush cc registry"
Anne Bonham
Oh dan di Pantheon, saya tidak bisa mendapatkan situs dengan modul Redis di mana pun kecuali situs / semua / modul - jadi saya hanya menyerah dan meninggalkan modul yang satu ini di folder modul root. Ah well - setidaknya modul saya yang lain terorganisir dengan baik.
Anne Bonham
Bagi mereka yang menggunakan LoginToboggan, berikut adalah 3 perintah MySQL yang Anda perlukan:update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.admin.inc' WHERE path = 'admin/config/system/logintoboggan'; update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.validation.inc' WHERE path = 'toboggan/revalidate/%'; update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.validation.inc' WHERE path = 'user/validate/%/%/%';
tyler.frankenstein
9

Coba alat keren dari Mark Sonnabaum: Drush Rebuild Project Paths . Itu mengotomatiskan proses; bekerja sangat baik untuk saya. Menggunakan Drush , tentu saja.

Saya akan menyarankan kedua agar Anda mencoba ini pada salinan database situs Anda.

greg_1_anderson
sumber
7

Sebagai catatan, ada perintah drush yang bagus untuk membangun kembali registri: http://drupal.org/project/registry_rebuild

Ada banyak informasi di halaman proyek.

jonhattan
sumber
Ini adalah metode saya yang paling disukai untuk memindahkan modul. Saya memiliki beberapa modul yang diaktifkan sites/all/modulesyang harus dipindahkan ke contribsubdirektori. Yang harus saya lakukan adalahdrush dl registry_rebuild; mv OLD_PATH/module NEW_PATH/module; drush rr
Sumeet Pareek
Ini berhasil untuk saya. Saya memindahkan semua modul saya terlebih dahulu kemudian melakukan registry_rebuild
gerl
Menariknya, drush rr --fire-bazookamengarah ke kesalahan, tetapi drush rrbaik-baik saja.
Alex Skrypnyk
5

Pertama, selalu buat cadangan database Anda, begitu mudahnya Anda akan menendang diri sendiri jika terjadi kesalahan dan Anda tidak membuat cadangan.

Saya tidak yakin apakah itu penting jika Anda menonaktifkan modul atau tidak; Anda mungkin ingin melakukannya, untuk berjaga-jaga. Kemudian lakukan ini:

  1. Masukkan situs Anda dalam mode pemeliharaan di (sitename) / admin / config / development / maintenance
  2. Pindahkan modul Anda secara fisik di sistem file.
  3. Bersihkan cache Anda di (sitename) / admin / config / development / performance, atau cukup simpan kembali halaman modul Anda.

Semua selesai! Drupal akan mencari kembali semua modul yang diinstal.

John Laine
sumber
+1 untuk mode maintaince, selalu senang melakukan ini sebelum melakukan hal seperti ini
Cyclonecode
1
Ini menyebabkan kesalahan fatal 100% dari waktu untuk saya. Mungkin ini berfungsi jika Anda memindahkan modul yang tidak memiliki dependensi atau sesuatu.
ergophobe
4

Mengapa Anda tidak mencoba modul Membangun Kembali Registry . Itu bekerja setiap saat untuk saya.

Berikut ini adalah kutipan tentang hal itu (dari halaman proyek modul):

Ada saat-saat di Drupal 7 ketika registri disingkirkan tanpa harapan dan Anda perlu membangun kembali registri (daftar kelas PHP dan file yang mereka bawa). Namun, kadang-kadang, Anda tidak dapat melakukan aktivitas bersih-cache ini karena beberapa kelas diperlukan saat sistem mencoba melakukan bootstrap.

drupalastik
sumber
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi. Jika ada prosedur untuk memindahkan modul yang termasuk menggunakan modul yang Anda tautkan, mohon jelaskan.
Mołot
Tidak ada teori ... itu berhasil. Ikuti instruksi di halaman. Saya menggunakan metode drush dan hanya berhasil.
iLLin
3

Anda dapat menggunakan modul Registry Rebuild , yang terintegrasi dengan Drush melalui Drush RRperintah.

Pada dasarnya yang Anda lakukan adalah langkah-langkah ini:

  1. Pindahkan modul Anda ke direktori lain, dan
  2. Registry Rebuild kemudian akan membangun kembali tabel sistem untuk mendapatkan modul di tempat yang tepat.

Saya pertama kali belajar / menemukannya melalui DrupalEasy Podcast # 133 , yang selanjutnya menjelaskan bagaimana modul / drush cmd ini dapat digunakan.

PS: Tentu saja, pertama-tama lakukan backup situs Anda ...

Pierre
sumber
3
Saya yang kedua ini. Cadangkan situs. Pindahkan semua modul ke folder baru. Jalankan kembali registri dengan drush, atau cukup ikuti instruksi dan navigasikan ke file php yang disertakan untuk menjalankannya. Sederhana.
Collins
2

Kunjungi / admin / build / modul itu akan membangun kembali jalur di tabel sistem. Terkadang drupal tidak dapat bootstrap lagi sehingga solusi ini tidak berfungsi dalam kasus ini. Jika tidak berhasil, Anda dapat menggunakan Drush Rebuild Project Paths seperti yang dikatakan dalam jawaban sebelumnya. Anda harus menambahkan perintah drush baru sebelum memecah bootstrap. Untuk menambahkan perintah baru, periksa bagian PERINTAH readme

Zatox
sumber
2

Saya memiliki beberapa masalah dengan drush dl tidak bekerja karena masalah direktori modul. Secara umum saya suka tumpukan jawaban yang bisa saya tempelkan agar semuanya berfungsi. Di sini Anda menemukan beberapa baris yang akan menginstal Drush Rebuild Registry dan menjalankannya di situs Anda jika Anda sudah berada di direktori situs yang tepat.

pushd ~  # good if drush on your site is broken because of moved modules
drush dl -y registry_rebuild
popd 
drush rr
keuangan fifi
sumber
2

Saya tidak 100% yakin pada jawaban drupal-esk sejati tetapi dalam pengalaman saya:

Saya tidak sengaja memindahkan salah satu folder modul khusus saya ke folder modul khusus lainnya ketika melakukan FTP ke server. Mereka berdua masih bekerja. Drupal tampaknya telah mengenalinya sebagai modul yang terpisah meskipun berada di folder modul lain. Saya tidak perlu menonaktifkan modul.

** Modul yang saya pindahkan TIDAK memiliki file .install, jadi saya tidak yakin apakah itu penting.

Exziled
sumber
File instalasi hanya untuk prosedur yang dipanggil selama pemasangan modul dan bukan keharusan. Ini berhasil karena Anda dapat memiliki struktur folder di bawah / sites / all / modules, drupal akan mencari file .info secara rekursif.
gbyte.co
@ gbyte.co terima kasih atas klarifikasi! Saya tahu tentang file instal tetapi tidak tahu proses rekursif drupal untuk mencari file .info. Saya pikir tidak masalah subfolder mana mereka berada tetapi bagus untuk memiliki jawaban yang solid!
Diasingkan
1

Distribusi Drupal tidak menangani ini dengan baik, jadi baru-baru ini setelah secara tidak sengaja berakhir dengan salinan Entity API di sites/all/situs Panopoly, tidak ada yang berhasil. Registry dibangun kembali, memuat halaman modul dan semua yang lain menyebabkan kesalahan fatal.

Menonaktifkan modul juga tidak mudah jika Anda harus memindahkan sesuatu seperti Entity API yang diperlukan oleh banyak modul lain di Panopoly.

Untuk mengatasi ini, untuk API Entitas Anda akan melakukan sesuatu seperti ini:

  1. Perbarui jalur dalam tabel sistem:

    UPDATE `system` 
      SET `filename` = REPLACE(
        `filename`, 
        'sites/all/modules/entity', 
        'profiles/panopoly/modules/contrib/entity'
      );
  2. Kemudian bangun kembali registri:

    drush rr
ergophobe
sumber
1

Drupal 7

Pertama-tama, cobalah drush rr.

Jika tidak berhasil, setelah memindahkan file, coba perintah Drush berikut ini di direktori root Drupal Anda:

drush sqlq "TRUNCATE cache; TRUNCATE cache_bootstrap;"
php -r "define('DRUPAL_ROOT', getcwd()); require_once DRUPAL_ROOT . '/includes/bootstrap.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION); registry_rebuild(); registry_update(); cache_clear_all();"
drush -y cc all

Jika di atas tidak berfungsi, cari tabel yang masih memiliki informasi lama tentang jalur dengan:

drush --ordered-dump sql-dump | grep "sites/all/modules" # Change the path to the old one.

Jika tidak ada yang ditemukan, itu berarti itu adalah cache eksternal Anda.

Jika demikian, jangan lupa untuk memulai kembali, misalnya:

killall -HUP memcached
drush eval "function_exists('xcache_clear_cache') && xcache_clear_cache();"

Lihat lebih lanjut: Metode apa yang digunakan untuk menghapus cache di Drupal?


Atau Anda dapat mencoba pertanyaan MySQL berikut setelah memindahkan file:

UPDATE system SET filename = REPLACE(filename, "sites/all/modules", "sites/newplace/modules") WHERE
       filename LIKE "sites/all/modules/%" AND type = "module"
       AND name IN ("my", "module", "whose", "path", "changed");

UPDATE registry SET filename = REPLACE(filename, "sites/all/modules", "sites/newplace/modules") WHERE
       filename LIKE "sites/all/modules/%"
       AND module IN  ("my", "module", "whose", "path", "changed");
kenorb
sumber
1

Direkomendasikan untuk memindahkan modul Anda ke subfolder contrib / dev / patched / custom. Namun tidak ada perolehan kinerja, ini dilakukan karena alasan praktis dan estetika. Ini akan membuat kehidupan pengembang masa depan lebih mudah.

Anda dapat memindahkan sebagian besar modul contrib ke subfolder tanpa masalah di situs langsung. Anda harus menghapus cache setelahnya. Jika Anda tidak menggunakan drush dan menemukan Anda tidak dapat mengakses halaman pembersihan cache lagi, Anda harus mengunjungi /update.php atau memotong tabel cache secara manual. Saya hanya perlu melakukan bit terakhir saat memindahkan modul API entitas.

Memindahkan modul inti secara teknis dimungkinkan, tetapi saya tidak akan merekomendasikannya atau melihat alasan yang sah untuk melakukan ini.

Pembaruan: Memindahkan modul seperti API entitas mungkin memerlukan pembangunan kembali registri. Lihat halaman registry_rebuild .

gbyte.co
sumber
-4

Anda bisa menambahkan tautan sym di direktori situs / semua / modul yang menunjuk ke situs / semua / contrib. Saya tidak yakin apakah itu menyelesaikan masalah Anda. Ada solusi lain juga, termasuk profil instalasi, atau file make drush. Saya tidak cukup tahu untuk memberikan rincian tentang mereka tetapi setidaknya itu adalah arah yang bisa Anda lihat.

lexicant
sumber
5
Ini sakit kepala pemeliharaan dalam jangka panjang
AgA
ini adalah retasan dan berkeliling memperbaiki ... bukan solusi yang baik.
iLLin
ya jauh lebih baik menggunakan drush registry_rebuild sekarang tersedia.
lexicant