Commit 5457bd56 by wdh

Merge branch 'master' of http://47.99.244.21:9999/root/joshine

parents 15605b2b e8922a7a
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Controller\Adminhtml\Delete;
use Magento\Backend\App\Action;
class Creditmemo extends \Magento\Backend\App\Action
{
/**
* @var \Magento\Sales\Api\CreditmemoRepositoryInterface
*/
protected $creditmemoRepository;
/**
* @var \Bss\DeleteOrder\Model\Creditmemo\Delete
*/
protected $delete;
/**
* Creditmemo constructor.
* @param Action\Context $context
* @param \Magento\Sales\Api\CreditmemoRepositoryInterface $creditmemoRepository
* @param \Bss\DeleteOrder\Model\Creditmemo\Delete $delete
*/
public function __construct(
Action\Context $context,
\Magento\Sales\Api\CreditmemoRepositoryInterface $creditmemoRepository,
\Bss\DeleteOrder\Model\Creditmemo\Delete $delete
) {
$this->creditmemoRepository = $creditmemoRepository;
$this->delete = $delete;
parent::__construct($context);
}
/**
* @return \Magento\Framework\App\ResponseInterface|\Magento\Framework\Controller\Result\Redirect|\Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
$creditmemoId = $this->getRequest()->getParam('creditmemo_id');
$creditmemo = $this->creditmemoRepository->get($creditmemoId);
try {
$this->delete->deleteCreditmemo($creditmemoId);
$this->messageManager->addSuccessMessage(__('Successfully deleted credit memo #%1.', $creditmemo->getIncrementId()));
} catch (\Exception $e) {
$this->messageManager->addErrorMessage(__('Error delete credit memo #%1.', $creditmemo->getIncrementId()));
}
$resultRedirect = $this->resultRedirectFactory->create();
$resultRedirect->setPath('sales/creditmemo/');
return $resultRedirect;
}
/*
* Check permission via ACL resource
*/
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Bss_DeleteOrder::delete_order');
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Controller\Adminhtml\Delete;
use Magento\Backend\App\Action;
class Invoice extends \Magento\Backend\App\Action
{
/**
* @var \Magento\Sales\Api\InvoiceRepositoryInterface
*/
protected $invoiceRepository;
/**
* @var \Bss\DeleteOrder\Model\Invoice\Delete
*/
protected $delete;
/**
* Invoice constructor.
* @param Action\Context $context
* @param \Magento\Sales\Api\InvoiceRepositoryInterface $invoiceRepository
* @param \Bss\DeleteOrder\Model\Invoice\Delete $delete
*/
public function __construct(
Action\Context $context,
\Magento\Sales\Api\InvoiceRepositoryInterface $invoiceRepository,
\Bss\DeleteOrder\Model\Invoice\Delete $delete
) {
$this->invoiceRepository = $invoiceRepository;
$this->delete = $delete;
parent::__construct($context);
}
/**
* @return \Magento\Framework\App\ResponseInterface|\Magento\Framework\Controller\Result\Redirect|\Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
$invoiceId = $this->getRequest()->getParam('invoice_id');
$invoice = $this->invoiceRepository->get($invoiceId);
try {
$this->delete->deleteInvoice($invoiceId);
$this->messageManager->addSuccessMessage(__('Successfully deleted invoice #%1.', $invoice->getIncrementId()));
} catch (\Exception $e) {
$this->messageManager->addErrorMessage(__('Error delete invoice #%1.', $invoice->getIncrementId()));
}
$resultRedirect = $this->resultRedirectFactory->create();
$resultRedirect->setPath('sales/invoice/');
return $resultRedirect;
}
/*
* Check permission via ACL resource
*/
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Bss_DeleteOrder::delete_order');
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Controller\Adminhtml\Delete;
use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;
use Magento\Backend\App\Action\Context;
use Magento\Ui\Component\MassAction\Filter;
use Magento\Sales\Model\ResourceModel\Order\CollectionFactory;
use Magento\Sales\Api\OrderManagementInterface;
class MassCreditmemo extends \Magento\Sales\Controller\Adminhtml\Order\AbstractMassAction
{
/**
* @var OrderManagementInterface
*/
protected $orderManagement;
/**
* @var \Magento\Sales\Model\ResourceModel\Order\Creditmemo\CollectionFactory
*/
protected $memoCollectionFactory;
/**
* @var \Magento\Sales\Api\CreditmemoRepositoryInterface
*/
protected $creditmemoRepository;
/**
* @var \Bss\DeleteOrder\Model\Creditmemo\Delete
*/
protected $delete;
/**
* MassCreditmemo constructor.
* @param Context $context
* @param Filter $filter
* @param OrderManagementInterface $orderManagement
* @param \Magento\Sales\Model\ResourceModel\Order\Creditmemo\CollectionFactory $memoCollectionFactory
* @param \Magento\Sales\Api\CreditmemoRepositoryInterface $creditmemoRepository
* @param \Bss\DeleteOrder\Model\Creditmemo\Delete $delete
*/
public function __construct(
Context $context,
Filter $filter,
CollectionFactory $collectionFactory,
OrderManagementInterface $orderManagement,
\Magento\Sales\Model\ResourceModel\Order\Creditmemo\CollectionFactory $memoCollectionFactory,
\Magento\Sales\Api\CreditmemoRepositoryInterface $creditmemoRepository,
\Bss\DeleteOrder\Model\Creditmemo\Delete $delete
) {
parent::__construct($context, $filter);
$this->collectionFactory = $collectionFactory;
$this->orderManagement = $orderManagement;
$this->memoCollectionFactory = $memoCollectionFactory;
$this->creditmemoRepository = $creditmemoRepository;
$this->delete = $delete;
}
/**
* @param AbstractCollection $collection
* @return \Magento\Framework\App\ResponseInterface|\Magento\Framework\Controller\Result\Redirect|\Magento\Framework\Controller\ResultInterface
* @throws \Magento\Framework\Exception\LocalizedException
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
protected function massAction(AbstractCollection $collection)
{
$params = $this->getRequest()->getParams();
$selected = [];
$collectionMemo = $this->filter->getCollection($this->memoCollectionFactory->create());
foreach ($collectionMemo as $memo) {
array_push($selected, $memo->getId());
}
if ($selected) {
foreach ($selected as $creditmemoId) {
$creditmemo = $this->creditmemoRepository->get($creditmemoId);
try {
$order = $this->deleteCreditMemo($creditmemoId);
$this->messageManager->addSuccessMessage(__('Successfully deleted credit memo #%1.', $creditmemo->getIncrementId()));
} catch (\Exception $e) {
$this->messageManager->addErrorMessage(__('Error delete credit memo #%1.', $creditmemo->getIncrementId()));
}
}
}
$resultRedirect = $this->resultRedirectFactory->create();
if ($params['namespace'] == 'sales_order_view_creditmemo_grid') {
$resultRedirect->setPath('sales/order/view', ['order_id' => $order->getId()]);
} else {
$resultRedirect->setPath('sales/creditmemo/');
}
return $resultRedirect;
}
/*
* Check permission via ACL resource
*/
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Bss_DeleteOrder::delete_order');
}
/**
* @param $creditmemoId
* @return \Magento\Sales\Model\Order
* @throws \Exception
*/
protected function deleteCreditMemo($creditmemoId)
{
return $this->delete->deleteCreditmemo($creditmemoId);
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Controller\Adminhtml\Delete;
use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;
use Magento\Backend\App\Action\Context;
use Magento\Ui\Component\MassAction\Filter;
use Magento\Sales\Model\ResourceModel\Order\CollectionFactory;
use Magento\Sales\Api\OrderManagementInterface;
class MassInvoice extends \Magento\Sales\Controller\Adminhtml\Order\AbstractMassAction
{
/**
* @var OrderManagementInterface
*/
protected $orderManagement;
/**
* @var \Magento\Sales\Model\ResourceModel\Order\Invoice\CollectionFactory
*/
protected $invoiceCollectionFactory;
/**
* @var \Magento\Sales\Api\InvoiceRepositoryInterface
*/
protected $invoiceRepository;
/**
* @var \Bss\DeleteOrder\Model\Invoice\Delete
*/
protected $delete;
/**
* MassInvoice constructor.
* @param Context $context
* @param Filter $filter
* @param OrderManagementInterface $orderManagement
* @param \Magento\Sales\Model\ResourceModel\Order\Invoice\CollectionFactory $invoiceCollectionFactory
* @param \Magento\Sales\Api\InvoiceRepositoryInterface $invoiceRepository
* @param \Bss\DeleteOrder\Model\Invoice\Delete $delete
*/
public function __construct(
Context $context,
Filter $filter,
CollectionFactory $collectionFactory,
OrderManagementInterface $orderManagement,
\Magento\Sales\Model\ResourceModel\Order\Invoice\CollectionFactory $invoiceCollectionFactory,
\Magento\Sales\Api\InvoiceRepositoryInterface $invoiceRepository,
\Bss\DeleteOrder\Model\Invoice\Delete $delete
) {
parent::__construct($context, $filter);
$this->collectionFactory = $collectionFactory;
$this->orderManagement = $orderManagement;
$this->invoiceCollectionFactory = $invoiceCollectionFactory;
$this->invoiceRepository = $invoiceRepository;
$this->delete = $delete;
}
/**
* @param AbstractCollection $collection
* @return \Magento\Framework\App\ResponseInterface|\Magento\Framework\Controller\Result\Redirect|\Magento\Framework\Controller\ResultInterface
* @throws \Magento\Framework\Exception\LocalizedException
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
protected function massAction(AbstractCollection $collection)
{
$params = $this->getRequest()->getParams();
$selected = [];
$collectionInvoice = $this->filter->getCollection($this->invoiceCollectionFactory->create());
foreach ($collectionInvoice as $invoice) {
array_push($selected, $invoice->getId());
}
if ($selected) {
foreach ($selected as $invoiceId) {
$invoice = $this->invoiceRepository->get($invoiceId);
try {
$order = $this->deleteInvoice($invoiceId);
$this->messageManager->addSuccessMessage(__('Successfully deleted invoice #%1.', $invoice->getIncrementId()));
} catch (\Exception $e) {
$this->messageManager->addErrorMessage(__('Error delete invoice #%1.', $invoice->getIncrementId()));
}
}
}
$resultRedirect = $this->resultRedirectFactory->create();
if ($params['namespace'] == 'sales_order_view_invoice_grid') {
$resultRedirect->setPath('sales/order/view', ['order_id' => $order->getId()]);
} else {
$resultRedirect->setPath('sales/invoice/');
}
return $resultRedirect;
}
/*
* Check permission via ACL resource
*/
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Bss_DeleteOrder::delete_order');
}
/**
* @param $invoiceId
* @return \Bss\DeleteOrder\Model\Invoice\Delete
*/
protected function deleteInvoice($invoiceId)
{
return $this->delete->deleteInvoice($invoiceId);
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Controller\Adminhtml\Delete;
use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;
use Magento\Backend\App\Action\Context;
use Magento\Ui\Component\MassAction\Filter;
use Magento\Sales\Model\ResourceModel\Order\CollectionFactory;
use Magento\Sales\Api\OrderManagementInterface;
class MassOrder extends \Magento\Sales\Controller\Adminhtml\Order\AbstractMassAction
{
/**
* @var OrderManagementInterface
*/
protected $orderManagement;
/**
* @var CollectionFactory
*/
protected $orderCollectionFactory;
/**
* @var \Bss\DeleteOrder\Model\Order\Delete
*/
protected $delete;
/**
* MassOrder constructor.
* @param Context $context
* @param Filter $filter
* @param OrderManagementInterface $orderManagement
* @param CollectionFactory $orderCollectionFactory
* @param \Bss\DeleteOrder\Model\Order\Delete $delete
*/
public function __construct(
Context $context,
Filter $filter,
CollectionFactory $collectionFactory,
OrderManagementInterface $orderManagement,
\Magento\Sales\Model\ResourceModel\Order\CollectionFactory $orderCollectionFactory,
\Bss\DeleteOrder\Model\Order\Delete $delete
) {
parent::__construct($context, $filter);
$this->collectionFactory = $collectionFactory;
$this->orderManagement = $orderManagement;
$this->orderCollectionFactory = $orderCollectionFactory;
$this->delete = $delete;
}
/**
* @param AbstractCollection $collection
* @return \Magento\Framework\App\ResponseInterface|\Magento\Framework\Controller\Result\Redirect|\Magento\Framework\Controller\ResultInterface
* @throws \Magento\Framework\Exception\LocalizedException
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
protected function massAction(AbstractCollection $collection)
{
$collectionInvoice = $this->filter->getCollection($this->orderCollectionFactory->create());
foreach ($collectionInvoice as $order) {
$orderId = $order->getId();
$incrementId = $order->getIncrementId();
try {
$this->deleteOrder($orderId);
$this->messageManager->addSuccessMessage(__('Successfully deleted order #%1.', $incrementId));
} catch (\Exception $e) {
$this->messageManager->addErrorMessage(__('Error delete order #%1.', $incrementId));
}
}
$resultRedirect = $this->resultRedirectFactory->create();
$resultRedirect->setPath('sales/order/');
return $resultRedirect;
}
/*
* Check permission via ACL resource
*/
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Bss_DeleteOrder::delete_order');
}
/**
* @param $orderId
* @throws \Exception
*/
protected function deleteOrder($orderId)
{
$this->delete->deleteOrder($orderId);
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Controller\Adminhtml\Delete;
use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;
use Magento\Backend\App\Action\Context;
use Magento\Sales\Model\ResourceModel\Order\CollectionFactory;
use Magento\Ui\Component\MassAction\Filter;
use Magento\Sales\Api\OrderManagementInterface;
class MassShipment extends \Magento\Sales\Controller\Adminhtml\Order\AbstractMassAction
{
/**
* @var OrderManagementInterface
*/
protected $orderManagement;
/**
* @var \Magento\Sales\Model\ResourceModel\Order\Shipment\CollectionFactory
*/
protected $shipmentCollectionFactory;
/**
* @var \Magento\Sales\Model\Order\Shipment
*/
protected $shipment;
/**
* @var \Bss\DeleteOrder\Model\Shipment\Delete
*/
protected $delete;
/**
* MassShipment constructor.
* @param Context $context
* @param Filter $filter
* @param OrderManagementInterface $orderManagement
* @param \Magento\Sales\Model\ResourceModel\Order\Shipment\CollectionFactory $shipmentCollectionFactory
* @param \Magento\Sales\Model\Order\Shipment $shipment
* @param \Bss\DeleteOrder\Model\Shipment\Delete $delete
*/
public function __construct(
Context $context,
Filter $filter,
CollectionFactory $collectionFactory,
OrderManagementInterface $orderManagement,
\Magento\Sales\Model\ResourceModel\Order\Shipment\CollectionFactory $shipmentCollectionFactory,
\Magento\Sales\Model\Order\Shipment $shipment,
\Bss\DeleteOrder\Model\Shipment\Delete $delete
) {
parent::__construct($context, $filter);
$this->collectionFactory = $collectionFactory;
$this->orderManagement = $orderManagement;
$this->shipmentCollectionFactory = $shipmentCollectionFactory;
$this->shipment = $shipment;
$this->delete = $delete;
}
/**
* @param AbstractCollection $collection
* @return \Magento\Framework\App\ResponseInterface|\Magento\Framework\Controller\Result\Redirect|\Magento\Framework\Controller\ResultInterface
* @throws \Magento\Framework\Exception\LocalizedException
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
protected function massAction(AbstractCollection $collection)
{
$params = $this->getRequest()->getParams();
$selected = [];
$collectionShipment = $this->filter->getCollection($this->shipmentCollectionFactory->create());
foreach ($collectionShipment as $shipment) {
array_push($selected, $shipment->getId());
}
if ($selected) {
foreach ($selected as $shipmentId) {
$shipment = $this->getShipmentbyId($shipmentId);
try {
$order = $this->deleteShipment($shipmentId);
$this->messageManager->addSuccessMessage(__('Successfully deleted shipment #%1.', $shipment->getIncrementId()));
} catch (\Exception $e) {
$this->messageManager->addErrorMessage(__('Error delete shipment #%1.', $shipment->getIncrementId()));
}
}
}
$resultRedirect = $this->resultRedirectFactory->create();
$resultRedirect->setPath('sales/shipment/');
if ($params['namespace'] == 'sales_order_view_shipment_grid') {
$resultRedirect->setPath('sales/order/view', ['order_id' => $order->getId()]);
} else {
$resultRedirect->setPath('sales/shipment/');
}
return $resultRedirect;
}
/*
* Check permission via ACL resource
*/
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Bss_DeleteOrder::delete_order');
}
/**
* @param $shipmentId
* @return \Magento\Sales\Model\Order
* @throws \Exception
*/
protected function deleteShipment($shipmentId)
{
return $this->delete->deleteShipment($shipmentId);
}
/**
* @param $shipmentId
* @return \Magento\Sales\Model\Order\Shipment
*/
protected function getShipmentbyId($shipmentId)
{
return $this->shipment->load($shipmentId);
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Controller\Adminhtml\Delete;
use Magento\Backend\App\Action;
class Order extends \Magento\Backend\App\Action
{
/**
* @var \Magento\Sales\Model\Order
*/
protected $order;
/**
* @var \Bss\DeleteOrder\Model\Order\Delete
*/
protected $delete;
/**
* Order constructor.
* @param Action\Context $context
* @param \Magento\Sales\Model\Order $order
* @param \Bss\DeleteOrder\Model\Order\Delete $delete
*/
public function __construct(
Action\Context $context,
\Magento\Sales\Model\Order $order,
\Bss\DeleteOrder\Model\Order\Delete $delete
) {
$this->order = $order;
$this->delete = $delete;
parent::__construct($context);
}
/**
* @return \Magento\Framework\App\ResponseInterface|\Magento\Framework\Controller\Result\Redirect|\Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
$orderId = $this->getRequest()->getParam('order_id');
$order = $this->order->load($orderId);
$incrementId = $order->getIncrementId();
try {
$this->delete->deleteOrder($orderId);
$this->messageManager->addSuccessMessage(__('Successfully deleted order #%1.', $incrementId));
} catch (\Exception $e) {
$this->messageManager->addErrorMessage(__('Error delete order #%1.', $incrementId));
}
$resultRedirect = $this->resultRedirectFactory->create();
$resultRedirect->setPath('sales/order/');
return $resultRedirect;
}
/*
* Check permission via ACL resource
*/
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Bss_DeleteOrder::delete_order');
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Controller\Adminhtml\Delete;
use Magento\Backend\App\Action;
class Shipment extends \Magento\Backend\App\Action
{
/**
* @var \Magento\Sales\Model\Order\Shipment
*/
protected $shipment;
/**
* @var \Bss\DeleteOrder\Model\Shipment\Delete
*/
protected $delete;
/**
* Shipment constructor.
* @param Action\Context $context
* @param \Magento\Sales\Model\Order\Shipment $shipment
* @param \Bss\DeleteOrder\Model\Shipment\Delete $delete
*/
public function __construct(
Action\Context $context,
\Magento\Sales\Model\Order\Shipment $shipment,
\Bss\DeleteOrder\Model\Shipment\Delete $delete
) {
$this->shipment = $shipment;
$this->delete = $delete;
parent::__construct($context);
}
/**
* @return \Magento\Framework\App\ResponseInterface|\Magento\Framework\Controller\Result\Redirect|\Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
$shipmentId = $this->getRequest()->getParam('shipment_id');
$shipment = $this->shipment->load($shipmentId);
try {
$this->delete->deleteShipment($shipmentId);
$this->messageManager->addSuccessMessage(__('Successfully deleted shipment #%1.', $shipment->getIncrementId()));
} catch (\Exception $e) {
$this->messageManager->addErrorMessage(__('Error delete shipment #%1.', $shipment->getIncrementId()));
}
$resultRedirect = $this->resultRedirectFactory->create();
$resultRedirect->setPath('sales/shipment/');
return $resultRedirect;
}
/*
* Check permission via ACL resource
*/
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Bss_DeleteOrder::delete_order');
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Helper;
use Magento\Framework\App\DeploymentConfig;
use Magento\Framework\Config\ConfigOptionsListConstants;
class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
/**
* @var DeploymentConfig
*/
protected $deploymentConfig;
/**
* Data constructor.
* @param \Magento\Framework\App\Helper\Context $context
* @param DeploymentConfig $deploymentConfig
*/
public function __construct(
\Magento\Framework\App\Helper\Context $context,
DeploymentConfig $deploymentConfig
) {
parent::__construct($context);
$this->deploymentConfig = $deploymentConfig;
}
/**
* @param null $name
* @return bool|string|null
*/
public function getTableName($name = null)
{
if ($name == null) {
return false;
}
$tableName = $name;
$tablePrefix = (string)$this->deploymentConfig->get(
ConfigOptionsListConstants::CONFIG_PATH_DB_PREFIX
);
if ($tablePrefix) {
$tableName = $tablePrefix . $name;
}
return $tableName;
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Model\Creditmemo;
use Magento\Framework\App\ResourceConnection;
class Delete
{
/**
* @var ResourceConnection
*/
protected $resource;
/**
* @var \Bss\DeleteOrder\Helper\Data
*/
protected $data;
/**
* @var \Magento\Sales\Api\CreditmemoRepositoryInterface
*/
protected $creditmemoRepository;
/**
* @var \Magento\Sales\Model\Order
*/
protected $order;
/**
* Delete constructor.
* @param ResourceConnection $resource
* @param \Bss\DeleteOrder\Helper\Data $data
* @param \Magento\Sales\Api\CreditmemoRepositoryInterface $creditmemoRepository
* @param \Magento\Sales\Model\Order $order
*/
public function __construct(
ResourceConnection $resource,
\Bss\DeleteOrder\Helper\Data $data,
\Magento\Sales\Api\CreditmemoRepositoryInterface $creditmemoRepository,
\Magento\Sales\Model\Order $order
) {
$this->resource = $resource;
$this->data = $data;
$this->creditmemoRepository = $creditmemoRepository;
$this->order = $order;
}
/**
* @param $creditmemoId
* @return \Magento\Sales\Model\Order
* @throws \Exception
*/
public function deleteCreditmemo($creditmemoId)
{
$connection = $this->resource->getConnection(\Magento\Framework\App\ResourceConnection::DEFAULT_CONNECTION);
$creditmemoGridTable = $connection->getTableName($this->data->getTableName('sales_creditmemo_grid'));
$creditmemoTable = $connection->getTableName($this->data->getTableName('sales_creditmemo'));
$creditmemo = $this->creditmemoRepository->get($creditmemoId);
$orderId = $creditmemo->getOrder()->getId();
$order = $this->order->load($orderId);
$orderItems = $order->getAllItems();
$creditmemoItems = $creditmemo->getAllItems();
// revert item in order
foreach ($orderItems as $item) {
foreach ($creditmemoItems as $creditmemoItem) {
if ($creditmemoItem->getOrderItemId() == $item->getItemId()) {
$item->setQtyRefunded($item->getQtyRefunded() - $creditmemoItem->getQty());
$item->setTaxRefunded($item->getTaxRefunded() - $creditmemoItem->getTaxAmount());
$item->setBaseTaxRefunded($item->getBaseTaxRefunded() - $creditmemoItem->getBaseTaxAmount());
$discountTaxItem = $item->getDiscountTaxCompensationRefunded();
$discountTaxCredit = $creditmemoItem->getDiscountTaxCompensationAmount();
$item->setDiscountTaxCompensationRefunded(
$discountTaxItem - $discountTaxCredit
);
$baseDiscountItem = $item->getBaseDiscountTaxCompensationRefunded();
$baseDiscountCredit = $creditmemoItem->getBaseDiscountTaxCompensationAmount();
$item->setBaseDiscountTaxCompensationRefunded(
$baseDiscountItem - $baseDiscountCredit
);
$item->setAmountRefunded($item->getAmountRefunded() - $creditmemoItem->getRowTotal());
$item->setBaseAmountRefunded($item->getBaseAmountRefunded() - $creditmemoItem->getBaseRowTotal());
$item->setDiscountRefunded($item->getDiscountRefunded() - $creditmemoItem->getDiscountAmount());
$item->setBaseDiscountRefunded(
$item->getBaseDiscountRefunded() - $creditmemoItem->getBaseDiscountAmount()
);
}
}
}
// revert info in order
$order->setBaseTotalRefunded($order->getBaseTotalRefunded() - $creditmemo->getBaseGrandTotal());
$order->setTotalRefunded($order->getTotalRefunded() - $creditmemo->getGrandTotal());
$order->setBaseSubtotalRefunded($order->getBaseSubtotalRefunded() - $creditmemo->getBaseSubtotal());
$order->setSubtotalRefunded($order->getSubtotalRefunded() - $creditmemo->getSubtotal());
$order->setBaseTaxRefunded($order->getBaseTaxRefunded() - $creditmemo->getBaseTaxAmount());
$order->setTaxRefunded($order->getTaxRefunded() - $creditmemo->getTaxAmount());
$order->setBaseDiscountTaxCompensationRefunded(
$order->getBaseDiscountTaxCompensationRefunded() - $creditmemo->getBaseDiscountTaxCompensationAmount()
);
$order->setDiscountTaxCompensationRefunded(
$order->getDiscountTaxCompensationRefunded() - $creditmemo->getDiscountTaxCompensationAmount()
);
$order->setBaseShippingRefunded($order->getBaseShippingRefunded() - $creditmemo->getBaseShippingAmount());
$order->setShippingRefunded($order->getShippingRefunded() - $creditmemo->getShippingAmount());
$order->setBaseShippingTaxRefunded(
$order->getBaseShippingTaxRefunded() - $creditmemo->getBaseShippingTaxAmount()
);
$order->setShippingTaxRefunded($order->getShippingTaxRefunded() - $creditmemo->getShippingTaxAmount());
$order->setAdjustmentPositive($order->getAdjustmentPositive() - $creditmemo->getAdjustmentPositive());
$order->setBaseAdjustmentPositive(
$order->getBaseAdjustmentPositive() - $creditmemo->getBaseAdjustmentPositive()
);
$order->setAdjustmentNegative($order->getAdjustmentNegative() - $creditmemo->getAdjustmentNegative());
$order->setBaseAdjustmentNegative(
$order->getBaseAdjustmentNegative() - $creditmemo->getBaseAdjustmentNegative()
);
$order->setDiscountRefunded($order->getDiscountRefunded() - $creditmemo->getDiscountAmount());
$order->setBaseDiscountRefunded($order->getBaseDiscountRefunded() - $creditmemo->getBaseDiscountAmount());
$this->setTotalandBaseTotal($creditmemo, $order);
// delete creditmemo info
$connection->rawQuery('DELETE FROM `'.$creditmemoGridTable.'` WHERE entity_id='.$creditmemoId);
$connection->rawQuery('DELETE FROM `'.$creditmemoTable.'` WHERE entity_id='.$creditmemoId);
$this->saveOrder($order);
return $order;
}
/**
* @param $creditmemo
* @param $order
*/
protected function setTotalandBaseTotal($creditmemo, $order)
{
if ($creditmemo->getDoTransaction()) {
$order->setTotalOnlineRefunded($order->getTotalOnlineRefunded() - $creditmemo->getGrandTotal());
$order->setBaseTotalOnlineRefunded($order->getBaseTotalOnlineRefunded() - $creditmemo->getBaseGrandTotal());
} else {
$order->setTotalOfflineRefunded($order->getTotalOfflineRefunded() - $creditmemo->getGrandTotal());
$order->setBaseTotalOfflineRefunded(
$order->getBaseTotalOfflineRefunded() - $creditmemo->getBaseGrandTotal()
);
}
}
/**
* @param $order
*/
protected function saveOrder($order)
{
if ($order->hasShipments() || $order->hasInvoices() || $order->hasCreditmemos()) {
$order->setState(\Magento\Sales\Model\Order::STATE_PROCESSING)
->setStatus($order->getConfig()->getStateDefaultStatus(\Magento\Sales\Model\Order::STATE_PROCESSING))
->save();
} elseif (!$order->canInvoice() && !$order->canShip() && !$order->hasCreditmemos()) {
$order->setState(\Magento\Sales\Model\Order::STATE_COMPLETE)
->setStatus($order->getConfig()->getStateDefaultStatus(\Magento\Sales\Model\Order::STATE_COMPLETE))
->save();
} else {
$order->setState(\Magento\Sales\Model\Order::STATE_NEW)
->setStatus($order->getConfig()->getStateDefaultStatus(\Magento\Sales\Model\Order::STATE_NEW))
->save();
}
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Model\Invoice;
use Magento\Framework\App\ResourceConnection;
class Delete
{
/**
* @var ResourceConnection
*/
protected $resource;
/**
* @var \Bss\DeleteOrder\Helper\Data
*/
protected $data;
/**
* @var \Magento\Sales\Api\InvoiceRepositoryInterface
*/
protected $invoiceRepository;
/**
* @var \Magento\Sales\Model\Order
*/
protected $order;
/**
* Delete constructor.
* @param ResourceConnection $resource
* @param \Bss\DeleteOrder\Helper\Data $data
* @param \Magento\Sales\Api\InvoiceRepositoryInterface $invoiceRepository
* @param \Magento\Sales\Model\Order $order
*/
public function __construct(
ResourceConnection $resource,
\Bss\DeleteOrder\Helper\Data $data,
\Magento\Sales\Api\InvoiceRepositoryInterface $invoiceRepository,
\Magento\Sales\Model\Order $order
) {
$this->resource = $resource;
$this->data = $data;
$this->invoiceRepository = $invoiceRepository;
$this->order = $order;
}
/**
* @param $invoiceId
* @return \Magento\Sales\Model\Order
* @throws \Exception
*/
public function deleteInvoice($invoiceId)
{
$connection = $this->resource->getConnection(\Magento\Framework\App\ResourceConnection::DEFAULT_CONNECTION);
$invoiceGridTable = $connection->getTableName($this->data->getTableName('sales_invoice_grid'));
$invoiceTable = $connection->getTableName($this->data->getTableName('sales_invoice'));
$invoice = $this->invoiceRepository->get($invoiceId);
$orderId = $invoice->getOrder()->getId();
$order = $this->order->load($orderId);
$orderItems = $order->getAllItems();
$invoiceItems = $invoice->getAllItems();
// revert item in order
foreach ($orderItems as $item) {
foreach ($invoiceItems as $invoiceItem) {
if ($invoiceItem->getOrderItemId() == $item->getItemId()) {
$item->setQtyInvoiced($item->getQtyInvoiced() - $invoiceItem->getQty());
$item->setTaxInvoiced($item->getTaxInvoiced() - $invoiceItem->getTaxAmount());
$item->setBaseTaxInvoiced($item->getBaseTaxInvoiced() - $invoiceItem->getBaseTaxAmount());
$item->setDiscountTaxCompensationInvoiced(
$item->getDiscountTaxCompensationInvoiced() - $invoiceItem->getDiscountTaxCompensationAmount()
);
$baseDiscountTaxItem = $item->getBaseDiscountTaxCompensationInvoiced();
$baseDiscountTaxInvoice = $invoiceItem->getBaseDiscountTaxCompensationAmount();
$item->setBaseDiscountTaxCompensationInvoiced(
$baseDiscountTaxItem - $baseDiscountTaxInvoice
);
$item->setDiscountInvoiced($item->getDiscountInvoiced() - $invoiceItem->getDiscountAmount());
$item->setBaseDiscountInvoiced(
$item->getBaseDiscountInvoiced() - $invoiceItem->getBaseDiscountAmount()
);
$item->setRowInvoiced($item->getRowInvoiced() - $invoiceItem->getRowTotal());
$item->setBaseRowInvoiced($item->getBaseRowInvoiced() - $invoiceItem->getBaseRowTotal());
}
}
}
// revert info in order
$order->setTotalInvoiced($order->getTotalInvoiced() - $invoice->getGrandTotal());
$order->setBaseTotalInvoiced($order->getBaseTotalInvoiced() - $invoice->getBaseGrandTotal());
$order->setSubtotalInvoiced($order->getSubtotalInvoiced() - $invoice->getSubtotal());
$order->setBaseSubtotalInvoiced($order->getBaseSubtotalInvoiced() - $invoice->getBaseSubtotal());
$order->setTaxInvoiced($order->getTaxInvoiced() - $invoice->getTaxAmount());
$order->setBaseTaxInvoiced($order->getBaseTaxInvoiced() - $invoice->getBaseTaxAmount());
$order->setDiscountTaxCompensationInvoiced(
$order->getDiscountTaxCompensationInvoiced() - $invoice->getDiscountTaxCompensationAmount()
);
$order->setBaseDiscountTaxCompensationInvoiced(
$order->getBaseDiscountTaxCompensationInvoiced() - $invoice->getBaseDiscountTaxCompensationAmount()
);
$order->setShippingTaxInvoiced($order->getShippingTaxInvoiced() - $invoice->getShippingTaxAmount());
$order->setBaseShippingTaxInvoiced($order->getBaseShippingTaxInvoiced() - $invoice->getBaseShippingTaxAmount());
$order->setShippingInvoiced($order->getShippingInvoiced() - $invoice->getShippingAmount());
$order->setBaseShippingInvoiced($order->getBaseShippingInvoiced() - $invoice->getBaseShippingAmount());
$order->setDiscountInvoiced($order->getDiscountInvoiced() - $invoice->getDiscountAmount());
$order->setBaseDiscountInvoiced($order->getBaseDiscountInvoiced() - $invoice->getBaseDiscountAmount());
$order->setBaseTotalInvoicedCost($order->getBaseTotalInvoicedCost() - $invoice->getBaseCost());
if ($invoice->getState() == \Magento\Sales\Model\Order\Invoice::STATE_PAID) {
$order->setTotalPaid($order->getTotalPaid() - $invoice->getGrandTotal());
$order->setBaseTotalPaid($order->getBaseTotalPaid() - $invoice->getBaseGrandTotal());
}
// delete invoice info
$connection->rawQuery('DELETE FROM `'.$invoiceGridTable.'` WHERE entity_id='.$invoiceId);
$connection->rawQuery('DELETE FROM `'.$invoiceTable.'` WHERE entity_id='.$invoiceId);
if ($order->hasShipments() || $order->hasInvoices() || $order->hasCreditmemos()) {
$order->setState(\Magento\Sales\Model\Order::STATE_PROCESSING)
->setStatus($order->getConfig()->getStateDefaultStatus(\Magento\Sales\Model\Order::STATE_PROCESSING))
->save();
} else {
$order->setState(\Magento\Sales\Model\Order::STATE_NEW)
->setStatus($order->getConfig()->getStateDefaultStatus(\Magento\Sales\Model\Order::STATE_NEW))
->save();
}
return $order;
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Model\Order;
use Magento\Framework\App\ResourceConnection;
class Delete
{
/**
* @var ResourceConnection
*/
protected $resource;
/**
* @var \Bss\DeleteOrder\Helper\Data
*/
protected $data;
/**
* @var \Magento\Sales\Model\Order
*/
protected $order;
/**
* Delete constructor.
* @param ResourceConnection $resource
* @param \Bss\DeleteOrder\Helper\Data $data
* @param \Magento\Sales\Model\Order $order
*/
public function __construct(
ResourceConnection $resource,
\Bss\DeleteOrder\Helper\Data $data,
\Magento\Sales\Model\Order $order
) {
$this->resource = $resource;
$this->data = $data;
$this->order = $order;
}
/**
* @param $orderId
* @throws \Exception
*/
public function deleteOrder($orderId)
{
$connection = $this->resource->getConnection(\Magento\Framework\App\ResourceConnection::DEFAULT_CONNECTION);
$invoiceGridTable = $connection->getTableName($this->data->getTableName('sales_invoice_grid'));
$shippmentGridTable = $connection->getTableName($this->data->getTableName('sales_shipment_grid'));
$creditmemoGridTable = $connection->getTableName($this->data->getTableName('sales_creditmemo_grid'));
$order = $this->order->load($orderId);
$order->delete();
$connection->rawQuery('DELETE FROM `'.$invoiceGridTable.'` WHERE order_id='.$orderId);
$connection->rawQuery('DELETE FROM `'.$shippmentGridTable.'` WHERE order_id='.$orderId);
$connection->rawQuery('DELETE FROM `'.$creditmemoGridTable.'` WHERE order_id='.$orderId);
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Model\Shipment;
use Magento\Framework\App\ResourceConnection;
class Delete
{
/**
* @var ResourceConnection
*/
protected $resource;
/**
* @var \Bss\DeleteOrder\Helper\Data
*/
protected $data;
/**
* @var \Magento\Sales\Model\Order\Shipment
*/
protected $shipment;
/**
* @var \Magento\Sales\Model\Order
*/
protected $order;
/**
* Delete constructor.
* @param ResourceConnection $resource
* @param \Bss\DeleteOrder\Helper\Data $data
* @param \Magento\Sales\Model\Order\Shipment $shipment
* @param \Magento\Sales\Model\Order $order
*/
public function __construct(
ResourceConnection $resource,
\Bss\DeleteOrder\Helper\Data $data,
\Magento\Sales\Model\Order\Shipment $shipment,
\Magento\Sales\Model\Order $order
) {
$this->resource = $resource;
$this->data = $data;
$this->shipment = $shipment;
$this->order = $order;
}
/**
* @param $shipmentId
* @return \Magento\Sales\Model\Order
* @throws \Exception
*/
public function deleteShipment($shipmentId)
{
$connection = $this->resource->getConnection(\Magento\Framework\App\ResourceConnection::DEFAULT_CONNECTION);
$shipmentTable = $connection->getTableName($this->data->getTableName('sales_shipment'));
$shipmentGridTable = $connection->getTableName($this->data->getTableName('sales_shipment_grid'));
$shipment = $this->shipment->load($shipmentId);
$orderId = $shipment->getOrder()->getId();
$order = $this->order->load($orderId);
$orderItems = $order->getAllItems();
$shipmentItems = $shipment->getAllItems();
// revert item in order
foreach ($orderItems as $item) {
foreach ($shipmentItems as $shipmentItem) {
if ($shipmentItem->getOrderItemId() == $item->getItemId()) {
$item->setQtyShipped($item->getQtyShipped() - $shipmentItem->getQty());
}
}
}
// delete shipment info
$connection->rawQuery('DELETE FROM `'.$shipmentGridTable.'` WHERE entity_id='.$shipmentId);
$connection->rawQuery('DELETE FROM `'.$shipmentTable.'` WHERE entity_id='.$shipmentId);
if ($order->hasShipments() || $order->hasInvoices() || $order->hasCreditmemos()) {
$order->setState(\Magento\Sales\Model\Order::STATE_PROCESSING)
->setStatus($order->getConfig()->getStateDefaultStatus(\Magento\Sales\Model\Order::STATE_PROCESSING))
->save();
} else {
$order->setState(\Magento\Sales\Model\Order::STATE_NEW)
->setStatus($order->getConfig()->getStateDefaultStatus(\Magento\Sales\Model\Order::STATE_NEW))
->save();
}
return $order;
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Plugin\Creditmemo;
class PluginAfter extends \Bss\DeleteOrder\Plugin\PluginAbstract
{
/**
* @var \Magento\Backend\Helper\Data
*/
protected $data;
/**
* PluginAfter constructor.
* @param \Magento\Authorization\Model\Acl\AclRetriever $aclRetriever
* @param \Magento\Backend\Model\Auth\Session $authSession
* @param \Magento\Backend\Helper\Data $data
*/
public function __construct(
\Magento\Authorization\Model\Acl\AclRetriever $aclRetriever,
\Magento\Backend\Model\Auth\Session $authSession,
\Magento\Backend\Helper\Data $data
) {
parent::__construct($aclRetriever, $authSession);
$this->data = $data;
}
/**
* @param \Magento\Sales\Block\Adminhtml\Order\Creditmemo\View $subject
* @param $result
* @return mixed
*/
public function afterGetBackUrl(\Magento\Sales\Block\Adminhtml\Order\Creditmemo\View $subject, $result)
{
if ($this->isAllowedResources()) {
$params = $subject->getRequest()->getParams();
$message = __('Are you sure you want to do this?');
if ($subject->getRequest()->getFullActionName() == 'sales_order_creditmemo_view') {
$subject->addButton(
'bss-delete',
['label' => __('Delete'), 'onclick' => 'confirmSetLocation(\'' . $message . '\',\'' . $this->getDeleteUrl($params['creditmemo_id']) . '\')', 'class' => 'bss-delete'],
-1
);
}
}
return $result;
}
/**
* @param string $creditmemoId
* @return mixed
*/
public function getDeleteUrl($creditmemoId)
{
return $this->data->getUrl(
'deleteorder/delete/creditmemo',
[
'creditmemo_id' => $creditmemoId
]
);
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Plugin\Invoice;
class PluginAfter extends \Bss\DeleteOrder\Plugin\PluginAbstract
{
/**
* @var \Magento\Backend\Helper\Data
*/
protected $data;
/**
* PluginAfter constructor.
* @param \Magento\Authorization\Model\Acl\AclRetriever $aclRetriever
* @param \Magento\Backend\Model\Auth\Session $authSession
* @param \Magento\Backend\Helper\Data $data
*/
public function __construct(
\Magento\Authorization\Model\Acl\AclRetriever $aclRetriever,
\Magento\Backend\Model\Auth\Session $authSession,
\Magento\Backend\Helper\Data $data
) {
parent::__construct($aclRetriever, $authSession);
$this->data = $data;
}
/**
* @param \Magento\Sales\Block\Adminhtml\Order\Invoice\View $subject
* @param $result
* @return mixed
*/
public function afterGetBackUrl(\Magento\Sales\Block\Adminhtml\Order\Invoice\View $subject, $result)
{
if ($this->isAllowedResources()) {
$params = $subject->getRequest()->getParams();
$message = __('Are you sure you want to do this?');
if ($subject->getRequest()->getFullActionName() == 'sales_order_invoice_view') {
$subject->addButton(
'bss-delete',
['label' => __('Delete'), 'onclick' => 'confirmSetLocation(\'' . $message . '\',\'' . $this->getDeleteUrl($params['invoice_id']) . '\')', 'class' => 'bss-delete'],
-1
);
}
}
return $result;
}
/**
* @param string $invoiceId
* @return mixed
*/
public function getDeleteUrl($invoiceId)
{
return $this->data->getUrl(
'deleteorder/delete/invoice',
[
'invoice_id' => $invoiceId
]
);
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Plugin\Order;
class PluginAfter extends \Bss\DeleteOrder\Plugin\PluginAbstract
{
/**
* @var \Magento\Backend\Helper\Data
*/
protected $data;
/**
* PluginAfter constructor.
* @param \Magento\Authorization\Model\Acl\AclRetriever $aclRetriever
* @param \Magento\Backend\Model\Auth\Session $authSession
* @param \Magento\Backend\Helper\Data $data
*/
public function __construct(
\Magento\Authorization\Model\Acl\AclRetriever $aclRetriever,
\Magento\Backend\Model\Auth\Session $authSession,
\Magento\Backend\Helper\Data $data
) {
parent::__construct($aclRetriever, $authSession);
$this->data = $data;
}
/**
* @param \Magento\Sales\Block\Adminhtml\Order\View $subject
* @param $result
* @return mixed
*/
public function afterGetBackUrl(\Magento\Sales\Block\Adminhtml\Order\View $subject, $result)
{
if ($this->isAllowedResources()) {
$params = $subject->getRequest()->getParams();
$message = __('Are you sure you want to do this?');
if ($subject->getRequest()->getFullActionName() == 'sales_order_view') {
$subject->addButton(
'bss-delete',
['label' => __('Delete'), 'onclick' => 'confirmSetLocation(\'' . $message . '\',\'' . $this->getDeleteUrl($params['order_id']) . '\')', 'class' => 'bss-delete'],
-1
);
}
}
return $result;
}
/**
* @param string $orderId
* @return mixed
*/
public function getDeleteUrl($orderId)
{
return $this->data->getUrl(
'deleteorder/delete/order',
[
'order_id' => $orderId
]
);
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Plugin;
class PluginAbstract
{
/**
* @var \Magento\Authorization\Model\Acl\AclRetriever
*/
protected $aclRetriever;
/**
* @var \Magento\Backend\Model\Auth\Session
*/
protected $authSession;
/**
* PluginAbstract constructor.
* @param \Magento\Authorization\Model\Acl\AclRetriever $aclRetriever
* @param \Magento\Backend\Model\Auth\Session $authSession
*/
public function __construct(
\Magento\Authorization\Model\Acl\AclRetriever $aclRetriever,
\Magento\Backend\Model\Auth\Session $authSession
) {
$this->aclRetriever = $aclRetriever;
$this->authSession = $authSession;
}
/**
* @return bool
*/
public function isAllowedResources()
{
$user = $this->authSession->getUser();
$role = $user->getRole();
$resources = $this->aclRetriever->getAllowedResourcesByRole($role->getId());
if (in_array("Magento_Backend::all", $resources) || in_array("Bss_DeleteOrder::delete_order", $resources)) {
return true;
}
return false;
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Plugin\Shipment;
class PluginAfter extends \Bss\DeleteOrder\Plugin\PluginAbstract
{
/**
* @var \Magento\Backend\Helper\Data
*/
protected $data;
/**
* PluginAfter constructor.
* @param \Magento\Authorization\Model\Acl\AclRetriever $aclRetriever
* @param \Magento\Backend\Model\Auth\Session $authSession
* @param \Magento\Backend\Helper\Data $data
*/
public function __construct(
\Magento\Authorization\Model\Acl\AclRetriever $aclRetriever,
\Magento\Backend\Model\Auth\Session $authSession,
\Magento\Backend\Helper\Data $data
) {
parent::__construct($aclRetriever, $authSession);
$this->data = $data;
}
/**
* @param \Magento\Shipping\Block\Adminhtml\View $subject
* @param $result
* @return mixed
*/
public function afterGetBackUrl(\Magento\Shipping\Block\Adminhtml\View $subject, $result)
{
if ($this->isAllowedResources()) {
$params = $subject->getRequest()->getParams();
$message = __('Are you sure you want to do this?');
if ($subject->getRequest()->getFullActionName() == 'adminhtml_order_shipment_view') {
$subject->addButton(
'bss-delete',
['label' => __('Delete'), 'onclick' => 'confirmSetLocation(\'' . $message . '\',\'' . $this->getDeleteUrl($params['shipment_id']) . '\')', 'class' => 'bss-delete'],
-1
);
}
}
return $result;
}
/**
* @param string $shipmentId
* @return mixed
*/
public function getDeleteUrl($shipmentId)
{
return $this->data->getUrl(
'deleteorder/delete/shipment',
[
'shipment_id' => $shipmentId
]
);
}
}
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
namespace Bss\DeleteOrder\Ui\Component\Control;
use Magento\Ui\Component\Control\Action;
class DeleteAction extends Action
{
/**
* setup url
*/
public function prepare()
{
$config = $this->getConfiguration();
$context = $this->getContext();
$config['url'] = $context->getUrl(
$config['deleteAction'],
['order_id' => $context->getRequestParam('order_id')]
);
$this->setData('config', (array)$config);
parent::prepare();
}
}
{
"name": "bsscommerce/delete-order",
"description": "Bss Delete Order Modules",
"type": "magento2-module",
"version": "1.0.6",
"license": [
"OSL-3.0",
"AFL-3.0"
],
"autoload": {
"files": [
"registration.php"
],
"psr-4": {
"Bss\\DeleteOrder\\": ""
}
}
}
<?xml version="1.0"?>
<!--
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">
<acl>
<resources>
<resource id="Magento_Backend::admin">
<resource id="Bss_DeleteOrder::bss_delete_order" title="Bss Commerce" sortOrder="100">
<resource id="Bss_DeleteOrder::delete_order" title="Delete Order" sortOrder="80"/>
</resource>
</resource>
</resources>
</acl>
</config>
<?xml version="1.0"?>
<!--
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="\Magento\Sales\Block\Adminhtml\Order\Invoice\View">
<plugin name="Bss_DeleteOrder::pluginAfterInvoice" type="Bss\DeleteOrder\Plugin\Invoice\PluginAfter" />
</type>
<type name="\Magento\Sales\Block\Adminhtml\Order\Creditmemo\View">
<plugin name="Bss_DeleteOrder::pluginAfterCreditmemo" type="Bss\DeleteOrder\Plugin\Creditmemo\PluginAfter" />
</type>
<type name="\Magento\Shipping\Block\Adminhtml\View">
<plugin name="Bss_DeleteOrder::pluginAfterShipment" type="Bss\DeleteOrder\Plugin\Shipment\PluginAfter" />
</type>
<type name="\Magento\Sales\Block\Adminhtml\Order\View">
<plugin name="Bss_DeleteOrder::pluginAfterOrder" type="Bss\DeleteOrder\Plugin\Order\PluginAfter" />
</type>
</config>
<?xml version="1.0"?>
<!--
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="admin">
<route id="deleteorder" frontName="deleteorder">
<module name="Bss_DeleteOrder" />
</route>
</router>
</config>
<?xml version="1.0"?>
<!--
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Bss_DeleteOrder" setup_version="1.0.6"/>
</config>
<?php
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Bss_DeleteOrder',
__DIR__
);
<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
-->
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<listingToolbar name="listing_top">
<massaction name="listing_massaction">
<action name="delete_creditmemos">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="type" xsi:type="string">bss_deleteCreditmemo</item>
<item name="label" xsi:type="string" translate="true">Delete Credit Memos</item>
<item name="url" xsi:type="url" path="deleteorder/delete/massCreditmemo"/>
<item name="confirm" xsi:type="array">
<item name="title" xsi:type="string" translate="true">Delete Credit Memos</item>
<item name="message" xsi:type="string" translate="true">Are you sure you want to delete selected credit memo(s) ?</item>
</item>
</item>
</argument>
</action>
</massaction>
</listingToolbar>
</listing>
<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
-->
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<listingToolbar name="listing_top">
<massaction name="listing_massaction">
<action name="export">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="type" xsi:type="string">bss_deleteOrder</item>
<item name="label" xsi:type="string" translate="true">Delete Orders</item>
<item name="url" xsi:type="url" path="deleteorder/delete/massOrder"/>
<item name="confirm" xsi:type="array">
<item name="title" xsi:type="string" translate="true">Delete Orders</item>
<item name="message" xsi:type="string" translate="true">Are you sure you want to delete selected order(s) ?</item>
</item>
</item>
</argument>
</action>
</massaction>
</listingToolbar>
</listing>
<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
-->
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<listingToolbar name="listing_top">
<massaction name="listing_massaction">
<action name="delete_invoices">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="type" xsi:type="string">bss_deleteInvoice</item>
<item name="label" xsi:type="string" translate="true">Delete Invoices</item>
<item name="url" xsi:type="url" path="deleteorder/delete/massInvoice"/>
<item name="confirm" xsi:type="array">
<item name="title" xsi:type="string" translate="true">Delete Invoices</item>
<item name="message" xsi:type="string" translate="true">Are you sure you want to delete selected invoice(s) ?</item>
</item>
</item>
</argument>
</action>
</massaction>
</listingToolbar>
</listing>
<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
-->
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<listingToolbar name="listing_top">
<massaction name="listing_massaction">
<action name="delete_shipments">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="type" xsi:type="string">bss_deleteShipment</item>
<item name="label" xsi:type="string" translate="true">Delete Shipments</item>
<item name="url" xsi:type="url" path="deleteorder/delete/massShipment"/>
<item name="confirm" xsi:type="array">
<item name="title" xsi:type="string" translate="true">Delete Shipments</item>
<item name="message" xsi:type="string" translate="true">Are you sure you want to delete selected shipment(s) ?</item>
</item>
</item>
</argument>
</action>
</massaction>
</listingToolbar>
</listing>
<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
-->
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<listingToolbar name="listing_top">
<massaction name="listing_massaction">
<action name="delete_creditmemos" class="Bss\DeleteOrder\Ui\Component\Control\DeleteAction">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="type" xsi:type="string">bss_deleteCreditmemo</item>
<item name="label" xsi:type="string" translate="true">Delete Credit Memos</item>
<item name="deleteAction" xsi:type="string">deleteorder/delete/massCreditmemo</item>
<item name="confirm" xsi:type="array">
<item name="title" xsi:type="string" translate="true">Delete Credit Memos</item>
<item name="message" xsi:type="string" translate="true">Are you sure you want to delete selected credit memo(s) ?</item>
</item>
</item>
</argument>
</action>
</massaction>
</listingToolbar>
</listing>
<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
-->
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<listingToolbar name="listing_top">
<massaction name="listing_massaction">
<action name="delete_invoices" class="Bss\DeleteOrder\Ui\Component\Control\DeleteAction">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="type" xsi:type="string">bss_deleteInvoice</item>
<item name="label" xsi:type="string" translate="true">Delete Invoices</item>
<item name="deleteAction" xsi:type="string">deleteorder/delete/massInvoice</item>
<item name="confirm" xsi:type="array">
<item name="title" xsi:type="string" translate="true">Delete Invoices</item>
<item name="message" xsi:type="string" translate="true">Are you sure you want to delete selected invoice(s) ?</item>
</item>
</item>
</argument>
</action>
</massaction>
</listingToolbar>
</listing>
<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
* BSS Commerce Co.
*
* NOTICE OF LICENSE
*
* This source file is subject to the EULA
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://bsscommerce.com/Bss-Commerce-License.txt
*
* @category BSS
* @package Bss_DeleteOrder
* @author Extension Team
* @copyright Copyright (c) 2019-2019 BSS Commerce Co. ( http://bsscommerce.com )
* @license http://bsscommerce.com/Bss-Commerce-License.txt
*/
-->
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<listingToolbar name="listing_top">
<massaction name="listing_massaction">
<action name="delete_shipments" class="Bss\DeleteOrder\Ui\Component\Control\DeleteAction">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="type" xsi:type="string">bss_deleteShipment</item>
<item name="label" xsi:type="string" translate="true">Delete Shipments</item>
<item name="deleteAction" xsi:type="string">deleteorder/delete/massShipment</item>
<item name="confirm" xsi:type="array">
<item name="title" xsi:type="string" translate="true">Delete Shipments</item>
<item name="message" xsi:type="string" translate="true">Are you sure you want to delete selected shipment(s) ?</item>
</item>
</item>
</argument>
</action>
</massaction>
</listingToolbar>
</listing>
<?php
/**
* Copyright © Customily. All rights reserved.
* Date: 03/09/2020
*/
namespace Customily\Categories\Api\Server;
use Customily\Categories\Helper\CustomilyHelper;
use Customily\Categories\Util\ManageOptions;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\Filesystem;
use Magento\Framework\Webapi\Rest\Request;
use Magento\MediaStorage\Model\File\UploaderFactory;
use Psr\Log\LoggerInterface;
class ApiRestImpl implements ApiRestInterface
{
protected $helper;
protected $manageOptions;
protected $mediaDirectory;
protected $fileUploaderFactory;
protected $request;
protected $logger;
const SWATCH_THUMBNAILS_URL_PATH = 'catalog/product/customily/swatches/thumbnails/';
const PREVIEW_URL_PATH = 'catalog/product/customily/previews/';
const THUMBNAILS_URL_PATH = 'catalog/product/customily/previews/thumbnails/';
/**
* ApiRestImpl constructor.
* @param CustomilyHelper $helper
* @param ManageOptions $manageOptions
* @param Filesystem $filesystem
* @param UploaderFactory $fileUploaderFactory
* @param Request $request
* @param LoggerInterface $logger
* @throws \Magento\Framework\Exception\FileSystemException
*/
public function __construct(
CustomilyHelper $helper,
ManageOptions $manageOptions,
Filesystem $filesystem,
UploaderFactory $fileUploaderFactory,
Request $request,
LoggerInterface $logger
)
{
$this->helper = $helper;
$this->manageOptions = $manageOptions;
$this->mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);
$this->fileUploaderFactory = $fileUploaderFactory;
$this->request = $request;
$this->logger = $logger;
}
/**
* @return false|mixed|string
*/
public function testApi()
{
if (!$this->checkPermissions()) {
return false;
}
$this->logger->debug('CUSTOMILY: Test api.');
$count = $this->helper->getCustomilyProductCount();
$response = ['success' => true, 'products' => $count];
return json_encode($response);
}
/**
* @return false|mixed|string
*/
public function status()
{
$memoryLimit = ini_get('memory_limit');
if (preg_match('/^(\d+)(.)$/', $memoryLimit, $matches)) {
if ($matches[2] == 'M') {
$memoryLimit = $matches[1]; // nnnM -> nnn MB
} else if ($matches[2] == 'K') {
$memoryLimit = $matches[1] / 1024; // nnnK -> nnn KB
}
}
$response = [
'status' => 'active',
'version' => $this->helper->getModuleVersion(),
'memory_limit' => "{$memoryLimit}MB",
'max_input_vars' => ini_get('max_input_vars'),
'max_execution_time' => ini_get('max_execution_time')
];
return json_encode($response);
}
/**
* @return false|mixed|string
*/
public function uploadThumbnail()
{
if (!$this->checkPermissions()) {
return false;
}
$data = $this->request->getBodyParams();
if (isset($data) && isset($data['fileContent'])) {
$fileType = $data['fileType'] ?? 'image';
$targetDir = $this->mediaDirectory->getAbsolutePath(self::SWATCH_THUMBNAILS_URL_PATH);
$response = $this->saveImage(
$data['fileContent'],
$targetDir,
self::SWATCH_THUMBNAILS_URL_PATH,
$fileType
);
} else {
$response = ['success' => false, 'imageUrl' => false];
}
return json_encode($response);
}
/**
* @return false|mixed|string
*/
public function deleteThumbnail()
{
if (!$this->checkPermissions()) {
return false;
}
$data = $this->request->getBodyParams();
if (isset($data) && isset($data['thumbnailName'])) {
$file = $this->mediaDirectory->getAbsolutePath(self::SWATCH_THUMBNAILS_URL_PATH . $data['thumbnailName']);
$response = ['success' => unlink($file)];
} else {
$response = ['success' => false];
}
return json_encode($response);
}
/**
* @return false|mixed|string
*/
public function uploadPreview()
{
if (!$this->checkPermissions()) {
return false;
}
$data = $this->request->getBodyParams();
if (isset($data) && isset($data['productId']) && isset($data['fileContent'])) {
if (isset($data['isThumbnail'])) {
$urlPath = self::THUMBNAILS_URL_PATH;
} else {
$urlPath = self::PREVIEW_URL_PATH;
}
$targetDir = $this->mediaDirectory->getAbsolutePath($urlPath . $data['productId'] . '/');
$response = $this->saveImage($data['fileContent'], $targetDir, $urlPath . $data['productId'] . '/');
} else {
$response = ['success' => false, 'imageUrl' => false];
}
return json_encode($response);
}
/**
* @return false|mixed|string
*/
public function optionsFromTemplate()
{
if (!$this->checkPermissions()) {
return false;
}
$data = $this->request->getBodyParams();
if (isset($data) && isset($data['productId']) && isset($data['templateId']) && isset($data['lastSortOrder'])) {
$this->logger->debug(
"Importing options <=> ProductId: {$data['productId']}, TemplateId: {$data['templateId']}," .
" LastSortOrder : {$data['lastSortOrder']}"
);
$result = $this->manageOptions->optionsFromTemplate(
$data['productId'],
$data['templateId'],
$data['lastSortOrder']
);
$response = ['success' => $result];
} else {
$response = ['success' => false];
}
return json_encode($response);
}
/**
* @return bool|mixed
*/
public function createLog()
{
if (!$this->checkPermissions()) {
return false;
}
$data = $this->request->getBodyParams();
if (isset($data) && isset($data['productId']) && isset($data['title']) && isset($data['message'])) {
/* @var \Magento\Catalog\Model\Product $product */
$product = $this->helper->getProduct($data['productId']);
$templateId = $data['templateId'] ?? '';
if (isset($product) && !empty($product)) {
$this->logger->debug(
"CUSTOMILY: {$data['title']} (sku: {$product->getSku()}, productName: {$product->getName()}," .
" templateId: {$templateId})"
);
$this->logger->debug($data['message']);
}
}
return true;
}
/**
* @param $data
* @param $targetDir
* @param $urlPath
* @param string $fileType
* @return array|false
*/
private function saveImage($data, $targetDir, $urlPath, $fileType = 'image')
{
if (!$this->checkPermissions()) {
return false;
}
try {
if ($fileType == 'svg') {
$ext = 'svg';
} else {
$data = 'image/png;base64,' . $data;
list($type, $data) = explode(';', $data);
list(, $data) = explode(',', $data);
$data = base64_decode($data);
list(, $ext) = explode('/', $type);
}
if (!file_exists($targetDir)) {
mkdir($targetDir, 0777, true);
}
$imageId = uniqid('', true);
$imageId = str_replace('.', '', $imageId);
$imagePath = $targetDir . $imageId . '.' . $ext;
$imageUrl = $urlPath . $imageId . '.' . $ext;
file_put_contents($imagePath, $data);
return [
'success' => true,
'imageUrl' => $imageUrl
];
} catch (\Exception $e) {
$this->logger->debug('CUSTOMILY: Error uploading swatch thumbnail.');
$this->logger->debug($e->getTraceAsString());
return [
'success' => false,
'imageUrl' => ''
];
}
}
/**
* @return bool
*/
private function checkPermissions()
{
try {
$settings = $this->helper->getCustomilyConfig();
$localApiKey = $settings['m_api_key'];
$apiKey = $this->request->getHeader('m-api-key');
if (
isset($localApiKey) && !empty($localApiKey) &&
isset($apiKey) && !empty($localApiKey) &&
base64_decode($localApiKey) == base64_decode($apiKey)
) {
return true;
}
} catch (\Exception $ex) {
$this->logger->debug('CUSTOMILY: Invalid api key.');
$this->logger->debug($ex->getTraceAsString());
}
return false;
}
}
\ No newline at end of file
<?php
/**
* Copyright © Customily. All rights reserved.
* Date: 03/09/2020
*/
namespace Customily\Categories\Api\Server;
interface ApiRestInterface
{
/**
* @return mixed
*/
public function testApi();
/**
* @return mixed
*/
public function status();
/**
* @return mixed
*/
public function uploadThumbnail();
/**
* @return mixed
*/
public function deleteThumbnail();
/**
* @return mixed
*/
public function uploadPreview();
/**
* @return mixed
*/
public function optionsFromTemplate();
/**
* @return mixed
*/
public function createLog();
}
\ No newline at end of file
<?php
/**
* Copyright © Customily. All rights reserved.
*/
namespace Customily\Categories\Block\Product\View\Options\Type\Select;
use Magento\Catalog\Api\Data\ProductCustomOptionValuesInterface;
use Magento\Catalog\Block\Product\View\Options\AbstractOptions;
use Magento\Catalog\Model\Product\Option;
class Checkable extends AbstractOptions
{
/**
* @var string
*/
protected $_template = 'Customily_Categories::product/composite/fieldset/options/view/checkable.phtml';
/**
* @param ProductCustomOptionValuesInterface $value
* Returns formatted price
*/
public function formatPrice(ProductCustomOptionValuesInterface $value)
{
// @noinspection PhpMethodParametersCountMismatchInspection
return parent::_formatPrice(
[
'is_percent' => $value->getPriceType() === 'percent',
'pricing_value' => $value->getPrice($value->getPriceType() === 'percent')
]
);
}
/**
* @param ProductCustomOptionValuesInterface $value
* Returns current currency for store
*
* @return float|string
*/
public function getCurrencyByStore(ProductCustomOptionValuesInterface $value)
{
// @noinspection PhpMethodParametersCountMismatchInspection
return $this->pricingHelper->currencyByStore(
$value->getPrice(true),
$this->getProduct()->getStore(),
false
);
}
/**
* @param Option $option
* Returns preconfigured value for given option
*
* @return null|array|string
*/
public function getPreconfiguredValue(Option $option)
{
return $this->getProduct()->getPreconfiguredValues()->getData('options/' . $option->getId());
}
}
<?php
/**
* Copyright © Customily. All rights reserved.
*/
namespace Customily\Categories\Block\Product\View\Options\Type\Select;
use Magento\Catalog\Block\Product\View\Options\AbstractOptions;
use Magento\Catalog\Model\Product\Option;
use Magento\Framework\View\Element\Html\Select;
class Multiple extends AbstractOptions
{
/**
* @var bool
*/
private $existConfigValue = false;
/**
* {@inheritdoc}
*
* @throws \Magento\Framework\Exception\LocalizedException
*
* @return string
*/
protected function _toHtml()
{
$option = $this->getOption();
$optionType = $option->getType();
$configValue = $this->getProduct()->getPreconfiguredValues()->getData('options/' . $option->getId());
$require = $option->getIsRequire() ? ' required' : '';
$extraParams = '';
if ($configValue) {
$this->existConfigValue = true;
}
/** @var Select $select */
$select = $this->getLayout()->createBlock(Select::class)->setData(
[
'id' => 'select_' . $option->getId(),
'class' => $require . ' product-custom-option admin__control-select'
]
);
$select = $this->insertSelectOption($select, $option);
$select = $this->processSelectOption($select, $option);
if ($optionType === Option::OPTION_TYPE_MULTIPLE) {
$extraParams = ' multiple="multiple"';
}
if (!$this->getSkipJsReloadPrice()) {
$extraParams .= ' onchange="opConfig.reloadPrice()"';
}
$extraParams .= ' data-selector="' . $select->getName() . '"';
$select->setExtraParams($extraParams);
if ($this->existConfigValue) {
$select->setValue($configValue);
}
return $select->getHtml();
}
/**
* Returns select with inserted option give as a parameter
*/
private function insertSelectOption(Select $select, Option $option): Select
{
$require = $option->getIsRequire() ? ' required' : '';
if ($option->getType() === Option::OPTION_TYPE_DROP_DOWN) {
$select->setName('options[' . $option->getId() . ']')->addOption('', __('-- Please Select --'));
} else {
$select->setName('options[' . $option->getId() . '][]');
$select->setClass('multiselect admin__control-multiselect' . $require . ' product-custom-option');
}
return $select;
}
/**
* Returns select with formatted option prices
*/
private function processSelectOption(Select $select, Option $option): Select
{
$store = $this->getProduct()->getStore();
foreach ($option->getValues() as $_value) {
$isPercentPriceType = $_value->getPriceType() === 'percent';
$priceStr = $this->_formatPrice(
[
'is_percent' => $isPercentPriceType,
'pricing_value' => $_value->getPrice($isPercentPriceType)
],
false
);
$selectOption = [];
if (!$this->existConfigValue && $_value->getData('customily_is_default')) {
$selectOption = ['selected' => 'selected'];
}
$select->addOption(
$_value->getOptionTypeId(),
$_value->getTitle() . ' ' . strip_tags($priceStr) . '',
[
'price' => $this->pricingHelper->currencyByStore(
$_value->getPrice(true),
$store,
false
),
$selectOption
]
);
}
return $select;
}
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib;
use Customily\Categories\Libraries\FontLib\Table\Type\name;
use Customily\Categories\Libraries\FontLib\TrueType\File;
/**
* Adobe Font Metrics file creation utility class.
*
* @package php-font-lib
*/
class AdobeFontMetrics {
private $f;
/**
* @var File
*/
private $font;
function __construct(File $font) {
$this->font = $font;
}
function write($file, $encoding = null) {
$map_data = array();
if ($encoding) {
$encoding = preg_replace("/[^a-z0-9-_]/", "", $encoding);
$map_file = dirname(__FILE__) . "/../maps/$encoding.map";
if (!file_exists($map_file)) {
throw new \Exception("Unkown encoding ($encoding)");
}
$map = new EncodingMap($map_file);
$map_data = $map->parse();
}
$this->f = fopen($file, "w+");
$font = $this->font;
$this->startSection("FontMetrics", 4.1);
$this->addPair("Notice", "Converted by PHP-font-lib");
$this->addPair("Comment", "https://github.com/PhenX/php-font-lib");
$encoding_scheme = ($encoding ? $encoding : "FontSpecific");
$this->addPair("EncodingScheme", $encoding_scheme);
$records = $font->getData("name", "records");
foreach ($records as $id => $record) {
if (!isset(name::$nameIdCodes[$id]) || preg_match("/[\r\n]/", $record->string)) {
continue;
}
$this->addPair(name::$nameIdCodes[$id], $record->string);
}
$os2 = $font->getData("OS/2");
$this->addPair("Weight", ($os2["usWeightClass"] > 400 ? "Bold" : "Medium"));
$post = $font->getData("post");
$this->addPair("ItalicAngle", $post["italicAngle"]);
$this->addPair("IsFixedPitch", ($post["isFixedPitch"] ? "true" : "false"));
$this->addPair("UnderlineThickness", $font->normalizeFUnit($post["underlineThickness"]));
$this->addPair("UnderlinePosition", $font->normalizeFUnit($post["underlinePosition"]));
$hhea = $font->getData("hhea");
if (isset($hhea["ascent"])) {
$this->addPair("FontHeightOffset", $font->normalizeFUnit($hhea["lineGap"]));
$this->addPair("Ascender", $font->normalizeFUnit($hhea["ascent"]));
$this->addPair("Descender", $font->normalizeFUnit($hhea["descent"]));
}
else {
$this->addPair("FontHeightOffset", $font->normalizeFUnit($os2["typoLineGap"]));
$this->addPair("Ascender", $font->normalizeFUnit($os2["typoAscender"]));
$this->addPair("Descender", -abs($font->normalizeFUnit($os2["typoDescender"])));
}
$head = $font->getData("head");
$this->addArray("FontBBox", array(
$font->normalizeFUnit($head["xMin"]),
$font->normalizeFUnit($head["yMin"]),
$font->normalizeFUnit($head["xMax"]),
$font->normalizeFUnit($head["yMax"]),
));
$glyphIndexArray = $font->getUnicodeCharMap();
if ($glyphIndexArray) {
$hmtx = $font->getData("hmtx");
$names = $font->getData("post", "names");
$this->startSection("CharMetrics", count($hmtx));
if ($encoding) {
foreach ($map_data as $code => $value) {
list($c, $name) = $value;
if (!isset($glyphIndexArray[$c])) {
continue;
}
$g = $glyphIndexArray[$c];
if (!isset($hmtx[$g])) {
$hmtx[$g] = $hmtx[0];
}
$this->addMetric(array(
"C" => ($code > 255 ? -1 : $code),
"WX" => $font->normalizeFUnit($hmtx[$g][0]),
"N" => $name,
));
}
}
else {
foreach ($glyphIndexArray as $c => $g) {
if (!isset($hmtx[$g])) {
$hmtx[$g] = $hmtx[0];
}
$this->addMetric(array(
"U" => $c,
"WX" => $font->normalizeFUnit($hmtx[$g][0]),
"N" => (isset($names[$g]) ? $names[$g] : sprintf("uni%04x", $c)),
"G" => $g,
));
}
}
$this->endSection("CharMetrics");
$kern = $font->getData("kern", "subtable");
$tree = is_array($kern) ? $kern["tree"] : null;
if (!$encoding && is_array($tree)) {
$this->startSection("KernData");
$this->startSection("KernPairs", count($tree, COUNT_RECURSIVE) - count($tree));
foreach ($tree as $left => $values) {
if (!is_array($values)) {
continue;
}
if (!isset($glyphIndexArray[$left])) {
continue;
}
$left_gid = $glyphIndexArray[$left];
if (!isset($names[$left_gid])) {
continue;
}
$left_name = $names[$left_gid];
$this->addLine("");
foreach ($values as $right => $value) {
if (!isset($glyphIndexArray[$right])) {
continue;
}
$right_gid = $glyphIndexArray[$right];
if (!isset($names[$right_gid])) {
continue;
}
$right_name = $names[$right_gid];
$this->addPair("KPX", "$left_name $right_name $value");
}
}
$this->endSection("KernPairs");
$this->endSection("KernData");
}
}
$this->endSection("FontMetrics");
}
function addLine($line) {
fwrite($this->f, "$line\n");
}
function addPair($key, $value) {
$this->addLine("$key $value");
}
function addArray($key, $array) {
$this->addLine("$key " . implode(" ", $array));
}
function addMetric($data) {
$array = array();
foreach ($data as $key => $value) {
$array[] = "$key $value";
}
$this->addLine(implode(" ; ", $array));
}
function startSection($name, $value = "") {
$this->addLine("Start$name $value");
}
function endSection($name) {
$this->addLine("End$name");
}
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien M�nager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib;
/**
* Autoloads FontLib classes
*
* @package php-font-lib
*/
class Autoloader {
const PREFIX = 'FontLib';
/**
* Register the autoloader
*/
public static function register() {
spl_autoload_register(array(new self, 'autoload'));
}
/**
* Autoloader
*
* @param string
*/
public static function autoload($class) {
$prefixLength = strlen(self::PREFIX);
if (0 === strncmp(self::PREFIX, $class, $prefixLength)) {
$file = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, $prefixLength));
$file = realpath(__DIR__ . (empty($file) ? '' : DIRECTORY_SEPARATOR) . $file . '.php');
if (file_exists($file)) {
require_once $file;
}
}
}
}
Autoloader::register();
\ No newline at end of file
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\EOT;
/**
* EOT font file.
*
* @package php-font-lib
*/
class File extends \Customily\Categories\Libraries\FontLib\TrueType\File {
const TTEMBED_SUBSET = 0x00000001;
const TTEMBED_TTCOMPRESSED = 0x00000004;
const TTEMBED_FAILIFVARIATIONSIMULATED = 0x00000010;
const TTMBED_EMBEDEUDC = 0x00000020;
const TTEMBED_VALIDATIONTESTS = 0x00000040; // Deprecated
const TTEMBED_WEBOBJECT = 0x00000080;
const TTEMBED_XORENCRYPTDATA = 0x10000000;
/**
* @var Header
*/
public $header;
function parseHeader() {
if (!empty($this->header)) {
return;
}
$this->header = new Header($this);
$this->header->parse();
}
function parse() {
$this->parseHeader();
$flags = $this->header->data["Flags"];
if ($flags & self::TTEMBED_TTCOMPRESSED) {
$mtx_version = $this->readUInt8();
$mtx_copy_limit = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8();
$mtx_offset_1 = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8();
$mtx_offset_2 = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8();
/*
var_dump("$mtx_version $mtx_copy_limit $mtx_offset_1 $mtx_offset_2");
$pos = $this->pos();
$size = $mtx_offset_1 - $pos;
var_dump("pos: $pos");
var_dump("size: $size");*/
}
if ($flags & self::TTEMBED_XORENCRYPTDATA) {
// Process XOR
}
// TODO Read font data ...
}
/**
* Little endian version of the read method
*
* @param int $n The number of bytes to read
*
* @return string
*/
public function read($n) {
if ($n < 1) {
return "";
}
$string = fread($this->f, $n);
$chunks = str_split($string, 2);
$chunks = array_map("strrev", $chunks);
return implode("", $chunks);
}
public function readUInt32() {
$uint32 = parent::readUInt32();
return $uint32 >> 16 & 0x0000FFFF | $uint32 << 16 & 0xFFFF0000;
}
/**
* Get font copyright
*
* @return string|null
*/
function getFontCopyright() {
return null;
}
/**
* Get font name
*
* @return string|null
*/
function getFontName() {
return $this->header->data["FamilyName"];
}
/**
* Get font subfamily
*
* @return string|null
*/
function getFontSubfamily() {
return $this->header->data["StyleName"];
}
/**
* Get font subfamily ID
*
* @return string|null
*/
function getFontSubfamilyID() {
return $this->header->data["StyleName"];
}
/**
* Get font full name
*
* @return string|null
*/
function getFontFullName() {
return $this->header->data["FullName"];
}
/**
* Get font version
*
* @return string|null
*/
function getFontVersion() {
return $this->header->data["VersionName"];
}
/**
* Get font weight
*
* @return string|null
*/
function getFontWeight() {
return $this->header->data["Weight"];
}
/**
* Get font Postscript name
*
* @return string|null
*/
function getFontPostscriptName() {
return null;
}
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\EOT;
use Exception;
use Customily\Categories\Libraries\FontLib\Font;
/**
* TrueType font file header.
*
* @package php-font-lib
*
* @property File $font
*/
class Header extends \Customily\Categories\Libraries\FontLib\Header {
protected $def = array(
"format" => self::uint32,
"numTables" => self::uint16,
"searchRange" => self::uint16,
"entrySelector" => self::uint16,
"rangeShift" => self::uint16,
);
public function parse() {
$font = $this->font;
$this->data = $font->unpack(array(
"EOTSize" => self::uint32,
"FontDataSize" => self::uint32,
"Version" => self::uint32,
"Flags" => self::uint32,
"FontPANOSE" => array(self::uint8, 10),
"Charset" => self::uint8,
"Italic" => self::uint8,
"Weight" => self::uint32,
"fsType" => self::uint16,
"MagicNumber" => self::uint16,
"UnicodeRange1" => self::uint32,
"UnicodeRange2" => self::uint32,
"UnicodeRange3" => self::uint32,
"UnicodeRange4" => self::uint32,
"CodePageRange1" => self::uint32,
"CodePageRange2" => self::uint32,
"CheckSumAdjustment" => self::uint32,
"Reserved1" => self::uint32,
"Reserved2" => self::uint32,
"Reserved3" => self::uint32,
"Reserved4" => self::uint32,
));
$this->data["Padding1"] = $font->readUInt16();
$this->readString("FamilyName");
$this->data["Padding2"] = $font->readUInt16();
$this->readString("StyleName");
$this->data["Padding3"] = $font->readUInt16();
$this->readString("VersionName");
$this->data["Padding4"] = $font->readUInt16();
$this->readString("FullName");
switch ($this->data["Version"]) {
default:
throw new Exception("Unknown EOT version " . $this->data["Version"]);
case 0x00010000:
// Nothing to do more
break;
case 0x00020001:
$this->data["Padding5"] = $font->readUInt16();
$this->readString("RootString");
break;
case 0x00020002:
$this->data["Padding5"] = $font->readUInt16();
$this->readString("RootString");
$this->data["RootStringCheckSum"] = $font->readUInt32();
$this->data["EUDCCodePage"] = $font->readUInt32();
$this->data["Padding6"] = $font->readUInt16();
$this->readString("Signature");
$this->data["EUDCFlags"] = $font->readUInt32();
$this->data["EUDCFontSize"] = $font->readUInt32();
break;
}
if (!empty($this->data["RootString"])) {
$this->data["RootString"] = explode("\0", $this->data["RootString"]);
}
}
private function readString($name) {
$font = $this->font;
$size = $font->readUInt16();
$this->data["{$name}Size"] = $size;
$this->data[$name] = Font::UTF16ToUTF8($font->read($size));
}
public function encode() {
//return $this->font->pack($this->def, $this->data);
}
}
\ No newline at end of file
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib;
/**
* Encoding map used to map a code point to a Unicode char.
*
* @package php-font-lib
*/
class EncodingMap {
private $f;
function __construct($file) {
$this->f = fopen($file, "r");
}
function parse() {
$map = array();
while ($line = fgets($this->f)) {
if (preg_match('/^[\!\=]([0-9A-F]{2,})\s+U\+([0-9A-F]{2})([0-9A-F]{2})\s+([^\s]+)/', $line, $matches)) {
$unicode = (hexdec($matches[2]) << 8) + hexdec($matches[3]);
$map[hexdec($matches[1])] = array($unicode, $matches[4]);
}
}
ksort($map);
return $map;
}
}
<?php
namespace Customily\Categories\Libraries\FontLib\Exception;
class FontNotFoundException extends \Exception
{
public function __construct($fontPath)
{
$this->message = 'Font not found in: ' . $fontPath;
}
}
\ No newline at end of file
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib;
use Customily\Categories\Libraries\FontLib\Exception\FontNotFoundException;
/**
* Generic font file.
*
* @package php-font-lib
*/
class Font {
static $debug = false;
/**
* @param string $file The font file
*
* @return TrueType\File|null $file
*/
public static function load($file) {
if(!file_exists($file)){
throw new FontNotFoundException($file);
}
$header = file_get_contents($file, false, null, null, 4);
$class = null;
switch ($header) {
case "\x00\x01\x00\x00":
case "true":
case "typ1":
$class = "TrueType\\File";
break;
case "OTTO":
$class = "OpenType\\File";
break;
case "wOFF":
$class = "WOFF\\File";
break;
case "ttcf":
$class = "TrueType\\Collection";
break;
// Unknown type or EOT
default:
$magicNumber = file_get_contents($file, false, null, 34, 2);
if ($magicNumber === "LP") {
$class = "EOT\\File";
}
}
if ($class) {
$class = "Customily\\Categories\\Libraries\\FontLib\\$class";
/** @var TrueType\File $obj */
$obj = new $class;
$obj->load($file);
return $obj;
}
return null;
}
static function d($str) {
if (!self::$debug) {
return;
}
echo "$str\n";
}
static function UTF16ToUTF8($str) {
return mb_convert_encoding($str, "utf-8", "utf-16");
}
static function UTF8ToUTF16($str) {
return mb_convert_encoding($str, "utf-16", "utf-8");
}
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
* @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $
*/
namespace Customily\Categories\Libraries\FontLib\Glyph;
use Customily\Categories\Libraries\FontLib\Table\Type\glyf;
use Customily\Categories\Libraries\FontLib\TrueType\File;
use Customily\Categories\Libraries\FontLib\BinaryStream;
/**
* `glyf` font table.
*
* @package php-font-lib
*/
class Outline extends BinaryStream {
/**
* @var \Customily\Categories\Libraries\FontLib\Table\Type\glyf
*/
protected $table;
protected $offset;
protected $size;
// Data
public $numberOfContours;
public $xMin;
public $yMin;
public $xMax;
public $yMax;
public $raw;
/**
* @param glyf $table
* @param $offset
* @param $size
*
* @return Outline
*/
static function init(glyf $table, $offset, $size, BinaryStream $font) {
$font->seek($offset);
if ($font->readInt16() > -1) {
/** @var OutlineSimple $glyph */
$glyph = new OutlineSimple($table, $offset, $size);
}
else {
/** @var OutlineComposite $glyph */
$glyph = new OutlineComposite($table, $offset, $size);
}
$glyph->parse($font);
return $glyph;
}
/**
* @return File
*/
function getFont() {
return $this->table->getFont();
}
function __construct(glyf $table, $offset = null, $size = null) {
$this->table = $table;
$this->offset = $offset;
$this->size = $size;
}
function parse(BinaryStream $font) {
$font->seek($this->offset);
if (!$this->size) {
return;
}
$this->raw = $font->read($this->size);
}
function parseData() {
$font = $this->getFont();
$font->seek($this->offset);
$this->numberOfContours = $font->readInt16();
$this->xMin = $font->readFWord();
$this->yMin = $font->readFWord();
$this->xMax = $font->readFWord();
$this->yMax = $font->readFWord();
}
function encode() {
$font = $this->getFont();
return $font->write($this->raw, strlen($this->raw));
}
function getSVGContours() {
// Inherit
}
function getGlyphIDs() {
return array();
}
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
* @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $
*/
namespace Customily\Categories\Libraries\FontLib\Glyph;
/**
* Glyph outline component
*
* @package php-font-lib
*/
class OutlineComponent {
public $flags;
public $glyphIndex;
public $a, $b, $c, $d, $e, $f;
public $point_compound;
public $point_component;
public $instructions;
function getMatrix() {
return array(
$this->a, $this->b,
$this->c, $this->d,
$this->e, $this->f,
);
}
}
\ No newline at end of file
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
* @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $
*/
namespace Customily\Categories\Libraries\FontLib\Glyph;
/**
* Composite glyph outline
*
* @package php-font-lib
*/
class OutlineComposite extends Outline {
const ARG_1_AND_2_ARE_WORDS = 0x0001;
const ARGS_ARE_XY_VALUES = 0x0002;
const ROUND_XY_TO_GRID = 0x0004;
const WE_HAVE_A_SCALE = 0x0008;
const MORE_COMPONENTS = 0x0020;
const WE_HAVE_AN_X_AND_Y_SCALE = 0x0040;
const WE_HAVE_A_TWO_BY_TWO = 0x0080;
const WE_HAVE_INSTRUCTIONS = 0x0100;
const USE_MY_METRICS = 0x0200;
const OVERLAP_COMPOUND = 0x0400;
/**
* @var OutlineComponent[]
*/
public $components = array();
function getGlyphIDs() {
if (empty($this->components)) {
$this->parseData();
}
$glyphIDs = array();
foreach ($this->components as $_component) {
$glyphIDs[] = $_component->glyphIndex;
$_glyph = $this->table->data[$_component->glyphIndex];
if ($_glyph !== $this) {
$glyphIDs = array_merge($glyphIDs, $_glyph->getGlyphIDs());
}
}
return $glyphIDs;
}
/*function parse() {
//$this->parseData();
}*/
function parseData() {
parent::parseData();
$font = $this->getFont();
do {
$flags = $font->readUInt16();
$glyphIndex = $font->readUInt16();
$a = 1.0;
$b = 0.0;
$c = 0.0;
$d = 1.0;
$e = 0.0;
$f = 0.0;
$point_compound = null;
$point_component = null;
$instructions = null;
if ($flags & self::ARG_1_AND_2_ARE_WORDS) {
if ($flags & self::ARGS_ARE_XY_VALUES) {
$e = $font->readInt16();
$f = $font->readInt16();
}
else {
$point_compound = $font->readUInt16();
$point_component = $font->readUInt16();
}
}
else {
if ($flags & self::ARGS_ARE_XY_VALUES) {
$e = $font->readInt8();
$f = $font->readInt8();
}
else {
$point_compound = $font->readUInt8();
$point_component = $font->readUInt8();
}
}
if ($flags & self::WE_HAVE_A_SCALE) {
$a = $d = $font->readInt16();
}
elseif ($flags & self::WE_HAVE_AN_X_AND_Y_SCALE) {
$a = $font->readInt16();
$d = $font->readInt16();
}
elseif ($flags & self::WE_HAVE_A_TWO_BY_TWO) {
$a = $font->readInt16();
$b = $font->readInt16();
$c = $font->readInt16();
$d = $font->readInt16();
}
//if ($flags & self::WE_HAVE_INSTRUCTIONS) {
//
//}
$component = new OutlineComponent();
$component->flags = $flags;
$component->glyphIndex = $glyphIndex;
$component->a = $a;
$component->b = $b;
$component->c = $c;
$component->d = $d;
$component->e = $e;
$component->f = $f;
$component->point_compound = $point_compound;
$component->point_component = $point_component;
$component->instructions = $instructions;
$this->components[] = $component;
} while ($flags & self::MORE_COMPONENTS);
}
function encode() {
$font = $this->getFont();
$gids = $font->getSubset();
$size = $font->writeInt16(-1);
$size += $font->writeFWord($this->xMin);
$size += $font->writeFWord($this->yMin);
$size += $font->writeFWord($this->xMax);
$size += $font->writeFWord($this->yMax);
foreach ($this->components as $_i => $_component) {
$flags = 0;
if ($_component->point_component === null && $_component->point_compound === null) {
$flags |= self::ARGS_ARE_XY_VALUES;
if (abs($_component->e) > 0x7F || abs($_component->f) > 0x7F) {
$flags |= self::ARG_1_AND_2_ARE_WORDS;
}
}
elseif ($_component->point_component > 0xFF || $_component->point_compound > 0xFF) {
$flags |= self::ARG_1_AND_2_ARE_WORDS;
}
if ($_component->b == 0 && $_component->c == 0) {
if ($_component->a == $_component->d) {
if ($_component->a != 1.0) {
$flags |= self::WE_HAVE_A_SCALE;
}
}
else {
$flags |= self::WE_HAVE_AN_X_AND_Y_SCALE;
}
}
else {
$flags |= self::WE_HAVE_A_TWO_BY_TWO;
}
if ($_i < count($this->components) - 1) {
$flags |= self::MORE_COMPONENTS;
}
$size += $font->writeUInt16($flags);
$new_gid = array_search($_component->glyphIndex, $gids);
$size += $font->writeUInt16($new_gid);
if ($flags & self::ARG_1_AND_2_ARE_WORDS) {
if ($flags & self::ARGS_ARE_XY_VALUES) {
$size += $font->writeInt16($_component->e);
$size += $font->writeInt16($_component->f);
}
else {
$size += $font->writeUInt16($_component->point_compound);
$size += $font->writeUInt16($_component->point_component);
}
}
else {
if ($flags & self::ARGS_ARE_XY_VALUES) {
$size += $font->writeInt8($_component->e);
$size += $font->writeInt8($_component->f);
}
else {
$size += $font->writeUInt8($_component->point_compound);
$size += $font->writeUInt8($_component->point_component);
}
}
if ($flags & self::WE_HAVE_A_SCALE) {
$size += $font->writeInt16($_component->a);
}
elseif ($flags & self::WE_HAVE_AN_X_AND_Y_SCALE) {
$size += $font->writeInt16($_component->a);
$size += $font->writeInt16($_component->d);
}
elseif ($flags & self::WE_HAVE_A_TWO_BY_TWO) {
$size += $font->writeInt16($_component->a);
$size += $font->writeInt16($_component->b);
$size += $font->writeInt16($_component->c);
$size += $font->writeInt16($_component->d);
}
}
return $size;
}
public function getSVGContours() {
$contours = array();
/** @var \Customily\Categories\Libraries\FontLib\Table\Type\glyf $glyph_data */
$glyph_data = $this->getFont()->getTableObject("glyf");
/** @var Outline[] $glyphs */
$glyphs = $glyph_data->data;
foreach ($this->components as $component) {
$_glyph = $glyphs[$component->glyphIndex];
if ($_glyph !== $this) {
$contours[] = array(
"contours" => $_glyph->getSVGContours(),
"transform" => $component->getMatrix(),
);
}
}
return $contours;
}
}
\ No newline at end of file
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
* @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $
*/
namespace Customily\Categories\Libraries\FontLib\Glyph;
/**
* `glyf` font table.
*
* @package php-font-lib
*/
class OutlineSimple extends Outline {
const ON_CURVE = 0x01;
const X_SHORT_VECTOR = 0x02;
const Y_SHORT_VECTOR = 0x04;
const REPEAT = 0x08;
const THIS_X_IS_SAME = 0x10;
const THIS_Y_IS_SAME = 0x20;
public $instructions;
public $points;
function parseData() {
parent::parseData();
if (!$this->size) {
return;
}
$font = $this->getFont();
$noc = $this->numberOfContours;
if ($noc == 0) {
return;
}
$endPtsOfContours = $font->r(array(self::uint16, $noc));
$instructionLength = $font->readUInt16();
$this->instructions = $font->r(array(self::uint8, $instructionLength));
$count = $endPtsOfContours[$noc - 1] + 1;
// Flags
$flags = array();
for ($index = 0; $index < $count; $index++) {
$flags[$index] = $font->readUInt8();
if ($flags[$index] & self::REPEAT) {
$repeats = $font->readUInt8();
for ($i = 1; $i <= $repeats; $i++) {
$flags[$index + $i] = $flags[$index];
}
$index += $repeats;
}
}
$points = array();
foreach ($flags as $i => $flag) {
$points[$i]["onCurve"] = $flag & self::ON_CURVE;
$points[$i]["endOfContour"] = in_array($i, $endPtsOfContours);
}
// X Coords
$x = 0;
for ($i = 0; $i < $count; $i++) {
$flag = $flags[$i];
if ($flag & self::THIS_X_IS_SAME) {
if ($flag & self::X_SHORT_VECTOR) {
$x += $font->readUInt8();
}
}
else {
if ($flag & self::X_SHORT_VECTOR) {
$x -= $font->readUInt8();
}
else {
$x += $font->readInt16();
}
}
$points[$i]["x"] = $x;
}
// Y Coords
$y = 0;
for ($i = 0; $i < $count; $i++) {
$flag = $flags[$i];
if ($flag & self::THIS_Y_IS_SAME) {
if ($flag & self::Y_SHORT_VECTOR) {
$y += $font->readUInt8();
}
}
else {
if ($flag & self::Y_SHORT_VECTOR) {
$y -= $font->readUInt8();
}
else {
$y += $font->readInt16();
}
}
$points[$i]["y"] = $y;
}
$this->points = $points;
}
public function splitSVGPath($path) {
preg_match_all('/([a-z])|(-?\d+(?:\.\d+)?)/i', $path, $matches, PREG_PATTERN_ORDER);
return $matches[0];
}
public function makePoints($path) {
$path = $this->splitSVGPath($path);
$l = count($path);
$i = 0;
$points = array();
while ($i < $l) {
switch ($path[$i]) {
// moveTo
case "M":
$points[] = array(
"onCurve" => true,
"x" => $path[++$i],
"y" => $path[++$i],
"endOfContour" => false,
);
break;
// lineTo
case "L":
$points[] = array(
"onCurve" => true,
"x" => $path[++$i],
"y" => $path[++$i],
"endOfContour" => false,
);
break;
// quadraticCurveTo
case "Q":
$points[] = array(
"onCurve" => false,
"x" => $path[++$i],
"y" => $path[++$i],
"endOfContour" => false,
);
$points[] = array(
"onCurve" => true,
"x" => $path[++$i],
"y" => $path[++$i],
"endOfContour" => false,
);
break;
// closePath
/** @noinspection PhpMissingBreakStatementInspection */
case "z":
$points[count($points) - 1]["endOfContour"] = true;
default:
$i++;
break;
}
}
return $points;
}
function encode() {
if (empty($this->points)) {
return parent::encode();
}
return $this->size = $this->encodePoints($this->points);
}
public function encodePoints($points) {
$endPtsOfContours = array();
$flags = array();
$coords_x = array();
$coords_y = array();
$last_x = 0;
$last_y = 0;
$xMin = $yMin = 0xFFFF;
$xMax = $yMax = -0xFFFF;
foreach ($points as $i => $point) {
$flag = 0;
if ($point["onCurve"]) {
$flag |= self::ON_CURVE;
}
if ($point["endOfContour"]) {
$endPtsOfContours[] = $i;
}
// Simplified, we could do some optimizations
if ($point["x"] == $last_x) {
$flag |= self::THIS_X_IS_SAME;
}
else {
$x = intval($point["x"]);
$xMin = min($x, $xMin);
$xMax = max($x, $xMax);
$coords_x[] = $x - $last_x; // int16
}
// Simplified, we could do some optimizations
if ($point["y"] == $last_y) {
$flag |= self::THIS_Y_IS_SAME;
}
else {
$y = intval($point["y"]);
$yMin = min($y, $yMin);
$yMax = max($y, $yMax);
$coords_y[] = $y - $last_y; // int16
}
$flags[] = $flag;
$last_x = $point["x"];
$last_y = $point["y"];
}
$font = $this->getFont();
$l = 0;
$l += $font->writeInt16(count($endPtsOfContours)); // endPtsOfContours
$l += $font->writeFWord(isset($this->xMin) ? $this->xMin : $xMin); // xMin
$l += $font->writeFWord(isset($this->yMin) ? $this->yMin : $yMin); // yMin
$l += $font->writeFWord(isset($this->xMax) ? $this->xMax : $xMax); // xMax
$l += $font->writeFWord(isset($this->yMax) ? $this->yMax : $yMax); // yMax
// Simple glyf
$l += $font->w(array(self::uint16, count($endPtsOfContours)), $endPtsOfContours); // endPtsOfContours
$l += $font->writeUInt16(0); // instructionLength
$l += $font->w(array(self::uint8, count($flags)), $flags); // flags
$l += $font->w(array(self::int16, count($coords_x)), $coords_x); // xCoordinates
$l += $font->w(array(self::int16, count($coords_y)), $coords_y); // yCoordinates
return $l;
}
public function getSVGContours($points = null) {
$path = "";
if (!$points) {
if (empty($this->points)) {
$this->parseData();
}
$points = $this->points;
}
$length = count($points);
$firstIndex = 0;
$count = 0;
for ($i = 0; $i < $length; $i++) {
$count++;
if ($points[$i]["endOfContour"]) {
$path .= $this->getSVGPath($points, $firstIndex, $count);
$firstIndex = $i + 1;
$count = 0;
}
}
return $path;
}
protected function getSVGPath($points, $startIndex, $count) {
$offset = 0;
$path = "";
while ($offset < $count) {
$point = $points[$startIndex + $offset % $count];
$point_p1 = $points[$startIndex + ($offset + 1) % $count];
if ($offset == 0) {
$path .= "M{$point['x']},{$point['y']} ";
}
if ($point["onCurve"]) {
if ($point_p1["onCurve"]) {
$path .= "L{$point_p1['x']},{$point_p1['y']} ";
$offset++;
}
else {
$point_p2 = $points[$startIndex + ($offset + 2) % $count];
if ($point_p2["onCurve"]) {
$path .= "Q{$point_p1['x']},{$point_p1['y']},{$point_p2['x']},{$point_p2['y']} ";
}
else {
$path .= "Q{$point_p1['x']},{$point_p1['y']}," . $this->midValue($point_p1['x'], $point_p2['x']) . "," . $this->midValue($point_p1['y'], $point_p2['y']) . " ";
}
$offset += 2;
}
}
else {
if ($point_p1["onCurve"]) {
$path .= "Q{$point['x']},{$point['y']},{$point_p1['x']},{$point_p1['y']} ";
}
else {
$path .= "Q{$point['x']},{$point['y']}," . $this->midValue($point['x'], $point_p1['x']) . "," . $this->midValue($point['y'], $point_p1['y']) . " ";
}
$offset++;
}
}
$path .= "z ";
return $path;
}
function midValue($a, $b) {
return $a + ($b - $a) / 2;
}
}
\ No newline at end of file
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib;
use Customily\Categories\Libraries\FontLib\TrueType\File;
/**
* Font header container.
*
* @package php-font-lib
*/
abstract class Header extends BinaryStream {
/**
* @var File
*/
protected $font;
protected $def = array();
public $data;
public function __construct(File $font) {
$this->font = $font;
}
public function encode() {
return $this->font->pack($this->def, $this->data);
}
public function parse() {
$this->data = $this->font->unpack($this->def);
}
}
\ No newline at end of file
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\OpenType;
/**
* Open Type font, the same as a TrueType one.
*
* @package php-font-lib
*/
class File extends \Customily\Categories\Libraries\FontLib\TrueType\File {
//
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\OpenType;
/**
* Open Type Table directory entry, the same as a TrueType one.
*
* @package php-font-lib
*/
class TableDirectoryEntry extends \Customily\Categories\Libraries\FontLib\TrueType\TableDirectoryEntry {
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\Table;
use Customily\Categories\Libraries\FontLib\TrueType\File;
use Customily\Categories\Libraries\FontLib\Font;
use Customily\Categories\Libraries\FontLib\BinaryStream;
/**
* Generic Font table directory entry.
*
* @package php-font-lib
*/
class DirectoryEntry extends BinaryStream {
/**
* @var File
*/
protected $font;
/**
* @var Table
*/
protected $font_table;
public $entryLength = 4;
public $tag;
public $checksum;
public $offset;
public $length;
protected $origF;
static function computeChecksum($data) {
$len = strlen($data);
$mod = $len % 4;
if ($mod) {
$data = str_pad($data, $len + (4 - $mod), "\0");
}
$len = strlen($data);
$hi = 0x0000;
$lo = 0x0000;
for ($i = 0; $i < $len; $i += 4) {
$hi += (ord($data[$i]) << 8) + ord($data[$i + 1]);
$lo += (ord($data[$i + 2]) << 8) + ord($data[$i + 3]);
$hi += $lo >> 16;
$lo = $lo & 0xFFFF;
$hi = $hi & 0xFFFF;
}
return ($hi << 8) + $lo;
}
function __construct(File $font) {
$this->font = $font;
$this->f = $font->f;
}
function parse() {
$this->tag = $this->font->read(4);
}
function open($filename, $mode = self::modeRead) {
// void
}
function setTable(Table $font_table) {
$this->font_table = $font_table;
}
function encode($entry_offset) {
Font::d("\n==== $this->tag ====");
//Font::d("Entry offset = $entry_offset");
$data = $this->font_table;
$font = $this->font;
$table_offset = $font->pos();
$this->offset = $table_offset;
$table_length = $data->encode();
$font->seek($table_offset);
$table_data = $font->read($table_length);
$font->seek($entry_offset);
$font->write($this->tag, 4);
$font->writeUInt32(self::computeChecksum($table_data));
$font->writeUInt32($table_offset);
$font->writeUInt32($table_length);
Font::d("Bytes written = $table_length");
$font->seek($table_offset + $table_length);
}
/**
* @return File
*/
function getFont() {
return $this->font;
}
function startRead() {
$this->font->seek($this->offset);
}
function endRead() {
//
}
function startWrite() {
$this->font->seek($this->offset);
}
function endWrite() {
//
}
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\Table;
use Customily\Categories\Libraries\FontLib\TrueType\File;
use Customily\Categories\Libraries\FontLib\Font;
use Customily\Categories\Libraries\FontLib\BinaryStream;
/**
* Generic font table.
*
* @package php-font-lib
*/
class Table extends BinaryStream {
/**
* @var DirectoryEntry
*/
protected $entry;
protected $def = array();
public $data;
final public function __construct(DirectoryEntry $entry) {
$this->entry = $entry;
$entry->setTable($this);
}
/**
* @return File
*/
public function getFont() {
return $this->entry->getFont();
}
protected function _encode() {
if (empty($this->data)) {
Font::d(" >> Table is empty");
return 0;
}
return $this->getFont()->pack($this->def, $this->data);
}
protected function _parse() {
$this->data = $this->getFont()->unpack($this->def);
}
protected function _parseRaw() {
$this->data = $this->getFont()->read($this->entry->length);
}
protected function _encodeRaw() {
return $this->getFont()->write($this->data, $this->entry->length);
}
public function toHTML() {
return "<pre>" . var_export($this->data, true) . "</pre>";
}
final public function encode() {
$this->entry->startWrite();
if (false && empty($this->def)) {
$length = $this->_encodeRaw();
}
else {
$length = $this->_encode();
}
$this->entry->endWrite();
return $length;
}
final public function parse() {
$this->entry->startRead();
if (false && empty($this->def)) {
$this->_parseRaw();
}
else {
$this->_parse();
}
$this->entry->endRead();
}
}
\ No newline at end of file
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\Table\Type;
use Customily\Categories\Libraries\FontLib\Table\Table;
/**
* `cmap` font table.
*
* @package php-font-lib
*/
class cmap extends Table {
private static $header_format = array(
"version" => self::uint16,
"numberSubtables" => self::uint16,
);
private static $subtable_header_format = array(
"platformID" => self::uint16,
"platformSpecificID" => self::uint16,
"offset" => self::uint32,
);
private static $subtable_v4_format = array(
"length" => self::uint16,
"language" => self::uint16,
"segCountX2" => self::uint16,
"searchRange" => self::uint16,
"entrySelector" => self::uint16,
"rangeShift" => self::uint16,
);
private static $subtable_v12_format = array(
"length" => self::uint32,
"language" => self::uint32,
"ngroups" => self::uint32
);
protected function _parse() {
$font = $this->getFont();
$cmap_offset = $font->pos();
$data = $font->unpack(self::$header_format);
$subtables = array();
for ($i = 0; $i < $data["numberSubtables"]; $i++) {
$subtables[] = $font->unpack(self::$subtable_header_format);
}
$data["subtables"] = $subtables;
foreach ($data["subtables"] as $i => &$subtable) {
$font->seek($cmap_offset + $subtable["offset"]);
$subtable["format"] = $font->readUInt16();
// @todo Only CMAP version 4 and 12
if (($subtable["format"] != 4) && ($subtable["format"] != 12)) {
unset($data["subtables"][$i]);
$data["numberSubtables"]--;
continue;
}
if ($subtable["format"] == 12) {
$font->readUInt16();
$subtable += $font->unpack(self::$subtable_v12_format);
$glyphIndexArray = array();
$endCodes = array();
$startCodes = array();
for ($p = 0; $p < $subtable['ngroups']; $p++) {
$startCode = $startCodes[] = $font->readUInt32();
$endCode = $endCodes[] = $font->readUInt32();
$startGlyphCode = $font->readUInt32();
for ($c = $startCode; $c <= $endCode; $c++) {
$glyphIndexArray[$c] = $startGlyphCode;
$startGlyphCode++;
}
}
$subtable += array(
"startCode" => $startCodes,
"endCode" => $endCodes,
"glyphIndexArray" => $glyphIndexArray,
);
}
else if ($subtable["format"] == 4) {
$subtable += $font->unpack(self::$subtable_v4_format);
$segCount = $subtable["segCountX2"] / 2;
$subtable["segCount"] = $segCount;
$endCode = $font->readUInt16Many($segCount);
$font->readUInt16(); // reservedPad
$startCode = $font->readUInt16Many($segCount);
$idDelta = $font->readInt16Many($segCount);
$ro_start = $font->pos();
$idRangeOffset = $font->readUInt16Many($segCount);
$glyphIndexArray = array();
for ($i = 0; $i < $segCount; $i++) {
$c1 = $startCode[$i];
$c2 = $endCode[$i];
$d = $idDelta[$i];
$ro = $idRangeOffset[$i];
if ($ro > 0) {
$font->seek($subtable["offset"] + 2 * $i + $ro);
}
for ($c = $c1; $c <= $c2; $c++) {
if ($ro == 0) {
$gid = ($c + $d) & 0xFFFF;
}
else {
$offset = ($c - $c1) * 2 + $ro;
$offset = $ro_start + 2 * $i + $offset;
$font->seek($offset);
$gid = $font->readUInt16();
if ($gid != 0) {
$gid = ($gid + $d) & 0xFFFF;
}
}
if ($gid > 0) {
$glyphIndexArray[$c] = $gid;
}
}
}
$subtable += array(
"endCode" => $endCode,
"startCode" => $startCode,
"idDelta" => $idDelta,
"idRangeOffset" => $idRangeOffset,
"glyphIndexArray" => $glyphIndexArray,
);
}
}
$this->data = $data;
}
function _encode() {
$font = $this->getFont();
$subset = $font->getSubset();
$glyphIndexArray = $font->getUnicodeCharMap();
$newGlyphIndexArray = array();
foreach ($glyphIndexArray as $code => $gid) {
$new_gid = array_search($gid, $subset);
if ($new_gid !== false) {
$newGlyphIndexArray[$code] = $new_gid;
}
}
ksort($newGlyphIndexArray); // Sort by char code
$segments = array();
$i = -1;
$prevCode = 0xFFFF;
$prevGid = 0xFFFF;
foreach ($newGlyphIndexArray as $code => $gid) {
if (
$prevCode + 1 != $code ||
$prevGid + 1 != $gid
) {
$i++;
$segments[$i] = array();
}
$segments[$i][] = array($code, $gid);
$prevCode = $code;
$prevGid = $gid;
}
$segments[][] = array(0xFFFF, 0xFFFF);
$startCode = array();
$endCode = array();
$idDelta = array();
foreach ($segments as $codes) {
$start = reset($codes);
$end = end($codes);
$startCode[] = $start[0];
$endCode[] = $end[0];
$idDelta[] = $start[1] - $start[0];
}
$segCount = count($startCode);
$idRangeOffset = array_fill(0, $segCount, 0);
$searchRange = 1;
$entrySelector = 0;
while ($searchRange * 2 <= $segCount) {
$searchRange *= 2;
$entrySelector++;
}
$searchRange *= 2;
$rangeShift = $segCount * 2 - $searchRange;
$subtables = array(
array(
// header
"platformID" => 3, // Unicode
"platformSpecificID" => 1,
"offset" => null,
// subtable
"format" => 4,
"length" => null,
"language" => 0,
"segCount" => $segCount,
"segCountX2" => $segCount * 2,
"searchRange" => $searchRange,
"entrySelector" => $entrySelector,
"rangeShift" => $rangeShift,
"startCode" => $startCode,
"endCode" => $endCode,
"idDelta" => $idDelta,
"idRangeOffset" => $idRangeOffset,
"glyphIndexArray" => $newGlyphIndexArray,
)
);
$data = array(
"version" => 0,
"numberSubtables" => count($subtables),
"subtables" => $subtables,
);
$length = $font->pack(self::$header_format, $data);
$subtable_headers_size = $data["numberSubtables"] * 8; // size of self::$subtable_header_format
$subtable_headers_offset = $font->pos();
$length += $font->write(str_repeat("\0", $subtable_headers_size), $subtable_headers_size);
// write subtables data
foreach ($data["subtables"] as $i => $subtable) {
$length_before = $length;
$data["subtables"][$i]["offset"] = $length;
$length += $font->writeUInt16($subtable["format"]);
$before_subheader = $font->pos();
$length += $font->pack(self::$subtable_v4_format, $subtable);
$segCount = $subtable["segCount"];
$length += $font->w(array(self::uint16, $segCount), $subtable["endCode"]);
$length += $font->writeUInt16(0); // reservedPad
$length += $font->w(array(self::uint16, $segCount), $subtable["startCode"]);
$length += $font->w(array(self::int16, $segCount), $subtable["idDelta"]);
$length += $font->w(array(self::uint16, $segCount), $subtable["idRangeOffset"]);
$length += $font->w(array(self::uint16, $segCount), array_values($subtable["glyphIndexArray"]));
$after_subtable = $font->pos();
$subtable["length"] = $length - $length_before;
$font->seek($before_subheader);
$length += $font->pack(self::$subtable_v4_format, $subtable);
$font->seek($after_subtable);
}
// write subtables headers
$font->seek($subtable_headers_offset);
foreach ($data["subtables"] as $subtable) {
$font->pack(self::$subtable_header_format, $subtable);
}
return $length;
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment