我正在学习Shopware,而我得到了一些我无法弄清楚如何解决的问题。
我正在编写一个向客户添加属性的测试插件。我已经将相应的字段添加到注册表单中,它会自动将其值保存到数据库中,就像我在文档中的某处读取一样。
现在我想在密码字段后的帐户个人资料页面中让该属性可编辑。我设法将输入放在那里,甚至显示db的值。但是当我更改值并保存时,它的值不会更新。我不知道是否只是让字段名称正确,或者我是否需要覆盖其他内容。或者它是不可能的?任何有关如何实现这一目标的帮助将不胜感激。
以下相关代码:
插件引导程序
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;
}
寄存器/ 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}
帐户/ 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}
答案 0 :(得分:2)
注册时使用的表单类型与您在配置文件中的表单类型不同。 如果你检查\ Shopware \ Bundle \ AccountBundle \ Form \ Account \ PersonalFormType :: buildForm,你可以看到
$builder->add('attribute', AttributeFormType::class, [
'data_class' => CustomerAttribute::class
]);
这意味着属性包含在表单中,并且它们将被保留。这就是为什么你可以保存注册表格的价值。
在配置文件中,您有\ Shopware \ Bundle \ AccountBundle \ Form \ Account \ ProfileUpdateFormType。此处,该属性未添加到表单构建器中。
如何扩展ProfileUpdateFormType?
在Bootstrap(或特定订阅者类)上订阅Shopware_Form_Builder
$ this-&gt; subscribeEvent('Shopware_Form_Builder','onFormBuild');
创建onFormBuild方法以添加逻辑
public function onFormBuild(\ Enlight_Event_EventArgs $ event){ if($ event-&gt; getReference()!== \ Shopware \ Bundle \ AccountBundle \ Form \ Account \ ProfileUpdateFormType :: class){ 返回; } $ builder = $ event-&gt; getBuilder();
$builder->add('attribute', AttributeFormType::class, [
'data_class' => CustomerAttribute::class
]);
}
使用此方法,您的个人资料表单中提供了所有属性。
您可能使用'additional'属性而不是'attribute',然后订阅控制器事件或挂钩控制器操作来处理您的自定义数据。