2012-10-10 23 views
5

Tôi đang tìm một giải pháp tốt để ghi đè cấu hình Magento mà không thay đổi các giá trị mặc định. Ví dụ: tôi muốn ghi đè mục "web/unsecure/base_skin_url" trong bảng core_config_data mà không xóa giá trị hiện tại. Vì vậy, nếu bất cứ nơi nào trong mã này chính xác được gọi là:Ghi đè Cấu hình Magento

Mage::getStoreConfig('web/unsecure/base_skin_url'); 

Nó sẽ tìm thấy tùy chọn cấu hình tôi thiết lập và không phải là một mặc định ...

Cảm ơn trước!

Chuck

Trả lời

9

Magento đọc giá trị cấu hình của nó trong thời gian chạy trực tiếp từ cấu trúc cây đối tượng cấu hình, vì vậy bạn cần phải sử dụng phương pháp setNode mẹ đẻ của đối tượng cấu hình để thay đổi các giá trị. Tuy nhiên, vì cách mà Magento loads in scoped configuration (tự liên kết), nó không thẳng thắn như nó có vẻ.

Với phiên bản hiện tại của Magento (và tôi tin rằng, nhưng chưa được thử nghiệm, với các phiên bản cũ hơn), bạn sẽ cần đặt giá trị cấu hình trong tập hợp các nút cho store hiện tại.

Bước một là nhận mã cho cửa hàng hiện được đặt. Bạn có thể làm điều này lập trình với những điều sau

$store = Mage::app()->getStore(); 
$code = $store->getCode(); 

sau đó, bạn có thể đặt một giá trị cấu hình với các cuộc gọi sau

$config = Mage::getConfig(); 
$config->setNode("stores/$code/web/unsecure/base_skin_url", 'value_to_set'); 

Hãy ghi nhớ điều này tất cả cần phải xảy ra sau Magento đã bootstrapped cấu hình vật. Cũng nên nhớ rằng có một khoảng thời gian Magento sẽ có cấu hình được nạp, nhưng đối tượng lưu trữ sẽ không được nạp. Nếu đây là trường hợp bạn không thể tải mã cửa hàng từ đối tượng cửa hàng.

Tôi đã làm điều gì đó tương tự trong số Pulse Storm Chaos module của mình. Nếu bạn quan tâm đến mã hoạt động, nó là Github.

+0

Cảm ơn lời giải thích tuyệt vời Alan! Tôi có thể thấy cách làm việc này sẽ hoạt động tốt trên cấu hình trên mỗi cửa hàng nhưng nếu tôi muốn tất cả các cửa hàng (và trang web) sử dụng tùy chọn cấu hình tùy chỉnh của tôi thì sao? Về bản chất, tôi muốn tùy chọn cấu hình tùy chỉnh của mình là toàn cầu ... –

+0

@ChuckD Phiên bản ngắn: Bạn sẽ cần thêm nó cho mỗi cửa hàng trong hệ thống (nhiều cuộc gọi). Khi Magento tạo ra các cửa hàng/store_code nút nó sẽ xem xét các giá trị mặc định và trang web. Bằng cách đó, phương thức getStoreConfig luôn có thể xem xét các cửa hàng/store_code để tìm đúng giá trị. –

+0

Chuck, bạn đã thử '$ config-> setNode (" global/web/unsecure/base_skin_url ", 'value_to_set');'? Chỉ là một ý tưởng, chưa được kiểm chứng. – Jongosi

1

Nếu bạn muốn ghi đè lên một số dữ liệu cấu hình đặc biệt, bạn có thể đặt nó trong ứng dụng/etc/local.xml. Nhưng điều đó chỉ hữu ích cho cửa hàng của riêng bạn, không phải cho các mô-đun công cộng.

Có cách để ghi đè base_url cho mục đích phát triển mà không thay đổi cơ sở dữ liệu.

<config> 
... 
    <stores> 
     <default> 
      <web> 
       <unsecure> 
        <base_url>http://dev.myshop.com/</base_url> 
       </unsecure> 
       <secure> 
        <base_url>http://dev.myshop.com/</base_url> 
       </secure> 
      </web> 
     </default> 
     <admin> 
      <web> 
       <unsecure> 
        <base_url>http://dev.myshop.com/</base_url> 
       </unsecure> 
       <secure> 
        <base_url>http://dev.myshop.com/</base_url> 
       </secure> 
      </web> 
     </admin> 
    </stores> 
... 
</config> 
+0

Bạn chỉ ghi lại giá trị cho cửa hàng có mã "mặc định" và quản trị viên. Ngoài ra, sau khi hợp nhất cấu hình toàn cầu từ tất cả các tệp XML, Magento cập nhật nó từ bảng core_config_data. Nếu giá trị trong phạm vi cửa hàng được xác định trước khi nó sẽ ghi đè giá trị từ xml. –

+0

Đó chính xác là những gì tôi đang tìm kiếm. Tôi bỏ lỡ thẻ "", nhưng bây giờ nó hoạt động :) Tôi không hoàn toàn chắc chắn về những điều mà @PavelNovitsky nói. Nhưng đối với một trang web một cửa hàng đơn giản, điều này là đủ. – func0der

7

Câu trả lời của Alan là chính xác nhưng không quan tâm đến bộ nhớ cache cấu hình. Ví dụ: nếu bạn gọi Mage::getStoreConfig('web/unsecure/base_skin_url') hai lần và thay đổi giá trị ở giữa, thay đổi sẽ không có hiệu lực. Để khắc phục sự cố này, bạn nên sử dụng $store->setConfig('web/unsecure/base_skin_url', 'value_to_set'). Nó làm cả hai: cập nhật bộ nhớ cache cấu hình và thiết lập nút config với phương thức của Alan.

+2

Cảm ơn bạn, nó hoạt động! Nếu ai đó tò mò về cách lấy biến '$ store', được đề cập trong câu trả lời:' $ store = Mage :: app() -> getStore(); ' –

Các vấn đề liên quan