Question

I've recently created a customer attribute for my Magento ver. 2.3.5-p1 instance using the following blog:

https://www.blog.sashas.org/magento-2-1-3-how-to-make-customer-attribute-update.html

The module has worked properly and created a new customer attribute with the i.d. "trade_ordernumber".

I would now like to add this attribute to the checkout success page but I'm not sure how to do this, what I was thinking was something like the below:

    <?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

?>
<?php /** @var $block \Magento\Checkout\Block\Onepage\Success */ ?>
<div class="checkout-success">
    <?php if ($block->getOrderId()) :?>
        <?php if ($block->getCanViewOrder()) :?>
                <h1><?= $block->escapeHtml(__('Your order # is: <span>%1</span>.', $block->getOrderId()), ['span']) ?></h1>
    
            <p><?= $block->escapeHtml(__('Your order number is: %1.', sprintf('<a href="%s" class="order-number"><strong>%s</strong></a>', $block->escapeUrl($block->getViewOrderUrl()), $block->getOrderId())), ['a', 'strong']) ?></p>
        <?php  else :?>
            <p><?= $block->escapeHtml(__('Your order # is: <span>%1</span>.', $block->getOrderId()), ['span']) ?></p>
        <?php endif;?>
            <p><?= $block->escapeHtml(__('We\'ll email you an order confirmation with details and tracking info.')) ?></p>
    <?php endif;?>

    <?= $block->getAdditionalInfoHtml() ?>

    <div class="actions-toolbar">
        <div class="primary">
            <a class="action primary continue" href="<?= $block->escapeUrl($block->getContinueUrl()) ?>"><span><?= $block->escapeHtml(__('Continue Shopping')) ?></span></a>
        </div>
    </div>
</div>


<?php
    $objectManager =  \Magento\Framework\App\ObjectManager::getInstance();        
    $storeManager  = $objectManager->get('\Magento\Store\Model\StoreManagerInterface');
    $storeID       = $storeManager->getStore()->getStoreId(); 
    $storeName     = $storeManager->getStore()->getName();
?>

<?php
    $customerSession = $objectManager->get('Magento\Customer\Model\Session');
    if($customerSession->isLoggedIn()) {
        echo $customerSession->getAttribute('trade_ordernumber');
    }
?>

Edit 7/8/2020

Thanks to Vivek Kumar for his solution. I am currently trying to create a solution which does not involve the object manager. So far Hello. Thank you for replying. I'm still having a couple of issues. Which I'll outline below.

I have created a new module with the following file structure:

enter image description here

The code in the files is as follows

registration.php

<?php
        \Magento\Framework\Component\ComponentRegistrar::register(
            \Magento\Framework\Component\ComponentRegistrar::MODULE,
            'CustomTrade_CallAttribute',
            __DIR__
        );

module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="CustomTrade_CallAttribute" >
    </module>
</config>

Data.php

<?php

namespace CustomTrade\CallAttribute\Helper;
use Magento\Framework\App\Helper\Context;
use Magento\Customer\Api\CustomerRepositoryInterface;
use Magento\Customer\Model\Session as CustomerSession;
class Data extends AbstractHelper
{
    protected $customerRepository;
    public function __construct(
        Context $context,
        CustomerRepositoryInterface $customerRepository,
        CustomeSession $customerSession
        )
    {
        $this->customerRepository = $customerRepository;
        $this->customerSession = $customerSession;
        parent::__construct($context);
    }
    public function getOrderNumberValue()
    {
        $customerId  = $this->customerSession->getCustomer()->getId();
        $customer = $this->customerRepository->getById($customerId);
        return $customer->getData('trade_ordernumber');
    }
}

And I have modified the success.phtml file in the following way

<?php
/**
 * Copyright ? Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
?>
<?php /** @var $block \Magento\Checkout\Block\Onepage\Success */ ?>
<div class="checkout-success">
    <?php if ($block->getOrderId()) :?>
        <?php if ($block->getCanViewOrder()) :?>
                <h1><?= $block->escapeHtml(__('Your order # is: <span>%1</span>.', $block->getOrderId()), ['span']) ?></h1>
    
            <p><?= $block->escapeHtml(__('Your order number is: %1.', sprintf('<a href="%s" class="order-number"><strong>%s</strong></a>', $block->escapeUrl($block->getViewOrderUrl()), $block->getOrderId())), ['a', 'strong']) ?></p>
        <?php  else :?>
            <p><?= $block->escapeHtml(__('Your order # is: <span>%1</span>.', $block->getOrderId()), ['span']) ?></p>
        <?php endif;?>
            <p><?= $block->escapeHtml(__('We\'ll email you an order confirmation with details and tracking info.')) ?></p>
    <?php endif;?>

    <?= $block->getAdditionalInfoHtml() ?>

    <div class="actions-toolbar">
        <div class="primary">
            <a class="action primary continue" href="<?= $block->escapeUrl($block->getContinueUrl()) ?>"><span><?= $block->escapeHtml(__('Continue Shopping')) ?></span></a>
        </div>
    </div>
</div>



<?php
$dataHelper = $this->helper('CustomTrade\CallAttribute\Helper\Data');
echo $dataHelper->getOrderNumberValue();
?>

Edit 3 20/08/2020

Finally seem to have this working now I now seem to have gotten this working: the Data.php file now looks as follows

    <?php

namespace CustomTrade\CallAttribute\Helper;
use Magento\Framework\App\Helper\Context;
use Magento\Customer\Api\CustomerRepositoryInterface;
use Magento\Customer\Model\Session as CustomerSession;
use Magento\Framework\App\Helper\AbstractHelper;
class Data extends AbstractHelper
{
    protected $customerRepository;
    public function __construct(
        Context $context,
        CustomerRepositoryInterface $customerRepository,
        CustomerSession $customerSession
        )
    {
        $this->customerRepository = $customerRepository;
        $this->customerSession = $customerSession;
        parent::__construct($context);
    }

    public function getOrderNumberValue()
    {
        $customerId  = $this->customerSession->getCustomer()->getId();
        $customer = $this->customerRepository->getById($customerId);
        return $customer->getCustomAttribute('trade_ordernumber')->getValue();
    }
}

And the success.phtml file is here

    <?php
/**
 * Copyright ? Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
?>
<?php /** @var $block \Magento\Checkout\Block\Onepage\Success */ ?>
<div class="checkout-success">
    <?php if ($block->getOrderId()) :?>
        <?php if ($block->getCanViewOrder()) :?>
                <h1><?= $block->escapeHtml(__('Your order # is: <span>%1</span>.', $block->getOrderId()), ['span']) ?></h1>
    
            <p><?= $block->escapeHtml(__('Your order number is: %1.', sprintf('<a href="%s" class="order-number"><strong>%s</strong></a>', $block->escapeUrl($block->getViewOrderUrl()), $block->getOrderId())), ['a', 'strong']) ?></p>
        <?php  else :?>
            <p><?= $block->escapeHtml(__('Your order # is: <span>%1</span>.', $block->getOrderId()), ['span']) ?></p>
        <?php endif;?>
            <p><?= $block->escapeHtml(__('We\'ll email you an order confirmation with details and tracking info.')) ?></p>
    <?php endif;?>

    <?= $block->getAdditionalInfoHtml() ?>

    <div class="actions-toolbar">
        <div class="primary">
            <a class="action primary continue" href="<?= $block->escapeUrl($block->getContinueUrl()) ?>"><span><?= $block->escapeHtml(__('Continue Shopping')) ?></span></a>
        </div>
    </div>
</div>


<?php
    $dataHelper = $this->helper('CustomTrade\CallAttribute\Helper\Data');
    echo $dataHelper->getOrderNumberValue();
?>

This seems to produce the correct result.

Was it helpful?

Solution

You would not get all the attributes in the session, you will have to load the repository or model to get all the attributes. So you would get some code like the following;

<?php
    $customerSession = $objectManager->get('Magento\Customer\Model\Session');
    if($customerSession->isLoggedIn()) {
        $customerId = $customerSession->getCustomer()->getId();
        $customer = $objectManager->create('Magento\Customer\Model\Customer')->load($customerId);
        echo $customer->getData('trade_ordernumber');
    }
?>

EDIT

The correct way would be injecting all the classes required like Customer session and model in the block corresponding to your phtml and calling the function from block to fetch the data. Going this way you, would not need to use objectmanager as well as there would be more separation between view and business logic, which helps to keep things in order.

EDIT 2

Doing this the correct way would require you to extend the block corresponding to your phtml i.e \Magento\Checkout\Block\Onepage\Success using preference,inject classes you need and add a new function to return the data you need. Follow this link - Magento 2 How to add new method in override block

Now you can call the function in your phtml using $block->functionName() or $this->functionName().

Alternatively, if you have to go with code you've already written, I see you have created a helper to return the values. You can call the helper like following in the phtml.

$dataHelper = $this->helper('CustomTrade\CallAttribute\Helper\Data');
$dataHelper->functionName()

Note that you should add all the dependencies like session in the helper itself and just call the function to get the data in the phtml.

EDIT 3

First of all you don't write classes in phtml so REMOVE all the code written below ;

<?php

use \CustomTrade\CallAttribute\Helper\Data;

class Data
{
       public function __construct(Data $helper)
       {
               $this->helper = $helper;
       }
       public function getTrade()
       {
               $this->helper->getOrderNumberValue();
       }
}
?>

Now I asked you to add all the dependencies in the helper and return the data you need, your final helper will look something like this;

<?php

namespace CustomTrade\CallAttribute\Helper;
use Magento\Framework\App\Helper\Context;
use Magento\Customer\Api\CustomerRepositoryInterface;
use Magento\Customer\Model\Session as CustomerSession;
class Data extends AbstractHelper
{
    protected $customerRepository;
    public function __construct(
        Context $context,
        CustomerRepositoryInterface $customerRepository,
        CustomeSession $customerSession
)
    {
        $this->customerRepository = $customerRepository;
        $this->customerSession = $customerSession;
        parent::__construct($context);
    }
    public function getOrderNumberValue()
    {
        $customerId  = $this->customerSession->getCustomer()->getId();
        $customer = $this->customerRepository->getById($customerId);
        return $customer->getCustomAttribute('trade_ordernumber');
    }
}

Now to call your function in the phtml, append following code

<?php
$dataHelper = $this->helper('CustomTrade\CallAttribute\Helper\Data');
echo $dataHelper->getOrderNumberValue()
?>

EDIT 4

If you're using customerModel instead of repository, you should be calling attribute as $customer->getData('trade_ordernumber'); instead of $customer->getCustomAttribute('trade_ordernumber'); in the helper.

EDIT 5

This error not relevant to the question you asked, but if you want to debug it add following code in your magento's root index.php

error_reporting(E_ALL);
ini_set('display_errors', 1);

As you're getting a 500 error, it will show you why the error is happening.

Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top