I have made a few external php scripts to update quantity and tracking numbers,etc Right now, i'm putting them in magento root and set the permission to 640. However, it's still accessible by the browser. I would like to make it accessible by cron and the owner/group only.
I tried to move the script to
magentoroot/script/
, and change the following in the script:
$file = fopen('../../qty.csv', 'r', '"');
require DIR . '../app/bootstrap.php';
$writer = new \Zend\Log\Writer\Stream(BP . '../var/log/import-update.log');
then the script stop working. what should i change in the file? script 1:
<?php $file = fopen('../qty.csv', 'r', '"'); // set path to the CSV file
if ($file !== false) {
require __DIR__ . '/app/bootstrap.php';
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
$objectManager = $bootstrap->getObjectManager();
$state = $objectManager->get('Magento\Framework\App\State');
$state->setAreaCode('adminhtml');
// used for updating product info
$productRepository = $objectManager->get('Magento\Catalog\Model\ProductRepository');
// used for updating product stock
$stockRegistry = $objectManager->get('Magento\CatalogInventory\Api\StockRegistryInterface');
// add logging capability
$writer = new \Zend\Log\Writer\Stream(BP . '/var/log/import-update.log');
$logger = new \Zend\Log\Logger();
$logger->addWriter($writer);
// enter the number of data fields you require the product row inside the CSV file to contain
$required_data_fields = 2; //change for 3 to 2
$header = fgetcsv($file); // get data headers and skip 1st row
while ( $row = fgetcsv($file, 5000, ",") ) {
$data_count = count($row);
if ($data_count < 1) {
continue;
}
$data = array();
$data = array_combine($header, $row);
$sku = $data['sku'];
if ($data_count < $required_data_fields) {
//$logger->info("Skipping product sku " . $sku . ". Not enough data to import.");
continue;
}
$qty = trim($data['qty']);
//$price = trim($data['price']);
// echo 'Updating product SKU: '.$sku.', with Qty: '.$qty.PHP_EOL; // .' and Price:'.$price.'<br />';
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////updating price/////////////////////////////////////////////////////////////////////
//try {
// $product = $productRepository->get($sku);
//}
//catch (\Exception $e) {
// $logger->info("Invalid product SKU: ".$sku);
// continue;
//}
//
// You can set other product data with $product->setAttributeName() if you want to update more data
//if ($product->getPrice() != $price) {
// $product->setPrice($price)
// ->setStoreId(0) // this is needed because if you have multiple store views, each individual store view will get "Use default value" unchecked for multiple attributes - which causes issues.
// ->save();
//}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////updating quantity/////////////////////////////////////////////////////////////////////
try {
//$stockItem = $stockRegistry->getStockItemBySku($sku);
$stockItem = $stockRegistry->getStockItemBySku($sku);
}
catch (\Exception $e) {
//$logger->info("Invalid stock for product SKU: ".$sku);
continue;
}
if ($stockItem->getQty() != $qty) {
echo 'Updating SKU:'.$sku.', current qty:'.$stockItem->getQty().', updating to qty:'.$qty.PHP_EOL;
$stockItem->setQty($qty);
$stockItem->setIsInStock((int)($qty > 0));
//if ($qty > 0) {
// $stockItem->setIsInStock(1);
//}
//if ($qty < 1) {
// $stockItem->setIsInStock(0); //clean up first time
//}
//$stockRegistry->updateStockItemBySku($sku, $stockItem);
/* $stockItem->setStockData(
array(
'use_config_manage_stock' => 0,
// checkbox for 'Use config settings'
'manage_stock' => 1, // manage stock
//'min_sale_qty' => 1, // Shopping Cart Minimum Qty Allowed
'is_in_stock' => (int)($qty > 0), // Stock Availability of product
'qty' => $qty // qty of product
)
);*/
$stockRegistry->updateStockItemBySku($sku, $stockItem);
$stockItem->save();
}
}
fclose($file);
}
script 2:
<?php
$file = fopen('../track.csv', 'r', '"'); // set path to the CSV file
if ($file !== false)
{
require __DIR__ . '/app/bootstrap.php';
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
$objectManager = $bootstrap->getObjectManager();
$state = $objectManager->get('Magento\Framework\App\State');
$state->setAreaCode('adminhtml');
// add logging capability
$writer = new \Zend\Log\Writer\Stream(BP . '/var/log/import-update.log');
$logger = new \Zend\Log\Logger();
$logger->addWriter($writer);
class ShipmentObject{
...
...
}
/**
* @param \Magento\Sales\Model\Order\Shipment\TrackFactory $shipmentTrackFactory
* @param \Magento\Sales\Model\Order\ShipmentFactory $shipmentFactory
* @param \Magento\Framework\DB\TransactionFactory $transactionFactory
* @param \Magento\Sales\Api\OrderRepositoryInterface $orderRepository
*/
$shipmentTrackFactory = $objectManager->get('\Magento\Sales\Model\Order\Shipment\TrackFactory');
$shipmentFactory = $objectManager->get('\Magento\Sales\Model\Order\ShipmentFactory');
$transactionFactory = $objectManager->get('\Magento\Framework\DB\TransactionFactory');
$orderRepository = $objectManager->get('\Magento\Sales\Api\OrderRepositoryInterface');
$orderFactory = $objectManager->get('\Magento\Sales\Model\OrderFactory');
$invoiceService = $objectManager->get('Magento\Sales\Model\Service\InvoiceService');
//create new class object
$test = new ShipmentObject($shipmentTrackFactory,$shipmentFactory,$transactionFactory,$orderRepository,$orderFactory,$invoiceService);
$test->setFile($file);
$test->execute();
//rewind($file);
//ftruncate($file, 0); // empty the file once done
file_put_contents('../track.csv',""); //empty the csv file
fclose($file);