2015-06-05 2 views
1

Я пытаюсь сделать этот хороший слайдер Bootstrap (https://github.com/seiyria/bootstrap-slider) работать на Symfony2.Symfony2 и слайдер Bootstrap

Для этого я создал пользовательский тип поля формы, следуя указаниям здесь (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 %} 

Конечно вышеперечисленное Barebone, как Я не устанавливаю реальные выборы, это было только начало видеть, если это сработало ... и это не так, поэтому я здесь.

Это то, что я делаю в типе формы, назвав его:

$builder->add($fieldName, new SingleSliderFormType(), array('label'=>'Risk', 'required' => $req, 'choices' => $percentages, 'attr'=>array('class'=>'singleslider '.$cssClass), 'label_attr'=>array('class'=>$cssClass))); 

$ проценты просто массив как [ '0' => '0%', '5' => '5%' ...]

Когда я извлекаю информацию из БД, все правильно и правильно отображается на слайдере. Когда я перемещаю ползунок, пустая строка передается, поэтому она не работает.

Исходное поле (где я храню информацию) является целым числом.

Что мне не хватает?

Я также пытался заявить, что он расширяет текст вместо «выбора» в getParent(), но он жалуется, что: "The option "choices" does not exist. Known options are:...". Но разве это не одна из целей setDefaults, объявляющая новый тип параметра AND, устанавливающий значение по умолчанию?

Я застрял и недоумевают:/

EDIT: новая версия после комментариев.

<?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 

EDIT 2:

Успели сделать его работу путем замены setOptional с setDefaults.

Проблема с возвратом пустого же. Я даже пытаюсь уничтожить слайдер, и у меня есть простой текстовый объект, но когда я сохраняю форму, он не связывает значение в БД. Излишне говорить, что если я использую исходное поле выбора, он работает. Я также пытался заставить вызов сеттер для поля, указав by_reference = ложь, а затем в сущности, я сделал:

public function setRiskToleranceFlag($riskToleranceFlag) 
{ 
    $this->riskToleranceFlag = intval($riskToleranceFlag); 

    return $this; 
} 

Все без толка, как вы можете себе представить.

ответ

0

Использование setDefaultOptions вместо configureOptions

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setOptional([ 
     'choices' => array(
      '0' => 0, 
      '1' => 20, 
      '2' => 40, 
      '3' => 60, 
      '4' => 80, 
      '5' => 100, 
     ) 
    ]); 
} 

Это должно решить вашу проблему

+0

Предполагаю удалить функцию configureOptions (и действительно, я узнал, что он был введен в Symfony 2.7, а я на 2.6). В любом случае это дает мне «Ошибка компиляции: объявление AppBundle \ Form \ Type \ SingleSliderFormType :: setDefaultOptions() должно быть совместимо с Symfony \ Component \ Form \ FormTypeInterface :: setDefaultOptions (Symfony \ Component \ OptionsResolver \ OptionsResolverInterface $ resolver)" –

+0

вы забыли параметр setDefaultOptions: 'setDefaultOptions (OptionsResolverInterface $ resolver)' не забудьте также использовать OptionResolverInterface в верхней части вашего файла – Med

+0

Я забыл «использовать» сверху. Теперь у меня есть и есть новая фантастическая ошибка (см. Отредактированный вопрос). Большое вам спасибо за ваше время! –

2

Простой способ использовать этот самозагрузки-слайдер с Symfony без создания пользовательского поля формы заключается в создании текстового поля и пропуск атрибуты слайдера в опции «attr».

$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' 
      ] 
     )); 
+0

Спасибо за ваше время. Я не знаю, работает ли это решение, но если это будет хорошо, -) –

+0

Добро пожаловать! Он отлично работает, я использую его в проекте, над которым я сейчас работаю. –

Смежные вопросы