简体   繁体   English

Magento2如何在管理cms中添加图像上传器字段

[英]Magento2 how add image uploader field in admin cms

Magento2 - How can i add image up-loader field in Admin cms page. Magento2-如何在Admin cms页面中添加图像上载器字段。

Added code on below path app\\code\\namespace\\moduleName\\view\\adminhtml\\ui_component\\cms_page_form.xml 在以下路径app \\ code \\ namespace \\ moduleName \\ view \\ adminhtml \\ ui_component \\ cms_page_form.xml上添加了代码

    <field name="page_image">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="dataType" xsi:type="string">string</item>
                <item name="source" xsi:type="string">page</item>
                <item name="label" xsi:type="string" translate="true">Page Image</item>
                <item name="visible" xsi:type="boolean">true</item>
                <item name="formElement" xsi:type="string">fileUploader</item>
                <item name="elementTmpl" xsi:type="string">ui/form/element/uploader/uploader</item>
                <item name="previewTmpl" xsi:type="string">Magento_Catalog/image-preview</item>
                <item name="required" xsi:type="boolean">false</item>
                <item name="sortOrder" xsi:type="number">40</item>
                <item name="uploaderConfig" xsi:type="array">
                    <item name="url" xsi:type="url" path="catalog/category_image/upload"/>
                </item>
            </item>
        </argument>
    </field>

Created page_image field in cms_page table. 在cms_page表中创建了page_image字段。 Image-preview is showing when I upload image. 上传图片时显示图片预览。 But how to save image (Database and server) and how to show uploaded image in edit mode . 但是如何保存图像(数据库和服务器)以及如何在编辑模式下显示上载的图像。

First you have to create your own module to override the save action and dataProvider for cms page. 首先,您必须创建自己的模块,以覆盖cms页的save操作和dataProvider。 If you don't know how to create module Please refer this link http://inchoo.net/magento-2/how-to-create-a-basic-module-in-magento-2/ . 如果您不知道如何创建模块,请参考此链接http://inchoo.net/magento-2/how-to-create-a-basic-module-in-magento-2/

After creating module, follow the following steps: 创建模块后,请执行以下步骤:

Step 1. Add column for custom image on cms_page table 步骤1.在cms_page表上添加自定义图像的列

Create InstallScema.php under [Vendor][Module]\\Setup. 在[供应商] [模块] \\ Setup下创建InstallScema.php。 Your file location will be [Vendor][Module]\\Setup\\InstallSchema.php 您的文件位置将为[供应商] [模块] \\ Setup \\ InstallSchema.php

namespace [Vendor]\[Module]\Setup;

use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\DB\Ddl\Table;

class InstallSchema implements InstallSchemaInterface
{
    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $installer = $setup;
        $installer->startSetup();
        $connection = $installer->getConnection();

        $connection->addColumn('cms_page','your_image_field_name',['type' =>\Magento\Framework\DB\Ddl\Table::TYPE_TEXT,'comment' => 'Your Image Field Name']);
        $installer->endSetup();
    }
}

If your module is already activated, please delete your module from setup_module table. 如果您的模块已被激活,请从setup_module表中删除您的模块。

After Creating InstallSchema.php, open your terminal and hit following commands. 创建InstallSchema.php之后,打开终端并单击以下命令。 It will add column to database table and clear caches. 它将列添加到数据库表并清除缓存。

php bin/magento cache:flush;
php bin/magento setup:upgrade;
php bin/magento setup:di:compile;
rm -rf var/generation/* var/di/* var/cache/* var/page_cache/* ;
rm -rf pub/static/frontend pub/static/_requirejs pub/static/adminhtml ;

Step 2. Add image field 步骤2.添加图像字段

Create cms_page_form.xml under [Vendor]/[Mdoule]/View/adminhtml/ui_component . 在[供应商] / [Mdoule] / View / adminhtml / ui_component下创建cms_page_form.xml。 Your file location will be [Vendor]/[Mdoule]/View/adminhtml/ui_component/cms_page_form.xml. 您的文件位置将为[供应商] / [Mdoule] /View/adminhtml/ui_component/cms_page_form.xml。 Add following code. 添加以下代码。

<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <fieldset name="content">
        <field name="your_image_field_name">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="dataType" xsi:type="string">string</item>
                    <item name="source" xsi:type="string">category</item>
                    <item name="label" xsi:type="string" translate="true">Your image field Name</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <item name="formElement" xsi:type="string">fileUploader</item>
                    <item name="elementTmpl" xsi:type="string">ui/form/element/uploader/uploader</item>
                    <item name="required" xsi:type="boolean">false</item>
                    <item name="uploaderConfig" xsi:type="array">
                        <item name="url" xsi:type="url" path="[module]/cms_heroimage/upload"/>
                    </item>
                </item>
            </argument>
        </field>
    </fieldset>
</form>

This will generate field under content tab. 这将在“内容”选项卡下生成字段。

Step 3. Create Controller for upload action. 步骤3.为上载操作创建控制器。

Create Upload.php on [Vendor]/[Mdoule]/Controller/Adminhtml/Cms/Heroimage. 在[供应商] / [Mdoule] / Controller / Adminhtml / Cms / Heroimage上创建Upload.php。 Your file location will be [Vendor]/[Mdoule]/Controller/Adminhtml/Cms/Heroimage/Upload.php. 您的文件位置将为[供应商] / [Mdoule] /Controller/Adminhtml/Cms/Heroimage/Upload.php。

Add following code. 添加以下代码。

use Magento\Framework\Controller\ResultFactory;

class Upload extends \Magento\Backend\App\Action
{
    /**
     * Image uploader
     *
     * @var \[Namespace]\[Module]\Model\ImageUploader
     */
    protected $imageUploader;

    /**
     * @param \Magento\Backend\App\Action\Context $context
     * @param \Magento\Catalog\Model\ImageUploader $imageUploader
     */
    public function __construct(
        \Magento\Backend\App\Action\Context $context,
        \Magento\Catalog\Model\ImageUploader $imageUploader
    ) {
        parent::__construct($context);
        $this->imageUploader = $imageUploader;
    }


    /**
     * Upload file controller action
     *
     * @return \Magento\Framework\Controller\ResultInterface
     */
    public function execute()
    {
        try {
            $result = $this->imageUploader->saveFileToTmpDir('your_image_field_name');

            $result['cookie'] = [
                'name' => $this->_getSession()->getName(),
                'value' => $this->_getSession()->getSessionId(),
                'lifetime' => $this->_getSession()->getCookieLifetime(),
                'path' => $this->_getSession()->getCookiePath(),
                'domain' => $this->_getSession()->getCookieDomain(),
            ];
        } catch (\Exception $e) {
            $result = ['error' => $e->getMessage(), 'errorcode' => $e->getCode()];
        }
        return $this->resultFactory->create(ResultFactory::TYPE_JSON)->setData($result);
    }
}
?>

Step 4. Override Save action. 步骤4.覆盖保存操作。

Create di.xml under [Vendor][Module]\\etc\\adminhtml. 在[供应商] [模块] \\ etc \\ adminhtml下创建di.xml。 Your file location will be [Vendor][Module]\\etc\\adminhtml\\di.xml add following line to override Save Action and DataProvider for cms page. 您的文件位置将为[供应商] [模块] \\ etc \\ adminhtml \\ di.xml,添加以下行以覆盖“为cms保存操作”和“ DataProvider”页面。

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Cms\Controller\Adminhtml\Page\Save" type="[Vendor]\[Module]\Controller\Adminhtml\Cms\Page\Save" />
    <preference for="Magento\Cms\Model\Page\DataProvider" type="[Vendor]\[Module]\Model\Cms\Page\DataProvider" />
</config>

Step 5. Create Save.php file. 步骤5.创建Save.php文件。 Create Save.php file under [Vendor][Module]\\Controller\\Adminhtml\\Cms\\Page. 在[供应商] [模块] \\ Controller \\ Adminhtml \\ Cms \\ Page下创建Save.php文件。 Your file location will be [Vendor][Module]\\Controller\\Adminhtml\\Cms\\Page\\Save.php. 您的文件位置将是[供应商] [模块] \\ Controller \\ Adminhtml \\ Cms \\ Page \\ Save.php。 Add Following code. 添加以下代码。

use Magento\Backend\App\Action;
use Magento\Cms\Model\Page;
use Magento\Framework\App\Request\DataPersistorInterface;
use Magento\Framework\Exception\LocalizedException;

class Save extends \Magento\Cms\Controller\Adminhtml\Page\Save
{
    /**
     * Authorization level of a basic admin session
     *
     * @see _isAllowed()
     */
    const ADMIN_RESOURCE = 'Magento_Cms::save';

    /**
     * @var PostDataProcessor
     */
    protected $dataProcessor;

    /**
     * @var DataPersistorInterface
     */
    protected $dataPersistor;


    /**
     * Save action
     *
     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
     * @return \Magento\Framework\Controller\ResultInterface
     */
    public function execute()
    {
        $data = $this->getRequest()->getPostValue();


        /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
        $resultRedirect = $this->resultRedirectFactory->create();
        if ($data) {
            $data = $this->dataProcessor->filter($data);
            if (isset($data['is_active']) && $data['is_active'] === 'true') {
                $data['is_active'] = Page::STATUS_ENABLED;
            }
            if (empty($data['page_id'])) {
                $data['page_id'] = null;
            }

            /** @var \Magento\Cms\Model\Page $model */
            $model = $this->_objectManager->create('Magento\Cms\Model\Page');

            $id = $this->getRequest()->getParam('page_id');
            if ($id) {
                $model->load($id);
            }

            // Add custom image field to data
            if(isset($data['your_image_field_name']) && is_array($data['your_image_field_name'])){
                $data['your_image_field_name']=$data['your_image_field_name'][0]['name'];
            }


            $model->setData($data);

            $this->_eventManager->dispatch(
                'cms_page_prepare_save',
                ['page' => $model, 'request' => $this->getRequest()]
            );

            if (!$this->dataProcessor->validate($data)) {
                return $resultRedirect->setPath('*/*/edit', ['page_id' => $model->getId(), '_current' => true]);
            }

            try {
                $model->save();
                $this->messageManager->addSuccess(__('You saved the page.'));
                $this->dataPersistor->clear('cms_page');
                if ($this->getRequest()->getParam('back')) {
                    return $resultRedirect->setPath('*/*/edit', ['page_id' => $model->getId(), '_current' => true]);
                }
                return $resultRedirect->setPath('*/*/');
            } catch (LocalizedException $e) {
                $this->messageManager->addError($e->getMessage());
            } catch (\Exception $e) {
                $this->messageManager->addException($e, __('Something went wrong while saving the page.'));
            }

            $this->dataPersistor->set('cms_page', $data);
            return $resultRedirect->setPath('*/*/edit', ['page_id' => $this->getRequest()->getParam('page_id')]);
        }
        return $resultRedirect->setPath('*/*/');
    }
}
?>

Step 6. Create DataProvider.php 步骤6.创建DataProvider.php

Create DataProvider.php under [Vendor]\\Module\\Model\\Cms\\Page. 在[供应商] \\ Module \\ Model \\ Cms \\ Page下创建DataProvider.php。 Your File location will be [Vendor]\\Module\\Model\\Cms\\Page\\DataProvider.php 您的文件位置将为[供应商] \\ Module \\ Model \\ Cms \\ Page \\ DataProvider.php

<?php
/**
 * Copyright © 2013-2017 Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace [Vendor]\Module\Model\Cms\Page;

use Magento\Cms\Model\ResourceModel\Page\CollectionFactory;
use Magento\Framework\App\Request\DataPersistorInterface;

/**
 * Class DataProvider
 */
class DataProvider extends \Magento\Cms\Model\Page\DataProvider
{

    /**
     * Get data
     *
     * @return array
     */
    public function getData()
    {
        if (isset($this->loadedData)) {
            return $this->loadedData;
        }
        $items = $this->collection->getItems();
        /** @var $page \Magento\Cms\Model\Page */
        foreach ($items as $page) {
            $this->loadedData[$page->getId()] = $page->getData();
        }

        $data = $this->dataPersistor->get('cms_page');


        if (!empty($data)) {
            $page = $this->collection->getNewEmptyItem();

            $page->setData($data);
            $this->loadedData[$page->getId()] = $page->getData();
            $this->dataPersistor->clear('cms_page');
        }
        /* For Modify  You custom image field data */
        if(!empty($this->loadedData[$page->getId()]['your_image_field_name'])){
            $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
            $storeManager = $objectManager->get('Magento\Store\Model\StoreManagerInterface');
            $currentStore = $storeManager->getStore();
            $media_url=$currentStore->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA);

            $image_name=$this->loadedData[$page->getId()]['your_image_field_name'];
            unset($this->loadedData[$page->getId()]['your_image_field_name']);
            $this->loadedData[$page->getId()]['your_image_field_name'][0]['name']=$image_name;
            $this->loadedData[$page->getId()]['your_image_field_name'][0]['url']=$media_url."cms/hero/tmp/".$image_name;
        }
        return $this->loadedData;
    }
}

Note. 注意。 Please Replace "your_image_field_name" with your field name. 请使用您的字段名称替换“ your_image_field_name”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM