{"record":{"id":"40392d94e8acf8ce","repo":"phacility/phabricator","slug":"no-more-than-7-columns-per-view","errorCode":null,"errorMessage":"No more than 7 columns per view.","messagePattern":"No more than 7 columns per view\\.","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"src/view/layout/AphrontMultiColumnView.php","lineNumber":70,"sourceCode":"    return $this;\n  }\n\n  public function setBorder($border) {\n    $this->border = $border;\n    return $this;\n  }\n\n  public function render() {\n    require_celerity_resource('aphront-multi-column-view-css');\n\n    $classes = array();\n    $classes[] = 'aphront-multi-column-inner';\n    $classes[] = 'grouped';\n\n    if ($this->fluidishLayout || $this->fluidLayout) {\n      // we only support seven columns for now for fluid views; see T4054\n      if (count($this->columns) > 7) {\n        throw new Exception(pht('No more than 7 columns per view.'));\n      }\n    }\n\n    $classes[] = 'aphront-multi-column-'.count($this->columns).'-up';\n\n    $columns = array();\n    $i = 0;\n    foreach ($this->columns as $column_data) {\n      $column_class = array('aphront-multi-column-column');\n      if ($this->gutter) {\n        $column_class[] = $this->gutter;\n      }\n      $outer_class = array('aphront-multi-column-column-outer');\n      if (++$i === count($this->columns)) {\n        $column_class[] = 'aphront-multi-column-column-last';\n        $outer_class[] = 'aphront-multi-colum-column-outer-last';\n      }\n      $column = $column_data['column'];","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/phacility/phabricator/blob/5720a38cfe95b00ca4be5016dd0d2f3195f4fa04/src/view/layout/AphrontMultiColumnView.php#L52-L88","documentation":"AphrontMultiColumnView styles columns with per-count CSS classes ('...-N-up'), and fluid mode (setFluidLayout(true) or setFluidishLayout(true)) only has CSS definitions up to seven columns (see upstream T4054). render() therefore enforces the cap: a fluid multi-column view with more than 7 columns throws. Fixed-width layouts are not subject to this check.","triggerScenarios":"Calling setFluidLayout(true) or setFluidishLayout(true) and then adding 8 or more columns via addColumn() — commonly a loop that adds one column per item without a limit.","commonSituations":"Dashboard-style custom pages that grow a column per result; turning an existing fixed 8+ column view fluid; dynamically generated column counts from user data.","solutions":["Reduce the view to at most 7 columns: slice the data, group items, or paginate.","Or keep the layout fixed-width (remove the fluid/fluidish setters), which does not enforce the cap.","For larger counts, split the items into several stacked AphrontMultiColumnView rows or use a different layout primitive."],"exampleFix":"// before\n$view = id(new AphrontMultiColumnView())\n  ->setFluidishLayout(true);\nforeach ($items as $item) {\n  $view->addColumn($item); // throws once an 8th column is added\n}\n\n// after: chunk into rows of at most 7 columns\n$out = array();\nforeach (array_chunk($items, 7) as $row_items) {\n  $row = id(new AphrontMultiColumnView())->setFluidishLayout(true);\n  foreach ($row_items as $item) {\n    $row->addColumn($item);\n  }\n  $out[] = $row;\n}","handlingStrategy":"validation","validationCode":"$rows = (count($columns) > 7)\n  ? array_chunk($columns, 7)\n  : array($columns);\nforeach ($rows as $row_columns) {\n  $view = id(new AphrontMultiColumnView())->setFluidishLayout(true);\n  foreach ($row_columns as $column) {\n    $view->addColumn($column);\n  }\n  $out[] = $view;\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Hard-cap columns at 7 whenever fluid or fluidish mode is enabled.","Turn N>7 items into multiple stacked multi-column rows instead of one wide view.","Remember the check only applies to fluid layouts; fixed layouts bypass it but may look wrong."],"tags":["php","phabricator","multi-column","layout","css-limits"],"backgroundTag":"column-limit-exceeded","analyzedSha":"5720a38cfe95b00ca4be5016dd0d2f3195f4fa04","analyzedAt":"2026-08-21T05:07:25.672Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}