| Conditions | 29 |
| Paths | 2642 |
| Total Lines | 148 |
| Code Lines | 86 |
| Lines | 0 |
| Ratio | 0 % |
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | <?php |
||
| 338 | protected function matchTemplate(NodeList $nodes, FormInterface $form) |
||
| 339 | { |
||
| 340 | // todo injection |
||
| 341 | $translator = $this->formRow->getTranslator(); |
||
| 342 | |||
| 343 | $matched = []; |
||
| 344 | $toRemove = []; |
||
| 345 | $elements = $form->getElements(); |
||
| 346 | |||
| 347 | /* @var $node \WebinoDraw\Dom\Element */ |
||
| 348 | foreach ($nodes as $node) { |
||
| 349 | /** @var \WebinoDraw\Dom\Document $ownerDocument */ |
||
| 350 | $ownerDocument = $node->ownerDocument; |
||
| 351 | |||
| 352 | $nodePath = $node->getNodePath(); |
||
| 353 | $elementNodes = $ownerDocument->getXpath()->query('.//*[@name]', $node); |
||
| 354 | /* @var $elementNode \WebinoDraw\Dom\Element */ |
||
| 355 | foreach ($elementNodes as $elementNode) { |
||
| 356 | |||
| 357 | $elementName = $elementNode->getAttribute('name'); |
||
| 358 | $matched[$elementName] = true; |
||
| 359 | |||
| 360 | if (!$form->has($elementName)) { |
||
| 361 | // remove node of the missing form element |
||
| 362 | $parentNode = $elementNode->parentNode; |
||
| 363 | if ('label' === $parentNode->nodeName) { |
||
| 364 | $parentNode->parentNode->removeChild($parentNode); |
||
| 365 | } else { |
||
| 366 | $toRemove[$nodePath][] = $elementName; |
||
| 367 | $elementNode->parentNode->removeChild($elementNode); |
||
| 368 | } |
||
| 369 | continue; |
||
| 370 | } |
||
| 371 | |||
| 372 | $elementNode->setAttribute('id', $elementName); |
||
| 373 | |||
| 374 | /* @var $element \Zend\Form\Element */ |
||
| 375 | $element = $form->get($elementName); |
||
| 376 | $attributes = $element->getAttributes(); |
||
| 377 | |||
| 378 | // TODO remaining elements |
||
| 379 | if (isset($attributes['type'])) { |
||
| 380 | switch ($attributes['type']) { |
||
| 381 | case 'checkbox': |
||
| 382 | /* @var $element \Zend\Form\Element\Checkbox */ |
||
| 383 | $attributes['value'] = $element->getCheckedValue(); |
||
| 384 | // todo checkbox use hidden element |
||
| 385 | break; |
||
| 386 | case 'multi_checkbox': |
||
| 387 | case 'select': |
||
| 388 | $selectNode = $ownerDocument->createDocumentFragment(); |
||
| 389 | $selectNode->appendXml($this->formElement->__invoke($element)); |
||
| 390 | $newNode = $selectNode->firstChild; |
||
| 391 | $elementNode->parentNode->replaceChild($newNode, $elementNode); |
||
| 392 | $elementNode = $newNode; |
||
| 393 | unset($selectNode); |
||
| 394 | unset($newNode); |
||
| 395 | break; |
||
| 396 | |||
| 397 | case 'text': |
||
| 398 | case 'email': |
||
| 399 | case 'submit': |
||
| 400 | case 'reset': |
||
| 401 | case 'button': |
||
| 402 | |||
| 403 | // set element node value if available |
||
| 404 | $value = $elementNode->hasAttribute('value') |
||
| 405 | ? $elementNode->getAttribute('value') |
||
| 406 | : $element->getValue(); |
||
| 407 | |||
| 408 | $attributes['value'] = !empty($value) ? $translator->translate($value) : ''; |
||
| 409 | unset($value); |
||
| 410 | break; |
||
| 411 | } |
||
| 412 | } |
||
| 413 | |||
| 414 | // glue form & template element class |
||
| 415 | empty($attributes['class']) |
||
| 416 | or $attributes['class'] = trim($attributes['class'] . ' ' . $elementNode->getAttribute('class')); |
||
| 417 | |||
| 418 | $subElementNodes = $nodes->create([$elementNode]); |
||
| 419 | $subElementNodes->setAttribs($attributes); |
||
| 420 | |||
| 421 | // labels |
||
| 422 | $subElementNodes->each( |
||
| 423 | 'xpath=../span[name(..)="label"]|..//label[@for="' . $elementName . '"]', |
||
| 424 | function ($nodes) use ($element, $translator) { |
||
| 425 | $label = $translator->translate($element->getLabel()); |
||
| 426 | |||
| 427 | /* @var $subNode \WebinoDraw\Dom\Element */ |
||
| 428 | foreach ($nodes as $subNode) { |
||
| 429 | $subNode->nodeValue = !$subNode->isEmpty() |
||
| 430 | ? $translator->translate($subNode->nodeValue) |
||
| 431 | : $label; |
||
| 432 | } |
||
| 433 | } |
||
| 434 | ); |
||
| 435 | |||
| 436 | // errors |
||
| 437 | $messages = $element->getMessages(); |
||
| 438 | if (!empty($messages)) { |
||
| 439 | |||
| 440 | $errorNode = $ownerDocument->createDocumentFragment(); |
||
| 441 | $errorNode->appendXml($this->formElementErrors->__invoke($element)); |
||
| 442 | |||
| 443 | foreach ($subElementNodes as $subElementNode) { |
||
| 444 | if (empty($subElementNode->nextSibling)) { |
||
| 445 | $subElementNode->parentNode->appendChild($errorNode); |
||
| 446 | } else { |
||
| 447 | $subElementNode->parentNode->insertBefore($errorNode, $subElementNode); |
||
| 448 | } |
||
| 449 | } |
||
| 450 | } |
||
| 451 | } |
||
| 452 | |||
| 453 | // auto draw hidden nodes |
||
| 454 | /** @var \Zend\Form\Element $element */ |
||
| 455 | foreach ($elements as $element) { |
||
| 456 | $attributes = $element->getAttributes(); |
||
| 457 | if (empty($attributes['type']) |
||
| 458 | || 'hidden' !== $attributes['type'] |
||
| 459 | ) { |
||
| 460 | continue; |
||
| 461 | } |
||
| 462 | |||
| 463 | // skip matched elements |
||
| 464 | if (isset($matched[$attributes['name']])) { |
||
| 465 | continue; |
||
| 466 | } |
||
| 467 | |||
| 468 | $hiddenNode = $ownerDocument->createDocumentFragment(); |
||
| 469 | $xhtml = (string) $this->formRow->__invoke($element); |
||
| 470 | |||
| 471 | $hiddenNode->appendXml($xhtml); |
||
| 472 | if (!$hiddenNode->hasChildNodes()) { |
||
| 473 | throw new Exception\RuntimeException('Invalid XHTML ' . $xhtml); |
||
| 474 | } |
||
| 475 | $node->appendChild($hiddenNode); |
||
| 476 | } |
||
| 477 | } |
||
| 478 | |||
| 479 | // remove labels of missing elements |
||
| 480 | foreach ($toRemove as $nodePath => $elementNames) { |
||
| 481 | foreach ($elementNames as $elementName) { |
||
| 482 | $nodes->remove('xpath=' . $nodePath . '//label[@for="' . $elementName . '"]'); |
||
| 483 | } |
||
| 484 | } |
||
| 485 | } |
||
| 486 | } |
||
| 487 |