我正在创建一个模块,我希望在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。
请有人帮我这个。 非常感谢
答案 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。