diff --git a/README.txt b/README.md similarity index 77% rename from README.txt rename to README.md index 972f7e027647a0d4b68facf5cf8854ccb76bc7a0..3017c4ac95116ad92f15faa4706bac4763a94402 100644 --- a/README.txt +++ b/README.md @@ -1,54 +1,43 @@ -CONTENTS OF THIS FILE ---------------------- +# CONTENTS OF THIS FILE -* Introduction -* Requirements -* Recommended Modules -* Installation -* Configuration -* Maintainers +- Introduction +- Requirements +- Recommended Modules +- Installation +- Configuration +- Maintainers - -INTRODUCTION ------------- +## INTRODUCTION The Page Manager module supports the creation of new pages, and allows placing blocks within that page. This module was formerly part of the Ctools suite of modules. -* For a full description of the module visit - https://www.drupal.org/project/page_manager. - -* To submit bug reports and feature suggestions, or to track changes visit - https://www.drupal.org/project/issues/page_manager. - +- For a full description of the module visit + <https://www.drupal.org/project/page_manager>. -REQUIREMENTS ------------- +- To submit bug reports and feature suggestions, or to track changes visit + <https://www.drupal.org/project/issues/page_manager>. -CTools - https://www.drupal.org/project/ctools +## REQUIREMENTS +CTools - <https://www.drupal.org/project/ctools> -RECOMMENDED MODULES -------------------- +## RECOMMENDED MODULES Panels in Drupal 8 integrates with Page Manager and offers a custom variant type which allows users to select different layouts and manage blocks. Panels on its own does not have much to offer and Page Manager provides a user interface that helps utilize Panels. -* Panels - https://www.drupal.org/project/panels +- Panels - <https://www.drupal.org/project/panels> +## INSTALLATION -INSTALLATION ------------- +- Install the Page Manager module as you would normally install a contributed + Drupal module. Visit <https://www.drupal.org/node/1897420>. -* Install the Page Manager module as you would normally install a contributed - Drupal module. Visit https://www.drupal.org/node/1897420. - - -CONFIGURATION -------------- +## CONFIGURATION Navigate to Administration > Extend and enable the Page Manager and Page Manager UI modules. This provides an interface for customizing page paths, parameters, @@ -103,10 +92,8 @@ configure the selection criteria to determine which variant should be displayed. selection criteria will always return true and be displayed. Ones with a selection criteria should be ordered above ones without any. +## MAINTAINERS -MAINTAINERS ------------ - -* Tim Plunkett (tim.plunkett) - https://www.drupal.org/u/timplunkett -* Kris Vanderwater (EclipseGc) - https://www.drupal.org/u/eclipsegc -* David Snopek (dsnopek) - https://www.drupal.org/u/dsnopek +- Tim Plunkett (tim.plunkett) - <https://www.drupal.org/u/timplunkett> +- Kris Vanderwater (EclipseGc) - <https://www.drupal.org/u/eclipsegc> +- David Snopek (dsnopek) - <https://www.drupal.org/u/dsnopek> diff --git a/page_manager.install b/page_manager.install index 428894d090ab385da37b7a2f535db3eea1708710..39d2c685329ebab8019a615e22f7732e5ae24a40 100644 --- a/page_manager.install +++ b/page_manager.install @@ -13,7 +13,7 @@ function page_manager_update_8001() { } /** - * Rename layout machine names in config entities to match layout discovery's default layouts. + * Rename layout machine names to match layout discovery's default layouts. */ function page_manager_update_8002() { $names = \Drupal::configFactory()->listAll('page_manager.page_variant'); diff --git a/page_manager.module b/page_manager.module index 7acfd65424fe5ae00a97975343296cf3d1c00739..921f0f69dab398363777cc8c43d62a51093e362d 100644 --- a/page_manager.module +++ b/page_manager.module @@ -13,7 +13,7 @@ use Drupal\page_manager\Form\LayoutBuilderForm; */ function page_manager_entity_type_build(array &$entity_types) { if (_page_manager_is_layout_builder_enabled()) { - /* @var $entity_types \Drupal\Core\Entity\EntityTypeInterface[] */ + /** @var $entity_types \Drupal\Core\Entity\EntityTypeInterface[] */ $entity_types['page_variant'] ->setHandlerClass('storage', LayoutBuilderStorage::class) ->setFormClass('layout_builder', LayoutBuilderForm::class); diff --git a/page_manager_ui/src/Access/PageManagerPluginAccess.php b/page_manager_ui/src/Access/PageManagerPluginAccess.php index be315d22b712b85f7ffe7d68e9b8ad2233a34419..5c3c16c7ff2f7c01b2ef3f768892b9fa354c8d99 100644 --- a/page_manager_ui/src/Access/PageManagerPluginAccess.php +++ b/page_manager_ui/src/Access/PageManagerPluginAccess.php @@ -6,8 +6,18 @@ use Drupal\Core\Access\AccessResult; use Drupal\Core\Session\AccountInterface; use Drupal\ctools\Access\AccessInterface; +/** + * Access Plugin for Page Manager Plugins. + */ class PageManagerPluginAccess implements AccessInterface { + /** + * Account Interface public method. + * + * @param \Drupal\Core\Session\AccountInterface $account + * + * @return \Drupal\Core\Access\AccessResultAllowed|\Drupal\Core\Access\AccessResultForbidden + */ public function access(AccountInterface $account) { return $account->hasPermission('administer pages') ? AccessResult::allowed() : AccessResult::forbidden(); } diff --git a/page_manager_ui/src/Entity/PageListBuilder.php b/page_manager_ui/src/Entity/PageListBuilder.php index 76c6cf1498d48af16f5253a885426e61706ee5b3..39e24d4e0c9730724bb399751cb857c9d606147d 100644 --- a/page_manager_ui/src/Entity/PageListBuilder.php +++ b/page_manager_ui/src/Entity/PageListBuilder.php @@ -36,7 +36,7 @@ class PageListBuilder extends ConfigEntityListBuilder { $row['description'] = [ 'data' => [ '#plain_text' => $entity->getDescription(), - ] + ], ]; $row['path'] = $this->getPath($entity); @@ -48,7 +48,9 @@ class PageListBuilder extends ConfigEntityListBuilder { */ public function getDefaultOperations(EntityInterface $entity) { $operations = parent::getDefaultOperations($entity); - $operations['edit']['url'] = new Url('entity.page.edit_form', ['machine_name' => $entity->id(), 'step' => 'general']); + $operations['edit']['url'] = new Url('entity.page.edit_form', [ + 'machine_name' => $entity->id(), 'step' => 'general' + ]); return $operations; } diff --git a/page_manager_ui/src/Form/AccessConfigure.php b/page_manager_ui/src/Form/AccessConfigure.php index 70a3d7a8af7717aef99f1f3f1dd1b68bfd91f86d..a8a14009f7cc4f3ec4a21d325c5ef9ed80a7a296 100644 --- a/page_manager_ui/src/Form/AccessConfigure.php +++ b/page_manager_ui/src/Form/AccessConfigure.php @@ -4,6 +4,9 @@ namespace Drupal\page_manager_ui\Form; use Drupal\ctools\Form\ConditionConfigure; +/** + * Access Configuration Forms. + */ class AccessConfigure extends ConditionConfigure { /** @@ -16,8 +19,8 @@ class AccessConfigure extends ConditionConfigure { $route_name = $page->isNew() ? 'entity.page.add_step_form' : 'entity.page.edit_form'; return [$route_name, [ - 'machine_name' => $this->machine_name, - 'step' => 'access', + 'machine_name' => $this->machine_name, + 'step' => 'access', ], ]; } diff --git a/page_manager_ui/src/Form/AccessDelete.php b/page_manager_ui/src/Form/AccessDelete.php index bed5b5cfcb1f1fc95bb40968a5bf2b25cc187196..53c1196eebd84aef7a4437e01e1ab621b2704212 100644 --- a/page_manager_ui/src/Form/AccessDelete.php +++ b/page_manager_ui/src/Form/AccessDelete.php @@ -4,6 +4,9 @@ namespace Drupal\page_manager_ui\Form; use Drupal\ctools\Form\ConditionDelete; +/** + * Delete Access Form. + */ class AccessDelete extends ConditionDelete { /** @@ -16,8 +19,8 @@ class AccessDelete extends ConditionDelete { $route_name = $page->isNew() ? 'entity.page.add_step_form' : 'entity.page.edit_form'; return [$route_name, [ - 'machine_name' => $this->machine_name, - 'step' => 'access', + 'machine_name' => $this->machine_name, + 'step' => 'access', ], ]; } diff --git a/page_manager_ui/src/Form/AddVariantContextsForm.php b/page_manager_ui/src/Form/AddVariantContextsForm.php index f17cff41448af418d5b980c78f4237c23648e075..8655b9f62d1b356d85beda4d4922bea9ff8dd604 100644 --- a/page_manager_ui/src/Form/AddVariantContextsForm.php +++ b/page_manager_ui/src/Form/AddVariantContextsForm.php @@ -9,6 +9,9 @@ use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Url; use Drupal\ctools\Form\ManageContext; +/** + * Add a Variant Context Form. + */ class AddVariantContextsForm extends ManageContext { /** @@ -30,7 +33,7 @@ class AddVariantContextsForm extends ManageContext { $context = $form_state->getValue('context'); $content = $this->formBuilder->getForm($this->getContextClass($cached_values), $context, $this->getTempstoreId(), $this->machine_name, $page_variant->id()); $content['#attached']['library'][] = 'core/drupal.dialog.ajax'; - list(, $route_parameters) = $this->getContextOperationsRouteInfo($cached_values, $this->machine_name, $context); + [, $route_parameters] = $this->getContextOperationsRouteInfo($cached_values, $this->machine_name, $context); $content['submit']['#attached']['drupalSettings']['ajax'][$content['submit']['#id']]['url'] = Url::fromRoute( $this->getContextAddRoute($cached_values), $route_parameters, @@ -120,7 +123,14 @@ class AddVariantContextsForm extends ManageContext { ]; } - + /** + * Check if context is editable. + * + * @param $cached_values + * @param $row + * + * @return bool + */ protected function isEditableContext($cached_values, $row) { /** @var \Drupal\page_manager\PageVariantInterface $page_variant */ $page_variant = $cached_values['page_variant']; diff --git a/page_manager_ui/src/Form/AddVariantSelectionConfigure.php b/page_manager_ui/src/Form/AddVariantSelectionConfigure.php index f5baae942e9a0ecebff7dc9b30261dbfc41d9c1f..2331e2120ce0ad20f4cde9e653da676d39fd586a 100644 --- a/page_manager_ui/src/Form/AddVariantSelectionConfigure.php +++ b/page_manager_ui/src/Form/AddVariantSelectionConfigure.php @@ -4,6 +4,9 @@ namespace Drupal\page_manager_ui\Form; use Drupal\ctools\Form\ConditionConfigure; +/** + * Configuration form for Add Variant Selection + */ class AddVariantSelectionConfigure extends ConditionConfigure { /** @@ -13,8 +16,9 @@ class AddVariantSelectionConfigure extends ConditionConfigure { * The cached values from the wizard. * * @return \Drupal\page_manager\PageVariantInterface + * The Page Variant. */ - protected function getPageVariant($cached_values) { + protected function getPageVariant(array $cached_values) { return $cached_values['page_variant']; } diff --git a/page_manager_ui/src/Form/AddVariantSelectionDelete.php b/page_manager_ui/src/Form/AddVariantSelectionDelete.php index d8317d6bc1f65e74b43c73e05bfe483b5a7883d2..c37f73abc06791bfb05f07340641579be2cd5a9b 100644 --- a/page_manager_ui/src/Form/AddVariantSelectionDelete.php +++ b/page_manager_ui/src/Form/AddVariantSelectionDelete.php @@ -4,6 +4,9 @@ namespace Drupal\page_manager_ui\Form; use Drupal\ctools\Form\ConditionDelete; +/** + * Delete form for Add Variant Selection. + */ class AddVariantSelectionDelete extends ConditionDelete { /** @@ -13,8 +16,9 @@ class AddVariantSelectionDelete extends ConditionDelete { * The cached values from the wizard. * * @return \Drupal\page_manager\PageVariantInterface + * The Page Variant. */ - protected function getPageVariant($cached_values) { + protected function getPageVariant(array $cached_values) { return $cached_values['page_variant']; } @@ -25,9 +29,9 @@ class AddVariantSelectionDelete extends ConditionDelete { $page_variant = $this->getPageVariant($cached_values); return ['entity.page_variant.add_step_form', [ - 'page' => $page_variant->getPage()->id(), - 'machine_name' => $this->machine_name, - 'step' => 'selection', + 'page' => $page_variant->getPage()->id(), + 'machine_name' => $this->machine_name, + 'step' => 'selection', ], ]; } diff --git a/page_manager_ui/src/Form/AddVariantSelectionForm.php b/page_manager_ui/src/Form/AddVariantSelectionForm.php index d9a46a72090fc13fd3a4d68106019a21fb7f69c3..39bf931a8dbd8f2bc9353b68f77bcd3e8ee25787 100644 --- a/page_manager_ui/src/Form/AddVariantSelectionForm.php +++ b/page_manager_ui/src/Form/AddVariantSelectionForm.php @@ -9,6 +9,9 @@ use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Url; use Drupal\ctools\Form\ManageConditions; +/** + * Selection form for Add Variant. + */ class AddVariantSelectionForm extends ManageConditions { /** @@ -40,9 +43,9 @@ class AddVariantSelectionForm extends ManageConditions { $page_variant = $cached_values['page_variant']; return ['entity.page_variant.add_step_form.condition', [ - 'page' => $page_variant->getPage()->id(), - 'machine_name' => $machine_name, - 'condition' => $row, + 'page' => $page_variant->getPage()->id(), + 'machine_name' => $machine_name, + 'condition' => $row, ], ]; } @@ -51,7 +54,7 @@ class AddVariantSelectionForm extends ManageConditions { * {@inheritdoc} */ protected function getConditions($cached_values) { - /** @var $page \Drupal\page_manager\Entity\PageVariant */ + /** @var \Drupal\page_manager\Entity\PageVariant $page_variant */ $page_variant = $cached_values['page_variant']; return $page_variant->get('selection_criteria'); } @@ -60,7 +63,7 @@ class AddVariantSelectionForm extends ManageConditions { * {@inheritdoc} */ protected function getContexts($cached_values) { - /** @var $page_variant \Drupal\page_manager\Entity\PageVariant */ + /** @var \Drupal\page_manager\Entity\PageVariant $page_variant */ $page_variant = $cached_values['page_variant']; return $page_variant->getContexts(); } @@ -81,7 +84,7 @@ class AddVariantSelectionForm extends ManageConditions { $condition = $form_state->getValue('conditions'); $content = \Drupal::formBuilder()->getForm($this->getConditionClass(), $condition, $this->getTempstoreId(), $this->machine_name, $page_variant->id()); $content['#attached']['library'][] = 'core/drupal.dialog.ajax'; - list(, $route_parameters) = $this->getOperationsRouteInfo($cached_values, $this->machine_name, $form_state->getValue('conditions')); + [, $route_parameters] = $this->getOperationsRouteInfo($cached_values, $this->machine_name, $form_state->getValue('conditions')); $content['submit']['#attached']['drupalSettings']['ajax'][$content['submit']['#id']]['url'] = Url::fromRoute( $this->getAddRoute($cached_values), $route_parameters, diff --git a/page_manager_ui/src/Form/AddVariantStaticContextConfigure.php b/page_manager_ui/src/Form/AddVariantStaticContextConfigure.php index d21021c9c95620ab8be8e79ec9c5a678ac6802b9..e5a32406f83420e0e8228abe793f9c5ce3720d00 100644 --- a/page_manager_ui/src/Form/AddVariantStaticContextConfigure.php +++ b/page_manager_ui/src/Form/AddVariantStaticContextConfigure.php @@ -5,6 +5,9 @@ namespace Drupal\page_manager_ui\Form; use Drupal\Core\Plugin\Context\ContextInterface; use Drupal\ctools\Form\ContextConfigure; +/** + * Configuration form for Add Static Variant Context. + */ class AddVariantStaticContextConfigure extends ContextConfigure { /** @@ -14,8 +17,9 @@ class AddVariantStaticContextConfigure extends ContextConfigure { * The cached values from the wizard. * * @return \Drupal\page_manager\PageVariantInterface + * The Page Variant. */ - protected function getPageVariant($cached_values) { + protected function getPageVariant(array $cached_values) { return $cached_values['page_variant']; } diff --git a/page_manager_ui/src/Form/AddVariantStaticContextDeleteForm.php b/page_manager_ui/src/Form/AddVariantStaticContextDeleteForm.php index 978addff14dd6068630a59b472ead4320578f0fa..df1dce25e115078430310ed988b447931292db55 100644 --- a/page_manager_ui/src/Form/AddVariantStaticContextDeleteForm.php +++ b/page_manager_ui/src/Form/AddVariantStaticContextDeleteForm.php @@ -43,7 +43,7 @@ class AddVariantStaticContextDeleteForm extends ContextDelete { */ public function submitForm(array &$form, FormStateInterface $form_state) { $cached_values = $this->getTempstore(); - /** @var $page \Drupal\page_manager\PageInterface */ + /** @var \Drupal\page_manager\PageVariantInterface $page_variant */ $page_variant = $this->getPageVariant($cached_values); $this->messenger()->addMessage($this->t('The static context %label has been removed.', ['%label' => $page_variant->getStaticContext($this->context_id)['label']])); $page_variant->removeStaticContext($this->context_id); @@ -58,8 +58,9 @@ class AddVariantStaticContextDeleteForm extends ContextDelete { * The cached values from the wizard. * * @return \Drupal\page_manager\PageVariantInterface + * The Page Variant. */ - protected function getPageVariant($cached_values) { + protected function getPageVariant(array $cached_values) { return $cached_values['page_variant']; } diff --git a/page_manager_ui/src/Form/PageAccessForm.php b/page_manager_ui/src/Form/PageAccessForm.php index e0fe27ea42ba760f792ec7dffa52d52e6317282f..5eea63087b86aeabf90910a404dfd8d731ce41c7 100644 --- a/page_manager_ui/src/Form/PageAccessForm.php +++ b/page_manager_ui/src/Form/PageAccessForm.php @@ -5,6 +5,9 @@ namespace Drupal\page_manager_ui\Form; use Drupal\Core\Form\FormStateInterface; use Drupal\ctools\Form\ManageConditions; +/** + * The Page Access Form. + */ class PageAccessForm extends ManageConditions { /** @@ -32,14 +35,19 @@ class PageAccessForm extends ManageConditions { * {@inheritdoc} */ protected function getOperationsRouteInfo($cached_values, $machine_name, $row) { - return ['entity.page.condition', ['machine_name' => $machine_name, 'condition' => $row]]; + return [ + 'entity.page.condition', [ + 'machine_name' => $machine_name, + 'condition' => $row + ], + ]; } /** * {@inheritdoc} */ protected function getConditions($cached_values) { - /** @var $page \Drupal\page_manager\Entity\Page */ + /** @var \Drupal\page_manager\Entity\Page $page */ $page = $cached_values['page']; return $page->get('access_conditions'); } @@ -48,7 +56,7 @@ class PageAccessForm extends ManageConditions { * {@inheritdoc} */ protected function getContexts($cached_values) { - /** @var $page \Drupal\page_manager\Entity\Page */ + /** @var \Drupal\page_manager\Entity\Page $page */ $page = $cached_values['page']; return $page->getContexts(); } @@ -57,6 +65,7 @@ class PageAccessForm extends ManageConditions { * The route to which condition 'add' actions should submit. * * @return string + * The add condition route. */ protected function getAddRoute($cached_values) { return 'entity.page.condition.add'; diff --git a/page_manager_ui/src/Form/PageGeneralForm.php b/page_manager_ui/src/Form/PageGeneralForm.php index e2a4a41296601eb0ae633ff04c0a50441c6912e9..fa180d8c1bc0c1b3affb8b73c9b3837997aaf76d 100644 --- a/page_manager_ui/src/Form/PageGeneralForm.php +++ b/page_manager_ui/src/Form/PageGeneralForm.php @@ -8,6 +8,9 @@ use Drupal\Core\Form\FormBase; use Drupal\Core\Form\FormStateInterface; use Symfony\Component\DependencyInjection\ContainerInterface; +/** + * A Page's General Config Form. + */ class PageGeneralForm extends FormBase { /** @@ -59,7 +62,7 @@ class PageGeneralForm extends FormBase { */ public function buildForm(array $form, FormStateInterface $form_state) { $cached_values = $form_state->getTemporaryValue('wizard'); - /** @var $page \Drupal\page_manager\Entity\Page */ + /** @var \Drupal\page_manager\Entity\Page $page */ $page = $cached_values['page']; $form['description'] = [ '#type' => 'textarea', @@ -120,7 +123,7 @@ class PageGeneralForm extends FormBase { */ public function submitForm(array &$form, FormStateInterface $form_state) { $cached_values = $form_state->getTemporaryValue('wizard'); - /** @var $page \Drupal\page_manager\Entity\Page */ + /** @var \Drupal\page_manager\Entity\Page $page */ $page = $cached_values['page']; $page->set('description', $form_state->getValue('description')); $page->set('path', $form_state->getValue('path')); @@ -131,7 +134,7 @@ class PageGeneralForm extends FormBase { $page->set('label', $form_state->getValue('label')); if (empty($cached_values['variant_plugin_id'])) { $variant_plugin_id = $cached_values['variant_plugin_id'] = $form_state->getValue('variant_plugin_id'); - /* @var \Drupal\page_manager\PageVariantInterface $page_variant */ + /** @var \Drupal\page_manager\PageVariantInterface $page_variant */ $page_variant = \Drupal::entityTypeManager() ->getStorage('page_variant') ->create([ @@ -146,7 +149,7 @@ class PageGeneralForm extends FormBase { } if ($cached_values['variant_plugin_id'] != $form_state->getValue('variant_plugin_id') && !empty($cached_values['page_variant'])) { $page_variant = $cached_values['page_variant']; - /** @var $page_variant \Drupal\page_manager\Entity\PageVariant */ + /** @var \Drupal\page_manager\Entity\PageVariant $page_variant */ $page_variant->set('variant', $form_state->getValue('variant_plugin_id')); $page_variant->set('variant_settings', []); $cached_values['variant_plugin_id'] = $form_state->getValue('variant_plugin_id'); @@ -162,7 +165,7 @@ class PageGeneralForm extends FormBase { */ public function validatePath(&$element, FormStateInterface $form_state) { $cached_values = $form_state->getTemporaryValue('wizard'); - /** @var $page \Drupal\page_manager\Entity\Page */ + /** @var \Drupal\page_manager\Entity\Page $page */ $page = $cached_values['page']; // Ensure the path has a leading slash. diff --git a/page_manager_ui/src/Form/PageParametersForm.php b/page_manager_ui/src/Form/PageParametersForm.php index cade549ccc408e1b6666ce15094871432e6f9b88..9f7e028c5bb60c333db81fafd255eb5547a34ea6 100644 --- a/page_manager_ui/src/Form/PageParametersForm.php +++ b/page_manager_ui/src/Form/PageParametersForm.php @@ -63,7 +63,7 @@ class PageParametersForm extends FormBase { } $row['type']['data'] = isset($parameter['type']) ?: $this->t('<em>No context assigned</em>'); - list($route_partial, $route_parameters) = $this->getOperationsRouteInfo($cached_values, $cached_values['id'], $parameter_name); + [$route_partial, $route_parameters] = $this->getOperationsRouteInfo($cached_values, $cached_values['id'], $parameter_name); $build = [ '#type' => 'operations', '#links' => $this->getOperations($route_partial, $route_parameters), @@ -82,7 +82,17 @@ class PageParametersForm extends FormBase { $cached_values = $form_state->getTemporaryValue('wizard'); } - + /** + * Operations for Page Parameters form. + * + * @param $route_name_base + * The base route name. + * @param array $route_parameters + * The route parameters. + * + * @return array + * The set of operations for the form. + */ protected function getOperations($route_name_base, array $route_parameters = []) { $operations['edit'] = [ 'title' => t('Edit'), @@ -103,13 +113,32 @@ class PageParametersForm extends FormBase { * Returns the tempstore id to use. * * @return string + * The default tempstore ID. */ protected function getTempstoreId() { return 'page_manager.page'; } + /** + * Get Operation Route Information. + * + * @param $cached_values + * The Cached Values. + * @param $machine_name + * Machine name of the route. + * @param $row + * The row being operated on. + * + * @return array + * + */ protected function getOperationsRouteInfo($cached_values, $machine_name, $row) { - return ['page_manager.parameter', ['machine_name' => $machine_name, 'name' => $row]]; + return [ + 'page_manager.parameter', [ + 'machine_name' => $machine_name, + 'name' => $row + ], + ]; } }