PluginProbe
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 2.1.3
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v2.1.3
4.7.2 4.7.1 4.7.0 4.6.6 4.6.5 4.6.4 4.6.3 4.6.2 4.6.1 4.6.0 4.5.1 4.5.0 4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 All 281 releases
surecart / packages / blocks / Blocks / BaseBlock.php
BaseBlock.php
288 lines 8.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace SureCartBlocks\Blocks;
4
5 use SureCartBlocks\Util\BlockStyleAttributes;
6
7 /**
8 * Checkout block
9 */
10 abstract class BaseBlock {
11 /**
12 * Optional directory to .json block data files.
13 *
14 * @var string
15 */
16 protected $directory = '';
17
18 /**
19 * Holds the block.
20 *
21 * @var object
22 */
23 protected $block;
24
25 /**
26 * Get the style for the block
27 *
28 * @param array $attributes Style variables.
29 * @return string
30 */
31 public function getVars( $attr, $prefix ) {
32 $style = '';
33 // padding.
34 if ( ! empty( $attr['style']['spacing']['padding'] ) ) {
35 $padding = $attr['style']['spacing']['padding'];
36 $style .= $prefix . '-padding-top: ' . $this->getSpacingPresetCssVar( array_key_exists( 'top', $padding ) ? $padding['top'] : '0' ) . ';';
37 $style .= $prefix . '-padding-bottom: ' . $this->getSpacingPresetCssVar( array_key_exists( 'bottom', $padding ) ? $padding['bottom'] : '0' ) . ';';
38 $style .= $prefix . '-padding-left: ' . $this->getSpacingPresetCssVar( array_key_exists( 'left', $padding ) ? $padding['left'] : '0' ) . ';';
39 $style .= $prefix . '-padding-right: ' . $this->getSpacingPresetCssVar( array_key_exists( 'right', $padding ) ? $padding['right'] : '0' ) . ';';
40 }
41 // margin.
42 if ( ! empty( $attr['style']['spacing']['margin'] ) ) {
43 $margin = $attr['style']['spacing']['margin'];
44 $style .= $prefix . '-margin-top: ' . $this->getSpacingPresetCssVar( array_key_exists( 'top', $margin ) ? $margin['top'] : '0' ) . ';';
45 $style .= $prefix . '-margin-bottom: ' . $this->getSpacingPresetCssVar( array_key_exists( 'bottom', $margin ) ? $margin['bottom'] : '0' ) . ';';
46 $style .= $prefix . '-margin-left: ' . $this->getSpacingPresetCssVar( array_key_exists( 'left', $margin ) ? $margin['left'] : '0' ) . ';';
47 $style .= $prefix . '-margin-right: ' . $this->getSpacingPresetCssVar( array_key_exists( 'right', $margin ) ? $margin['right'] : '0' ) . ';';
48 }
49 // aspect ratio.
50 if ( ! empty( $attr['ratio'] ) ) {
51 $style .= $prefix . '-aspect-ratio: ' . $attr['ratio'] . ';';
52 }
53 // border width.
54 if ( ! empty( $attr['style']['border']['width'] ) ) {
55 $style .= $prefix . '-border-width: ' . $attr['style']['border']['width'] . ';';
56 }
57 // border radius.
58 if ( ! empty( $attr['style']['border']['radius'] ) ) {
59 $style .= $prefix . '-border-radius: ' . $attr['style']['border']['radius'] . ';';
60 }
61 // font weight.
62 if ( ! empty( $attr['style']['typography']['fontWeight'] ) ) {
63 $style .= $prefix . '-font-weight: ' . $attr['style']['typography']['fontWeight'] . ';';
64 }
65 // font size.
66 if ( ! empty( $attr['fontSize'] ) || ! empty( $attr['style']['typography']['fontSize'] ) ) {
67 $font_size = ! empty( $attr['fontSize'] ) ? $this->getFontSizePresetCssVar( $attr['fontSize'] ) : $attr['style']['typography']['fontSize'];
68 $style .= 'font-size: ' . $font_size . ';';
69 }
70 // border color.
71 if ( ! empty( $attr['borderColor'] ) || ! empty( $attr['style']['border']['color'] ) ) {
72 $border_color = ! empty( $attr['borderColor'] ) ? $this->getColorPresetCssVar( $attr['borderColor'] ) : $attr['style']['border']['color'];
73 $style .= $prefix . '-border-color: ' . $border_color . ';';
74 }
75 // text color.
76 if ( ! empty( $attr['textColor'] ) || ! empty( $attr['style']['color']['text'] ) ) {
77 $text_color = ! empty( $attr['textColor'] ) ? $this->getColorPresetCssVar( $attr['textColor'] ) : $attr['style']['color']['text'];
78 $style .= $prefix . '-text-color: ' . $text_color . ';';
79 }
80 // background color.
81 if ( ! empty( $attr['backgroundColor'] ) || ! empty( $attr['style']['color']['background'] ) ) {
82 $text_color = ! empty( $attr['backgroundColor'] ) ? $this->getColorPresetCssVar( $attr['backgroundColor'] ) : $attr['style']['color']['background'];
83 $style .= $prefix . '-background-color: ' . $text_color . ';';
84 }
85 // text align.
86 if ( ! empty( $attr['align'] ) ) {
87 $style .= $prefix . '-align: ' . $attr['align'] . ';';
88 }
89
90 if ( ! empty( $attr['width'] ) ) {
91 $style .= $prefix . '-width: ' . $attr['width'] . '%;';
92 }
93
94 return $style;
95 }
96
97 /**
98 * Get the class name for the color.
99 *
100 * @param string $color_context_name The color context name (color, background-color).
101 * @param string $color_slug (foreground, background, etc.).
102 *
103 * @return string
104 */
105 public function getColorClassName( $color_context_name, $color_slug ) {
106 if ( ! $color_context_name || ! $color_slug ) {
107 return false;
108 }
109 $color_slug = _wp_to_kebab_case( $color_slug );
110 return "has-$color_slug-$color_context_name";
111 }
112
113 /**
114 * Get the classes.
115 *
116 * @param array $attributes The block attributes.
117 *
118 * @return string
119 */
120 public function getClasses( $attributes ) {
121 // get block classes and styles.
122 [ 'classes' => $classes ] = BlockStyleAttributes::getClassesAndStylesFromAttributes( $attributes );
123 // get text align class.
124 ['class' => $text_align_class] = BlockStyleAttributes::getTextAlignClassAndStyle( $attributes );
125 // get text align class.
126 [ 'class' => $align_class ] = BlockStyleAttributes::getAlignClassAndStyle( $attributes );
127 return implode( ' ', array_filter( [ $classes, $text_align_class, $align_class ] ) );
128 }
129
130 /**
131 * Get the styles
132 *
133 * @param array $attributes The block attributes.
134 *
135 * @return string
136 */
137 public function getStyles( $attributes ) {
138 [ 'styles' => $styles ] = BlockStyleAttributes::getClassesAndStylesFromAttributes( $attributes );
139 return $styles;
140 }
141
142 /**
143 * Get the spacing preset css variable.
144 *
145 * @param string $value The value.
146 *
147 * @return string|void
148 */
149 public function getSpacingPresetCssVar( $value ) {
150 if ( ! $value ) {
151 return;
152 }
153
154 preg_match( '/var:preset\|spacing\|(.+)/', $value, $matches );
155
156 if ( ! $matches ) {
157 return $value;
158 }
159
160 return "var(--wp--preset--spacing--$matches[1])";
161 }
162
163 /**
164 * Get the font size preset css variable.
165 *
166 * @param string $value The value.
167 *
168 * @return string|void
169 */
170 public function getFontSizePresetCssVar( $value ) {
171 if ( ! $value ) {
172 return;
173 }
174
175 return "var(--wp--preset--font-size--$value)";
176 }
177
178 /**
179 * Get the color preset css variable.
180 *
181 * @param string $value The value.
182 *
183 * @return string|void
184 */
185 public function getColorPresetCssVar( $value ) {
186 if ( ! $value ) {
187 return;
188 }
189
190 return "var(--wp--preset--color--$value)";
191 }
192
193
194 /**
195 * Register the block for dynamic output
196 *
197 * @param \Pimple\Container $container Service container.
198 *
199 * @return void
200 */
201 public function register() {
202 register_block_type_from_metadata(
203 $this->getDir(),
204 apply_filters(
205 'surecart/block/registration/args',
206 [ 'render_callback' => [ $this, 'preRender' ] ],
207 ),
208 );
209 }
210
211 /**
212 * Get the called class directory path
213 *
214 * @return string
215 */
216 public function getDir() {
217 if ( $this->directory ) {
218 return $this->directory;
219 }
220
221 $reflector = new \ReflectionClass( $this );
222 $fn = $reflector->getFileName();
223 return dirname( $fn );
224 }
225
226
227 /**
228 * Optionally run a function to modify attibuutes before rendering.
229 *
230 * @param array $attributes Block attributes.
231 * @param string $content Post content.
232 *
233 * @return function
234 */
235 public function preRender( $attributes, $content, $block ) {
236 $this->block = $block;
237
238 // run middlware.
239 $render = $this->middleware( $attributes, $content );
240
241 if ( is_wp_error( $render ) ) {
242 return $render->get_error_message();
243 }
244
245 if ( true !== $render ) {
246 return $render;
247 }
248
249 $attributes = $this->getAttributes( $attributes );
250
251 // render.
252 return $this->render( $attributes, $content, $block );
253 }
254
255 /**
256 * Run any block middleware before rendering.
257 *
258 * @param array $attributes Block attributes.
259 * @param string $content Post content.
260 * @return boolean|\WP_Error;
261 */
262 protected function middleware( $attributes, $content ) {
263 return true;
264 }
265
266 /**
267 * Allows filtering of attributes before rendering.
268 *
269 * @param array $attributes Block attributes.
270 * @return array $attributes
271 */
272 public function getAttributes( $attributes ) {
273 return $attributes;
274 }
275
276 /**
277 * Render the block
278 *
279 * @param array $attributes Block attributes.
280 * @param string $content Post content.
281 *
282 * @return string
283 */
284 public function render( $attributes, $content ) {
285 return '';
286 }
287 }
288