Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
| 1 | <?php |
||
| 15 | class CloningPresenter extends BasePresenter |
||
| 16 | { |
||
| 17 | 1 | public function renderDefault() |
|
| 21 | |||
| 22 | 1 | public function createComponentCloningForm() |
|
| 23 | { |
||
| 24 | 1 | $form = $this->createForm(); |
|
| 25 | |||
| 26 | 1 | $langs = $this->getAllLanguages(); |
|
| 27 | 1 | $packages = \WebCMS\Helpers\SystemHelper::getPackages(); |
|
| 28 | |||
| 29 | 1 | $form->addGroup('Copy structures'); |
|
| 30 | |||
| 31 | 1 | $form->addSelect('languageFrom', 'Copy from', $langs)->setRequired('Please pick up language.')->setAttribute('class', 'form-control'); |
|
|
|
|||
| 32 | 1 | $form->addSelect('languageTo', 'Copy to', $langs)->setRequired('Please pick up language.')->setAttribute('class', 'form-control'); |
|
| 33 | 1 | $form->addCheckbox('removeData', 'Remove data?'); |
|
| 34 | |||
| 35 | 1 | $form->addGroup('Copy data from modules'); |
|
| 36 | |||
| 37 | 1 | View Code Duplication | foreach ($packages as $key => $package) { |
| 38 | if ($package['vendor'] === 'webcms2' && $package['package'] !== 'webcms2') { |
||
| 39 | $object = $this->createObject($package['package']); |
||
| 40 | |||
| 41 | if ($object->isCloneable()) { |
||
| 42 | $form->addCheckbox(str_replace('-', '_', $package['package']), $package['package']); |
||
| 43 | } else { |
||
| 44 | $form->addCheckbox(str_replace('-', '_', $package['package']), $package['package'].' not clonable.')->setDisabled(true); |
||
| 45 | } |
||
| 46 | } |
||
| 47 | 1 | } |
|
| 48 | |||
| 49 | 1 | $form->onSuccess[] = callback($this, 'cloningFormSubmitted'); |
|
| 50 | 1 | $form->addSubmit('send', 'Clone'); |
|
| 51 | |||
| 52 | 1 | return $form; |
|
| 53 | } |
||
| 54 | |||
| 55 | public function cloningFormSubmitted(UI\Form $form) |
||
| 56 | { |
||
| 57 | $values = $form->getValues(); |
||
| 58 | |||
| 59 | $languageFrom = $this->em->getRepository('WebCMS\Entity\Language')->find($values->languageFrom); |
||
| 60 | $languageTo = $this->em->getRepository('WebCMS\Entity\Language')->find($values->languageTo); |
||
| 61 | $removeData = $values->removeData; |
||
| 62 | |||
| 63 | $values = $this->normalizeValues($values); |
||
| 64 | |||
| 65 | // remove data first |
||
| 66 | if ($removeData) { |
||
| 67 | $this->removeData($languageTo); |
||
| 68 | } |
||
| 69 | |||
| 70 | // clone page structure |
||
| 71 | $transformTable = array(); |
||
| 72 | |||
| 73 | $pages = $this->em->getRepository('WebCMS\Entity\Page')->findBy(array( |
||
| 74 | 'language' => $languageFrom, |
||
| 75 | ), array('lft' => 'asc')); |
||
| 76 | |||
| 77 | foreach ($pages as $page) { |
||
| 78 | $new = $this->createNewPage($languageTo, $page); |
||
| 79 | |||
| 80 | if ($page->getParent()) { |
||
| 81 | $new->setParent($transformTable[$page->getParent()->getId()]); |
||
| 82 | } |
||
| 83 | |||
| 84 | $this->em->persist($new); |
||
| 85 | $this->em->flush(); |
||
| 86 | |||
| 87 | $new = $this->setPagePath($new); |
||
| 88 | |||
| 89 | $this->em->flush(); |
||
| 90 | |||
| 91 | $transformTable[$page->getId()] = $new; |
||
| 92 | } |
||
| 93 | |||
| 94 | foreach ($pages as $page) { |
||
| 95 | $this->pageCreateBoxes($page, $transformTable); |
||
| 96 | } |
||
| 97 | |||
| 98 | // clone all data |
||
| 99 | $this->cloneData($values, $languageFrom, $languageTo, $transformTable); |
||
| 100 | |||
| 101 | // persist all changes into database |
||
| 102 | $this->em->flush(); |
||
| 103 | |||
| 104 | $this->flashMessage('Cloning has been successfuly done.', 'success'); |
||
| 105 | if (!$this->isAjax()) { |
||
| 106 | $this->forward('Languages:cloning'); |
||
| 107 | } |
||
| 108 | } |
||
| 109 | |||
| 110 | /** |
||
| 111 | * |
||
| 112 | * |
||
| 113 | * @param \WebCMS\Entity\Page $new [description] |
||
| 114 | */ |
||
| 115 | 1 | View Code Duplication | private function setPagePath($new) |
| 129 | |||
| 130 | /** |
||
| 131 | * |
||
| 132 | * |
||
| 133 | * @param [type] $values [description] |
||
| 134 | * @return [type] [description] |
||
| 135 | */ |
||
| 136 | private function normalizeValues($values) |
||
| 137 | { |
||
| 138 | unset($values->languageFrom); |
||
| 139 | unset($values->languageTo); |
||
| 140 | unset($values->removeData); |
||
| 141 | |||
| 142 | return $values; |
||
| 143 | } |
||
| 144 | |||
| 145 | /** |
||
| 146 | * |
||
| 147 | * |
||
| 148 | * @return [type] [description] |
||
| 149 | */ |
||
| 150 | private function pageCreateBoxes($page, $transformTable) |
||
| 161 | |||
| 162 | /** |
||
| 163 | * |
||
| 164 | * |
||
| 165 | * @return [type] [description] |
||
| 166 | */ |
||
| 167 | private function cloneData($values, $languageFrom, $languageTo, $transformTable) |
||
| 178 | |||
| 179 | /** |
||
| 180 | * |
||
| 181 | * |
||
| 182 | * @return [type] [description] |
||
| 183 | */ |
||
| 184 | private function removeData($languageTo) |
||
| 195 | |||
| 196 | /** |
||
| 197 | * |
||
| 198 | * |
||
| 199 | * @param [type] $languageTo [description] |
||
| 200 | * @param [type] $page [description] |
||
| 201 | * @return [type] [description] |
||
| 202 | */ |
||
| 203 | private function createNewPage($languageTo, $page) |
||
| 219 | |||
| 220 | /** |
||
| 221 | * |
||
| 222 | * |
||
| 223 | * @param [type] $box [description] |
||
| 224 | * @return [type] [description] |
||
| 225 | */ |
||
| 226 | 1 | private function createNewBox($box, $transformTable) |
|
| 238 | } |
||
| 239 |
It seems like the type of the argument is not accepted by the function/method which you are calling.
In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.
We suggest to add an explicit type cast like in the following example: