tra-loi-cau-hoi-phat-trien-web.com

Plugin Joomla để ghi đè tiền tố bảng

Tổng quan : Tôi có một trang web Joomla có nhiều bản sao khác nhau của các bảng cơ sở dữ liệu trong cùng một cơ sở dữ liệu, nhưng với các tiền tố bảng khác nhau.

Tùy thuộc vào người dùng nào đang truy cập trang web, tôi cần thay đổi tiền tố bảng j Joomla nào được sử dụng để hiển thị các bảng có liên quan.

Điều này phải được trang web rộng.

Vấn đề : với hack mã lõi tôi có thể thay đổi tiền tố khi cần, nhưng sẽ thích cái này như một plugin.

Với plugin tôi có thể nhận được tiền tố, sử dụng $ db-> getPrefix () và tôi có thể đặt phiên bản kết nối ngay lập tức bằng cách sử dụng $ db = JDatabaseDriver :: getInstance (tùy chọn $). Nhưng đây không phải là trang web rộng và được ghi đè bởi tiêu chuẩn $ db = JFactory :: getDbo ().

Vì vậy, tôi cần một plugin hệ thống sẽ thay thế mọi phiên bản của tiền tố bảng khi nó được chạy.

Có ý kiến ​​gì không?

4
Shaun

Hoàn toàn không có cách nào để làm điều này từ bên trong một plugin, điều này là do Joomla bắt đầu truy cập vào cơ sở dữ liệu trước khi tải các plugin.

Cách duy nhất để làm điều này là từ bên trong configuration.php tập tin, nơi bạn nên có logic (bạn nên tạo một hàm có tên getTablePrefix there). Bạn phải đảm bảo rằng Joomla không thể ghi vào tệp này, bởi vì nếu làm như vậy, thì nó sẽ phá hủy các thay đổi của bạn.

Tôi đã nghĩ về việc làm điều này thông qua defines.php tập tin, nhưng nó không thể được thực hiện ở đó vì nó được tải trước khi cấu hình được tải.

Bằng cách này, câu hỏi tuyệt vời, nhưng tôi cũng tò mò về lý do tại sao bạn cần phải có một bộ bảng khác nhau cho mỗi người dùng. Có lẽ giải pháp tốt nhất sẽ là suy nghĩ lại toàn bộ logic.

1
itoctopus

Tôi đoán cách duy nhất để làm điều đó là thêm class JDatabaseDriverCustom extends JDatabaseDriverMySql Tùy chỉnh của bạn và bạn sẽ có thể đi với một vài tùy chọn:

  • viết logic phụ thuộc vào người dùng ngay bên trong trình điều khiển;
  • gọi một số chức năng mà bạn sẽ viết ở một nơi khác;

Dù sao, hãy suy nghĩ về: bạn có thực sự cần trang web để phụ thuộc vào người dùng, hoặc vào một cái gì đó như IP hoặc bất cứ điều gì không liên quan đến Joomla. Bằng cách này, bạn sẽ có thể viết __constructor() bên trong tệp cấu hình của mình và đặt logic ngay tại đó và thay đổi $this->db_prefix.

0
Alexandr