1

I created a module that displays custom fields in shipping at checkout and saves the data in the database in the both the quote and sales order table and I can confirm the data is there. I am trying to get the data to show in the admin when the orders are viewed and in the confirmation email that goes out. I have it so the template displays the echoed text in the admin order view but not the data from the database. Nothing shows currently in the email but I want to fix viewing the data in the order first.

To break it down, I have the data in the two tables in the DB and need to display it on the orders in the admin. I have the fields in extension_attributes.xml

The fields get saved to the DB here in Plugin > Quote > SaveToQuote.php:

  class SaveToQuote
{
   /**
    * @var QuoteRepository
    */
   protected $quoteRepository;

   /**
    * SaveToQuote constructor.
    * @param QuoteRepository $quoteRepository
    */
   public function __construct(
       QuoteRepository $quoteRepository
   ) {
       $this->quoteRepository = $quoteRepository;
   }

   /**
    * @param \Magento\Checkout\Model\ShippingInformationManagement $subject
    * @param $cartId
    * @param \Magento\Checkout\Api\Data\ShippingInformationInterface $addressInformation
    */
   public function beforeSaveAddressInformation(
       \Magento\Checkout\Model\ShippingInformationManagement $subject,
       $cartId,
       \Magento\Checkout\Api\Data\ShippingInformationInterface $addressInformation
   ) {
       if(!$extAttributes = $addressInformation->getExtensionAttributes())
           return;

       $quote = $this->quoteRepository->getActive($cartId);

       $quote->setInputRoomShippingField($extAttributes->getInputRoomShippingField());
       $quote->setInputFloorShippingField($extAttributes->getInputFloorShippingField());
       $quote->setDateCustomShippingField($extAttributes->getDateCustomShippingField());
       $quote->setSelectCustomShippingField($extAttributes->getSelectCustomShippingField());
   }
}

But here is what I have come up with to view the data in the order in the admin so far with no luck.

First - view>adminhtml>layout>sales_order_view.xml

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="admin-2columns-left" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
    <referenceBlock name="order_info">
        <block class="xxx\xxx\Block\Adminhtml\Order\View\OrderView" name="sales_order_view_custom" template="xxx_xxx::shipping_info.phtml" />
    </referenceBlock>
</body>

Next in view>adminhtml>templates>shipping_info.phtml

<strong><?php echo __('Room Number') ?></strong>
<span class="room"><?=$block->getInputRoomShippingField(); ?></span>
<strong><?php echo __('Floor Number') ?></strong>
<span class="floor"><?=$block->getInputFloorShippingField(); ?></span>
<strong><?php echo __('Address') ?></strong>
<span class="address"><?=$block->getSelectCustomShippingField(); ?></span

I can see the echoed text above in the admin > order view but not the values called by $block.

Next - Block>Adminhtml>Order>View>OrderView.php

namespace xxx\xxx\Block\Adminhtml\Order\View;

class OrderView extends \Magento\Backend\Block\Template
{

}

I think I need the above so I can call $block

Next - Observer>ShippingDataToAdminObserver.php

namespace xxx\xxx\Observer;
use Magento\Framework\Event\Observer as EventObserver;
use Magento\Framework\Event\ObserverInterface;

class ShippingDataToAdminObserver implements ObserverInterface
{

    /**
     * @var \Magento\Framework\ObjectManagerInterface
     */
    protected $_block;

    /**
     * @param \Magento\Framework\View\Element\Template $block
     */
    public function __construct(
        \Magento\Framework\View\Element\Template $block
    )
    {
        $this->_block = $block;
    }

    /**
     * @param EventObserver $observer
     */

    public function execute(EventObserver $observer)
    {
        if($observer->getElementName() == 'order_shipping_view')
        {
            $orderShippingViewBlock = $observer->getLayout()->getBlock($observer->getElementName());
            $order = $orderShippingViewBlock->getOrder();
            $RoomDeliveryBlock = $this->_block;
            $RoomDeliveryBlock->setTemplate('xxx_xxx::shipping_info.phtml');
            $html = $observer->getTransport()->getOutput() . $RoomDeliveryBlock->toHtml();
            $observer->getTransport()->setOutput($html);
        }
    }
}

Used the above to get data to display in admin > sales > order and uses OrderView.php above. I see the text but not the data.

Like I said, I am trying to get the data in the database (which is present) to show on the orders in the admin and eventually emails.

I don't know if this is too confusing to get help or not. Any thoughts are greatly appreciated.

Amira Bedhiafi
  • 8,088
  • 6
  • 24
  • 60
stanhook
  • 63
  • 3
  • 12
  • I have this working. If anyone has question just post them and I will try to answer. It is too much code to paste here. – stanhook Sep 02 '20 at 19:36

0 Answers0