![](/img/trans.png)
[英]oroCommerce/Symfony 2.8 - how to add a custom field to a registration form
[英]Orocommerce Adding a custom entity field and making it required on form
我正在嘗試將電話輸入添加到 Orocommerce 的注冊頁面。 我已經更新了客戶用戶的后台實體並添加了一個電話字段。 我可以在店面的注冊頁面中看到它。 我想讓這個字段成為必填項。 我添加了一個 symfony 表單擴展,如下所示。
<?php
namespace <custom>\Bundle\CustomerBundle\Form\Extension;
use Oro\Bundle\CustomerBundle\Form\Type\FrontendCustomerUserRegistrationType;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
class FrontendCustomerUserRegistrationTypeExtension extends AbstractTypeExtension
{
/**
* {@inheritDoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$field = $builder->get('phone');
$options = $field->getOptions();
$options['required'] = true;
$options['attr'] = ['placeholder' => '+X(XXX)XXX-XXX'];
$options['constraints'] = array_merge($options['constraints'], [new NotBlank()]);
$builder->add(
$field->getName(),
TextType::class,
$options
);
}
/**
* {@inheritDoc}
*/
public function getExtendedType()
{
return FrontendCustomerUserRegistrationType::class;
}
}
當我在此代碼更改后重新加載注冊頁面時。 我收到以下錯誤:
名為“電話”的孩子不存在。
是否需要添加其他內容才能調用 $builder->get('phone')? 如果我嘗試更新另一個默認字段,例如 email $builder->get('email')。 我沒有收到任何錯誤,並且可以對其進行選項更改,例如更改占位符、必需等。
編輯:如果我繞過 get() 並執行 add() 我收到此錯誤:
“無法將擴展字段“電話”添加到表單中。同名字段已存在或已被其他擴展添加。”
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('phone', TextType::class, ['mapped' => false, 'required' => true]);
}
這些是將字段添加到注冊頁面並使用占位符設置所需的以下步驟。
src\YourCompany\Bundle\CustomerBundle\Migrations\Schema\v1_0
<?php
namespace YourCompany\Bundle\CustomerBundle\Migrations\Schema\v1_0;
use Doctrine\DBAL\Schema\Schema;
use Oro\Bundle\EntityExtendBundle\EntityConfig\ExtendScope;
use Oro\Bundle\MigrationBundle\Migration\Migration;
use Oro\Bundle\MigrationBundle\Migration\QueryBag;
/**
* @SuppressWarnings(PHPMD.TooManyMethods)
* @SuppressWarnings(PHPMD.ExcessiveClassLength)
*/
class AddAddress implements Migration
{
/**
* {@inheritdoc}
*/
public function up(Schema $schema, QueryBag $queries)
{
$table = $schema->getTable('oro_customer_user');
$table->addColumn('phone', 'string',
[
'oro_options' => [
'extend' => [
'is_extend' => true,
'owner' => ExtendScope::OWNER_CUSTOM
],
'form' => ['is_enabled' => false],
'view' => ['is_displayable' => true],
'entity' => ['label' => 'Phone Number']
]
]
);
}
}
src\YourCompany\Bundle\CustomerBundle\Form\Extension\FrontendCustomerUserRegistrationTypeExtension.php
<?php
namespace YourCompany\Bundle\CustomerBundle\Form\Extension;
use Oro\Bundle\CustomerBundle\Form\Type\FrontendCustomerUserRegistrationType;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
class FrontendCustomerUserRegistrationTypeExtension extends AbstractTypeExtension
{
/**
* {@inheritDoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('country', CountryType::class, [
'required' => true,
'label' => 'Country',
'attr' => ['placeholder' => '+X(XXX)XXX-XXXX']
])
}
/**
* {@inheritDoc}
*/
public function getExtendedType()
{
return FrontendCustomerUserRegistrationType::class;
}
}
或者,如果您只需要在沒有任何其他選項(如占位符)的情況下創建必填字段,則只需創建一個 validation.yml 文件並將該字段添加到后台的實體中,而無需進行類型擴展。
src\YourCompany\Bundle\CustomerBundle\Resources\config\validation.yml
Oro\Bundle\CustomerBundle\Entity\CustomerUser:
properties:
phone:
- NotBlank: ~
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.