You are here

gridbuilder.module in Grid builder 8

Same filename and directory in other branches
  1. 7 gridbuilder.module

Simple grid builder tool.

File

gridbuilder.module
View source
<?php

/**
 * @file
 * Simple grid builder tool.
 */
use Drupal\gridbuilder\Grid;

/**
 * Fixed width grid.
 */
const GRIDBUILDER_FIXED = 0;

/**
 * Fluid width grid.
 */
const GRIDBUILDER_FLUID = 1;

/**
 * Implements hook_menu().
 */
function gridbuilder_menu() {
  $items = array();
  $items['admin/structure/grids'] = array(
    'title' => 'Grids',
    'description' => 'Manage list of grids which can be used with layouts.',
    'page callback' => 'gridbuilder_page_list',
    'access callback' => 'user_access',
    'access arguments' => array(
      'administer gridbuilder',
    ),
    'file' => 'gridbuilder.admin.inc',
  );
  $items['admin/structure/grids/add'] = array(
    'title' => 'Add grid',
    'page callback' => 'gridbuilder_page_add',
    'access callback' => 'user_access',
    'access arguments' => array(
      'administer gridbuilder',
    ),
    'type' => MENU_LOCAL_ACTION,
    'file' => 'gridbuilder.admin.inc',
  );
  $items['admin/structure/grids/grid/%gridbuilder/edit'] = array(
    'title' => 'Edit grid',
    'page callback' => 'gridbuilder_page_edit',
    'page arguments' => array(
      4,
    ),
    'access callback' => 'user_access',
    'access arguments' => array(
      'administer gridbuilder',
    ),
    'type' => MENU_CALLBACK,
    'file' => 'gridbuilder.admin.inc',
  );
  $items['admin/structure/grids/grid/%gridbuilder/delete'] = array(
    'title' => 'Delete',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'gridbuilder_delete_confirm',
      4,
    ),
    'access callback' => 'user_access',
    'access arguments' => array(
      'administer gridbuilder',
    ),
    'type' => MENU_CALLBACK,
    'file' => 'gridbuilder.admin.inc',
  );
  return $items;
}

/**
 * Implements hook_permission().
 */
function gridbuilder_permission() {
  return array(
    'administer gridbuilder' => array(
      'title' => t('Administer grid builder grids'),
      'description' => t('Administer grids created with the grid builder.'),
    ),
  );
}

/**
 * Implements hook_entity_info().
 */
function gridbuilder_entity_info() {
  $types['grid'] = array(
    'label' => 'Grid',
    'entity class' => 'Drupal\\gridbuilder\\Grid',
    'controller class' => 'Drupal\\Core\\Config\\Entity\\ConfigStorageController',
    'form controller class' => array(
      'default' => 'Drupal\\gridbuilder\\GridFormController',
    ),
    'list controller class' => 'Drupal\\Core\\Config\\Entity\\ConfigEntityListController',
    'list path' => 'admin/structure/grids',
    'uri callback' => 'gridbuilder_uri',
    'config prefix' => 'grid',
    'entity keys' => array(
      'id' => 'id',
      'label' => 'label',
      'uuid' => 'uuid',
    ),
  );
  return $types;
}

/**
 * Entity URI callback.
 *
 * @param Drupal\gridbuilder\Grid $grid
 *   Grid configuration entity instance.
 *
 * @return array
 *   Entity URI information.
 */
function gridbuilder_uri(Grid $grid) {
  return array(
    'path' => 'admin/structure/grids/grid/' . $grid
      ->id(),
  );
}

/**
 * Look up one grid setup based on machine name.
 *
 * @return Drupal\gridbuilder\Grid
 *   Grid configuration entity instance.
 */
function gridbuilder_load($id) {
  return entity_load('grid', $id);
}

/**
 * API function to get all grids on the site.
 *
 * @return array
 *   List of Drupal\gridbuilder\Grid instances keyed by id.
 */
function gridbuilder_load_all() {
  return entity_load_multiple('grid');
}

/**
 * Return generated CSS for a given grid.
 *
 * @param (string) $name
 *   Machine name of the grid.
 * @param (string) $wrapper_selector
 *   (optional) Wrapper CSS selector to use to scope the CSS.
 * @param (string) $span_selector_prefix
 *   (optional) Column span selector prefix to scope the CSS.
 * @param (boolean) $skip_spacing
 *    Whether we should skip including spacing in the output. Useful for tight
 *    layout demonstration presentation.
 *
 * @return
 *   Fully assembled CSS string.
 */
function gridbuilder_get_css($name, $wrapper_selector = NULL, $span_selector_prefix = NULL, $skip_spacing = FALSE) {

  // First attempt to let other modules provide CSS for this grid. If users are
  // not happy with the CSS generated here, they can provide their own and skip
  // our CSS generation.
  $css = module_invoke_all('gridbuilder_get_css', $name);
  if (!empty($css)) {
    return join('', $css);
  }
  $grid = gridbuilder_load($name);
  $css = '';

  // If the wrapper selector was not provided, generate one. This is useful for
  // specific administration use cases when we scope the classes by grids.
  if (empty($wrapper_selector)) {
    $wrapper_selector = '.rld-container-' . $grid
      ->id();
  }

  // If the span selector was not provided, generate one. This is useful for
  // the front end to apply varying span widths under different names.
  if (empty($span_selector_prefix)) {
    $span_selector_prefix = '.rld-span_';
  }

  // If spacing is to be skipped, override the gutter and padding temporarily.
  if ($skip_spacing) {
    $grid->gutter_width = $grid->padding_width = 0;
  }
  switch ($grid->type) {
    case GRIDBUILDER_FLUID:
      $size_suffix = '%';

      // Override to 100% whatever it was.
      $grid->width = '100';
      break;
    case GRIDBUILDER_FIXED:
      $size_suffix = 'px';
      break;
  }

  // Because we use the border-box box model, we only need to substract the
  // size of margins from the full width and divide the rest by number of
  // columns to get a value for column size.
  $colwidth = ($grid->width - ($grid->columns - 1) * $grid->gutter_width) / $grid->columns;
  $css = $wrapper_selector . ' .rld-col {
  border: 0px solid rgba(0,0,0,0);
  float: left;
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  -moz-background-clip: padding-box !important;
  -webkit-background-clip: padding-box !important;
  background-clip: padding-box !important;
  margin-left: ' . $grid->gutter_width . $size_suffix . ';
  padding: 0 ' . $grid->padding_width . $size_suffix . ';
}
' . $wrapper_selector . ' .rld-col' . $span_selector_prefix . 'first {
  margin-left: 0;
  clear: both;
}
';
  for ($i = 1; $i <= $grid->columns; $i++) {
    $css .= $wrapper_selector . ' ' . $span_selector_prefix . $i . " {\n";
    if ($i == 1) {

      // The first column does not yet have any margins.
      $css .= '  width: ' . $colwidth * $i . $size_suffix . ";\n";
    }
    elseif ($i == $grid->columns) {

      // The full width column always spans 100%.
      $css .= "  width: " . $grid->width . $size_suffix . ";\n  margin-left: 0;\n";
    }
    else {

      // Other columns absorb all columns that they need to include and one
      // less margin before them.
      $css .= '  width: ' . ($colwidth * $i + $grid->gutter_width * ($i - 1)) . $size_suffix . ";\n";
    }
    $css .= "}\n";
  }
  return $css;
}

/**
 * Get the grid plugin manager instance.
 *
 * @return Drupal\layout\Plugin\Type\GridBuilderManager
 *   The grid plugin manager instance.
 */
function gridbuilder_manager() {
  return drupal_container()
    ->get('plugin.manager.gridbuilder');
}

Functions

Namesort descending Description
gridbuilder_entity_info Implements hook_entity_info().
gridbuilder_get_css Return generated CSS for a given grid.
gridbuilder_load Look up one grid setup based on machine name.
gridbuilder_load_all API function to get all grids on the site.
gridbuilder_manager Get the grid plugin manager instance.
gridbuilder_menu Implements hook_menu().
gridbuilder_permission Implements hook_permission().
gridbuilder_uri Entity URI callback.

Constants

Namesort descending Description
GRIDBUILDER_FIXED Fixed width grid.
GRIDBUILDER_FLUID Fluid width grid.