Định tuyến danh mục Magento EE 1.13


7

CẬP NHẬT
Dưới đây là câu hỏi ban đầu, và trong khi nó liên quan đến vấn đề cuối cùng là gì, thì nó lại tiếp tục. Vui lòng xem các chỉnh sửa bắt đầu bằng số 2 để biết thêm thông tin cơ bản hữu ích

Trên trang web của chúng tôi, chúng tôi có một số trang CMS giải thích mối tương quan giữa hai loại khác nhau. Như vậy, các URL có xu hướng tương tự như các URL trang danh mục đó.

  • Một ví dụ về URL CMS:
    • "nhãn hiệu / danh mục.html"
  • Danh mục phù hợp:
    • "thể loại"

Có một thiết lập trong Magento để buộc khớp tuyến đường loại nghiêm ngặt hơn không?

EDIT: Tôi nên lưu ý, mặc dù nó cảm thấy rõ ràng: Đây chỉ là tên ví dụ

EDIT 2: Nếu nó hữu ích, tất cả các trang danh mục đều có URL liên quan đến root (website.com/subcat) trong đó subcat là con của một danh mục khác. Hành vi này khác với mặc định trong các cài đặt Magento khác. (Lưu ý: điều này không được ưa thích và không rõ tại sao nó lại xảy ra).

EDIT 3: Sau khi đào sâu hơn, tôi đã tìm thấy một trích dẫn từ một bài viết của Fabrizio Branca về các khóa URL trong 1.13:

Trước 1.13 / 1.8, bất kỳ trang CMS nào có khóa url cũng được sử dụng làm khóa url danh mục hoặc sản phẩm sẽ được đánh giá trước tiên. Bằng cách này, bạn có thể dễ dàng thay thế các danh mục chính bằng các trang đích cms. Điều này đã thay đổi ngay bây giờ. Mặc dù bộ điều khiển CMS được xử lý trước tiên, các url của sản phẩm và danh mục sẽ được đánh giá trước khi quá trình định tuyến bắt đầu, khiến việc hiển thị nội dung cms theo cách sạch sẽ khó khăn hơn nhiều.

EDIT 4: Kết quả của nhiều nghiên cứu hơn:

  • "danh mục hợp pháp" tồn tại và theo mặc định có thể truy cập tại /a
  • "danh mục hợp pháp khác" cũng tồn tại và b
  • bất kể mối quan hệ giữa hai loại này, có thể được truy cập bằng cách sử dụng cái kia làm cha mẹ của nó ( a/bhoạt động tốt, như vậy b/a).
    • lưu ý rằng a/bhiển thị các sản phẩm của bb/acác sản phẩm của a
  • Tuy nhiên , b/bkhông hoạt động, cũng khôngnon-existant-category/a

Điều tôi đang tìm kiếm là một cấu trúc URL tương tự như các phiên bản Magento trước đây (IE category/subcategory), mà không làm mất các lợi ích của việc lập chỉ mục nền mà 1.13 mang lại.


Tôi nghĩ bạn sẽ cần phải giải thích "Có cài đặt nào trong Magento để buộc khớp tuyến đường loại nghiêm ngặt hơn không" một chút nữa.
đánh dấu

Chà, rõ ràng Magento đang đưa ra các giả định bằng cách khớp yêu cầu website.com/brand/category.htmlvới tuyến đường website.com/category. Câu hỏi của tôi là làm thế nào để điều đó không xảy ra.
mpw

Không có mẹ đẻ kết nối chương trình giữa URL loại SEF và URL trang CMS.
đánh dấu

Tôi đánh giá cao việc bạn gắn bó với tôi về vấn đề này, nhưng tôi không chắc cách sử dụng nhận xét đó để giúp tìm ra giải pháp.
mpw

Bạn đang hỏi về cài đặt "mức độ nghiêm ngặt" cho các URL danh mục và bạn cung cấp ngữ cảnh cho câu hỏi này liên quan đến các trang CMS. Không có kết nối gốc như vậy trong Magento, vì vậy chúng tôi sẽ phải biết thêm về câu hỏi của bạn, môi trường của bạn (các tùy chỉnh, v.v.). Các tuyến cho các thực thể này dựa trên dữ liệu trong các bảng hoàn toàn khác nhau và có các lớp bộ định tuyến riêng cho mỗi thực thể.
đánh dấu

Câu trả lời:


7

( Nghĩ rằng tôi đã đăng một câu trả lời tương tự như của Alan , nhưng tôi đã không. Ngồi ở đây trong LocalStorage. Nhưng, tôi có thể gắn thẻ câu trả lời của anh ấy với một lý thuyết giải pháp thú vị. )

Bộ định tuyến CMS tự thêm vào phiên bản Bộ điều khiển phía trước bằng cách quan sát controller_front_init_routerssự kiện sau khi bộ định tuyến Quản trị viên và Tiêu chuẩn được thêm vào. Với một chút cấu hình XML, có thể chuyển đổi nó thành controller_front_init_beforesự kiện , do đó thêm bộ định tuyến CMS trước , nghĩa là match()logic ing của nó sẽ chạy trước các sự kiện khác.

Để kiểm tra lý thuyết này, hãy bỏ phần sau vào app / etc / local.xml :

<frontend>
    <events>
        <!-- fire observer for different event -->
        <controller_front_init_before>
            <observers>
                <cms>
                    <class>Mage_Cms_Controller_Router</class>
                    <method>initControllerRouters</method>
                </cms>
            </observers>
        </controller_front_init_before>
        <!-- disable the original observer -->
        <controller_front_init_routers>
            <observers>
                <cms>
                    <type>disabled</type>
                </cms>
            </observers>
        </controller_front_init_routers>
    </events>
</frontend>

Xem nếu điều này giải quyết vấn đề.

Ngẫu nhiên, bộ định tuyến CMS sẽ điều chỉnh đường dẫn yêu cầu giống như mô hình viết lại URL.


Thật tuyệt vời. Mặc dù tôi không nghĩ có bất cứ điều gì phải làm về phương pháp định tuyến danh mục mới lạ này, việc cho các trang CMS cơ hội phù hợp đầu tiên sẽ đi một chặng đường dài.
mpw

2
Chỉ cần không đặt tên bất kỳ trang CMS nào là "quản trị viên" hoặc bất kỳ tên quản trị viên nào của bạn là :-)
benmark

Ok, đừng bận tâm. Điều này không thực sự hoạt động. Để chắc chắn rằng tôi không điên frontendđược lồng đúng cách config-> frontend, vâng?
mpw

Đúng. Đảm bảo rằng nó đang được tải, nhưng bạn có thể đặt điểm dừng, bỏ Mage::log()cuộc gọi (hoặc tiếng vang hoặc bất cứ điều gì) Mage_Core_Controller_Varien_Action::addRouter()để xem thứ tự các lớp bộ định tuyến được thêm vào.
đánh dấu

Tôi chỉ có thể thấy addRouterphương pháp trong Mage_Core_Controller_Varien_Front. Bất kể, thứ tự theo đầu ra nhật ký là: admin, tiêu chuẩn, cms, mặc định.
mpw

6

Tôi đã thấy rất nhiều triển khai thú vị (một số tốt, một số xấu) bởi các chuyên gia SEO, những người không có nền tảng Magento trong suốt những năm qua. Có vẻ như bạn có thể gặp vấn đề với một số mã tùy chỉnh mà bạn không hiểu. Câu trả lời cấp cao cho câu hỏi của bạn có thể là "Liên hệ với người đã viết mã SEO và / hoặc cài đặt tiện ích mở rộng mà bạn không hiểu" hoặc tìm chuyên gia tư vấn Magento để xem và nhanh chóng mổ xẻ cho bạn.

Câu hỏi của bạn, ngay cả với sự làm rõ của nó, vẫn còn quá khó hiểu. Nói theo nghĩa đen, không, không có thiết lập nào trong Magento để "buộc định tuyến danh mục phải nghiêm ngặt hơn". Tôi sẽ giải thích, theo nghĩa rộng, cách định tuyến danh mục hoạt động so với định tuyến CMS trong hệ thống Magento tiêu chuẩn. Điều này sẽ (hy vọng) cung cấp cho bạn đủ thông tin để đặt câu hỏi mới theo thuật ngữ chúng tôi sẽ có thể hiểu nó bằng cách. Ngoài ra, tôi đã viết nhiều về công văn yêu cầu của Magento trước đây, vì vậy nếu bạn quan tâm đến các chi tiết ghê rợn, tôi sẽ bắt đầu từ đó .

Định tuyến danh mục

Nói đúng ra, không có định tuyến "danh mục" trong Magento. Trên một trang web có URL Thân thiện với SEO bị tắt, một trang danh sách danh mục trông như thế này.

http://magento.example.com/catalog/category/view/id/8

Khi URL thân thiện với SEO được bật, Magento (đang trong quá trình lập chỉ mục) sẽ tạo ra từ một đến một số mục trong

core_url_rewrite

bảng cho thể loại đó. Các request_pathcột là một trong nhập khẩu ở đây. Khi Magento quyết định cách xử lý một URL cụ thể, đầu tiên nó sẽ tìm trong bảng này. Nếu URL hiện tại khớp với request_path, Magento sẽ thay đổi biểu diễn bên trong của URL để nó trông giống như target_pathcột.

Vì vậy, trong dữ liệu mẫu, có một hàng trông như thế này

*************************** 1. row ***************************
url_rewrite_id: 17
      store_id: 1
   category_id: 8
    product_id: NULL
       id_path: category/8
  request_path: electronics/cell-phones.html
   target_path: catalog/category/view/id/8
     is_system: 1
       options: NULL
   description: NULL
1 row in set (0.01 sec)

Khi Magento nhìn thấy url http://magento.example.com/electronics/cell-phones.html, nó khớp với hàng này vì request_pathbiến là electronics/cell-phones.html. Sau đó, nó thay đổi biểu diễn bên trong của URL thành target_path( catalog/category/view/id/8). Sau đó, Magento xử lý URL bình thường.

Đó có thể là một chút để làm theo nếu bạn không quen với nó, nhưng điều quan trọng cần loại bỏ là hệ thống quyết định cách xử lý URL không quan tâm rằng đó là URL danh mục, nó chỉ quan tâm rằng có một mục trong core_url_rewritebảng . Bảng này được sử dụng cho các URL tên sản phẩm. Nhiều phần mở rộng SEO và giải pháp mã tùy chỉnh cũng sử dụng bảng này.

Định tuyến trang CMS

Sau khi Magento kết thúc việc tham khảo core_url_rewritebảng, điều xảy ra tiếp theo là

  1. Nó kiểm tra xem có phù hợp với trang ứng dụng Quản trị viên không (quản lý sản phẩm, quản lý danh mục, v.v.)

  2. Nó kiểm tra xem có phù hợp với trang ứng dụng Frontend không (trang danh sách sản phẩm, trang danh sách danh mục được đề cập ở trên, v.v.)

  3. Nếu số 1 & 2 không chứa kết quả khớp thì nó sẽ tìm kết quả khớp trang CMS.

Magento không sử dụng core_url_rewritebảng cho các trang CMS. Thay vào đó, nếu đạt đến bước số 3, nó sẽ cố khớp URL với URL Keytập hợp trên đối tượng trang CMS. (sẽ chính xác hơn khi nói rằng khi Magento tìm kiếm một trang CMS phù hợp, nó hoạt động trên một URL đã được sửa đổi bởi core_url_rewritequy trình - nhưng mọi thứ đã đủ khó hiểu)

Vấn đề quan trọng ở đây là: Kết hợp CMS chỉ xảy ra sau khi một trận đấu trang danh mục không thành công.

Có vẻ như bạn có thể có các quy trình bên ngoài sửa đổi core_url_rewritebảng hoặc có thể có một đối tượng bộ định tuyến tùy chỉnh được thêm vào hệ thống của bạn để thực hiện định tuyến bổ sung hoặc thậm chí có thể một hệ thống không phải là magento làm việc để thay đổi URL.

Tôi sợ không có câu trả lời nhanh chóng và dễ dàng cho tình huống của bạn.


Tôi có thể có một giải pháp, xem câu trả lời của tôi
đánh dấu

Tôi không tin rằng bất kỳ mã tùy chỉnh nào đang ảnh hưởng đến việc viết lại URL danh mục (mặc dù tôi sẽ xem xét kỹ core_url_rewritebảng). Ngay từ khi bắt đầu phát triển, tôi có thể nhớ rằng nó subcategorysẽ khớp /subcategory.html(trái ngược với category/subcategory.html) - ngay cả trước khi bất kỳ mã bên ngoài nào được đưa vào. ( \n) Giả sử điều này có thể hữu ích trước đó, nhưng có thể có một sự thay đổi trong EE 1.13 có thể gây ra điều này?
mpw

@mpw Tôi không biết. Cách tiếp cận của tôi là gỡ lỗi những điều này từ dưới lên.
Alan Storm

Chỉ cần kiểm tra core_url_rewritebảng. Nó trống rỗng. Thể này có bất cứ điều gì để làm với các vấn đề của tôi?
mpw

1
Theo như tôi có thể nói, core_url_rewrite không được sử dụng trong 1.13, mặc dù tôi không chắc về điều đó. Tôi nghĩ rằng hiện tại chỉ có Enterprise_url_rewrite được sử dụng.
Josh

5

Điều tôi đang tìm kiếm là một cấu trúc URL tương tự như các phiên bản Magento trước đây (danh mục / danh mục con IE), mà không làm mất các lợi ích của việc lập chỉ mục nền mà 1.13 mang lại.

Đây là một vấn đề tôi đã xem xét, mà cho đến nay dường như không có một giải pháp tuyệt vời. Chúng tôi có một số loại lồng nhau sâu, ví dụ:

Cat A
    Cat B
        Cat C
            Cat D

Trước 1.13, url danh mục sẽ được tạo dưới dạng www.domain.com/cat-a/cat-b/cat-c/cat-d/, nhưng bây giờ, nó tạo ra dưới dạng www.domain.com/catd. Mặc dù nếu bạn có nhiều "Cat D", thì nó có thể tạo ra một cái gì đó như www.domain.com/catalog/c Ab / view / s / cat-d / id / 32 /.

Tôi đã tìm hiểu các ý tưởng khác nhau để giải quyết vấn đề này, một điều tôi đang cố gắng ngay bây giờ là sửa đổi phương thức loadByRequestPath của Enterprise_UrlRewrite_Model_Resource_Url_Rewrite để tìm đường dẫn đầy đủ trước khi sử dụng hành vi mặc định. Tôi đã làm điều đó bằng cách thêm phương pháp này:

protected function tryLoadByFullPath($object, $paths)
{
    if (count($paths) > 1) {
        $_path = implode('/', $paths);

        $select = $this->_getReadAdapter()->select()
            ->from(array('m' => $this->getMainTable()))
            ->where('m.request_path = ?', $_path);

        $result = $this->_getReadAdapter()->fetchRow($select);

        if ($result) {
            $object->setData($result);
            $this->unserializeFields($object);
            $this->_afterLoad($object);

            return true;
        }
    }

    return false;
}

và sau đó thêm mã này vào đầu loadByRequestPath ():

if ($this->tryLoadByFullPath($object, $paths)) {
        return $this;
}

Dường như nó hoạt động, thoạt nhìn, tôi chưa thử nó rất tốt. Nhược điểm của điều này là url_key phải được đặt thủ công thành đường dẫn đầy đủ cho mọi danh mục, do đó bạn sẽ phải đặt khóa url cho Cat D thành "cat-a / cat-b / cat-c / cat-d ". Đó rõ ràng là không lý tưởng.

Dù sao, điều đó có lẽ không hữu ích lắm, nhưng có lẽ ai đó có cách tiếp cận tốt hơn.


Chỉ vui vì không cô đơn trong chuyện này! Nếu chúng tôi tìm thấy một giải pháp, tôi chắc chắn sẽ báo cáo nó.
mpw

5

@benmark trả lời là tốt rồi. Nhưng bạn vẫn sẽ gặp sự cố nếu URL sản phẩm của bạn khớp với URL trang CMS của bạn. URL ghi lại từ bảng core_url_rewriteđược kiểm tra trước khi các bộ định tuyến được kiểm tra - xem Mage_Core_Controller_Varien_Front::dispatch:

public function dispatch()
{
    // [...]
    $this->_getRequestRewriteController()->rewrite();

    Varien_Profiler::start('mage::dispatch::routers_match');
    $i = 0;
    while (!$request->isDispatched() && $i++ < 100) {
        foreach ($this->_routers as $router) {
            /** @var $router Mage_Core_Controller_Varien_Router_Abstract */
            if ($router->match($request)) {
                break;
            }
        }
    }
    // [...]
}

Nếu một URL sản phẩm khớp với thông tin đường dẫn hiện tại, thông tin đường dẫn của yêu cầu sẽ được thay đổi Mage_Core_Model_Url_Rewrite_Request::_rewriteDb, để bộ định tuyến CMS sẽ không khớp nữa ngay cả khi nó được gọi trước bộ định tuyến danh mục (nếu bạn đã áp dụng @benmark config.xml) .

May mắn thay, có một lá cờ đẹp được gọi straight, có thể được đặt trên a Mage_Core_Controller_Request_Http. Nếu cờ được đặt, URL sẽ ghi lại từ cơ sở dữ liệu sẽ không được kiểm tra. Do đó, giải pháp của tôi là quan sát một sự kiện, được kích hoạt đủ sớm ( controller_front_init_before) và đặt straightcờ theo yêu cầu trong đó nếu thông tin đường dẫn hiện tại khớp với mã định danh trang CMS:

Trong tệp cấu hình của bạn:

<global>
    <events>
        <controller_front_init_before>
            <observers>
                <namespace_module>
                    <class>namespace_module/observer</class>
                    <method>controllerFrontInitBefore</method>
                </namespace_module>
            </observers>
        </controller_front_init_before>
    </events>
<global>

Phương pháp quan sát của bạn:

class Namespace_Module_Model_Observer
{

    public function controllerFrontInitBefore(Varien_Event_Observer $observer)
    {
        /** @var Mage_Core_Controller_Request_Http $request */
        $request = $observer->getFront()->getRequest();

        $identifier = trim($request->getPathInfo(), '/');
        $pageId = Mage::getModel('cms/page')->checkIdentifier($identifier, Mage::app()->getStore()->getId());

        if ($pageId) {
            $request->isStraight(true);
        }
    }

}

Vì bộ định tuyến danh mục sẽ không khớp nếu URL cơ sở dữ liệu ghi lại không được áp dụng, giải pháp này sẽ tự hoạt động và bạn thậm chí không cần cấu hình của tệp @benmark.

Hy vọng điều này sẽ giúp được ai đó - điều đó đã mất khá nhiều nỗ lực để gỡ lỗi!


Rất đẹp tìm thấy.
đánh dấu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.