color_scheme_form_submit($form, FormStateInterface $form_state)
Form submission handler for color_scheme_form().
See also
File
- core/modules/color/color.module, line 373
- Allows users to change the color scheme of themes.
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | function color_scheme_form_submit( $form , FormStateInterface $form_state ) { // Avoid color settings spilling over to theme settings. $color_settings = array ( 'theme' , 'palette' , 'scheme' ); if ( $form_state ->hasValue( 'info' )) { $color_settings [] = 'info' ; } foreach ( $color_settings as $setting_name ) { ${ $setting_name }= $form_state ->getValue( $setting_name ); $form_state ->unsetValue( $setting_name ); } if (!isset( $info )) { return ; } $config = \Drupal::configFactory()->getEditable( 'color.theme.' . $theme ); // Resolve palette. if ( $scheme != '' ) { foreach ( $palette as $key => $color ) { if (isset( $info [ 'schemes' ][ $scheme ][ 'colors' ][ $key ])) { $palette [ $key ] = $info [ 'schemes' ][ $scheme ][ 'colors' ][ $key ]; } } $palette += $info [ 'schemes' ][ 'default' ][ 'colors' ]; } // Make sure enough memory is available. if (isset( $info [ 'base_image' ])) { // Fetch source image dimensions. $source = drupal_get_path( 'theme' , $theme ) . '/' . $info [ 'base_image' ]; list( $width , $height ) = getimagesize ( $source ); // We need at least a copy of the source and a target buffer of the same // size (both at 32bpp). $required = $width * $height * 8; // We intend to prevent color scheme changes if there isn't enough memory // available. memory_get_usage(TRUE) returns a more accurate number than // memory_get_usage(), therefore we won't inadvertently reject a color // scheme change based on a faulty memory calculation. $usage = memory_get_usage(TRUE); $memory_limit = ini_get ( 'memory_limit' ); $size = Bytes::toInt( $memory_limit ); if (!Environment::checkMemoryLimit( $usage + $required , $memory_limit )) { drupal_set_message(t( 'There is not enough memory available to PHP to change this theme\'s color scheme. You need at least %size more. Check the <a href="http://php.net/manual/ini.core.php#ini.sect.resource-limits">PHP documentation</a> for more information.' , array ( '%size' => format_size( $usage + $required - $size ))), 'error' ); return ; } } // Delete old files. $files = $config ->get( 'files' ); if (isset( $files )) { foreach ( $files as $file ) { @drupal_unlink( $file ); } } if (isset( $file ) && $file = dirname( $file )) { @drupal_rmdir( $file ); } // No change in color config, use the standard theme from color.inc. if (implode( ',' , color_get_palette( $theme , TRUE)) == implode( ',' , $palette )) { $config -> delete (); return ; } // Prepare target locations for generated files. $id = $theme . '-' . substr (hash( 'sha256' , serialize( $palette ) . microtime()), 0, 8); $paths [ 'target' ] = $paths [ 'color' ] . '/' . $id ; foreach ( $paths as $path ) { file_prepare_directory( $path , FILE_CREATE_DIRECTORY); } $paths [ 'target' ] = $paths [ 'target' ] . '/' ; $paths [ 'id' ] = $id ; $paths [ 'source' ] = drupal_get_path( 'theme' , $theme ) . '/' ; $paths [ 'files' ] = $paths [ 'map' ] = array (); // Save palette and logo location. $config ->set( 'palette' , $palette ) ->set( 'logo' , $paths [ 'target' ] . 'logo.svg' ) ->save(); // Copy over neutral images. foreach ( $info [ 'copy' ] as $file ) { $base = drupal_basename( $file ); $source = $paths [ 'source' ] . $file ; $filepath = file_unmanaged_copy( $source , $paths [ 'target' ] . $base ); $paths [ 'map' ][ $file ] = $base ; $paths [ 'files' ][] = $filepath ; } // Render new images, if image has been provided. if (isset( $info [ 'base_image' ])) { _color_render_images( $theme , $info , $paths , $palette ); } // Rewrite theme stylesheets. $css = array (); foreach ( $info [ 'css' ] as $stylesheet ) { // Build a temporary array with CSS files. $files = array (); if ( file_exists ( $paths [ 'source' ] . $stylesheet )) { $files [] = $stylesheet ; } foreach ( $files as $file ) { $css_optimizer = new CssOptimizer(); // Aggregate @imports recursively for each configured top level CSS file // without optimization. Aggregation and optimization will be // handled by drupal_build_css_cache() only. $style = $css_optimizer ->loadFile( $paths [ 'source' ] . $file , FALSE); // Return the path to where this CSS file originated from, stripping // off the name of the file at the end of the path. $css_optimizer ->rewriteFileURIBasePath = base_path() . dirname( $paths [ 'source' ] . $file ) . '/' ; // Prefix all paths within this CSS file, ignoring absolute paths. $style = preg_replace_callback( '/url\([\'"]?(?![a-z]+:|\/+)([^\'")]+)[\'"]?\)/i' , array ( $css_optimizer , 'rewriteFileURI' ), $style ); // Rewrite stylesheet with new colors. $style = _color_rewrite_stylesheet( $theme , $info , $paths , $palette , $style ); $base_file = drupal_basename( $file ); $css [] = $paths [ 'target' ] . $base_file ; _color_save_stylesheet( $paths [ 'target' ] . $base_file , $style , $paths ); } } // Maintain list of files. $config ->set( 'stylesheets' , $css ) ->set( 'files' , $paths [ 'files' ]) ->save(); } |
Please login to continue.