AddToCartButton
3 years ago
Address
3 years ago
BumpLineItem
3 years ago
Button
3 years ago
BuyButton
3 years ago
Card
3 years ago
Cart
3 years ago
CartBumpLineItem
3 years ago
CartCoupon
3 years ago
CartHeader
3 years ago
CartItems
3 years ago
CartMenuButton
3 years ago
CartMessage
3 years ago
CartSubmit
3 years ago
CartSubtotal
3 years ago
Checkbox
3 years ago
CheckoutErrors
3 years ago
CheckoutForm
3 years ago
CollapsibleRow
3 years ago
Column
2 years ago
Columns
2 years ago
ConditionalForm
3 years ago
Confirmation
3 years ago
Coupon
3 years ago
CustomerDashboardButton
3 years ago
Dashboard
3 years ago
Divider
3 years ago
Donation
3 years ago
DonationAmount
3 years ago
Email
3 years ago
ExpressPayment
3 years ago
FirstName
3 years ago
Form
2 years ago
Heading
3 years ago
Input
3 years ago
LastName
3 years ago
LineItemShipping
3 years ago
LineItems
3 years ago
LogoutButton
3 years ago
Name
3 years ago
NameYourPrice
3 years ago
OrderBumps
2 years ago
OrderConfirmationCustomer
3 years ago
OrderConfirmationLineItems
3 years ago
Password
2 years ago
Payment
3 years ago
Phone
3 years ago
PriceChoice
3 years ago
PriceSelector
3 years ago
Product
2 years ago
ProductItem
3 years ago
ProductItemImage
3 years ago
ProductItemList
2 years ago
ProductItemPrice
3 years ago
ProductItemTitle
3 years ago
Radio
3 years ago
RadioGroup
3 years ago
SessionDetail
3 years ago
ShippingChoices
3 years ago
StoreLogo
3 years ago
Submit
2 years ago
Subtotal
3 years ago
Switch
3 years ago
TaxIdInput
3 years ago
TaxLineItem
3 years ago
Textarea
3 years ago
Total
3 years ago
Totals
2 years ago
BaseBlock.php
3 years ago
BlockService.php
3 years ago
BlockServiceProvider.php
3 years ago
CartBlock.php
3 years ago
BaseBlock.php
288 lines
| 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 |