getImage($element) to have lazyLoad where $element * // contains: * // item: Drupal\image\Plugin\Field\FieldType\ImageItem. * 'slide' => '', * 'caption' => ['title' => t('Description #1')], * ]; * * $items[] = [ * 'slide' => '', * 'caption' => ['title' => t('Description #2')], * ]; * * $items[] = [ * 'slide' => '', * 'caption' => ['title' => t('Description #3')], * ]; * * // Pass the $items to the array. * $build['items'] = $items; * * // If no optionset name is provided via $build['settings'], slick will * // fallback to 'default'. * // Optionally override 'default' optionset with custom JS options. * $build['options'] = [ * 'autoplay' => TRUE, * 'dots' => TRUE, * 'arrows' => FALSE, * ]; * * // Build the slick. * $element = $slick->build($build); * * // Prepare $variables to pass into a .twig.html file. * $variables['slick'] = $element; * * // Render the slick at a .twig.html file. * // {{ slick }} * // Or simply return the $element if a renderable array is expected. * return $element; * } * @endcode * @see \Drupal\slick\SlickManager::build() * @see template_preprocess_slick_wrapper() * @see template_preprocess_slick() * * @section sec_detail Detailed sample #2 * * This can go to some hook_preprocess() of a target html.twig, or any relevant * PHP file. * * The goal is to create a vertical newsticker, or tweets, with pure text only. * First, create an unformatted Views block, says 'Ticker' containing ~ 10 * titles, or any data for the contents -- using EFQ, or static array will do. * * Returns the renderable array of a slick instance. * @code * function my_module_render_slick_detail() { * // Invoke the plugin class, or use a DI service container accordingly. * $slick = \Drupal::service('slick.manager'); * * // Access the formatter service for image related methods: * $formatter = \Drupal::service('slick.formatter'); * * $build = []; * * // 1. * // Optional $settings, can be removed. * // Provides HTML settings with optionset name and ID, none of JS related. * // To add JS key:value pairs, use #options below instead. * // @see \Drupal\slick\SlickDefault for most supported settings. * $build['settings'] = [ * // Optional optionset name, otherwise fallback to default. * // 'optionset' => 'blog', * // Optional skin name fetched from hook_slick_skins_info(), else none. * // 'skin' => 'fullwidth', * // Define the main ID. The rest are managed by the module. * // If you provide ID, be sure unique per instance as it is cached. * // Leave empty to be provided by the module. * 'id' => 'slick-ticker', * * // Define cache max-age, default to -1 (Cache::PERMANENT) to permanently * // cache the results. Hence a 1 hour is passed. Be sure it is an integer! * 'cache' => 3600, * ]; * * // 3. * // Obligatory #items, as otherwise empty slick. * // Prepare #items, note the 'slide' key is to hold the actual slide * // which can be pure and simple text, or any image/media file. * // Meaning $rows can be text only, or image/audio/video, or a combination * // of both. * // To add caption/overlay, use 'caption' key with the supported sub-keys: * // alt, data, link, overlay, title for complex content. * // Sanitize each sub-key content accordingly. * // @see template_preprocess_slick_slide() for more info. * $items = []; * foreach ($rows as $key => $row) { * // Each item has keys: slide, caption, settings. * $items[] = [ * 'slide' => $row, * * // Optional caption contains: alt, data, link, overlay, title. * // If the above slide is an image, to add text caption, use: * 'caption' => ['title' => 'some-caption data'], * * // Optional slide settings to manipulate layout, can be removed. * // Individual slide supports some useful settings like layout, classes, * // etc. * // Meaning each slide can have different layout, or classes. * // @see src/Plugin/Field/README.txt * 'settings' => [ * * // Optionally add a custom layout, can be a static uniform value, or * // dynamic one based on the relevant field value. * // @see src/Plugin/Field/README.txt for the supported layout keys. * 'layout' => 'bottom', * * // Optionally add a custom class, can be a static uniform class, or * // dynamic one based on the relevant field value. * 'class' => 'slide--custom-class--' . $key, * ], * ]; * } * * // Pass the $items to the array. * $build['items'] = $items; * * // 4. * // Optional specific JS options, to re-use one optionset, can be removed. * // Play with speed and options to achieve desired result. * // @see config/install/slick.optionset.default.yml * $build['options'] = [ * 'arrows' => FALSE, * 'autoplay' => TRUE, * 'vertical' => TRUE, * 'draggable' => FALSE, * ]; * * // 5. * // Build the slick with the arguments as described above. * $element = $slick->build($build); * * // Prepare $variables to pass into a .twig.html file. * $variables['slick'] = $element; * * // Render the slick at a .twig.html file. * // {{ slick }} * // Or simply return the $element if a renderable array is expected. * return $element; * } * @endcode * @see \Drupal\slick\SlickManager::build() * @see template_preprocess_slick_wrapper() * * @section sec_asnavfor AsNavFor sample #3 * * The only requirement for asNavFor is optionset and optionset_thumbnail IDs: * @code * $build['settings']['optionset'] = 'optionset_name'; * $build['settings']['optionset_thumbnail'] = 'optionset_thumbnail_name'; * @endcode * * The rest are optional, and will fallback to default: * - $build['settings']['optionset_thumbnail'] = 'optionset_thumbnail_name'; * Defined at the main settings. * * - $build['settings']['id'] = 'slick-asnavfor'; * Only main display ID is needed. The thumbnail ID will be * automatically created: 'slick-asnavfor-thumbnail', including the content * attributes accordingly. If none provided, will fallback to incremented * ID. * * See the HTML structure below to get a clear idea. * * 1. Main slider: * @code *
*
*
*
*
* @endcode * 2. Thumbnail slider: * @code *
*
*
*
*
* @endcode * The asnavfor targets are the 'slick-initialized' attributes, and managed by * the module automatically when using SlickManager::build(). * * Returns the renderable array of slick instances. * @code * function my_module_render_slick_asnavfor() { * // Invoke the plugin class, or use a DI service container accordingly. * $slick = \Drupal::service('slick.manager'); * * // Access the formatter service for image related methods: * $formatter = \Drupal::service('slick.formatter'); * * $build = []; * * // 1. Main slider --------------------------------------------------------- * // Add the main display items. * $build['items'] = []; * * $images = [1, 2, 3, 4, 6, 7]; * foreach ($images as $key) { * // Each item has keys: slide, caption, settings. * $build['items'][] = [ * * // Use $formatter->getImage($element) to have lazyLoad where $element * // contains: * // item: Drupal\image\Plugin\Field\FieldType\ImageItem. * 'slide' => '', * * // Main caption contains: alt, data, link, overlay, title keys which * // serve the purpose to have consistent markups and skins without * // bothering much nor remembering what HTML tags and where to place to * // provide for each purpose cosnsitently. CSS will do layout regardless * // HTML composition. * // If having more complex caption data, use 'data' key instead. * // If the common layout doesn't satisfy the need, just override twig. * 'caption' => ['title' => 'Description #' . $key], * ]; * } * * // Optionally override the optionset. * $build['options'] = [ * 'arrows' => FALSE, * 'centerMode' => TRUE, * 'centerPadding' => '', * ]; * * // Satisfy the asnavfor main settings. * // @see \Drupal\slick\SlickDefault for most supported settings. * $build['settings'] = [ * // The only required is 'optionset_thumbnail'. * // Define both main and thumbnail optionset names at the main display. * 'optionset' => 'optionset_main_name', * 'optionset_thumbnail' => 'optionset_thumbnail_name', * * // The rest is optional, just FYI. * 'id' => 'slick-asnavfor', * 'skin' => 'skin-main-name', * 'skin_thumbnail' => 'skin-thumbnail-name', * ]; * * // 2. Thumbnail slider ---------------------------------------------------- * // The thumbnail array is grouped by 'thumb'. * $build['thumb'] = ['items' => []]; * foreach ($images as $key) { * // Each item has keys: slide, caption, settings. * $build['thumb']['items'][] = [ * // Use $formatter->getThumbnail($settings) where $settings contain: * // uri, image_style, height, width, alt, title. * 'slide' => '', * * // Thumbnail caption accepts direct markup or custom renderable array * // without any special key to be simple as much as complex. * // Think Youtube playlist with scrolling nav: thumbnail, text, etc. * 'caption' => ['#markup' => 'Description #' . $key], * ]; * } * * // Optionally override 'optionset_thumbnail_name' with custom JS options. * $build['thumb']['options'] = [ * 'arrows' => TRUE, * 'centerMode' => TRUE, * 'centerPadding' => '10px', * * // Be sure to have multiple slides for the thumbnail, otherwise nonsense. * 'slidesToShow' => 5, * ]; * * // Build the slick once. * $element = $slick->build($build); * * // Prepare variables to pass into a .twig.html file. * $variables['slick'] = $element; * * // Render the slick at a .twig.html file. * // {{ slick }} * // Or simply return the $element if a renderable array is expected. * return $element; * } * @endcode * @see \Drupal\slick\SlickManager::build() * @see template_preprocess_slick_wrapper() * * @section sec_skin Registering Slick skins * * To register a skin, implement hook_slick_skins_info() in a module file, and * defines skins at the registered class which implements SlickSkinInterface. * * The class must implement \Drupal\slick\SlickSkinInterface, and it has 3 * supported methods: ::skins(), ::dots(), ::arrows() to have skin options for * main/thumbnail/overlay/nested displays, dots, and arrows skins respectively. * The declared skins will be available for custom coded, or UI selections. * * @see \Drupal\slick\SlickSkinInterface * @see \Drupal\slick_example\SlickExampleSkin * @see \Drupal\slick_extras\SlickExtrasSkin * * Add the needed methods accordingly. * This can be used to register skins for the Slick. Skins will be * available when configuring the Optionset, Field formatter, or Views style, * or custom coded slicks. * * Slick skins get a unique CSS class to use for styling, e.g.: * If your skin name is "my_module_slick_carousel_rounded", the CSS class is: * slick--skin--my-module-slick-carousel-rounded * * A skin can specify CSS and JS files to include when Slick is displayed, * except for a thumbnail skin which accepts CSS only. * * Each skin supports 5 keys: * - name: The human readable name of the skin. * - description: The description about the skin, for help and manage pages. * - css: An array of CSS files to attach. * - js: An array of JS files to attach, e.g.: image zoomer, reflection, etc. * - group: A string grouping the current skin: main, thumbnail. * - provider: A module name registering the skins. * * @section sec_skins Defines the Slick main and thumbnail skins * * @code * public function skins() { * $theme_path = base_path() . drupal_get_path('theme', 'my_theme'); * * return [ * 'skin_name' => [ * // Human readable skin name. * 'name' => 'Skin name', * * // Description of the skin. * 'description' => t('Skin description.'), * * // Group skins to reduce confusion on form selection: main, thumbnail. * 'group' => 'main', * * // Optional module name to prefix the library name. * 'provider' => 'my_module', * * // Custom assets to be included within a skin, e.g.: Zoom, Reflection, * // Slicebox, etc. * 'css' => [ * 'theme' => [ * // Full path to a CSS file to include with the skin. * $theme_path . '/css/my-theme--slider.css' => [], * $theme_path . '/css/my-theme--carousel.css' => [], * ], * ], * 'js' => [ * // Full path to a JS file to include with the skin. * $theme_path . '/js/my-theme--slider.js' => [], * $theme_path . '/js/my-theme--carousel.js' => [], * // To act on afterSlick event, or any other slick events, * // put a lighter weight before slick.load.min.js (0). * $theme_path . '/js/slick.skin.menu.min.js' => ['weight' => -2], * ], * * // Alternatively, add extra library dependencies for re-usable * // libraries. These must be registered as module libraries first. * // Use above CSS and JS directly if reluctant to register libraries. * 'dependencies' => [ * 'my_module/d3', * 'my_module/slicebox', * 'my_module/zoom', * ], * * // Add custom options to be merged into [data-slick] attribute. * // Below is a sample of Slicebox options merged into Slick options. * // These options later can be accessed in the custom JS acccordingly. * 'options' => [ * 'orientation' => 'r', * 'cuboidsCount' => 7, * 'maxCuboidsCount' => 7, * 'cuboidsRandom' => TRUE, * 'disperseFactor' => 30, * 'itemAnimation' => TRUE, * 'perspective' => 1300, * 'reflection' => TRUE, * 'effect' => ['slicebox', 'zoom'], * ], * ], * ]; * } * @endcode * * @section sec_dots Defines Slick dot skins * * The provided dot skins will be available at sub-module UI form. * A skin dot named 'hop' will have a class 'slick-dots--hop' for the UL. * * The array is similar to the self::skins(), excluding group, JS. * @code * public function dots() { * // Create an array of dot skins. * return []; * } * @endcode * * @section sec_arrows Defines Slick arrow skins * * The provided arrow skins will be available at sub-module UI form. * A skin arrow 'slit' will have a class 'slick__arrow--slit' for the NAV. * * The array is similar to the self::skins(), excluding group, JS. * * @return array * The array of the arrow skins. * @code * public function arrows() { * // Create an array of arrow skins. * return []; * } * @endcode * @} */ /** * @addtogroup hooks * @{ */ /** * Registers a class that should hold skin definitions. * * @deprecated, will be removed anytime when a core solution is available. * @see #2233261 * Postponed till D9. * * @see slick_hook_info() * @see slick_example.module * @see slick_extras.module * @see \Drupal\slick\SlickSkinInterface * @see sec_skin * * @ingroup slick_api */ function hook_slick_skins_info() { return '\Drupal\my_module\MyModuleSlickSkin'; } /** * Modifies overridable options to re-use one optionset. * * @see \Drupal\slick\Form\SlickAdmin::getOverridableOptions() * * @ingroup slick_api */ function hook_slick_overridable_options_info_alter(&$options) { // Adds RTL option to Slick field formatters, or Slick Views UI. $options['rtl'] = t('RTL'); } /** * @} End of "addtogroup hooks". */