2016-11-04 9 views
0

Magento 2でシステム構成のカテゴリセレクタを取得するには?システム構成のMagento 2カテゴリセレクタ

管理設定セクションで、すべてのレベルのカテゴリをマルチ選択オプションとして取得する必要があります。私は次のコードを追加して、望みの結果を得ています。しかし、私は再帰関数を使ってそれをやりたい私も同じことを手伝ってください。

namespace Vendor\Productslider\Model\Config\Source; 

use Magento\Framework\Option\ArrayInterface; 
use Magento\Catalog\Helper\Category; 

class Categorylist implements ArrayInterface 
{ 
    protected $_categoryHelper; 
    protected $categoryRepository; 

    public function __construct(
     \Magento\Catalog\Helper\Category $catalogCategory, 
     \Magento\Catalog\Model\CategoryRepository $categoryRepository 
     ) 
    { 
     $this->_categoryHelper = $catalogCategory; 
     $this->categoryRepository = $categoryRepository; 
    } 

    /* 
    * Return categories helper 
    */ 

    public function getStoreCategories($sorted = false, $asCollection = false, $toLoad = true) 
    { 
     return $this->_categoryHelper->getStoreCategories($sorted , $asCollection, $toLoad); 
    } 

    /* 
    * Option getter 
    * @return array 
    */ 
    public function toOptionArray() 
    { 


     $arr = $this->toArray(); 
     $ret = []; 

     foreach ($arr as $key => $value) 
     { 

      $ret[] = [ 
       'value' => $key, 
       'label' => $value 
      ]; 
     } 

     return $ret; 
    } 

    /* 
    * Get options in "key-value" format 
    * @return array 
    */ 
    public function toArray() 
    { 

     $categories = $this->getStoreCategories(true,false,true); 
     $categoryList = $this->renderCategories($categories); 
     return $categoryList; 
    } 

    public function renderCategories($_categories) 
    { 
     $categoryList = array(); 
     foreach ($_categories as $category){ 
      $categoryList[$category->getEntityId()] = __($category->getName()); // Main categories 

      $categoryObj = $this->categoryRepository->get($category->getId()); 
      $subcategories = $categoryObj->getChildrenCategories(); 
      foreach($subcategories as $subcategory) { 
       $categoryList[$subcategory->getEntityId()] = __('--'.$subcategory->getName()); // 1st level Sub categories 

       if($subcategory->hasChildren()) { 
        $childCategoryObj = $this->categoryRepository->get($subcategory->getId()); 
        $childSubcategories = $childCategoryObj->getChildrenCategories(); 
        foreach($childSubcategories as $childSubcategory) { 
         $categoryList[$childSubcategory->getEntityId()] = __('----'.$childSubcategory->getName()); // 2nd level Sub categories 
        } 
       } 
      } 
     } 

     return $categoryList;  
    } 

} 

答えて

0

ありがとうございました! 解決策を見つけました

namespace Vendor\Productslider\Model\Config\Source; 

use Magento\Framework\Option\ArrayInterface; 
use Magento\Catalog\Helper\Category; 

class Categorylist implements ArrayInterface 
{ 
    protected $_categoryHelper; 
    protected $categoryRepository; 
    protected $categoryList; 

    public function __construct(
     \Magento\Catalog\Helper\Category $catalogCategory, 
     \Magento\Catalog\Model\CategoryRepository $categoryRepository 
     ) 
    { 
     $this->_categoryHelper = $catalogCategory; 
     $this->categoryRepository = $categoryRepository; 
    } 

    /* 
    * Return categories helper 
    */ 

    public function getStoreCategories($sorted = false, $asCollection = false, $toLoad = true) 
    { 
     return $this->_categoryHelper->getStoreCategories($sorted , $asCollection, $toLoad); 
    } 

    /* 
    * Option getter 
    * @return array 
    */ 
    public function toOptionArray() 
    { 


     $arr = $this->toArray(); 
     $ret = []; 

     foreach ($arr as $key => $value) 
     { 

      $ret[] = [ 
       'value' => $key, 
       'label' => $value 
      ]; 
     } 

     return $ret; 
    } 

    /* 
    * Get options in "key-value" format 
    * @return array 
    */ 
    public function toArray() 
    { 

     $categories = $this->getStoreCategories(true,false,true); 
     $categoryList = $this->renderCategories($categories); 
     return $categoryList; 
    } 

    public function renderCategories($_categories) 
    { 
     foreach ($_categories as $category){ 
      $i = 0; 
      $this->categoryList[$category->getEntityId()] = __($category->getName()); // Main categories 
      $list = $this->renderSubCat($category,$i); 
     } 

     return $this->categoryList;  
    } 

    public function renderSubCat($cat,$j){ 

     $categoryObj = $this->categoryRepository->get($cat->getId()); 

     $level = $categoryObj->getLevel(); 
     $arrow = str_repeat("---", $level-1); 
     $subcategories = $categoryObj->getChildrenCategories(); 

     foreach($subcategories as $subcategory) { 
      $this->categoryList[$subcategory->getEntityId()] = __($arrow.$subcategory->getName()); 

      if($subcategory->hasChildren()) { 

       $this->renderSubCat($subcategory,$j); 

      } 
     } 

     return $this->categoryList; 
    } 
} 
関連する問題