Plugin system » History » Version 31
Max Milbers, 07/07/2011 02:10 PM
1 | 10 | Oscar van Eijk | {{>toc}} |
---|---|---|---|
2 | |||
3 | 1 | Oscar van Eijk | h1. Plugin system |
4 | |||
5 | 5 | Oscar van Eijk | Since VirtueMart v2, the Joomla! plugin system is used form payment and shipper plugins. |
6 | 1 | Oscar van Eijk | |
7 | h2. Installing plugins |
||
8 | |||
9 | During development the the VM2 branch, the plugins are not available as Joomla install packages, so for test environments, they must be installed manually. |
||
10 | |||
11 | h3. Payment plugins |
||
12 | |||
13 | At the time of writing, only 2 of the former payment plugins have been converted to the new plugin system. Others should follow soon, all help is appreciated!! |
||
14 | |||
15 | Use the SQL query below to add the plugins to your database (assuming the table prefix is "jos_"): |
||
16 | |||
17 | 12 | Christopher Roussel | J1.5: |
18 | 1 | Oscar van Eijk | <pre> |
19 | 4 | Devendra Kumar Shukla | INSERT INTO `jos_plugins` (`id`, `name`, `element`, `folder`, `access`, `ordering` |
20 | 1 | Oscar van Eijk | , `published`, `iscore`, `client_id`, `checked_out`, `checked_out_time`, `params`) |
21 | VALUES |
||
22 | (NULL, 'VMPayment - Authorize', 'authorize', 'vmpayment', 0, 0, 1, 0, 0, 0, '0000-00-00 00:00:00', '') |
||
23 | 12 | Christopher Roussel | ,(NULL, 'VMPayment - Cash on delivery', 'cashondel', 'vmpayment', 0, 0, 1, 0, 0, 0, '0000-00-00 00:00:00',''); |
24 | 1 | Oscar van Eijk | </pre> |
25 | 12 | Christopher Roussel | J1.6: |
26 | <pre> |
||
27 | INSERT INTO `jos_extensions` (`extension_id`, `type`, `name`, `element`, `folder`, `access`, `ordering` |
||
28 | , `enabled`, `protected`, `client_id`, `checked_out`, `checked_out_time`, `params`) |
||
29 | VALUES |
||
30 | (NULL, 'plugin', 'plg_vmpayment_authorize', 'authorize', 'vmpayment', 1, 0, 1, 0, 0, 0, '0000-00-00 00:00:00', '') |
||
31 | ,(NULL, 'plugin', 'plg_vmpayment_cashondel', 'cashondel', 'vmpayment', 1, 0, 1, 0, 0, 0, '0000-00-00 00:00:00',''); |
||
32 | </pre> |
||
33 | 1 | Oscar van Eijk | |
34 | 13 | Max Milbers | Next, when you did not use the svn checkout, copy the plugin files (authorize.php, authorize.xml, cashondel.php and cashondel.xml), located in the folder /plugins/vmpayment, to the Joomla plugin directory. If that doesn't exist, it must be created first. |
35 | 1 | Oscar van Eijk | |
36 | 19 | Valérie Isaksen | Now, in the store maintenance, you can add payment methods based on one of these plugins, then click Apply button to display the appropriate parameters in the configuration tab. Note at this moment it is required to select a vendor! |
37 | 1 | Oscar van Eijk | |
38 | h3. Shipper plugins |
||
39 | 3 | Oscar van Eijk | |
40 | 1 | Oscar van Eijk | This is very similar to the payment plugins. Only 1 plugin has been created (again: all help is appreciated!); 'standard', which provides a basic shipping option for postal services. |
41 | *Note:* Installing the sample data does _NOT_ provide shipping rates anymore! |
||
42 | |||
43 | Use the SQL query below to add the plugins to your database (assuming the table prefix is "jos_"): |
||
44 | |||
45 | 12 | Christopher Roussel | J1.5: |
46 | 1 | Oscar van Eijk | <pre> |
47 | INSERT INTO `jos_plugins` (`id`, `name`, `element`, `folder`, `access`, `ordering` |
||
48 | , `published`, `iscore`, `client_id`, `checked_out`, `checked_out_time`, `params`) |
||
49 | VALUES |
||
50 | 17 | Valérie Isaksen | (NULL, 'By weight, ZIP and countries', 'weight_countries', 'vmshipper', 0, 0, 1, 0, 0, 0, '0000-00-00 00:00:00', '') |
51 | 14 | Valérie Isaksen | ; |
52 | 1 | Oscar van Eijk | </pre> |
53 | |||
54 | 12 | Christopher Roussel | J1.6: |
55 | <pre> |
||
56 | INSERT INTO `jos_extensions` (`extension_id`, `type`, `name`, `element`, `folder`, `access`, `ordering` |
||
57 | 1 | Oscar van Eijk | , `enabled`, `protected`, `client_id`, `checked_out`, `checked_out_time`, `params`) |
58 | VALUES |
||
59 | 16 | Valérie Isaksen | (NULL, 'plugin', 'plg_vmshipper_weight_countries', 'weight_countries', 'vmshipper', 1, 0, 1, 0, 0, 0, '0000-00-00 00:00:00', '') |
60 | 14 | Valérie Isaksen | ; |
61 | 12 | Christopher Roussel | </pre> |
62 | 19 | Valérie Isaksen | Next, when you did not use the svn checkout, copy the plugin files (weight_countries.php, weight_countries.xml, products_countries.php and products_countries.XML), located in the folder /plugins/vmshipper, to the Joomla plugin directory. If that doesn't exist, it must be created first. |
63 | 1 | Oscar van Eijk | |
64 | 19 | Valérie Isaksen | Now use the 'Shipping methods' menu item in the backend to add 1 or more shipping methods. Give a shipping method name, select the shipping method,and click Apply button to display the appropriate parameters in the configuration tab. All you need to do here is give the shipper a name and select a vendor (this is optional; when no vendor is selected, this carrier is valid for all vendors). |
65 | Make sure a there's always a valid shipping rate: the plugin must be able to find a matching rate based on the shipto address! |
||
66 | 1 | Oscar van Eijk | |
67 | 5 | Oscar van Eijk | h2. Plugin Development |
68 | 1 | Oscar van Eijk | |
69 | 5 | Oscar van Eijk | All plugins for VirtueMart should be developed confirming the Joomla! plugin development methods. Refer to http://docs.joomla.org/Tutorial:Plugins for developers documentation for Joomla! plugins. |
70 | |||
71 | 30 | Max Milbers | h3. [[Payment Plugins]] |
72 | 5 | Oscar van Eijk | |
73 | 1 | Oscar van Eijk | Payment plugins are used both in the front-end and the backend. They must be created as classes deriving from the base class *vmPaymentPlugin*: |
74 | 30 | Max Milbers | |
75 | |||
76 | 9 | Oscar van Eijk | <pre><code class="php"> |
77 | 7 | Oscar van Eijk | class plgVmPayment<myPlugin> extends vmPaymentPlugin { |
78 | function plgVmPayment<myPlugin>(&$subject, $config) { |
||
79 | $this->_pelement = basename(__FILE__, '.php'); // Required! |
||
80 | $this->_createTable(); // Required, see below |
||
81 | parent::__construct($subject, $config); |
||
82 | } |
||
83 | } |
||
84 | 9 | Oscar van Eijk | </code></pre> |
85 | 7 | Oscar van Eijk | |
86 | Below is the list with events and a description on what moment they are fired. |
||
87 | 6 | Oscar van Eijk | * *plgVmOnSelectPayment()* - This event is fired during the checkout process. It allows the shopper to select one of the available payment methods. |
88 | 5 | Oscar van Eijk | It should display a radio button (name: paym_id) to select the payment method. Other information (like credit card info) might be selected as well, depending on the plugin. |
89 | +Return:+ |
||
90 | It must return the HTML code for displaying the form (radio button and optional extra selections). |
||
91 | +Parameters:+ |
||
92 | # (VirtueMartCart object) The cart object |
||
93 | # (integer, default 0) ID of an already selected payment method ID, if any |
||
94 | |||
95 | 6 | Oscar van Eijk | * *plgVmOnPaymentSelectCheck()* - This event is fired after the payment method has been selected. It can be used to store |
96 | 5 | Oscar van Eijk | additional payment info in the cart. |
97 | +Return:+ |
||
98 | Plugins that were not selected must return null, otherwise True of False must be returned indicating Success or Failure. |
||
99 | +Parameters:+ |
||
100 | # (VirtueMartCart object) The cart object |
||
101 | |||
102 | 10 | Oscar van Eijk | |
103 | |||
104 | 6 | Oscar van Eijk | * *plgVmOnCheckoutCheckPaymentData()* - This event is fired during the checkout process. It can be used to validate the payment data as entered by the user. |
105 | 5 | Oscar van Eijk | +Return:+ |
106 | Plugins that were not selected must return null, otherwise True of False must be returned indicating Success or Failure. |
||
107 | +Parameters:+ |
||
108 | None |
||
109 | |||
110 | 6 | Oscar van Eijk | * *plgVmOnConfirmedOrderStorePaymentData()* - This event is fired after the payment has been processed; it stores the payment method-specific data. |
111 | 5 | Oscar van Eijk | All plugins _must_ reimplement this method. |
112 | +Return:+ |
||
113 | If the plugin is NOT actually executed (not the selected payment method), this method must return NULL |
||
114 | If this plugin IS executed, it MUST return the order status code that the order should get. This triggers the stock updates if required |
||
115 | +Parameters:+ |
||
116 | # (integer) The ordernumber being processed |
||
117 | # (object) Data from the cart |
||
118 | # (array) Price information for this order |
||
119 | |||
120 | 6 | Oscar van Eijk | * *plgVmOnShowOrderPaymentBE()* - This method is fired when showing the order details in the backend. It displays the the payment method-specific data. |
121 | 5 | Oscar van Eijk | All plugins _must_ reimplement this method. |
122 | +Return:+ |
||
123 | Null when for payment methods that were not selected, text (HTML) otherwise |
||
124 | +Parameters:+ |
||
125 | # (integer) The order ID |
||
126 | # (integer) Payment method used for this order |
||
127 | |||
128 | 6 | Oscar van Eijk | * *plgVmOnCancelPayment()* - This event is fired each time the status of an order is changed to Cancelled. It can be used to refund payments, void authorization etc. |
129 | 5 | Oscar van Eijk | When reimplementing this methis, the body _must_ start with this code: |
130 | 9 | Oscar van Eijk | <pre><code class="php">$_paymethodID = $this->getPaymentMethodForOrder($_orderID); |
131 | 5 | Oscar van Eijk | if (!$this->selectedThisMethod($this->_pelement, $_paymethodID)) { |
132 | return; |
||
133 | 9 | Oscar van Eijk | }</code></pre> |
134 | 5 | Oscar van Eijk | +Parameters:+ |
135 | (integer The order ID |
||
136 | (char) Previous order status |
||
137 | (char) New order status |
||
138 | |||
139 | 6 | Oscar van Eijk | * *plgVmOnShipOrderPayment()* - This event is fired when the status of an order is changed to Shipped. It can be used to confirm or capture payments |
140 | 5 | Oscar van Eijk | When reimplementing this methis, the body _must_ start with this code: |
141 | 9 | Oscar van Eijk | <pre><code class="php">$_paymethodID = $this->getPaymentMethodForOrder($_orderID); |
142 | 5 | Oscar van Eijk | if (!$this->selectedThisMethod($this->_pelement, $_paymethodID)) { |
143 | return; |
||
144 | 9 | Oscar van Eijk | }</code></pre> |
145 | 5 | Oscar van Eijk | +Return:+ |
146 | True on success, False on failure, Null if this plugin was not activated |
||
147 | +Parameters:+ |
||
148 | 1 | Oscar van Eijk | # (integer) Order ID |
149 | 7 | Oscar van Eijk | |
150 | Other helper functions inherited from the base class: |
||
151 | |||
152 | 9 | Oscar van Eijk | * *_ createTable()* - This method is used to create and maintain the plugin specific database table(s). |
153 | 7 | Oscar van Eijk | It _must_ be reimplemented by all plugins. |
154 | 1 | Oscar van Eijk | +Example:+ |
155 | 8 | Oscar van Eijk | <pre><code class="php"> |
156 | 7 | Oscar van Eijk | $_scheme = DbScheme::get_instance(); |
157 | $_scheme->create_scheme('#__vm_order_payment_'.$this->_pelement); |
||
158 | $_schemeCols = array( |
||
159 | 'id' => array ( |
||
160 | 'type' => 'int' |
||
161 | ,'length' => 11 |
||
162 | ,'auto_inc' => true |
||
163 | ,'null' => false |
||
164 | ) |
||
165 | ,'order_id' => array ( |
||
166 | 'type' => 'int' |
||
167 | ,'length' => 11 |
||
168 | ,'null' => false |
||
169 | ) |
||
170 | ,'payment_method_id' => array ( |
||
171 | 'type' => 'text' |
||
172 | ,'null' => false |
||
173 | ) |
||
174 | ); |
||
175 | $_schemeIdx = array( |
||
176 | 'idx_order_payment' => array( |
||
177 | 'columns' => array ('order_id') |
||
178 | ,'primary' => false |
||
179 | ,'unique' => false |
||
180 | ,'type' => null |
||
181 | ) |
||
182 | ); |
||
183 | $_scheme->define_scheme($_schemeCols); |
||
184 | $_scheme->define_index($_schemeIdx); |
||
185 | if (!$_scheme->scheme()) { |
||
186 | JError::raiseWarning(500, $_scheme->get_db_error()); |
||
187 | } |
||
188 | $_scheme->reset(); |
||
189 | 8 | Oscar van Eijk | </code></pre> |
190 | 7 | Oscar van Eijk | |
191 | 8 | Oscar van Eijk | * *getPaymentMethodForOrder()* - Get the order payment ID for a given order number |
192 | 7 | Oscar van Eijk | +Return:+ |
193 | The payment method ID, or -1 when not found |
||
194 | +Parameters:+ |
||
195 | # (integer) The order ID |
||
196 | |||
197 | 8 | Oscar van Eijk | * *getThisMethodName()* - Get the name of the payment method. |
198 | 7 | Oscar van Eijk | This method can _not_ be reimplemented |
199 | +Return:+ |
||
200 | Paymenent method name |
||
201 | +Parameters:+ |
||
202 | # (integer) The payment method ID |
||
203 | |||
204 | 8 | Oscar van Eijk | * *selectedThisMethod()* - This method checks if the selected payment method matches the current plugin |
205 | 7 | Oscar van Eijk | +Return:+ |
206 | True if the calling plugin has the given payment ID, False otherwise. |
||
207 | +Parameters:+ |
||
208 | # (string) Element name, taken from the plugin filename |
||
209 | # (integer) The payment method ID |
||
210 | |||
211 | 8 | Oscar van Eijk | * *writePaymentData()* - This method writes all payment plugin specific data to the plugin's table |
212 | 7 | Oscar van Eijk | +Return:+ |
213 | True if the calling plugin has the given payment ID, False otherwise. |
||
214 | +Parameters:+ |
||
215 | # (array) Indexed array in the format 'column_name' => 'value' |
||
216 | 1 | Oscar van Eijk | # (string) Table name |
217 | 10 | Oscar van Eijk | |
218 | 30 | Max Milbers | h3. [[Shipper Plugins]] |