Coding standards and hints for Virtuemart » History » Version 14
Max Milbers, 02/18/2014 04:16 PM
1 | 1 | Max Milbers | h1. Coding standards and hints for Virtuemart |
---|---|---|---|
2 | |||
3 | 3 | Max Milbers | In general we avoid the use of globals. Globals are hard to maintain and they are unsure variables. |
4 | |||
5 | 1 | Max Milbers | h2. Code Formatting: |
6 | |||
7 | 12 | Max Milbers | We follow the joomla standard in most cases. We use camelCase for methods. For faster copypasting and working with database fields, both variable and database fields are lowercase and seperated with "_". You may use for internal variables camelCase also. |
8 | We prefer for any if/else constrution clear brackets. Clear and simple "one line if" constructions are allowed, but in case there is an else use curly brackets. |
||
9 | 1 | Max Milbers | |
10 | Example: |
||
11 | |||
12 | <pre> |
||
13 | function exampleMethod($data = 0) { |
||
14 | 12 | Max Milbers | |
15 | 1 | Max Milbers | if (!$product_id) $product_id = JRequest::getInt('product_id', 0); |
16 | 12 | Max Milbers | |
17 | 1 | Max Milbers | if ($product_id > 0) { |
18 | ...; |
||
19 | } |
||
20 | } |
||
21 | 12 | Max Milbers | </pre> |
22 | |||
23 | 14 | Max Milbers | Templates keep the open and closing tags <?php and ?> in one line. Avoid closing and directly opening again. Prefer always plain html without echoing whole lines (just echo the variable instead). In case you start a longer php sequence, it is adequate to give the php tag an own line. |
24 | 12 | Max Milbers | <pre> |
25 | <?php if ($link) { ?> |
||
26 | <a href="<?php echo $link; ?>">My link</a> |
||
27 | 1 | Max Milbers | <?php } ?> |
28 | 14 | Max Milbers | |
29 | <php |
||
30 | if($y<$b){ |
||
31 | $link = $this->createLink(); |
||
32 | if ($link) { |
||
33 | ?><a href="<?php echo $link; ?>">My link</a><?php |
||
34 | } |
||
35 | } |
||
36 | ?> |
||
37 | 1 | Max Milbers | </pre> |
38 | |||
39 | h2. SQL Formatting: |
||
40 | |||
41 | The queries should follow this format: |
||
42 | |||
43 | 10 | Max Milbers | @$q = 'SELECT `example_id` FROM `#__vm_table` WHERE `user_id`= "' . (int)$user_id . '"';@ |
44 | 1 | Max Milbers | |
45 | or if the |
||
46 | |||
47 | $user_id is an array, use $user_id["myId"] |
||
48 | |||
49 | Placing of the ` improves speed, because the sql-engine can parse faster ( and do not have to reparse). |
||
50 | |||
51 | h2. Variable Formatting: |
||
52 | |||
53 | Due abstract logic many people name their variables or database fields just "id", "key", "value" and so on. |
||
54 | |||
55 | In our case we want to rewrite the structure of an old code, therefore it is very important to find the variable in the code rather fields in the database. |
||
56 | |||
57 | So we want a kind of this: <classname><tablename>variable like here |
||
58 | |||
59 | $vendor_id or $payment_method_id |
||
60 | |||
61 | Exception from this rule is the use of ordering and published. Ordering and published with 0 and 1 as values are useable with the joomla standard methods. |
||
62 | |||
63 | h2. Filename Formatting: |
||
64 | |||
65 | Filenames should be lowercase. |
||
66 | |||
67 | Models filenames (mymodel.php), view direcorynames (myview), all helper files and probably all other files loaded by the Joomla Framework, must be lowercase, no matter how you load the file: |
||
68 | |||
69 | @$this->loadHelper('adminMenu'); // looks for the file helpers/adminmenu.php@ |
||
70 | |||
71 | More complex filenames that are specific to your task and loaded by your own code (using require_once()), e.g. mySpecificClass.php, can be camelcase. |
||
72 | |||
73 | Read this article for more info http://docs.joomla.org/Talk:Developing_a_Model-View-Controller_Component_-_Part_1#Use_lowercase_file_and_folder_names_in_your_components.21 |
||
74 | |||
75 | h2. URL Requests: |
||
76 | |||
77 | As written in the section __Filename Formatting__ above, Joomla requires lowercase filenames. However, URL requests are not lowercased by Joomla. In order to find the proper views and controllers, make sure you use lowercase only in requests, e.g.: |
||
78 | |||
79 | $this->setRedirect('index.php?option=com_virtuemart&view=updatesMigration', $msg); // Fails |
||
80 | $this->setRedirect('index.php?option=com_virtuemart&view=updatesmigration', $msg); // Works |
||
81 | |||
82 | |||
83 | h2. Character Encoding: |
||
84 | |||
85 | 11 | Max Milbers | Like in joomla we use UTF-8, without BOM. Please ensure the right character set in your IDE. |
86 | 2 | Max Milbers | |
87 | 6 | Max Milbers | h2. Path constants |
88 | 1 | Max Milbers | |
89 | 6 | Max Milbers | Always use: |
90 | |||
91 | JPATH_VM_SITE for the frontend (points to JPATH_SITE.DS.'components'.DS.'com_virtuemart') |
||
92 | 1 | Max Milbers | JPATH_VM_ADMINISTRATOR for the backend (points to JPATH_SITE.DS.'components'.DS.'com_virtuemart') |
93 | |||
94 | This is important for performance and that all pieces of code work in every application that means, plugins, modules and so on. |
||
95 | |||
96 | 7 | Max Milbers | h1. Database tables and fields |
97 | |||
98 | h2. Naming convention |
||
99 | |||
100 | In general we follow now the nooku conventions for naming tables and fields (http://nooku.assembla.com/spaces/nooku-framework/wiki/KDatabase). |
||
101 | |||
102 | All tables must start with the component name, here virtuemart => #__virtuemart_ and be lowercase. |
||
103 | |||
104 | All non xref tables should use plural. Don't use underscore to make long words readable. Concat them like the germans do, for exampel: |
||
105 | vm_user_info => virtuemart_userinfos, vm_admin_menu => virtuemart_adminmenu, vm_payment_method => virtuemart_paymentmethods, ... |
||
106 | |||
107 | All xref tables are now added with underscore, the use of singular or plural gives a hint on the kind of the xref. |
||
108 | For exampel the xref table linking products to categories looks like #__virtuemart_product_categories. Or the hardcore exampel category_categories :-). |
||
109 | |||
110 | Next is to consider that all primary keys should be always the table name in singular + id on it. Look on this as exampel |
||
111 | |||
112 | 8 | Max Milbers | CREATE TABLE IF NOT EXISTS `#__virtuemart_product_categories` ( |
113 | 7 | Max Milbers | `virtuemart_product_id` int(11) NOT NULL DEFAULT '0', |
114 | `virtuemart_category_id` int(11) NOT NULL DEFAULT '0', |
||
115 | |||
116 | |||
117 | 1 | Max Milbers | h2. Standard publishing fields use: |
118 | 9 | Max Milbers | |
119 | 7 | Max Milbers | Except the published field we use now the nooku conventions. So we use |
120 | 1 | Max Milbers | |
121 | 7 | Max Milbers | `ordering` tinyint(2) NOT NULL, |
122 | `shared` tinyint(1) NOT NULL, |
||
123 | `published` tinyint(1) NOT NULL DEFAULT '1', |
||
124 | `created_on` datetime NOT NULL default '0000-00-00 00:00:00', |
||
125 | `created_by` int(11) NOT NULL DEFAULT 0, |
||
126 | `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', |
||
127 | `modified_by` int(11) NOT NULL DEFAULT 0, |
||
128 | `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', |
||
129 | `locked_by` int(11) NOT NULL DEFAULT 0, |
||
130 | |||
131 | 2 | Max Milbers | - publish_up and publish_down formatted in the db as datetime with standard 0000-00-00 00:00:00 |
132 | |||
133 | The standard query is then |
||
134 | |||
135 | 5 | Max Milbers | @ $db = &JFactory::getDBO(); |
136 | $this->_nullDate = $db->getNullDate(); |
||
137 | $this->_now = JFactory::getDate()->toMySQL(); |
||
138 | |||
139 | $query = 'SELECT * FROM `#__sometable` WHERE yourexampel ="myexampelvalue" AND '; |
||
140 | $query .= ' ( publish_up = '.$this->_db->Quote($this->_nullDate).' OR publish_up <= '.$this->_db->Quote($this->_now).' )' . |
||
141 | ' AND ( publish_down = '.$this->_db->Quote($this->_nullDate).' OR publish_down >= '.$this->_db->Quote($this->_now).' ) '; @ |