駭客入侵(修正) – 在 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粉絲專頁或是訂閱我們的電子報喔!
我們會不定期的更新分享文章,跟我們的歐斯瑞一起學習吧!
我要留言