I have this code for image attribute (avatar).
app/code/Ibnab/CustomerPut/Setup/InstallData.php :
<?php
namespace Ibnab\CustomerPut\Setup;
use Magento\Framework\Module\Setup\Migration;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
class InstallData implements InstallDataInterface
{
/**
* Customer setup factory
*
* @var \Magento\Customer\Setup\CustomerSetupFactory
*/
private $customerSetupFactory;
/**
* Init
*
* @param \Magento\Customer\Setup\CustomerSetupFactory $customerSetupFactory
*/
public function __construct(\Magento\Customer\Setup\CustomerSetupFactory $customerSetupFactory)
{
$this->customerSetupFactory = $customerSetupFactory;
}
/**
* Installs DB schema for a module
*
* @param ModuleDataSetupInterface $setup
* @param ModuleContextInterface $context
* @return void
*/
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
$installer = $setup;
$installer->startSetup();
$customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);
$entityTypeId = $customerSetup->getEntityTypeId(\Magento\Customer\Model\Customer::ENTITY);
$customerSetup->removeAttribute(\Magento\Customer\Model\Customer::ENTITY, "avatar");
$customerSetup->addAttribute(\Magento\Customer\Model\Customer::ENTITY, "avatar", array(
"type" => "varchar",
"backend" => "",
"label" => "Avatar",
"input" => "image",
"source" => "",
"visible" => true,
"required" => true,
"default" => "",
"frontend" => "",
"unique" => false,
"note" => ""
));
$avatar = $customerSetup->getAttribute(\Magento\Customer\Model\Customer::ENTITY, "avatar");
$avatar = $customerSetup->getEavConfig()->getAttribute(\Magento\Customer\Model\Customer::ENTITY, 'avatar');
$used_in_forms[]="adminhtml_customer";
$used_in_forms[]="checkout_register";
$used_in_forms[]="customer_account_create";
$used_in_forms[]="customer_account_edit";
$used_in_forms[]="adminhtml_checkout";
$avatar->setData("used_in_forms", $used_in_forms)
->setData("is_used_for_customer_segment", true)
->setData("is_system", 0)
->setData("is_user_defined", 1)
->setData("is_visible", 1)
->setData("sort_order", 100);
$avatar->save();
$installer->endSetup();
}
}
app/code/Ibnab/CustomerPut/view/frontend/layout/customer_account_create.xml:
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="form.additional.info">
<block class="Magento\Framework\View\Element\Template" name="form_additional_info_customerput" template="Ibnab_CustomerPut::additionalinfocustomer.phtml"/>
</referenceContainer>
</body>
</page>
app/code/Ibnab/CustomerPut/view/frontend/layout/customer_account_edit.xml :
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="content">
<referenceContainer name="form.additional.info">
<block class="Magento\Framework\View\Element\Template" template="Ibnab_CustomerPut::additionalinfocustomer.phtml"/>
</referenceContainer>
</referenceContainer>
</body>
</page>
app/code/Ibnab/CustomerPut/view/frontend/templates/additionalinfocustomer.phtml
<fieldset class="fieldset create account" data-hasrequired="<?php /* @escapeNotVerified */ echo __('* Required Fields') ?>">
<legend class="legend"><span><?php /* @escapeNotVerified */ echo __('Additional Information') ?></span></legend><br>
<div class="field avatar required">
<label for="avatar" class="label"><span><?php /* @escapeNotVerified */ echo __('Avatar') ?></span></label>
<div class="control">
<input type="file" name="avatar" id="avatar" title="<?php /* @escapeNotVerified */ echo __('Avatar') ?>" autocomplete="off">
</div>
</div>
</fieldset>
-
Avatar is shown perfectly in registration page and i can upload an image easily. But I am trying to sign up using rest API as :
POST http://localhost/magento2/index.php/rest/V1/customers
customer[email] = abc@gmail.com customer[firstname] = abc customer[lastname] = xyz password = abc@12345 avatar ms.jpg =>(file)
but I am always get message :
{
"message": "\"Avatar\" is a required value."
}
Please help ..
Best Answer
You need to update the new attribute configuration.
You create this attribute with required to true :
I do not think that you can make this attribute not required only for REST.
But I think that you can make it required on the store scope.
If you want to make it required with the API, you need to create/update the API endpoint in order to be able to upload this file. Maybe by sending the file encoded in base64 but carefull with security issue.