'public://logo.jpg', * * // Explicitly request for Blazy. * // This allows Slick lazyLoad to not load Blazy. * // May be ignored by your defined options at Blazy UI since 2.6+, unless * // flagged by a bool `unlazy` in tandem with `loading` option. * 'lazy' => 'blazy', * * // Optionally provide an image style. Valid URI is a must: * 'image_style' => 'thumbnail', * ]; * * $build = [ * '#theme' => 'blazy', * '#settings' => $settings, * * // Or below for clarity: * '#settings' => ['uri' => 'public://logo.jpg', 'lazy' => 'blazy'], * * // Pass custom attributes into the same #item_attributes property as * // Blazy formatters so to respect external modules like RDF, etc. without * // extra property. The regular #attributes property is reserved by Blazy * // container which holds either IMG, icons, or iFrame. Meaning Blazy is * // not just IMG. * '#item_attributes' => [ * 'alt' => t('Thumbnail'), * 'title' => t('Thumbnail title'), * 'width' => 120, * ], * * // Finally load the library, or include it into a parent container. * '#attached' => ['library' => ['blazy/load']], * ]; * * return $build; * } * @endcode * @see \Drupal\blazy\Theme\BlazyTheme::blazy() * @see \Drupal\blazy\BlazyDefault::imageSettings() * * A multiple image sample. * * For advanced usages with multiple images, and a few Blazy features such as * lightboxes, lazyloaded images, or iframes, including CSS background and * aspect ratio, etc.: * o Invoke blazy.manager, and or blazy.formatter, services. * o Use \Drupal\blazy\BlazyManager::getBlazy() method to work with images and * pass relevant settings which request for particular Blazy features * accordingly. * o Use \Drupal\blazy\BlazyManager::attach() to load relevant libraries. * @code * function my_module_render_blazy_multiple() { * // Invoke the plugin class, or use a DI service container accordingly. * $manager = \Drupal::service('blazy.manager'); * * $settings = [ * // Explicitly request for Blazy library. * // This allows Slick lazyLoad, or text formatter, to not load Blazy. * 'blazy' => TRUE, * * // Supported media switcher options dependent on available modules: * // colorbox, media (Image to iframe), photobox. * 'media_switch' => 'media', * ]; * * // Build images. * $build = [ * // Load images via $manager->getBlazy(). * // See below ...Formatter::buildElements() for consistent samples. * ]; * * // Finally attach libraries as requested via $settings. * $build['#attached'] = $manager->attach($settings); * * return $build; * } * @endcode * @see \Drupal\blazy\Plugin\Field\FieldFormatter\BlazyFormatterBlazy::buildElements() * @see \Drupal\gridstack\Plugin\Field\FieldFormatter\GridStackFileFormatterBase::buildElements() * @see \Drupal\slick\Plugin\Field\FieldFormatter\SlickFileFormatterBase::buildElements() * @see \Drupal\blazy\BlazyManager::getBlazy() * @see \Drupal\blazy\BlazyDefault::imageSettings() * @see hook_blazy_alter() * @} */ /** * @addtogroup hooks * @{ */ /** * Alters Blazy attachments to add own library, drupalSettings, and JS template. * * @param array $load * The array of loaded library being modified. * @param array $settings * The available array of settings. * * @ingroup blazy_api */ function hook_blazy_attach_alter(array &$load, array $settings = []) { // Since 2.6, non-configurable settings are mostly grouped under `blazies`. // For pre 2.6, please use $settings['NAME'] directly. $blazies = $settings['blazies']; // Attach additional libraries or drupalSettings if meeting a condition: if ($blazies->get('photoswipe')) { $load['library'][] = 'my_module/load'; $template = ['#theme' => 'photoswipe_container']; $load['drupalSettings']['photoswipe'] = [ 'options' => blazy()->configLoad('options', 'photoswipe.settings'), 'container' => blazy()->getRenderer()->renderPlain($template), ]; } } /** * Alters available lightboxes for Media switch select option at Blazy UI. * * @param array $lightboxes * The array of lightbox options being modified. * * @see https://www.drupal.org/project/blazy_photoswipe * * @ingroup blazy_api */ function hook_blazy_lightboxes_alter(array &$lightboxes) { $lightboxes[] = 'photoswipe'; } /** * Alters Blazy individual item output to support a custom lightbox. * * @param array $build * The renderable array of image/ video iframe being modified. * @param array $settings * The available array of settings. * * @ingroup blazy_api */ function hook_blazy_alter(array &$build, array $settings = []) { if (!empty($settings['media_switch']) && $settings['media_switch'] == 'photoswipe') { $build['#pre_render'][] = 'my_module_pre_render'; } } /** * Alters Blazy outputs entirely to support a custom (quasy-)lightbox. * * In a case of ElevateZoom Plus, it adds a prefix large image preview before * the Blazy Grid elements by adding an extra #theme_wrappers via #pre_render * element. * * @param array $build * The renderable array of the entire Blazy output being modified. * @param array $settings * The available array of settings. * * @ingroup blazy_api */ function hook_blazy_build_alter(array &$build, array $settings = []) { // Since 2.6, non-configurable settings are mostly grouped under `blazies`. // For pre 2.6, please use $settings['NAME'] directly. $blazies = $settings['blazies']; // All (quasi-)lightboxes are put directly under $blazies for being unique. // This also allows a quasi-lightbox like ElevateZoomPlus inject its optionset // as its value: elevatezoomplus: responsive, etc. if ($blazies->get('colorbox') || $blazies->get('zooming')) { $build['#pre_render'][] = 'my_module_pre_render_build'; } } /** * Alters blazy-related formatter form options to make site-builders happier. * * A less robust alternative to third party settings to pass the options to * blazy-related formatters within the designated compact form. * While third party settings offer more fine-grained control over a specific * formatter, this offers a swap to various blazy-related formatters at one go. * Any class extending \Drupal\blazy\BlazyDefault will be capable * to modify both form and UI options at one go. * * This requires 4 things: option definitions (this alter), schema, extended * forms, and front-end implementation of the provided options which can be done * via regular hook_preprocess(). * * Accordingly update the schema via core hook_config_schema_info_alter(), or * regular module.schema.yml file to have a valid schema. * @code * function hook_config_schema_info_alter(array &$definitions) { * $settings = ['color' => '', 'arrowpos' => '', 'dotpos' => '']; * BlazyAlter::configSchemaInfoAlter($definitions, * 'slick_base', SlickDefault::extendedSettings() + $settings); * } * @endcode * * In addition to the schema, implement hook_blazy_complete_form_element_alter() * to provide the actual extended forms, see far below. And lastly, implement * the options at front-end via hook_preprocess(). * * @param array $settings * The settings being modified. * @param array $context * The array containing class which defines or limit the scope of the options. * * @ingroup blazy_api */ function hook_blazy_base_settings_alter(array &$settings, array $context = []) { // One override for both various Slick field formatters and Slick views style. // SlickDefault extends BlazyDefault, hence capable to modify/ extend options. // These options will be available at many Slick formatters at one go. if ($context['class'] == 'Drupal\slick\SlickDefault') { $settings += ['color' => '', 'arrowpos' => '', 'dotpos' => '']; } } /** * Alters blazy settings inherited by all child elements. * * @param array $build * The array containing: settings, or potential optionset for extensions. * @param object $items * The Drupal\Core\Field\FieldItemListInterface items. * * @ingroup blazy_api */ function hook_blazy_settings_alter(array &$build, $items) { // Most configurable settings are put as direct key-value pairs. $settings = &$build['settings']; // Since 2.6, non-configurable settings are mostly grouped under `blazies`. // For pre 2.6, please use $settings['NAME'] directly. $blazies = $settings['blazies']; // Overrides one pixel placeholder on particular pages relevant if using Views // rewrite results which may strip out Data URI. // See https://drupal.org/node/2908861. $id = $blazies->get('entity.id'); if ($id && in_array($id, [45, 67])) { $blazies->set('ui.placeholder', '/blank.gif'); } // Alternatively override views blocks identified by `view.view_mode` with // a blank SVG since 1px gif has issues with non-square sizes, see #2908861: // // Adjust plugin ID since Blazy has a few formatters, View style/ fields. // Since 2.6, plugin_id is put under: `field`, 'view', `filter` under blazies. // For pre 2.6 all plugin IDs are ignorantly put under settings.plugin_id // replacing each other -- while hardly an issue, likely due to no real/useful // usages, it was plain wrong. A valid reason for `blazies` as grouping. // Field formatters are grouped under $blazies->get('field.plugin_id'): // - `blazy` for plain old Image. // - `blazy_media` for Media. // - `blazy_oembed` for oEmbed, etc. // View fields and styles are grouped under $blazies->get('view.plugin_id'): // - `blazy` for BlazyGrid Views style. // - `blazy_file` for Views field File like plain image galleries. // - `blazy_media` for Views field Media like mixed Media libraries. // [Blazy|Splide|Slick]Filter are under $blazies->get('filter.plugin_id'): // - `blazy_filter` for BlazyFilter, supports both plain media and galleries. // - `slick_filter` for SlickFilter galleries. // - `splide_filter` for SplideFilter galleries. $plugin_id = $blazies->get('view.plugin_id') == 'blazy'; // Only concern with blocks having `Rewrite view resuts` to fix 404 due to // `data:image` placeholder is stripped out by Views sanitization procedure. // By default machine names are like block_1, or page_1, etc. till changed. $rewriten_blocks = ['block_categories', 'block_popular', 'block_related']; if ($plugin_id && $view_mode = $blazies->get('view.view_mode')) { if (in_array($view_mode, $rewriten_blocks)) { $blazies->set('ui.placeholder', '/blank.svg'); } } } /** * Alters blazy-related formatter form elements. * * This takes advantage of Blazy taking care of a few elements finalizations, * such as adding #empty_option, extras CSS classes, checkboxes, states, etc. * This is run before hook_blazy_complete_form_element_alter(). * * @param array $form * The $form being modified. * @param array $definition * The array defining the scope of form elements. * * @see \Drupal\blazy\Form\BlazyAdminBase::finalizeForm() * * @ingroup blazy_api */ function hook_blazy_form_element_alter(array &$form, array $definition = []) { // Scope to splide formatters, blazy, gridstack, slick, etc. Or swap em all. if (($definition['namespace'] ?? FALSE) == 'splide') { // Extend the formatter form elements as needed. } } /** * Alters blazy-related formatter form elements. * * Modify anything Blazy forms output as you wish. * This is run after hook_blazy_form_element_alter(). * * @param array $form * The $form being modified. * @param array $definition * The array defining the scope of form elements. * * @see \Drupal\blazy\Form\BlazyAdminBase::finalizeForm() * * @ingroup blazy_api */ function hook_blazy_complete_form_element_alter(array &$form, array $definition = []) { // Scope to splide formatters, blazy, gridstack, slick, etc. Or swap em all. if (($definition['namespace'] ?? FALSE) == 'splide') { // Extend the formatter form elements as needed. } } /** * @} End of "addtogroup hooks". */