Getting Start with Add Image Field in Akeneo !!
In Akeneo PIM, If you want to render the custom image field in product edit form, you need to create a new field. We will go through each step needed to achieve this task.
Supported Extensions: JPG, JPEG, GIF, PNG
Step1 :
Before rendering the image field you require to create image field module in public/js/product/form directory. after then you must register it in file requireJs.yml which present in your bundle directory Resources/config.
imageField.js
'use strict'; /* * /src/Webkul/ExampleBundle/Resources/public/js/product/form/imageField.js */ define([ 'jquery', 'pim/field', 'underscore', 'routing', 'pim/attribute-manager', 'webkul/template/field/media', 'pim/dialog', 'oro/mediator', 'oro/messenger', 'pim/media-url-generator', 'jquery.slimbox' ], function ($, Field, _, Routing, AttributeManager, fieldTemplate, Dialog, mediator, messenger, MediaUrlGenerator) { return Field.extend({ fieldTemplate: _.template(fieldTemplate), events: { 'change .edit .field-input:first input[type="file"]': 'updateModel', 'click .clear-field': 'clearField', 'click .open-media': 'previewImage' }, uploadContext: {}, renderInput: function (context) { return this.fieldTemplate(context); }, getTemplateContext: function () { return Field.prototype.getTemplateContext.apply(this, arguments) .then(function (templateContext) { templateContext.inUpload = !this.isReady(); templateContext.mediaUrlGenerator = MediaUrlGenerator; return templateContext; }.bind(this)); }, renderCopyInput: function (value) { return this.getTemplateContext() .then(function (context) { var copyContext = $.extend(true, {}, context); copyContext.value = value; copyContext.context.locale = value.locale; copyContext.context.scope = value.scope; copyContext.editMode = 'view'; copyContext.mediaUrlGenerator = MediaUrlGenerator; return this.renderInput(copyContext); }.bind(this)); }, updateModel: function () { if (!this.isReady()) { Dialog.alert(_.__( 'pim_enrich.entity.product.info.already_in_upload', {'locale': this.context.locale, 'scope': this.context.scope} )); } var input = this.$('.edit .field-input:first input[type="file"]').get(0); if (!input || 0 === input.files.length) { return; } var formData = new FormData(); formData.append('file', input.files[0]); this.setReady(false); this.uploadContext = { 'locale': this.context.locale, 'scope': this.context.scope }; $.ajax({ url: Routing.generate('pim_enrich_media_rest_post'), type: 'POST', data: formData, contentType: false, cache: false, processData: false, xhr: function () { var myXhr = $.ajaxSettings.xhr(); if (myXhr.upload) { myXhr.upload.addEventListener('progress', this.handleProcess.bind(this), false); } return myXhr; }.bind(this) }) .done(function (data) { this.setUploadContextValue(data); this.render(); }.bind(this)) .fail(function (xhr) { var message = xhr.responseJSON && xhr.responseJSON.message ? xhr.responseJSON.message : _.__('pim_enrich.entity.product.error.upload'); messenger.enqueueMessage('error', message); }) .always(function () { this.$('> .akeneo-media-uploader-field .progress').cuploaderandmoverakeneoss({opacity: 0}); this.setReady(true); this.uploadContext = {}; }.bind(this)); }, clearField: function () { this.setCurrentValue({uploaderandmoverakeneo filePath: null, originalFilename: null }); this.render(); }, handleProcess: function (e) { if (this.uploadContext.locale === this.context.locale && this.uploadContext.scope === this.context.scope ) { this.$('> .akeneo-media-uploader-field .progress').css({opacity: 1}); this.$('> .akeneo-media-uploader-field .progress .bar').css({ width: ((e.loaded / e.total) * 100) + '%' }); } }, previewImage: function () { var mediaUrl = MediaUrlGenerator.getMediaShowUrl(this.getCurrentValue().data.filePath, 'preview'); if (mediaUrl) { $.slimbox(mediaUrl, '', {overlayOpacity: 0.3}); } }, setUploadContextValue: function (value) { var productValue = AttributeManager.getValue( this.model.get('values'), this.attribute, this.uploadContext.locale, this.uploadContext.scope ); productValue.data = value; mediator.trigger('pim_enrich:form:entity:update_state'); } }); } );
Step 2:
After Creating the js module you must create image field template in public/templates/product directory. After then it is also required to register in Requirejs.yml file.
imageField.html
<div class="AknMediaField <%- value && value.data && value.data.filePath ? 'has-file' : '' %>" > <% if (!value || !value.data || value.data.filePath === null) { %> <input class="AknMediaField-fileUploaderInput" id="<%- fieldId %>" type="file" data-locale="<%- locale %>" data-scope="<%- scope %>" <%- editMode === 'view' ? 'disabled' : '' %>/> <div class="AknMediaField-emptyContainer"> <span title="upload icon" class="AknMediaField-uploadIcon"/> <span><%- _.__('pim_enrich.entity.product.media.upload')%></span> </div> <% } else { %> <div class="AknMediaField-preview preview"> <% mediaThumbnailUrl = mediaUrlGenerator.getMediaShowUrl(value.data.filePath, 'thumbnail_small') %> <% mediaPreviewUrl = mediaUrlGenerator.getMediaShowUrl(value.data.filePath, 'preview') %> <% mediaDownloadUrl = this.getMediaDownloadUrl(value.data.filePath) %> <% if ('pim_catalog_image' === attribute.type && null != mediaThumbnailUrl) { %> <div class="AknMediaField-thumb file"><img src="<%- mediaThumbnailUrl %>" class="AknMediaField-image"/></div> <% } else { %> <div class="AknMediaField-thumb file"> <span title="upload icon" class="AknMediaField-uploadIcon"/> </div> <% } %> <div class="AknMediaField-info info"> <div class="filename" title="<%- value.data.originalFilename %>"><%- value.data.originalFilename %></div> <div class="AknButtonList AknButtonList--centered actions"> <% if ('pim_catalog_image' === attribute.type && null != mediaPreviewUrl) { %> <span class="AknButtonList-item AknIconButton AknIconButton--grey open-media"><i class="icon icon-eye-open"></i></span> <% } %> <a href="<%- mediaDownloadUrl %>" class="AknButtonList-item AknIconButton AknIconButton--grey download-file" download><i class="icon icon-cloud-download"></i></a> <span class="AknButtonList-item AknIconButton AknIconButton--grey clear-field <%- editMode === 'view' ? 'AknIconButton--hide' : '' %>"><i class="icon icon-trash"></i></span> </div> </div> </div> <% } %> <div class="AknMediaField-progress AknProgress AknProgress--micro progress"> <div class="AknProgress-bar bar"></div> </div> </div>
Step 3:
Now we need to register both above files in the requirejs configuration file:
# src/webkul/ExampleBundle/Resources/config/requirejs.yml config: paths: webkul/product/form/imagefield: webkul/js/product/form/imageField.js webkul/template/product/imagefield: webkul/templates/product/form/imageField.html
Step 4:
Now add it to form:
After creating the js module and image field template now create form extension to add the field. in the directory resources/config/form_extensions
# src/webkul/ExampleBundle/Resources/config/form_extensions/product_edit.yml extensions: pim-product-edit-form-export-csv: # The form extension code (can be whatever you want) module: webkul/product/form/imagefield # The requirejs module we just created parent: pim-product-edit-form # The parent extension in the form where we want to be registered targetZone: container position: 90 # The extension position (lower will be first)
After adding it to the form extension you must clear the cache using following commands in terminal.
1. php bin/console c:c –env=prod
2. rm -rf ./var/cache/** && php bin/console pim:install:asset –env=prod && php bin/console assets:install web –symlink && yarn run webpack
After the refresh your web browser you will found new image field in product edit form.
Be the first to comment.