Symfony2和Bootstrap滑块

时间:2015-06-05 13:54:03

标签: twitter-bootstrap symfony symfony-forms

我试图让这个好的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;
}

一切都无济于事。

2 个答案:

答案 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,
        )
    ]);
}

它应该解决你的问题