駭客入侵(修正) – 在 Magento 2 後台 Form 表單取得 categories 功能
當您使用PHP製作一個Magento 2後台Form表單則無法有所有UI elements的功能。
我最近遇到了一個將產品目錄列出來的Form表單,並且正在使用一種我已經看到在Stack Overflow網站平台中廣泛使用的hack方法。
這個程式大部分都可以運作,但是由於版本2.2.1和2.2.3之間有些結構改變,以至於一些程式碼會產生錯誤。 它還將根目錄列出來,這些根目錄大多數情況下沒有作用,你可能不希望它們顯示在列表中。 它也看起來很醜,我們可以改善這一點。
這裡是他原來程式碼:
const REPEATER = "__"; const PREFIX_END = ''; $categories = $this->getCategoryCollection(true, false, false, false); private function _toArray() { $categories = $this->getCategoryCollection(true, false, false, false); $catagoryList = array(); foreach ($categories as $key => $category) { $prefix = str_repeat(self::REPEATER, ($category->getLevel()-1) * 1) . self::PREFIX_END; $catagoryList[$category->getEntityId()] = $prefix. $category->getName(); } return $catagoryList; }
在這個例子中你可以看到定義REPEATER是一個下劃線,這個想法是在常規的下拉清單元件中創建一個樹結構,如下所示:
Item 1
__Item 2
____Item 3
相當的醜對吧? 不過,我們稍後會回顧那部分。 這裡最重要的是str_repeat函式 – 在M2的某些版本中,根目錄的初始設置為0 – 這意味著str_repeat第二個參數將會有被帶入負數的情形,那麼網站就會產生fatal error!
所以我們將為此創建一個簡單的修復程序。 首先,我們將檢查分配給根目錄的級別,然後我們將跳過根目錄,然後我們將確保不會有負數帶入str_repeat第二個參數讓它產生錯誤 – 如果是負數,我們將跳過它!
我們修改的程式碼(每個步驟都有註釋):
private function _toArray() { $categories = $this->getCategoryCollection(true, false, false, false); $catagoryList = array(); $i = 0; foreach ($categories as $key => $category) { if($i == 0){ $rootLevel = $category->getLevel(); //this is the level of our root category } if($category->getLevel() == $rootLevel){ $i++; continue; //we want to skip the root categories like so } if($category->getLevel()-1 < 0){ $i++; continue; //we want to make sure that we aren't going to break the str_repeat } $z = $rootLevel + 1; //we want to do this so we don't have any underscores on our top level - that would be even uglier!! $prefix = str_repeat(self::REPEATER, ($category->getLevel()-$z) * 1) . self::PREFIX_END; $catagoryList[$category->getEntityId()] = $prefix. $category->getName(); $i++; } return $catagoryList; }
太棒了,現在我們有了我們的樹狀結構,它兼容在2.2.1和2.2.3的版本! 現在我們只需要刪除那些醜陋的下劃線。
當我們的表單加載時,我們將使用Jquery來做到這一點。 這不是最理想的,但它是我們想到最好的方式。
$("option").each(function() { var text = $(this).text(); text = text.replace(/\_/g, "\u2003"); $(this).text(text); });
想了解更多關於Magento的相關教學,可以關注我們的Facebook粉絲專頁或是訂閱我們的電子報喔!
我們會不定期的更新分享文章,跟我們的歐斯瑞一起學習吧!
我要留言