更新前端帐户资料表单中的客户属性
update customer attribute in frontend account profile form
我正在学习 Shopware,但遇到了一些我不知道如何解决的问题。
我正在编写一个向客户添加属性的测试插件。我已将通讯员字段添加到注册表中,它会自动将其值保存到数据库中,就像我在文档中的某处阅读的那样。
现在我想让该属性在帐户配置文件页面中的密码字段之后可编辑。我设法将输入放在那里,甚至显示来自数据库的值。但是当我更改值并保存时,该值不会更新。我不知道这是否只是让字段名称正确的问题,还是我需要覆盖其他内容。还是根本不可能?任何有关如何实现这一目标的帮助将不胜感激。
相关代码如下:
插件bootstrap
public function install(InstallContext $context)
{
$service = $this->container->get('shopware_attribute.crud_service');
$service->update('s_user_attributes', 'test_field', 'string');
$metaDataCache = Shopware()->Models()->getConfiguration()->getMetadataCacheImpl();
$metaDataCache->deleteAll();
Shopware()->Models()->generateAttributeModels(['s_user_attributes']);
return true;
}
register/personal_fieldset.tpl
{extends file="parent:frontend/register/personal_fieldset.tpl"}
{block name='frontend_register_personal_fieldset_password_description'}
{$smarty.block.parent}
<div class="register--test-field">
<input autocomplete="section-personal test-field"
name="register[personal][attribute][testField]"
type="text"
placeholder="Test Field"
id="testfield"
value="{$form_data.attribute.testField|escape}"
class="register--field{if $errorFlags.testField} has--error{/if}"
/>
</div>
{/block}
account/profile.tpl
{extends file="parent:frontend/account/profile.tpl"}
{block name='frontend_account_profile_profile_required_info'}
<div class="profile--test-field">
<input autocomplete="section-personal test-field"
name="profile[attribute][testfield]"
type="text"
placeholder="Test Field"
id="testfield"
value="{$sUserData.additional.user.test_field|escape}"
class="profile--field{if $errorFlags.testField} has--error{/if}"
/>
</div>
{$smarty.block.parent}
{/block}
注册时使用的表单类型与您在个人资料中使用的表单类型不同。
如果你检查 \Shopware\Bundle\AccountBundle\Form\Account\PersonalFormType::buildForm,你可以看到
$builder->add('attribute', AttributeFormType::class, [
'data_class' => CustomerAttribute::class
]);
这意味着属性包含在表单中并且将被持久化。这就是为什么您可以在注册表单上保存值。
您的个人资料 \Shopware\Bundle\AccountBundle\Form\Account\ProfileUpdateFormType。这里的属性没有添加到表单生成器。
如何扩展 ProfileUpdateFormType?
在 Bootstrap(或特定订阅者 class)上订阅 Shopware_Form_Builder
$this->subscribeEvent('Shopware_Form_Builder', 'onFormBuild');
创建方法 onFormBuild 以添加您的逻辑
public 函数 onFormBuild(\Enlight_Event_EventArgs $event) {
如果 ($event->getReference() !== \Shopware\Bundle\AccountBundle\Form\Account\ProfileUpdateFormType::class) {
return;
}
$builder = $event->getBuilder();
$builder->add('attribute', AttributeFormType::class, [
'data_class' => CustomerAttribute::class
]);
}
通过这种方法,您的个人资料表单上的所有属性都可用。
您的其他可能性是使用 'additional' 属性 而不是 'attribute' 然后订阅控制器事件或挂钩控制器操作来处理您的自定义数据。
我正在学习 Shopware,但遇到了一些我不知道如何解决的问题。
我正在编写一个向客户添加属性的测试插件。我已将通讯员字段添加到注册表中,它会自动将其值保存到数据库中,就像我在文档中的某处阅读的那样。
现在我想让该属性在帐户配置文件页面中的密码字段之后可编辑。我设法将输入放在那里,甚至显示来自数据库的值。但是当我更改值并保存时,该值不会更新。我不知道这是否只是让字段名称正确的问题,还是我需要覆盖其他内容。还是根本不可能?任何有关如何实现这一目标的帮助将不胜感激。
相关代码如下:
插件bootstrap
public function install(InstallContext $context)
{
$service = $this->container->get('shopware_attribute.crud_service');
$service->update('s_user_attributes', 'test_field', 'string');
$metaDataCache = Shopware()->Models()->getConfiguration()->getMetadataCacheImpl();
$metaDataCache->deleteAll();
Shopware()->Models()->generateAttributeModels(['s_user_attributes']);
return true;
}
register/personal_fieldset.tpl
{extends file="parent:frontend/register/personal_fieldset.tpl"}
{block name='frontend_register_personal_fieldset_password_description'}
{$smarty.block.parent}
<div class="register--test-field">
<input autocomplete="section-personal test-field"
name="register[personal][attribute][testField]"
type="text"
placeholder="Test Field"
id="testfield"
value="{$form_data.attribute.testField|escape}"
class="register--field{if $errorFlags.testField} has--error{/if}"
/>
</div>
{/block}
account/profile.tpl
{extends file="parent:frontend/account/profile.tpl"}
{block name='frontend_account_profile_profile_required_info'}
<div class="profile--test-field">
<input autocomplete="section-personal test-field"
name="profile[attribute][testfield]"
type="text"
placeholder="Test Field"
id="testfield"
value="{$sUserData.additional.user.test_field|escape}"
class="profile--field{if $errorFlags.testField} has--error{/if}"
/>
</div>
{$smarty.block.parent}
{/block}
注册时使用的表单类型与您在个人资料中使用的表单类型不同。 如果你检查 \Shopware\Bundle\AccountBundle\Form\Account\PersonalFormType::buildForm,你可以看到
$builder->add('attribute', AttributeFormType::class, [
'data_class' => CustomerAttribute::class
]);
这意味着属性包含在表单中并且将被持久化。这就是为什么您可以在注册表单上保存值。
您的个人资料 \Shopware\Bundle\AccountBundle\Form\Account\ProfileUpdateFormType。这里的属性没有添加到表单生成器。
如何扩展 ProfileUpdateFormType?
在 Bootstrap(或特定订阅者 class)上订阅 Shopware_Form_Builder
$this->subscribeEvent('Shopware_Form_Builder', 'onFormBuild');
创建方法 onFormBuild 以添加您的逻辑
public 函数 onFormBuild(\Enlight_Event_EventArgs $event) { 如果 ($event->getReference() !== \Shopware\Bundle\AccountBundle\Form\Account\ProfileUpdateFormType::class) { return; } $builder = $event->getBuilder();
$builder->add('attribute', AttributeFormType::class, [ 'data_class' => CustomerAttribute::class ]); }
通过这种方法,您的个人资料表单上的所有属性都可用。
您的其他可能性是使用 'additional' 属性 而不是 'attribute' 然后订阅控制器事件或挂钩控制器操作来处理您的自定义数据。