在前端帐户配置文件表单中更新客户属性

时间:2017-02-06 20:39:11

标签: frontend shopware

我正在学习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}

1 个答案:

答案 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?

  1. 在Bootstrap(或特定订阅者类)上订阅Shopware_Form_Builder

    $ this-&gt; subscribeEvent('Shopware_Form_Builder','onFormBuild');

  2. 创建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
        ]);
    }
    
  3. 使用此方法,您的个人资料表单中提供了所有属性。

    您可能使用'additional'属性而不是'attribute',然后订阅控制器事件或挂钩控制器操作来处理您的自定义数据。