| Total Complexity | 73 |
| Total Lines | 438 |
| Duplicated Lines | 0 % |
| Changes | 1 | ||
| Bugs | 0 | Features | 0 |
Complex classes like AppRecordView often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use AppRecordView, and based on these observations, apply Extract Interface, too.
| 1 | <?php |
||
| 40 | class AppRecordView extends AppUiObject |
||
| 41 | { |
||
| 42 | /** |
||
| 43 | * @var AppRecord |
||
| 44 | */ |
||
| 45 | protected $record = null; |
||
| 46 | |||
| 47 | /** |
||
| 48 | * @var AppRecordSet |
||
| 49 | */ |
||
| 50 | protected $recordSet = null; |
||
| 51 | |||
| 52 | /** |
||
| 53 | * @var WidgetSection[] |
||
| 54 | */ |
||
| 55 | protected $sections = array(); |
||
| 56 | |||
| 57 | protected $view = ''; |
||
| 58 | |||
| 59 | /** |
||
| 60 | * @var AppCtrlRecord |
||
| 61 | */ |
||
| 62 | protected $recordController = null; |
||
| 63 | |||
| 64 | protected $recordIsReadable = false; |
||
| 65 | protected $recordIsUpdateable = false; |
||
| 66 | protected $recordIsDeletable = false; |
||
| 67 | |||
| 68 | /** |
||
| 69 | * @param Func_App $App |
||
| 70 | * @param string $id |
||
| 71 | * @param WidgetLayout $layout |
||
| 72 | */ |
||
| 73 | public function __construct(Func_App $App, $id = null, WidgetLayout $layout = null) |
||
| 74 | { |
||
| 75 | parent::__construct($App); |
||
| 76 | |||
| 77 | if (!isset($layout)) { |
||
| 78 | $W = bab_Widgets(); |
||
| 79 | $layout = $W->Items(); |
||
| 80 | } |
||
| 81 | |||
| 82 | $this->setInheritedItem($layout); |
||
| 83 | } |
||
| 84 | |||
| 85 | |||
| 86 | /** |
||
| 87 | * @param AppRecord $record |
||
| 88 | * @return self |
||
| 89 | */ |
||
| 90 | public function setRecord(AppRecord $record) |
||
| 91 | { |
||
| 92 | $this->record = $record; |
||
| 93 | $this->recordSet = $record->getParentSet(); |
||
| 94 | |||
| 95 | $this->recordIsReadable = $record->isReadable(); |
||
| 96 | $this->recordIsUpdateable = $record->isUpdatable(); |
||
| 97 | $this->recordIsDeletable = $record->isDeletable(); |
||
| 98 | |||
| 99 | return $this; |
||
| 100 | } |
||
| 101 | |||
| 102 | |||
| 103 | /** |
||
| 104 | * @param string $view |
||
| 105 | * @return self |
||
| 106 | */ |
||
| 107 | public function setView($view) |
||
| 108 | { |
||
| 109 | $this->view = $view; |
||
| 110 | return $this; |
||
| 111 | } |
||
| 112 | |||
| 113 | |||
| 114 | /** |
||
| 115 | * @return string |
||
| 116 | */ |
||
| 117 | public function getView() |
||
| 118 | { |
||
| 119 | return $this->view; |
||
| 120 | } |
||
| 121 | |||
| 122 | |||
| 123 | |||
| 124 | /** |
||
| 125 | * Creates section in the editor. |
||
| 126 | * If a section with the same header text (title) was already |
||
| 127 | * created it is replaced by an empty section. |
||
| 128 | * |
||
| 129 | * @param string $headerText |
||
| 130 | * @return WidgetSection |
||
| 131 | */ |
||
| 132 | protected function addSection($id, $headerText, $layout = null) |
||
| 133 | { |
||
| 134 | $W = bab_Widgets(); |
||
| 135 | if (!isset($layout)) { |
||
| 136 | $layout = $W->VBoxLayout(); |
||
| 137 | } |
||
| 138 | $this->sections[$id] = $W->Section( |
||
| 139 | $headerText, |
||
| 140 | $layout |
||
| 141 | )->setFoldable(true); |
||
| 142 | |||
| 143 | return $this->sections[$id]; |
||
| 144 | } |
||
| 145 | |||
| 146 | /** |
||
| 147 | * Creates section in the editor. |
||
| 148 | * If a section with the same header text (title) was already |
||
| 149 | * created it is replaced by an empty section. |
||
| 150 | * |
||
| 151 | * @param string $headerText |
||
| 152 | * @return WidgetSection |
||
| 153 | */ |
||
| 154 | protected function createSection($headerText, $layout = null) |
||
| 155 | { |
||
| 156 | return $this->addSection($headerText, $headerText, $layout); |
||
| 157 | } |
||
| 158 | |||
| 159 | |||
| 160 | /** |
||
| 161 | * Retrieves a section in the editor. |
||
| 162 | * |
||
| 163 | * @param string $headerText |
||
| 164 | * @return WidgetSection |
||
| 165 | */ |
||
| 166 | protected function getSection($id) |
||
| 167 | { |
||
| 168 | if (!isset($this->sections[$id])) { |
||
| 169 | return null; |
||
| 170 | } |
||
| 171 | return $this->sections[$id]; |
||
| 172 | } |
||
| 173 | |||
| 174 | |||
| 175 | /** |
||
| 176 | * Returns the list of sections created via createSection(). |
||
| 177 | * |
||
| 178 | * @return WidgetSection[] |
||
| 179 | */ |
||
| 180 | public function getSections() |
||
| 181 | { |
||
| 182 | return $this->sections; |
||
| 183 | } |
||
| 184 | |||
| 185 | |||
| 186 | |||
| 187 | |||
| 188 | /** |
||
| 189 | * @param string $textLabel |
||
| 190 | * @param mixed $value |
||
| 191 | * @param AppCustomSection $section |
||
| 192 | * @return WidgetLayout |
||
| 193 | */ |
||
| 194 | public function labelledWidget($textLabel, $value, AppCustomSection $section = null) |
||
| 195 | { |
||
| 196 | $W = bab_Widgets(); |
||
| 197 | |||
| 198 | if ($value instanceof WidgetDisplayableInterface) { |
||
| 199 | $widget = $value; |
||
| 200 | } else { |
||
| 201 | $widget = $W->Label($value); |
||
| 202 | } |
||
| 203 | |||
| 204 | if (isset($section)) { |
||
| 205 | if ($textLabel === '__') { |
||
| 206 | $fieldLayout = AppCustomSection::FIELDS_LAYOUT_NO_LABEL; |
||
| 207 | } else { |
||
| 208 | $fieldLayout = $section->fieldsLayout; |
||
| 209 | } |
||
| 210 | switch ($fieldLayout) { |
||
| 211 | case AppCustomSection::FIELDS_LAYOUT_HORIZONTAL_LABEL: |
||
| 212 | return $W->FlowItems( |
||
| 213 | $W->Label($textLabel)->addClass('crm-horizontal-display-label', 'widget-strong') |
||
| 214 | ->setSizePolicy('widget-25pc'), |
||
| 215 | $widget |
||
| 216 | )->addClass('widget-labelled-widget') |
||
| 217 | ->setHorizontalSpacing(1, 'ex') |
||
| 218 | ->setVerticalAlign('top'); |
||
| 219 | |||
| 220 | case AppCustomSection::FIELDS_LAYOUT_WIDE_HORIZONTAL_LABEL: |
||
| 221 | return $W->FlowItems( |
||
| 222 | $W->Label($textLabel)->addClass('crm-horizontal-display-label', 'widget-strong') |
||
| 223 | ->setSizePolicy('widget-50pc'), |
||
| 224 | $widget |
||
| 225 | )->addClass('widget-labelled-widget') |
||
| 226 | ->setHorizontalSpacing(1, 'ex') |
||
| 227 | ->setVerticalAlign('top'); |
||
| 228 | |||
| 229 | case AppCustomSection::FIELDS_LAYOUT_NO_LABEL: |
||
| 230 | return $widget; |
||
| 231 | |||
| 232 | case AppCustomSection::FIELDS_LAYOUT_VERTICAL_LABEL: |
||
| 233 | default: |
||
| 234 | return $W->LabelledWidget($textLabel, $widget); |
||
| 235 | } |
||
| 236 | } |
||
| 237 | } |
||
| 238 | |||
| 239 | |||
| 240 | public function labelledWidgetOptional($textLabel, $displayedValue, $value = null, AppCustomSection $section = null) |
||
| 241 | { |
||
| 242 | if (!isset($value)) { |
||
| 243 | $value = $displayedValue; |
||
| 244 | } |
||
| 245 | if (!isset($value) || is_numeric($value) && $value == 0 || is_string($value) && trim($value) == '' || ($value instanceof WidgetLayout && count($value->getItems()) <= 0)) { |
||
| 246 | return null; |
||
| 247 | } |
||
| 248 | return $this->labelledWidget($textLabel, $displayedValue, $section); |
||
| 249 | } |
||
| 250 | |||
| 251 | |||
| 252 | |||
| 253 | protected function fieldOutput($field, $record, $fieldName) |
||
| 254 | { |
||
| 255 | if ($field instanceof ORMCurrencyField) { |
||
| 256 | $App = $this->App(); |
||
| 257 | $value = $App->shortFormatWithUnit($this->record->$fieldName, $App->translate('_euro_')); |
||
| 258 | } else { |
||
| 259 | $value = $field->output($this->record->$fieldName); |
||
| 260 | } |
||
| 261 | return $value; |
||
| 262 | } |
||
| 263 | |||
| 264 | protected function addSections($view = '') |
||
| 265 | { |
||
| 266 | $App = $this->App(); |
||
| 267 | $W = bab_Widgets(); |
||
| 268 | |||
| 269 | $objectName = $this->getViewObjectName(); |
||
| 270 | |||
| 271 | $customContainerSet = $App->CustomContainerSet(); |
||
| 272 | $customContainers = $customContainerSet->select( |
||
| 273 | $customContainerSet->object->is($objectName)->_AND_($customContainerSet->view->is($view)) |
||
| 274 | ); |
||
| 275 | $customContainers->orderAsc($customContainerSet->rank); |
||
| 276 | |||
| 277 | |||
| 278 | $customSectionSet = $App->CustomSectionSet(); |
||
| 279 | |||
| 280 | foreach ($customContainers as $customContainer) { |
||
| 281 | |||
| 282 | if (isset($this->record) && !$customContainer->isVisibleForRecord($this->record)) { |
||
| 283 | continue; |
||
| 284 | } |
||
| 285 | |||
| 286 | $container = $W->Items() |
||
| 287 | ->addClass($customContainer->classname) |
||
| 288 | ->setSizePolicy("app-container {$customContainer->sizePolicy}"); |
||
| 289 | |||
| 290 | $this->addItem($container); |
||
| 291 | |||
| 292 | $customSections = $customSectionSet->select( |
||
| 293 | $customSectionSet->container->is($customContainer->id) |
||
| 294 | ); |
||
| 295 | $customSections->orderAsc($customSectionSet->rank); |
||
| 296 | |||
| 297 | $currentColumn = 0; |
||
| 298 | $nbCol = 0; |
||
| 299 | $row = $W->Items()->setSizePolicy('row'); |
||
| 300 | $row->addClass('row'); |
||
| 301 | |||
| 302 | foreach ($customSections as $customSection) { |
||
| 303 | |||
| 304 | if (isset($this->record) && !$customSection->isVisibleForRecord($this->record)) { |
||
| 305 | continue; |
||
| 306 | } |
||
| 307 | |||
| 308 | list(, , $nbCol) = explode('-', $customSection->sizePolicy); |
||
| 309 | |||
| 310 | if ($currentColumn + $nbCol > 12) { |
||
| 311 | $container->addItem($row); |
||
| 312 | $row = $W->Items()->setSizePolicy('row'); |
||
| 313 | $row->addClass('row'); |
||
| 314 | $currentColumn = 0; |
||
| 315 | } |
||
| 316 | $currentColumn += $nbCol; |
||
| 317 | |||
| 318 | if (strpos($customSection->classname, 'horizontal') !== false) { |
||
| 319 | $box = $W->FlowItems() |
||
| 320 | ->setVerticalAlign('top') |
||
| 321 | ->setSpacing(1, 'em'); |
||
| 322 | } else { |
||
| 323 | $box = null; |
||
| 324 | } |
||
| 325 | |||
| 326 | $section = $this->getSection($customSection->id); |
||
| 327 | if (!isset($section)) { |
||
| 328 | $section = $this->addSection($customSection->id, $customSection->name, $box); |
||
| 329 | $section->addClass($customSection->classname); |
||
| 330 | $section->setSizePolicy($customSection->sizePolicy); |
||
| 331 | |||
| 332 | $menu = $section->addContextMenu('inline'); |
||
| 333 | $menu->addClass(\Func_Icons::ICON_LEFT_16); |
||
| 334 | |||
| 335 | if ($customSection->editable && $this->recordIsUpdateable) { |
||
| 336 | $menu->addItem( |
||
| 337 | $W->Link( |
||
| 338 | '', |
||
| 339 | $this->record->getController()->editSection($this->record->id, $customSection->id) |
||
| 340 | )->addClass('widget-actionbutton', 'section-button', 'icon', \Func_Icons::ACTIONS_DOCUMENT_EDIT) |
||
| 341 | ->setOpenMode(WidgetLink::OPEN_DIALOG)->setDialogClass('customSectionEditorDialog '.$customSection->classname) |
||
| 342 | ); |
||
| 343 | } |
||
| 344 | |||
| 345 | $section->setFoldable($customSection->foldable, $customSection->folded); |
||
| 346 | $row->addItem($section); |
||
| 347 | } |
||
| 348 | |||
| 349 | |||
| 350 | |||
| 351 | $displayFields = $customSection->getFields(); |
||
| 352 | |||
| 353 | foreach ($displayFields as $displayFieldId => $displayField) { |
||
| 354 | $isGroupField = strpos($displayFieldId, '_fieldsGroup') !== false; |
||
| 355 | $item = null; |
||
| 356 | $displayFieldName = $displayField['fieldname']; |
||
| 357 | $parameters = $displayField['parameters']; |
||
| 358 | $classname = isset($parameters['classname']) ? $parameters['classname'] : ''; |
||
| 359 | $label = isset($parameters['label']) && !empty($parameters['label']) ? $parameters['label'] : null; |
||
| 360 | $sizePolicy = 'customsection-field-box '; |
||
| 361 | $sizePolicy .= isset($parameters['sizePolicy']) ? $parameters['sizePolicy'] : ''; |
||
| 362 | $sizePolicy .= isset($parameters['transparentBackground']) && $parameters['transparentBackground'] ? 'customsection-field-box-transparentBackground' : ''; |
||
| 363 | |||
| 364 | $displayFieldMethod = '_' . $displayFieldName; |
||
| 365 | if (!$isGroupField && method_exists($this, $displayFieldMethod)) { |
||
| 366 | $item = $this->$displayFieldMethod($customSection, $label); |
||
| 367 | } |
||
| 368 | else { |
||
| 369 | if($isGroupField){ |
||
| 370 | list(, $groupId) = explode('_fieldsGroup', $displayFieldId); |
||
| 371 | if (method_exists($this, '__fieldsGroup')) { |
||
| 372 | $item = $this->__fieldsGroup($customSection, $groupId, $label); |
||
| 373 | } |
||
| 374 | $sizePolicy .= ' customsection-fieldsgroup-box'; |
||
| 375 | } |
||
| 376 | else{ |
||
| 377 | try { |
||
| 378 | $field = $this->recordSet->getField($displayFieldName); |
||
| 379 | $value = $this->fieldOutput($field, $this->record, $displayFieldName); |
||
| 380 | if (!isset($label)) { |
||
| 381 | $label = $App->translate($field->getDescription()); |
||
| 382 | } |
||
| 383 | |||
| 384 | $outputWidget = $field->outputWidget($this->record->$displayFieldName); |
||
| 385 | |||
| 386 | $item = $this->labelledWidget( |
||
| 387 | $label, |
||
| 388 | $outputWidget, |
||
| 389 | $customSection |
||
| 390 | ); |
||
| 391 | } catch (ORMException $e) { |
||
| 392 | $item = null; |
||
| 393 | } |
||
| 394 | } |
||
| 395 | } |
||
| 396 | if (isset($item) && $item instanceof WidgetDisplayableInterface) { |
||
| 397 | $item->setSizePolicy($sizePolicy); |
||
| 398 | $item->addClass($classname); |
||
| 399 | $section->addItem($item); |
||
| 400 | } |
||
| 401 | } |
||
| 402 | } |
||
| 403 | |||
| 404 | if ($currentColumn + $nbCol> 0) { |
||
| 405 | $container->addItem($row); |
||
| 406 | } |
||
| 407 | } |
||
| 408 | } |
||
| 409 | |||
| 410 | |||
| 411 | protected function __spacer() |
||
| 412 | { |
||
| 413 | $W = bab_Widgets(); |
||
| 414 | return $W->Label('')->addClass('spacer'); |
||
| 415 | } |
||
| 416 | |||
| 417 | protected function getObjectName() |
||
| 420 | } |
||
| 421 | |||
| 422 | protected function getViewObjectName() |
||
| 425 | } |
||
| 426 | |||
| 427 | protected function __fieldsGroup(AppCustomSection $customSection, $groupId = 0, $label = null) |
||
| 428 | { |
||
| 478 | } |
||
| 479 | } |
The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g.
excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths