Skip to content

netteForms.js: Stack overflow and Too much recursions on CheckboxList #143

Description

@radekdostal
  • bug report? yes
  • feature request? no
  • version: 2.4.3

Description

I have form component with four CheckboxLists. There are set own validation rules (PHP, JavaScript), but if these rules are removed, error is still thrown. The entire form contains only four checkboxes and a submit button. The form is manually rendered and Firefox Console is blank. If I leave the tab and come back, console contains "too much recursion" and "stack overflow" on this line and this line. Javascript validation during form submitting fails, own validation rules are not called.

When I use netteForms.js version 2.3.10, everything is ok and JavaScript validation passes.

data-nette-rules attributes are the same for Nette 2.3.10 and Nette 2.4.0 (20170119).

Steps To Reproduce

  public function getControl()
  {
    $this->setOption('rendered', TRUE);

    $form = new Form();
    $container = $form->addContainer($this->getHtmlName());

    $regions = $municipalities = $departments = [];

    if ($this->regionsEnabled === TRUE)
    {
      $regions = $container->addCheckboxList('regions', NULL, $this->regionsList);
      $regions->setDefaultValue($this->regions)
        ->getSeparatorPrototype()
        ->setName(NULL);
      $regions->getLabelPrototype()
        ->setClass('checkbox-inline');
    }

    if ($this->municipalitiesEnabled === TRUE)
    {
      $municipalities = $container->addCheckboxList('municipalities', NULL, $this->municipalitiesList);
      $municipalities->setDefaultValue($this->municipalities)
        ->getSeparatorPrototype()
        ->setName(NULL);
      $municipalities->getLabelPrototype()
        ->setClass('checkbox-inline');
    }

    if ($this->departmentsEnabled === TRUE)
    {
      $departments = $container->addCheckboxList('departments', NULL, $this->departmentsList);
      $departments->setDefaultValue($this->departments)
        ->getSeparatorPrototype()
        ->setName(NULL);
      $departments->getLabelPrototype()
        ->setClass('checkbox-inline');
    }

    if ($this->municipalitiesEnabled === TRUE || $this->departmentsEnabled === TRUE)
    {
      $districts = $container->addCheckboxList('districts', NULL, $this->districtsList);
      $districts->setDefaultValue($this->districts)
        ->getSeparatorPrototype()
        ->setName(NULL);
      $districts->getLabelPrototype()
        ->setClass('checkbox-inline');
    }

    $control = Html::el();

    if ($this->regionsEnabled === TRUE)
    {
      $regions->addRule(__CLASS__.'::validateOrganization', static::$validationMessages['organization'], [$regions, $municipalities, $departments]);

      $control->addHtml(Html::el('p', Html::el('small', Html::el('strong', 'Kraj')))->class('form-control-static'))
        ->addHtml($regions->getControl());
    }

    if ($this->municipalitiesEnabled === TRUE)
    {
      $municipalities->addRule(__CLASS__.'::validateOrganization', static::$validationMessages['organization'], [$regions, $municipalities, $departments])
        ->addRule(__CLASS__.'::validateDistrict', static::$validationMessages['district'], [$regions, $municipalities, $departments, $districts]);

      $control->addHtml(Html::el('p', Html::el('small', Html::el('strong', 'Obce')))->class('form-control-static'))
        ->addHtml($municipalities->getControl());
    }

    if ($this->departmentsEnabled === TRUE)
    {
      $departments->addRule(__CLASS__.'::validateOrganization', static::$validationMessages['organization'], [$regions, $municipalities, $departments])
        ->addRule(__CLASS__.'::validateDistrict', static::$validationMessages['district'], [$regions, $municipalities, $departments, $districts]);

      $control->addHtml(Html::el('p', Html::el('small', Html::el('strong', 'Příspěvkové organizace')))->class('form-control-static'))
        ->addHtml($departments->getControl());
    }

    if ($this->municipalitiesEnabled === TRUE || $this->departmentsEnabled === TRUE)
    {
      $control->addHtml(Html::el('hr'))
        ->addHtml(Html::el('p', Html::el('small', Html::el('strong', 'Okres')))->class('form-control-static'))
        ->addHtml($districts->getControl());
    }

    return $control;
  }

  public static function validateOrganization(IControl $control)
  {
    return count($control->regions) > 0 || count($control->municipalities) > 0 || count($control->departments) > 0;
  }

  public static function validateDistrict(IControl $control)
  {
    return (count($control->regions) > 0 && count($control->municipalities) === 0 && count($control->departments) === 0)
      || count($control->districts) > 0;
  }

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions