protected function MenuTreeStorage::preSave

protected MenuTreeStorage::preSave(array &$link, array $original)

Fills in all the fields the database save needs, using the link definition.

Parameters

array $link: The link definition to be updated.

array $original: The link definition before the changes. May be empty if not found.

Return value

array The values which will be stored.

Throws

\Drupal\Component\Plugin\Exception\PluginException Thrown when the specific depth exceeds the maximum.

File

core/lib/Drupal/Core/Menu/MenuTreeStorage.php, line 338

Class

MenuTreeStorage
Provides a menu tree storage using the database.

Namespace

Drupal\Core\Menu

Code

protected function preSave(array &$link, array $original) {
  static $schema_fields, $schema_defaults;
  if (empty($schema_fields)) {
    $schema = static::schemaDefinition();
    $schema_fields = $schema['fields'];
    foreach ($schema_fields as $name => $spec) {
      if (isset($spec['default'])) {
        $schema_defaults[$name] = $spec['default'];
      }
    }
  }

  // Try to find a parent link. If found, assign it and derive its menu.
  $parent = $this->findParent($link, $original);
  if ($parent) {
    $link['parent'] = $parent['id'];
    $link['menu_name'] = $parent['menu_name'];
  }
  else {
    $link['parent'] = '';
  }

  // If no corresponding parent link was found, move the link to the
  // top-level.
  foreach ($schema_defaults as $name => $default) {
    if (!isset($link[$name])) {
      $link[$name] = $default;
    }
  }
  $fields = array_intersect_key($link, $schema_fields);
  // Sort the route parameters so that the query string will be the same.
  asort($fields['route_parameters']);
  // Since this will be urlencoded, it's safe to store and match against a
  // text field.
  $fields['route_param_key'] = $fields['route_parameters'] ? UrlHelper::buildQuery($fields['route_parameters']) : '';

  foreach ($this->serializedFields() as $name) {
    if (isset($fields[$name])) {
      $fields[$name] = serialize($fields[$name]);
    }
  }
  $this->setParents($fields, $parent, $original);

  // Need to check both parent and menu_name, since parent can be empty in any
  // menu.
  if ($original && ($link['parent'] != $original['parent'] || $link['menu_name'] != $original['menu_name'])) {
    $this->moveChildren($fields, $original);
  }
  // We needed the mlid above, but not in the update query.
  unset($fields['mlid']);

  // Cast Booleans to int, if needed.
  $fields['enabled'] = (int) $fields['enabled'];
  $fields['expanded'] = (int) $fields['expanded'];
  return $fields;
}

© 2001–2016 by the original authors
Licensed under the GNU General Public License, version 2 and later.
Drupal is a registered trademark of Dries Buytaert.
https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Menu!MenuTreeStorage.php/function/MenuTreeStorage::preSave/8.1.x