2010-11-11 36 views
10

Tôi hiện đang tìm cách tạo các url/định tuyến tùy chỉnh bằng magento, hiện tại tôi đã đặt tuyến đường mặc định trong config.xml trong mô-đun cục bộ.Gernerate url tùy chỉnh trong Magento

<frontend> 
<routers> 
     <portfolios> 
      <use>standard</use> 
      <args> 
       <module>Custom_Portfolios</module> 
       <frontName>portfolios</frontName> 
      </args> 
     </portfolios> 
    </routers> 
    <default> 
     <router>portfolios</router> 
    </default> 
</frontend> 

Điều này hiện đang hoạt động với đường dẫn url/danh mục/index/action/custom-string là tuyến đường mặc định của Magento. Điều tôi đang cố gắng đạt được là có /portfolios/custom-string.html Tôi đã cố gắng sử dụng quy tắc mod_rewrite không thành công, tôi đã tìm thấy một số tham chiếu liên quan đến việc sử dụng hậu tố tùy chỉnh của .html mà tôi đã thêm vào cùng một tệp config.xml.

<default><portfolios><seo><portfolios_url_suffix>.html</portfolios_url_suffix></seo></portfolios></default> 

Tôi đã xem các tài liệu về bão định hướng liên quan đến định tuyến và thấy nó phù hợp với đường dẫn định tuyến mặc định hoặc thông tin không cập nhật.

Bạn có biết phương pháp tốt nhất để kiểm soát việc định tuyến trong Magento có thể dễ dàng làm theo và hướng dẫn có liên quan không? nếu có xin vui lòng chia sẻ: D nhiều người

Trả lời

8

Cách để làm điều này là viết lại URL. Trong thực tế, cấu hình hậu tố mà bạn tìm thấy có thể được sử dụng bởi Mage_Catalog để tạo ra các bộ ghi đè của nó. Tôi đang tiếp cận tính năng đặc biệt này lần đầu tiên vì vậy đoạn mã này nên được thực hiện với một nhúm muối ...

// Creating a rewrite 
/* @var $rewrite Mage_Core_Model_Url_Rewrite */ 
$rewrite = Mage::getModel('core/url_rewrite'); 
$rewrite->setStoreId($store_id) 
     ->setIdPath('portfolios/'.$url_key) 
     ->setRequestPath('portfolios/'.$url_key.'.html') 
     ->setTargetPath('portfolios/index/action/id/'.$url_key) 
     ->setIsSystem(true) 
     ->save(); 

Cần phải viết lại mới cho mỗi đường dẫn có thể.

Chỉnh sửa; Tôi đã thêm setIdPath vì có thể cần thiết.

+0

tôi sẽ điều tra này hơn nữa, bạn sẽ biết cách tốt nhất để tham khảo nó từ một con đường trong xml nếu không tôi sẽ nhận được thông báo lỗi 404 xuất hiện? – Ryan

+0

Xin lỗi tôi không hiểu câu hỏi. – clockworkgeek

+0

khi tôi nhấn danh mục đầu tư/blah.html nó hiện được chuyển tiếp đến trang lỗi 404, tôi đoán điều này là nguyên nhân gây ra định tuyến không tồn tại và do đó gây ra sự cố, bạn có biết tôi sẽ cần tham chiếu đến mã này làm phương pháp trong tập tin xml hoặc tôi sẽ chỉ cần chạy mã này một lần? – Ryan

0

Phương pháp đơn giản nhất (khi bạn không cần tự động tạo nhiều url) là sử dụng mô-đun Viết lại Url được tích hợp sẵn. Chuyển đến phần phụ trợ quản trị ->Danh mục ->Quản lý ghi đè url và thiết lập bất kỳ url nào bạn viết lại.

+2

Xin chào, tôi tin rằng điều này sẽ chỉ thực sự hoạt động khi url được biết mà không cần tạo trước hàng nghìn quy tắc theo cách thủ công. cảm ơn bạn cho imput của bạn mặc dù. – Ryan

15

Mã dưới đây là chưa được kiểm tra, nhưng nên làm việc

Nếu bạn không muốn xác định tùy chỉnh viết lại cho từng hạng mục protfolio, chỉ cần làm theo các bước sau:

  1. Viết lớp Router tùy chỉnh của bạn được mở rộng từ Mage_Core_Controller_Varien_Router_Standard và triển khai phương thức match:

    public function match(Zend_Controller_Request_Http $request) 
    { 
        $path = explode('/', trim($request->getPathInfo(), '/')); 
        // If path doesn't match your module requirements 
        if (count($path) > 2 && $path[0] != 'portfolios') { 
         return false; 
        } 
        // Define initial values for controller initialization 
        $module = $path[0]; 
        $realModule = 'Custom_Portfolios'; 
        $controller = 'index'; 
        $action = 'action'; 
        $controllerClassName = $this->_validateControllerClassName(
         $realModule, 
         $controller 
        );    
        // If controller was not found 
        if (!$controllerClassName) { 
         return false; 
        }    
        // Instantiate controller class 
        $controllerInstance = Mage::getControllerInstance(
         $controllerClassName, 
         $request, 
         $this->getFront()->getResponse() 
        ); 
        // If action is not found 
        if (!$controllerInstance->hasAction($action)) { 
         return false; // 
        }    
        // Set request data 
        $request->setModuleName($module); 
        $request->setControllerName($controller); 
        $request->setActionName($action); 
        $request->setControllerModule($realModule);    
        // Set your custom request parameter 
        $request->setParam('url_path', $path[1]); 
        // dispatch action 
        $request->setDispatched(true); 
        $controllerInstance->dispatch($action); 
        // Indicate that our route was dispatched 
        return true; 
    } 
    
  2. Xác định bộ định tuyến tùy chỉnh của bạn trong config.xml:

    <stores> 
        <default> 
         <web> 
          <routers>        
           <your_custom> 
            <area>frontend</area> 
            <class>Custom_Portfolios_Controller_Router_Custom</class> 
           </your_custom> 
          </routers> 
         </web> 
        </default> 
    </stores> 
    
  3. Thưởng thức định tuyến tùy chỉnh của bạn trong Magento :)

+0

Tôi đã tìm thấy giải pháp ở trên đã hoạt động cho các nhu cầu của mình và do đó không sử dụng giải pháp này. Cảm ơn bạn đã dành thời gian trả lời câu hỏi này. – Ryan

+1

Và đừng quên đặt tên tuyến đường cho yêu cầu - nó đang được sử dụng để xử lý bố cục: $ request-> setRouteName ('someRouteName') –

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