簡體   English   中英

Orocommerce 添加自定義實體字段並使其在表單中成為必需

[英]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]);
   }

這些是將字段添加到注冊頁面並使用占位符設置所需的以下步驟。

  1. 為字段添加架構文件。 記下選項 'form' => ['is_enabled' => false]。 通過將其設置為 false,它將允許您使用 buildForm 手動添加它。

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']
                ]
            ]
        );
    }
}
  1. 添加表單類型擴展。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM