Drupal 8动态表单ID


Drupal 8 Dynamic form ID

我写了一个动态创建block的模块。在每个块我有一个形式。我的问题是,我想要一个动态的形式id为每个形式,但在我的ModuleBlockForm.php我只能定义一个静态的

  public function getFormId() {
    return 'mymodule_block_form';
  }

但是我想要这样的:

  public function getFormId() {
    return 'mymodule_block_form_' . $foo;
  }

可能吗?

thanks for help

抱歉:由于我还不能评论,我将把我的评论作为答案写下来

我在Julie Pelletier的回答中看到的问题是,rand不会生成唯一的数字,所以我建议定义一个私有的静态整数slug,你附加到每个formId并增加它。

的例子:

private static $slug = 0;

和__construct()

self::$slug = 0;

和getFormId()

self::$slug += 1;
return 'mymodule_block_form_' . self::$slug;

你可以把最后两行合二为一,我这样写是为了便于阅读。

希望对你有帮助。

您应该在构造函数中将其设置为类属性。它既可以传递给对象的构造函数,也可以随机传递,例如:

this->formId = rand(11111, 99999);

…并将其用作:

public function getFormId() {
    return 'mymodule_block_form_' . this->formId;
}

由于我的表单正在动态构建(基于plugin_id进入表单构建器作为参数),我能够通过定义protected static $formId属性来实现这一点。

然后创建了方法getFormId像这样

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    $formId = 'settings_form';
    if (self::$formId) {
      $formId .= '_' . self::$formId;
    }
    return $formId;
  }

那么在buildForm方法中我只需调用

$blockId = $buildInfo['args'][0] ?? NULL;    
self::$formId = Html::cleanCssIdentifier($blockId);

ashraf aaref建议的方法对我不起作用,但下面的方法可以。

public function getFormId() {
    static $num = 0;
    $num++;
    return 'mymodule_form_' . $num;
}