Gán sản phẩm để phân loại theo chương trình trong magento2


9

Làm cách nào tôi có thể gán 'Sản phẩm mới' cho 'Danh mục SẢN PHẨM MỚI' theo chương trình trong magento 2.

Câu trả lời:


17

Bạn cần lấy Id danh mục và Id sản phẩm để đặt dữ liệu: thực hiện điều này:

$this->getCategoryLinkManagement()->assignProductToCategories(
                $product->getSku(),
                $product->getCategoryIds()
            );

cũng bao hàm chức năng này:

private function getCategoryLinkManagement()
{
    if (null === $this->categoryLinkManagement) {
        $this->categoryLinkManagement = \Magento\Framework\App\ObjectManager::getInstance()
            ->get('Magento\Catalog\Api\CategoryLinkManagementInterface');
    }
    return $this->categoryLinkManagement;
}

phần còn lại phụ thuộc bạn nên quản lý cho: Magento\Catalog\Api\CategoryLinkManagementInterface

hướng nội:

protected $categoryLinkManagement;

Việc sử dụng trực tiếp \ Magento \ Framework \ App \ ObjectManager :: getInstance () không hợp lệ theo magento để bạn có thể đưa nó vào Trình xây dựng

Câu trả lời này dành cho các phiên bản magento 2.2 bên dưới, vì vậy vui lòng ghi chú lại


Tôi đã sử dụng mã này trong một khối và cố gắng kết xuất khối đó trong tệp mẫu. Khi tôi thử phương pháp này, tôi đã nhận được "Lỗi chưa được xử lý: Gọi đến một hàm thành viên gán ProducttToC loại ()" trong tệp mẫu. Bạn có thể vui lòng giúp tôi sắp xếp này?
chinchu

Bạn đã cung cấp sự phụ thuộc cho "Magento \ Catalog \ Api \ CategoryLinkManloymentInterface" chưa?
Ronak Chauhan

Vâng, tôi đã thêm. Tôi đã làm việc tốt
chinchu

Xin chào @RonakChauhan Tôi đã thử mã của bạn nhưng có vẻ như không hoạt động. Các sản phẩm của tôi không được chỉ định vào danh mục ..
Daniel_12

@ Daniel_12 bạn có nhận được lỗi nào không?
Ronak Chauhan

12

Tôi nghĩ rằng, điều này cần một câu trả lời cập nhật mà không sử dụng trình quản lý đối tượng. Ngoài ra, có một số kink liên quan mà không được đề cập ở bất cứ đâu.

Trong hàm tạo của bạn, hãy nhập CategoryLinkManloymentInterface:

protected $categoryLinkManagement;

public function __construct(
    ...
    \Magento\Catalog\Api\CategoryLinkManagementInterface $categoryLinkManagementInterface,
    ...
) {
    $this->categoryLinkManagement = $categoryLinkManagementInterface;
    ...
}

Sau đó trong mã của bạn, gán các danh mục theo cách sau:

$product = $this->productRepository->getById(1337); // or any other way to get a product model/interface
$categoryIds = [
    42,
    606
];
$this->categoryLinkManagement->assignProductToCategories(
    $product->getSku(),
    $categoryIds
);

Điều này sẽ thay thế tất cả các bài tập thể loại trước đó. Nếu bạn muốn giữ các bài tập thể loại hiện có, hãy sử dụng một cái gì đó như thế này:

$categoryIds = array_unique(
    array_merge(
        $product->getCategoryIds(),
        $categoryIds
    )
);

Lưu ý : Quản lý liên kết trì hoãn việc gán danh mục (cho thuộc tính sản phẩm) cho người lập chỉ mục theo lịch trình. Điều này có nghĩa là nếu bạn thực hiện các thay đổi khác cho sản phẩm và lưu nó sau khi gán ProducttToC loại ()

$product = $this->productRepository->save($product);

các bài tập danh mục sẽ biến mất vì $ sản phẩm chứa null (nếu đó là sản phẩm mới được tạo) hoặc chỉ các danh mục được gán trước đó cho thuộc tính của nó. Cũng thế,

$product = $this->productRepository->getById($product->getId());

ngay sau khi gán ProducttToC loại () sẽ không giúp ích cho cùng một lý do được đề cập ở trên. Chỉ định các danh mục tại thời điểm gần nhất có thể (khi bạn không lưu sản phẩm sau đó) hoặc gán thuộc tính theo cách thủ công trước khi lưu lại

$product->setCategoryIds($categoryIds);

Nếu bạn chọn sử dụng cái sau, có lẽ bạn có thể quay lại chỉ sử dụng setC CategoryIds (). Tôi chưa thử nghiệm cả hai trường hợp (gán ProducttToC loại + setC CategoryIds + save hoặc setC CategoryIds + save) cho tác động hiệu suất, vì vậy tôi không thể nhận xét về điều đó, nhưng tôi nghĩ rằng toàn bộ tình huống là quan trọng cần đề cập.


xin chào, @Drelling, Không thể lưu sản phẩm \ "41859 \" với vị trí 0 đến loại 8 bị lỗi ở trên,
jafar pinjar

Xin chào @jafarpinjar, đó có phải là tất cả những gì bạn nhận được về các thông báo lỗi không? Tôi có thể nghĩ ra một vài lý do, tại sao điều này xảy ra: 1. Bạn đã vô tình sử dụng $ sản phẩm-> getId () thay vì $ sản phẩm-> getSku () 2. Khóa URL của sản phẩm không phải là duy nhất (mặc dù tôi nghĩ rằng thông báo lỗi sẽ được cụ thể) 3. Sản phẩm đã được chỉ định cho danh mục với id 8
T. Dreiling 27/11/18

1. chúng ta không thể sử dụng $ sản phẩm-> getId ()? 3. Sản phẩm đã được gán cho danh mục có id 8 - T. nếu được chỉ định, chúng tôi có thể không xóa sản phẩm không?
jafar pinjar

1. Không, gán ProducttToC loại () rõ ràng cần SKU, không phải ID! Nếu đó là lỗi của bạn, thay vào đó hãy thử lại với SKU. 3. Ah, tôi đã hơi sai ở đây. Lỗi tôi đã nghĩ đến xảy ra khi $ categoryIds sẽ chứa cùng một danh mục nhiều lần. Bạn thực sự cần bao gồm id loại 8 để giữ nó trong danh mục đó. Nếu bạn không, nó sẽ bị xóa. Vì vậy, đó là cách bạn có thể xóa sản phẩm khỏi danh mục.
T. Dreiling

Lỗi tôi đã nghĩ đến xảy ra khi $ categoryIds sẽ chứa cùng một danh mục nhiều lần. Nó không thể là nó? bởi vì id danh mục là duy nhất, tôi chỉ chuyển sku cho phương thức này gán ProducttToC loại không phải là id
jafar pinjar

5

Gán sản phẩm cho danh mục

 <?php
 $new_category_id = array('100','101');
 $sku = 'sku of product';

 $objectManager = \Magento\Framework\App\ObjectManager::getInstance();

 $CategoryLinkRepository = $objectManager->get('\Magento\Catalog\Api\CategoryLinkManagementInterface');
 $CategoryLinkRepository->assignProductToCategories($sku, $new_category_id);

Xóa sản phẩm khỏi danh mục

 <?php
 $category_id = 101;
 $sku = 'sku of product';

 $objectManager = \Magento\Framework\App\ObjectManager::getInstance();

 $CategoryLinkRepository = $objectManager->get('\Magento\Catalog\Model\CategoryLinkRepository');
 $CategoryLinkRepository->deleteByIds($category_id ,$sku);

gặp lỗi này, Không thể lưu sản phẩm ở vị trí 0 vào loại 8
jafar pinjar

@jafarpinjar lỗi này có liên quan đến các tùy chỉnh khác. Nếu bạn kiểm tra đoạn mã này với cài đặt Magento mới, nó sẽ hoạt động tốt. Vui lòng kiểm tra xem có bất kỳ tùy chỉnh của bên thứ ba nào ngăn mã này thực thi không
chirag dodia

hi @chirag dodia, không, tôi đã sử dụng mã này trong tệp tùy chỉnh và chạy nó bằng cách di chuyển đến thư mục gốc, không có tùy chỉnh nào được sử dụng
jafar pinjar

@jafarpinjar thử với sản phẩm mới và kiểm tra xem cái này có liên quan đến một sản phẩm cụ thể không?
chirag dodia

xin chào @chirag, tôi đã gặp lỗi này, Không thể lưu sản phẩm \ "41859 \" với vị trí 0 đến loại 8
jafar pinjar

0

Ngay cả khi câu hỏi đã được trả lời, tôi vẫn muốn thêm một cách nhanh hơn để gán một nhóm sản phẩm cho một danh mục, vì việc lặp lại $this->getCategoryLinkManagement()->assignProductToCategories()khá chậm

Sự thay thế này liên quan đến việc tải danh mục mà chúng tôi muốn nhóm sản phẩm của chúng tôi được chỉ định, vì vậy chúng tôi cần tiêm Magento\Catalog\Model\CategoryFactory, chúng tôi có thể đặt một nhóm sản phẩm vào danh mục bằng cách sử dụng setPostedProducts()một mảng ['entity_id','position']để ví dụ mã sẽ như thế này:

use Magento\Catalog\Model\CategoryFactory;
...
protected $_category;
...
$this->_category = $categoryFactory;

    $parentsCollection = $this->_productCollection->create()
        ->addFieldToSelect('entity_id')
        ->addFieldToFilter('entity_id',['in' => $data['parent_ids']]);

    $parentsPosted = array_fill_keys(array_keys($parentsCollection->toArray(['entity_id'])), 0);

    if($catIds == 80 || $catIds == 82) {
        $category = $this->_category->create()->load($catIds);
        $category->setPostedProducts($parentsPosted);
        $category->save();
        echo "Products assigned to category: ".$catIds."\n";
    }

Hy vọng điều này sẽ giúp được ai đó!


-1
$objectManager = ObjectManager::getInstance();
$catalogProduct = $objectManager->create('Magento\Catalog\Model\Product');
$catalogProduct->setSku('sku-1');
$catalogProduct->setName('name');
$catalogProduct->setAttributeSetId(4);
$catalogProduct->setStatus(1); // Status on product enabled/ disabled 1/0
$catalogProduct->setVisibility(4);
$catalogProduct->setTypeId('simple'); // type of product (simple/virtual/downloadable/configurable)
$catalogProduct->setPrice(100);

$catalogProduct->setCategoryIds(['id']); // here you are

$catalogProduct->setStockData([
    'is_in_stock' => true,
    'qty'         => 10
]);

$catalogProduct->setStoreId(1); // $this->storeManagerInterface->getStore()->getId()
$catalogProduct->setWebsiteIds([1]); // $this->storeManagerInterface->getStore()->getWebsiteId()

$catalogProduct->save();

Đây là một yêu cầu rất nặng nề và thực thi rất chậm so với Trình quản lý liên kết
Timik
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.