Cách đặt sản phẩm vào / ra khỏi kho theo chương trình


8

Tôi đã thử một vài đoạn được tìm thấy trực tuyến nhưng không thành công.

Chỉ cần cố gắng đặt một sản phẩm ở trong kho / hết hàng với mã, điều này là theo như tôi đã nhận được:

$product = Mage::getModel('catalog/product')->load( 'id' );

$stockItem = $product->getStockItem();
$stockItem->setData('manage_stock', 1);
$stockItem->setData('is_in_stock', 0);
$stockItem->setData('use_config_notify_stock_qty', 0);
$stockItem->setData('qty', 0);

$stockItem->save();
$product->save();

Không có thay đổi nào đối với thông tin sản phẩm khi được xem qua bảng quản trị, có ý tưởng nào không?


Mã của bạn đang làm việc cho tôi, tuy nhiên, bạn phải có cài đặt để cho phép cổ phiếu được quản lý thông qua phụ trợ.
philwinkle

Câu trả lời:


12

Hãy thử điều này thay thế:

$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product);

và sau đó thiết lập và lưu các thay đổi của bạn như trước đây.


Cảm ơn vì điều đó, tôi đã giải quyết vấn đề bằng cách chuyển thủ công sang "quản lý chứng khoán" = có trong bảng quản trị. Khi đã xong, mã của bạn hoạt động hoàn hảo.
Mike

cái này hiệu quả với magento 1.6
ahnbizcad 04/11/2015

Khi tôi thực hiện việc này trong chức năng quan sát, thông báo lỗi bên dưới đang hiển thị Số lượng được yêu cầu cho "Tên sản phẩm" không khả dụng. có phương thức nào không $ stockItem-> save ();
Naveenbos

8

Hãy thử như sau. bạn không cần phải tải một đối tượng chứng khoán mới

$product->setStockData(
   array( 
          'is_in_stock' => 0, 
          'qty' => 0,
          'manage_stock' => 1,
          'use_config_notify_stock_qty' => 1
   )
 ); 

Và chỉ lưu sản phẩm như bạn đã làm trong kịch bản của mình


Không hoạt động dưới 1.8 CE ...
Dor

2
OP đã đăng câu hỏi cho ce1.6. Nhưng chính xác những gì không hoạt động. Nó có ném lỗi không?
Sander Mangel

Không hoạt động dưới 1.9 CE.
dùng487772

3

Tôi có một vấn đề tương tự nhưng với sự khác biệt là không có bất kỳ đối tượng mặt hàng chứng khoán nào cho một sản phẩm cụ thể. Khi điều này xảy ra, tốt nhất là tạo đối tượng vật phẩm ban đầu trước khi đặt số lượng (trừ khi có một cách để chúng cùng một lúc).

// Kiểm tra nếu có một đối tượng mục chứng khoán
$ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadBy SẢNt ($ sản phẩm-> getId ());
$ stockItemData = $ stockItem-> getData ();
if (trống ($ stockItemData)) {

    // Tạo đối tượng mục chứng khoán ban đầu
    $ stockItem-> setData ('Manage_stock', 1);
    $ stockItem-> setData ('is_in_stock', $ qty? 1: 0);
    $ stockItem-> setData ('use_config_manage_stock', 0);
    $ stockItem-> setData ('stock_id', 1);
    $ stockItem-> setData ('sản phẩm_id', $ sản phẩm-> getId ());
    $ stockItem-> setData ('qty', 0);
    $ stockItem-> save ();

    // Khởi tạo lại đối tượng sau khi nó đã được lưu để chúng ta có được đối tượng đầy đủ
    $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadBy SẢNt ($ sản phẩm-> getId ());
}

// Đặt số lượng
$ stockItem-> setData ('qty', $ qty);
$ stockItem-> save ();
$ sản phẩm-> lưu ();

1
$product->save();- có cần thiết sau khi tiết kiệm $stockItemkhông?
Styx

1
Có lẽ không dành riêng cho mục chứng khoán trừ khi bạn thay đổi các thuộc tính sản phẩm khác.
Raj

Có, bởi vì nếu bạn tạo nó từ đầu, bạn cần thêm stockItem vào sản phẩm, một Người quan sát sẽ lấy nó và lưu nó sau (vì vậy việc tiết kiệm trùng lặp không được yêu cầu
Max S

3

đang thử trên magento 1.8.1.0 CE và không thể lưu "qty" do thiếu giá trị "type_id" (đối với mục mới). giải quyết bằng

$stockItem->setTypeId( $product->getTypeId() );

Mate, mất nhiều thời gian để tìm ra giải pháp phù hợp cho vấn đề của tôi. Bạn bình luận cuộc sống của tôi. Chúc mừng! ;-)
medina

Cứu mạng tôi quá !!!!
Khóa

3

Vì thêm vào tất cả các câu trả lời, có thể nên sử dụng addDatathay vì setDatatrong oder để an toàn cho việc cập nhật thông tin và không chỉ thiết lập nó.


2

Tôi muốn đề nghị thay đổi câu trả lời của Raj để hỗ trợ các tình huống kỳ lạ. Để câu trả lời có hiệu quả, tôi đã phải bình luận câu lệnh if, bởi vì các sản phẩm được tạo theo cách lập trình có thể có dữ liệu chứng khoán một phần, nhưng chưa hoàn chỉnh. Đây là cách duy nhất mà tôi có thể làm cho nó hoạt động.

// Kiểm tra nếu có một đối tượng mục chứng khoán
$ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadBy SẢNt ($ sản phẩm-> getId ());
$ stockItemData = $ stockItem-> getData ();
// if (trống ($ stockItemData)) {
    // Tạo đối tượng mục chứng khoán ban đầu
    $ stockItem-> setData ('Manage_stock', 1);
    $ stockItem-> setData ('is_in_stock', $ qty? 1: 0);
    $ stockItem-> setData ('use_config_manage_stock', 0);
    $ stockItem-> setData ('stock_id', 1);
    $ stockItem-> setData ('sản phẩm_id', $ sản phẩm-> getId ());
    $ stockItem-> setData ('qty', 0);
    $ stockItem-> save ();

    // Khởi tạo lại đối tượng sau khi nó đã được lưu để chúng ta có được đối tượng đầy đủ
    $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadBy SẢNt ($ sản phẩm-> getId ());
//}

// Đặt số lượng
$ stockItem-> setData ('qty', $ qty);
$ stockItem-> save ();
$ sản phẩm-> lưu ();

1

Đây là một nguyên nhân có thể khiến tôi mất khoảng 2 giờ làm việc: Tôi đã thử điều này trong nhiều năm, tự hỏi tại sao nó sẽ không tiết kiệm. Tôi đã có một exit;câu lệnh php sau ->save()và một loạt tiếng vang để nó không tự động chuyển sang màn hình tiếp theo (để giúp gỡ lỗi).

Tuy nhiên, các cam kết đối với cơ sở dữ liệu phải xảy ra muộn trong quá trình tải trang, nó sẽ không lưu cho tôi cho đến khi tôi xóa exit;!


1

Như trong các câu trả lời khác, người ta có thể sử dụng lớp Mage_CatalogInventory_Model_Stock_Itemtrực tiếp. Nhưng người ta phải tham chiếu chính xác sản phẩm thông qua một cuộc gọi setProductđể có mã làm việc cho cả các mặt hàng chứng khoán mới và hiện có.

$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId());
$stockItem->setProduct($product)
    ->setData('stock_id', Mage_CatalogInventory_Model_Stock::DEFAULT_STOCK_ID)
    ->setData('qty', 1)
    ->setData('is_in_stock', 1)
    ->setData('manage_stock', 1)
    ->setData('use_config_manage_stock', 0)
    ->setData('use_config_backorders', 0)
    ->setData('backorders', 0)
    ->setData('use_config_max_sale_qty', 0)
    ->setData('max_sale_qty', 1)                
    ->save();

Giải pháp thay thế

Tuy nhiên nếu bạn gọi bằng $product->savemọi cách tôi sẽ chỉ thiết lập dữ liệu chứng khoán $product->setStockdata($array)như sau. Cách này Magento tạo ra một mục chứng khoán chính xác từ dữ liệu chứng khoán. Ưu điểm lớn là cập nhật mục chứng khoán xảy ra trong cùng một giao dịch $product->save(). Điều này rất quan trọng đối với tính nhất quán của dữ liệu.

$stockData = array();
$stockData['qty'] = 1;
$stockData['is_in_stock'] = 1;
$stockData['manage_stock'] = 1;
$stockData['use_config_manage_stock'] = 0;
$stockData['use_config_backorders'] = 0;
$stockData['backorders'] = 0;
$stockData['use_config_max_sale_qty'] = 0;
$stockData['max_sale_qty'] = 1;
$product->setStockData($stockData);
//...
$product->save()

0

Đây là mã C # của tôi

var inStock = qty > 0 ? 1 : 0;    
var stock_data = new catalogInventoryStockItemUpdateEntity()
            {
                qty = qty,
                is_in_stock = inStock,
                manage_stock = 1,
                is_in_stockSpecified = true,
            };

is_in_stockSpecified rất quan trọng

Đây là đầu ra

nhập mô tả hình ảnh ở đây

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.