2

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.

10
  • I am sorry, but I am really confused. Are you trying to solve the same problem i.e showing attribute on order success page or something else entirely? Commented Aug 8, 2020 at 15:16
  • Sorry, I may have gone the wrong way here. I am still trying to solve the same problem as before. Just in a different way.
    – CJNotts
    Commented Aug 9, 2020 at 16:19
  • I have added solutions using both helper and extending block in EDIT 2, please go through it and let me know if you still face any issues. Commented Aug 9, 2020 at 17:48
  • Hello. Sorry for the delay. I'm still having a bit of trouble. I decided to go with trying to call the helper into the phtml file. Unfortunately most of the articles I googles didn't give explicit instructions about how to call the helper function into the phtml. I've edited the success.phtml file with my latest attempt but I still have not had much luck.
    – CJNotts
    Commented Aug 11, 2020 at 11:43
  • Please check edit 3 Commented Aug 12, 2020 at 5:31

1 Answer 1

2
+100

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.

6
  • Thank you! That seems to have done the trick. The attribute is now displaying on the success page. I'll have to do a little tinkering with the formatting but at least the data is displaying correctly. I'll award the bounty once the lock expires.
    – CJNotts
    Commented Aug 6, 2020 at 11:54
  • Sure. Do let me know if face any other issue regarding this post. Commented Aug 6, 2020 at 12:11
  • I guess it will make a job done but it's not recommended way. magento.stackexchange.com/questions/117098/… Commented Aug 6, 2020 at 16:14
  • It should be apparent to any developer by now that objectmanager is obviously not recommended, but I am not here to preach, it has been done countless times. I have just added the code the way it is was meant to be written by OP. Commented Aug 6, 2020 at 16:18
  • Hi Guys. Thanks, if there's a better way to do this please let me know.
    – CJNotts
    Commented Aug 7, 2020 at 11:02

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.