Conditions | 29 |
Paths | 2642 |
Total Lines | 153 |
Code Lines | 91 |
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 | $multiNode = $ownerDocument->createDocumentFragment(); |
||
388 | $multiNode->appendXml($this->formRow->__invoke($element)); |
||
389 | $elementNode = $elementNode->parentNode->replaceChild($multiNode, $elementNode); |
||
390 | unset($multiNode); |
||
391 | break; |
||
392 | case 'select': |
||
393 | $selectNode = $ownerDocument->createDocumentFragment(); |
||
394 | $selectNode->appendXml($this->formElement->__invoke($element)); |
||
395 | $newNode = $selectNode->firstChild; |
||
396 | $elementNode->parentNode->replaceChild($newNode, $elementNode); |
||
397 | $elementNode = $newNode; |
||
398 | unset($selectNode); |
||
399 | unset($newNode); |
||
400 | break; |
||
401 | |||
402 | case 'text': |
||
403 | case 'email': |
||
404 | case 'submit': |
||
405 | case 'reset': |
||
406 | case 'button': |
||
407 | |||
408 | // set element node value if available |
||
409 | $value = $elementNode->hasAttribute('value') |
||
410 | ? $elementNode->getAttribute('value') |
||
411 | : $element->getValue(); |
||
412 | |||
413 | $attributes['value'] = !empty($value) ? $translator->translate($value) : ''; |
||
414 | unset($value); |
||
415 | break; |
||
416 | } |
||
417 | } |
||
418 | |||
419 | // glue form & template element class |
||
420 | empty($attributes['class']) |
||
421 | or $attributes['class'] = trim($attributes['class'] . ' ' . $elementNode->getAttribute('class')); |
||
422 | |||
423 | $subElementNodes = $nodes->create([$elementNode]); |
||
424 | $subElementNodes->setAttribs($attributes); |
||
425 | |||
426 | // labels |
||
427 | $subElementNodes->each( |
||
428 | 'xpath=../span[name(..)="label"]|..//label[@for="' . $elementName . '"]', |
||
429 | function ($nodes) use ($element, $translator) { |
||
430 | $label = $translator->translate($element->getLabel()); |
||
431 | |||
432 | /* @var $subNode \WebinoDraw\Dom\Element */ |
||
433 | foreach ($nodes as $subNode) { |
||
434 | $subNode->nodeValue = !$subNode->isEmpty() |
||
435 | ? $translator->translate($subNode->nodeValue) |
||
436 | : $label; |
||
437 | } |
||
438 | } |
||
439 | ); |
||
440 | |||
441 | // errors |
||
442 | $messages = $element->getMessages(); |
||
443 | if (!empty($messages)) { |
||
444 | |||
445 | $errorNode = $ownerDocument->createDocumentFragment(); |
||
446 | $errorNode->appendXml($this->formElementErrors->__invoke($element)); |
||
447 | |||
448 | foreach ($subElementNodes as $subElementNode) { |
||
449 | if (empty($subElementNode->nextSibling)) { |
||
450 | $subElementNode->parentNode->appendChild($errorNode); |
||
451 | } else { |
||
452 | $subElementNode->parentNode->insertBefore($errorNode, $subElementNode); |
||
453 | } |
||
454 | } |
||
455 | } |
||
456 | } |
||
457 | |||
458 | // auto draw hidden nodes |
||
459 | /** @var \Zend\Form\Element $element */ |
||
460 | foreach ($elements as $element) { |
||
461 | $attributes = $element->getAttributes(); |
||
462 | if (empty($attributes['type']) |
||
463 | || 'hidden' !== $attributes['type'] |
||
464 | ) { |
||
465 | continue; |
||
466 | } |
||
467 | |||
468 | // skip matched elements |
||
469 | if (isset($matched[$attributes['name']])) { |
||
470 | continue; |
||
471 | } |
||
472 | |||
473 | $hiddenNode = $ownerDocument->createDocumentFragment(); |
||
474 | $xhtml = (string) $this->formRow->__invoke($element); |
||
475 | |||
476 | $hiddenNode->appendXml($xhtml); |
||
477 | if (!$hiddenNode->hasChildNodes()) { |
||
478 | throw new Exception\RuntimeException('Invalid XHTML ' . $xhtml); |
||
479 | } |
||
480 | $node->appendChild($hiddenNode); |
||
481 | } |
||
482 | } |
||
483 | |||
484 | // remove labels of missing elements |
||
485 | foreach ($toRemove as $nodePath => $elementNames) { |
||
486 | foreach ($elementNames as $elementName) { |
||
487 | $nodes->remove('xpath=' . $nodePath . '//label[@for="' . $elementName . '"]'); |
||
488 | } |
||
489 | } |
||
490 | } |
||
491 | } |
||
492 |