PluginProbe
Packeta / 1.3.1
Packeta v1.3.1
2.3.2 2.3.1 trunk 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.3.0 1.3.1 1.3.2 1.4 1.4.1 1.4.2 1.4.3 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 All 56 releases
packeta / src / Packetery / Module / Order / Metabox.php

Metabox.php in Packeta 1.3.1, at src/Packetery/Module/Order/Metabox.php

341 lines 9.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Class Metabox
4 *
5 * @package Packetery\Order
6 */
7
8 declare( strict_types=1 );
9
10 namespace Packetery\Module\Order;
11
12 use Packetery\Core;
13 use Packetery\Core\Helper;
14 use Packetery\Module\Checkout;
15 use Packetery\Module\FormFactory;
16 use Packetery\Module\MessageManager;
17 use Packetery\Module\Options;
18 use Packetery\Module\Plugin;
19 use PacketeryLatte\Engine;
20 use PacketeryNette\Forms\Form;
21 use PacketeryNette\Http\Request;
22
23 /**
24 * Class Metabox
25 *
26 * @package Packetery\Order
27 */
28 class Metabox {
29
30 const FIELD_WEIGHT = 'packetery_weight';
31 const FIELD_WIDTH = 'packetery_width';
32 const FIELD_LENGTH = 'packetery_length';
33 const FIELD_HEIGHT = 'packetery_height';
34
35 /**
36 * PacketeryLatte engine.
37 *
38 * @var Engine
39 */
40 private $latte_engine;
41
42 /**
43 * Message manager.
44 *
45 * @var MessageManager
46 */
47 private $message_manager;
48
49 /**
50 * Helper.
51 *
52 * @var Helper
53 */
54 private $helper;
55
56 /**
57 * Order form.
58 *
59 * @var Form
60 */
61 private $order_form;
62
63 /**
64 * HTTP request.
65 *
66 * @var Request
67 */
68 private $request;
69
70 /**
71 * Options provider.
72 *
73 * @var Options\Provider
74 */
75 private $optionsProvider;
76
77 /**
78 * Form factory.
79 *
80 * @var FormFactory
81 */
82 private $formFactory;
83
84 /**
85 * Order repository.
86 *
87 * @var Repository
88 */
89 private $orderRepository;
90
91 /**
92 * Metabox constructor.
93 *
94 * @param Engine $latte_engine PacketeryLatte engine.
95 * @param MessageManager $message_manager Message manager.
96 * @param Helper $helper Helper.
97 * @param Request $request Http request.
98 * @param Options\Provider $optionsProvider Options provider.
99 * @param FormFactory $formFactory Form factory.
100 * @param Repository $orderRepository Order repository.
101 */
102 public function __construct(
103 Engine $latte_engine,
104 MessageManager $message_manager,
105 Helper $helper,
106 Request $request,
107 Options\Provider $optionsProvider,
108 FormFactory $formFactory,
109 Repository $orderRepository
110 ) {
111 $this->latte_engine = $latte_engine;
112 $this->message_manager = $message_manager;
113 $this->helper = $helper;
114 $this->request = $request;
115 $this->optionsProvider = $optionsProvider;
116 $this->formFactory = $formFactory;
117 $this->orderRepository = $orderRepository;
118 }
119
120 /**
121 * Registers related hooks.
122 */
123 public function register(): void {
124 add_action(
125 'admin_init',
126 function () {
127 $this->order_form = $this->formFactory->create();
128 $this->add_fields();
129 }
130 );
131 add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
132 add_action( 'save_post', array( $this, 'save_fields' ) );
133 }
134
135 /**
136 * Add metaboxes
137 */
138 public function add_meta_boxes(): void {
139 global $post;
140
141 $order = $this->orderRepository->getById( (int) $post->ID );
142 if ( null === $order ) {
143 return;
144 }
145
146 add_meta_box(
147 'packetery_metabox',
148 __( 'Packeta', 'packeta' ),
149 array(
150 $this,
151 'render_metabox',
152 ),
153 'shop_order',
154 'side',
155 'high'
156 );
157 }
158
159 /**
160 * Adds packetery fields to order form.
161 */
162 public function add_fields(): void {
163 $this->order_form->addHidden( 'packetery_order_metabox_nonce' );
164 $this->order_form->addText( self::FIELD_WEIGHT, __( 'Weight (kg)', 'packeta' ) )
165 ->setRequired( false )
166 ->addRule( $this->order_form::FLOAT, __( 'Provide numeric value!', 'packeta' ) );
167 $this->order_form->addText( self::FIELD_WIDTH, __( 'Width (mm)', 'packeta' ) )
168 ->setRequired( false )
169 ->addRule( $this->order_form::FLOAT, __( 'Provide numeric value!', 'packeta' ) );
170 $this->order_form->addText( self::FIELD_LENGTH, __( 'Length (mm)', 'packeta' ) )
171 ->setRequired( false )
172 ->addRule( $this->order_form::FLOAT, __( 'Provide numeric value!', 'packeta' ) );
173 $this->order_form->addText( self::FIELD_HEIGHT, __( 'Height (mm)', 'packeta' ) )
174 ->setRequired( false )
175 ->addRule( $this->order_form::FLOAT, __( 'Provide numeric value!', 'packeta' ) );
176
177 foreach ( Checkout::$pickupPointAttrs as $attrs ) {
178 $this->order_form->addHidden( $attrs['name'] );
179 }
180 $this->order_form->addButton( 'packetery_pick_pickup_point', __( 'Choose pickup point', 'packeta' ) );
181 }
182
183 /**
184 * Renders metabox
185 */
186 public function render_metabox(): void {
187 global $post;
188
189 $order = $this->orderRepository->getById( (int) $post->ID );
190 if ( null === $order ) {
191 return;
192 }
193 $packetId = $order->getPacketId();
194
195 if ( $packetId ) {
196 $this->latte_engine->render(
197 PACKETERY_PLUGIN_DIR . '/template/order/metabox-overview.latte',
198 [
199 'packet_id' => $packetId,
200 'packet_tracking_url' => $this->helper->get_tracking_url( $packetId ),
201 'translations' => [
202 'packetTrackingOnline' => __( 'Packet tracking online', 'packeta' ),
203 ],
204 ]
205 );
206
207 return;
208 }
209
210 $this->order_form->setDefaults(
211 [
212 'packetery_order_metabox_nonce' => wp_create_nonce(),
213 self::FIELD_WEIGHT => $order->getWeight(),
214 self::FIELD_WIDTH => $order->getWidth(),
215 self::FIELD_LENGTH => $order->getLength(),
216 self::FIELD_HEIGHT => $order->getHeight(),
217 ]
218 );
219
220 $prev_invalid_values = get_transient( 'packetery_metabox_nette_form_prev_invalid_values' );
221 if ( $prev_invalid_values ) {
222 $this->order_form->setValues( $prev_invalid_values );
223 $this->order_form->validate();
224 }
225 delete_transient( 'packetery_metabox_nette_form_prev_invalid_values' );
226
227 $widgetSettings = [
228 'packeteryApiKey' => $this->optionsProvider->get_api_key(),
229 'country' => ( $order->getShippingCountry() ? $order->getShippingCountry() : '' ),
230 'language' => substr( get_locale(), 0, 2 ),
231 'appIdentity' => Plugin::getAppIdentity(),
232 'weight' => $order->getWeight(),
233 'carriers' => Checkout::getWidgetCarriersParam( $order->isPickupPointDelivery(), $order->getCarrierId() ),
234 'pickupPointAttrs' => Checkout::$pickupPointAttrs,
235 ];
236
237 $this->latte_engine->render(
238 PACKETERY_PLUGIN_DIR . '/template/order/metabox-form.latte',
239 [
240 'form' => $this->order_form,
241 'order' => $order,
242 'widgetSettings' => $widgetSettings,
243 'logo' => plugin_dir_url( PACKETERY_PLUGIN_DIR . '/packeta.php' ) . 'public/packeta-symbol.png',
244 ]
245 );
246 }
247
248 /**
249 * Saves added packetery form fields to order metas.
250 *
251 * @param mixed $orderId Order id.
252 *
253 * @return mixed Order id.
254 * @throws \WC_Data_Exception When invalid data are passed during shipping address update.
255 */
256 public function save_fields( $orderId ) {
257 $order = $this->orderRepository->getById( $orderId );
258 if (
259 null === $order ||
260 ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) ||
261 null === $this->request->getPost( 'packetery_order_metabox_nonce' )
262 ) {
263 return $orderId;
264 }
265
266 if ( false === $this->order_form->isValid() ) {
267 set_transient( 'packetery_metabox_nette_form_prev_invalid_values', $this->order_form->getValues( true ) );
268 $this->message_manager->flash_message( __( 'Packeta: entered data is not valid!', 'packeta' ), MessageManager::TYPE_ERROR );
269
270 return $orderId;
271 }
272
273 $values = $this->order_form->getValues( 'array' );
274
275 if ( ! wp_verify_nonce( $values['packetery_order_metabox_nonce'] ) ) {
276 $this->message_manager->flash_message( __( 'Session has expired! Please try again.', 'packeta' ), MessageManager::TYPE_ERROR );
277
278 return $orderId;
279 }
280
281 if ( ! current_user_can( 'edit_post', $orderId ) ) {
282 $this->message_manager->flash_message( __( 'You do not have sufficient rights to make changes!', 'packeta' ), MessageManager::TYPE_ERROR );
283
284 return $orderId;
285 }
286
287 $propsToSave = [
288 self::FIELD_WEIGHT => ( is_numeric( $values[ self::FIELD_WEIGHT ] ) ? (float) $values[ self::FIELD_WEIGHT ] : null ),
289 self::FIELD_WIDTH => ( is_numeric( $values[ self::FIELD_WIDTH ] ) ? (float) number_format( $values[ self::FIELD_WIDTH ], 0, '.', '' ) : null ),
290 self::FIELD_LENGTH => ( is_numeric( $values[ self::FIELD_LENGTH ] ) ? (float) number_format( $values[ self::FIELD_LENGTH ], 0, '.', '' ) : null ),
291 self::FIELD_HEIGHT => ( is_numeric( $values[ self::FIELD_HEIGHT ] ) ? (float) number_format( $values[ self::FIELD_HEIGHT ], 0, '.', '' ) : null ),
292 ];
293
294 if ( $values[ Checkout::ATTR_POINT_ID ] && $order->isPickupPointDelivery() ) {
295 $wcOrder = wc_get_order( $orderId ); // Can not be false due condition at the beginning of method.
296 foreach ( Checkout::$pickupPointAttrs as $pickupPointAttr ) {
297 $value = $values[ $pickupPointAttr['name'] ];
298
299 if ( Checkout::ATTR_CARRIER_ID === $pickupPointAttr['name'] ) {
300 $value = ( ! empty( $values[ Checkout::ATTR_CARRIER_ID ] ) ? $values[ Checkout::ATTR_CARRIER_ID ] : \Packetery\Module\Carrier\Repository::INTERNAL_PICKUP_POINTS_ID );
301 }
302
303 $propsToSave[ $pickupPointAttr['name'] ] = $value;
304
305 if ( $this->optionsProvider->replaceShippingAddressWithPickupPointAddress() ) {
306 Checkout::updateShippingAddressProperty( $wcOrder, $pickupPointAttr['name'], (string) $value );
307 }
308 }
309 $wcOrder->save();
310 }
311
312 $orderSize = $order->getSize();
313 if ( null === $orderSize ) {
314 $orderSize = new Core\Entity\Size();
315 }
316
317 foreach ( $propsToSave as $attrName => $attrValue ) {
318 switch ( $attrName ) {
319 case self::FIELD_WEIGHT:
320 $order->setWeight( $attrValue );
321 break;
322 case self::FIELD_WIDTH:
323 $orderSize->setWidth( $attrValue );
324 break;
325 case self::FIELD_LENGTH:
326 $orderSize->setLength( $attrValue );
327 break;
328 case self::FIELD_HEIGHT:
329 $orderSize->setHeight( $attrValue );
330 break;
331 }
332 }
333
334 $order->setSize( $orderSize );
335 Checkout::updateOrderEntityFromPropsToSave( $order, $propsToSave );
336 $this->orderRepository->save( $order );
337
338 return $orderId;
339 }
340 }
341