在 Nette Forms 渲染期间在控件上添加自定义 Class

Add Custom Class on Controls during rendering for Nette Forms

我正在使用此示例 Bootstrap3 example 呈现表单,想知道是否可以添加自定义类名以基于控件类型形成输入包装器。我尝试了以下但它适用于表单输入而不是周围的包装 div(在这种情况下为表单组):

foreach ($form->getControls() as $control) {
    $type = $control->getOption('type');
    $control->getControlPrototype()->addClass('form-' . $control->getControlPrototype()->type);
}

输入包装器不是 Control(输入)的问题,而是 Renderer 的问题。 DefaultFormRenderer 将控件包装在 renderPair 方法中——其他渲染器甚至不必进行任何包装。因此,您无法获得包装器的原型。

不过,您可以使用 $control->setOption('class', …)DefaultFormRenderer 会将其用作包装器的 class(如您在 DefaultFormRenderer::renderPair 的源代码中所见) .

与其直接操作表单,不如实现自定义的更简洁IFormRenderer as @hrach mentions above. His Bs3FormRenderer是一个很好的例子。