在magento 2中的CMS Block中的自定义日期字段

时间:2017-07-14 03:07:18

标签: magento magento2

我正在创建一个模块,我希望在magento 2中的cms块中有一个自定义日期字段。通过UI组件我创建了一个两个日期字段。

<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
 <fieldset name="general">       
       <field name="custom_block_from">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="sortOrder" xsi:type="number">20</item>
                        <item name="label" xsi:type="string" translate="true">From</item>
                        <item name="dataType" xsi:type="string">string</item>
                        <item name="formElement" xsi:type="string">date</item>
                        <item name="source" xsi:type="string">block</item>
                        <item name="dataScope" xsi:type="string">custom_block_from</item>
                        <item name="validation" xsi:type="array">
                            <item name="validate-date" xsi:type="boolean">true</item>
                        </item>
                        <item name="options" xsi:type="array">
                                        <item name="dateFormat" xsi:type="string">yyyy-MM-dd</item>
                        </item>                 
                </item>
            </argument>
        </field>
        <field name="custom_block_to">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                 <item name="sortOrder" xsi:type="number">21</item>
                    <item name="label" xsi:type="string" translate="true">To</item>
                    <item name="dataType" xsi:type="string">string</item>
                    <item name="formElement" xsi:type="string">date</item>
                    <item name="source" xsi:type="string">block</item>
                    <item name="dataScope" xsi:type="string">custom_block_to</item>
                    <item name="validation" xsi:type="array">
                        <item name="validate-date" xsi:type="boolean">true</item>
                    </item>
                </item>
            </argument>
        </field>
    </fieldset>
</form>

通过升级脚本我还在magento的CMS块表中添加了两个colummn

  public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $installer = $setup;
        $installer->startSetup();
        if ($installer->tableExists('cms_block')) {
            $table = $installer->getTable('cms_block');
            $connection = $installer->getConnection();
            if (version_compare($context->getVersion(), '1.0.2') < 0) {
                $connection->addColumn(
                    $table,
                    'custom_block_from',
                    [
                        'type' => Table::TYPE_DATE,
                        'nullable' => true,
                        'comment' => 'date'
                    ]
                );
                $connection->addColumn(
                    $table,
                    'custom_block_to',
                    [
                        'type' => Table::TYPE_DATE,
                        'nullable' => true,
                        'comment' => 'date'
                    ]
                );              
            }
            $installer->endSetup();
        }
    }

现在在CMS Block中创建了两个字段,但是当我保存cms块时,日期字段值未保存在数据库中。但是,当我通过sql更改Date字段时,该字段从数据库中获取值并显示在cms块编辑中,并在再次保存之后,date fields turn 0000-00-00。

请有人帮我这个。 非常感谢

1 个答案:

答案 0 :(得分:0)

在保存到数据库之前,必须格式化日期字段。在你的情况下

foreach (['custom_block_from', 'custom_block_to'] as $field) {
    $value = !$object->getData($field) ? null : $this->dateTime->formatDate($object->getData($field));
    $object->setData($field, $value);
}

必须在保存cms块之前调用此代码。

所以即使你重写了Class

/vendor/magento/module-cms/Model/ResourceModel/Block.php

使用偏好

<preference for="Magento\Cms\Model\ResourceModel\Block" type="Your_Vendor\Your_Modulename\Model\ResourceModel\Block" />

并添加以下功能

    /**
 * Perform operations before object save
 *
 * @param AbstractModel $object
 * @return $this
 * @throws LocalizedException
 */
protected function _beforeSave(AbstractModel $object)
{
    foreach (['custom_block_from', 'custom_block_to'] as $field) {
        $value = !$object->getData($field) ? null : $this->dateTime->formatDate($object->getData($field));
        $object->setData($field, $value);
    }

    if (!$this->getIsUniqueBlockToStores($object)) {
        throw new LocalizedException(
            __('A block identifier with the same properties already exists in the selected store.')
        );
    }
    return $this;
}

或使用事件cms_block_save_before。