我试图让这个好的Bootstrap滑块(https://github.com/seiyria/bootstrap-slider)在Symfony2上运行。
为此,我按照此处的指示(http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html)创建了自定义表单字段类型。
所以我的自定义表单字段类型如下:
<?php
// src/AppBundle/Form/Type/SingleSliderType.php
namespace AppBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;
class SingleSliderFormType extends AbstractType
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'choices' => array(
'0' => 0,
'1' => 20,
'2' => 40,
'3' => 60,
'4' => 80,
'5' => 100,
)
));
}
public function getParent()
{
return 'choice';
}
public function getName()
{
return 'singleslider';
}
}
我创建了一个fields.html.twig,这是内容:
{% block singleslider_widget -%}
<div class="input-group">
<input type="text" class='singleslider' data-slider-min="0" data-slider-max="100" data-slider-step="5" {% if value is defined %} data-slider-value="{{ value }}"{% endif %}/>
</div>
{%- endblock singleslider_widget %}
当然上面是准确的,因为我没有设定真正的选择,只是开始看它是否有效......但事实并非如此,因此我就在这里。
这就是我在调用它的表单类型中所做的:
$builder->add($fieldName, new SingleSliderFormType(), array('label'=>'Risk', 'required' => $req, 'choices' => $percentages, 'attr'=>array('class'=>'singleslider '.$cssClass), 'label_attr'=>array('class'=>$cssClass)) );
$百分比只是一个数组,如[&#39; 0&#39; =&gt;&#39; 0%&#39;,&#39; 5&#39; =&gt;&#39; 5% &#39; ...]
当我从数据库中检索信息时,一切正常,并在滑块上正确映射。当我移动滑块时,会传递一个空白字符串,因此它不起作用。
原始字段(我存储信息的地方)是一个整数。
我错过了什么?
我还试图声明它扩展了文字&#39;而不是选择&#39;在getParent()中,它抱怨:"The option "choices" does not exist. Known options are:..."
。但是,这不是setDefaults的目的之一,声明一个新的选项类型并设置它的默认值吗?
我感到困惑和困惑:/
编辑:评论后的新版本。
<?php
// src/AppBundle/Form/Type/SingleSliderType.php
namespace AppBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class SingleSliderFormType extends AbstractType
{
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setOptional(array(
'choices' => array(
'0' => 0,
'1' => 20,
'2' => 40,
'3' => 60,
'4' => 80,
'5' => 100,
)
));
}
public function getParent()
{
return 'text';
}
public function getName()
{
return 'singleslider';
}
}
现在我有错误"Warning: Illegal offset type"
,这是错误堆栈的第2点:
at ErrorHandler ->handleError ('2', 'Illegal offset type', 'D:\provarepos\user\vendor\symfony\symfony\src\Symfony\Component\OptionsResolver\OptionsResolver.php', '337', array('optionNames' => array('choices' => array('0', '20', '40', '60', '80', '100')), 'option' => array('0', '20', '40', '60', '80', '100'), 'this' => object(OptionsResolver)))
in vendor/symfony/symfony/src/Symfony/Component/OptionsResolver/OptionsResolver.php at line 337
编辑2:
通过将setOptional
替换为setDefaults
来管理其工作。
返回空白的问题是一样的。我甚至试图破坏滑块,我有一个简单的文本对象,但是当我保存表单时,它不会绑定DB上的值。不用说,如果我使用原始选择字段,它的工作原理。我还尝试通过指定by_reference = false来强制调用字段的setter,然后在我执行的实体内部:
public function setRiskToleranceFlag($riskToleranceFlag)
{
$this->riskToleranceFlag = intval($riskToleranceFlag);
return $this;
}
一切都无济于事。
答案 0 :(得分:2)
在不创建自定义表单字段的情况下,将此引导滑块与Symfony一起使用的简单方法是创建文本字段并在&#34; attr&#34;中传递滑块的属性。选项。
$formBuilder->add($question->getId(), TextType::class, array(
'required' => true,
'label' => $label,
'attr' => [
'data-provide' => 'slider',
'data-slider-ticks' => '[1, 2, 3]',
'data-slider-ticks-labels' => '["1", "2", "3"]',
'data-slider-min' => '1',
'data-slider-max' => '3',
'data-slider-step' => '1',
'data-slider-value' => '2',
'data-slider-tooltip' => 'hide'
]
));
答案 1 :(得分:0)
使用setDefaultOptions
代替configureOptions
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setOptional([
'choices' => array(
'0' => 0,
'1' => 20,
'2' => 40,
'3' => 60,
'4' => 80,
'5' => 100,
)
]);
}
它应该解决你的问题