Commit | Line | Data |
---|---|---|
7f254ad8 AE |
1 | <?php |
2 | ||
3 | /** | |
4 | * @file | |
5 | * Provide views data and handlers for user.module. | |
6 | * | |
7 | * @ingroup views_module_handlers | |
8 | */ | |
9 | ||
10 | /** | |
11 | * Implements hook_views_data(). | |
12 | */ | |
13 | function profile_views_data() { | |
14 | $data['profile_values']['moved to'] = 'profile_value'; | |
15 | // Define the base group of this table. Fields that don't | |
16 | // have a group defined will go into this field by default. | |
17 | $data['profile_value']['table']['group'] = t('Profile'); | |
18 | ||
19 | $data['profile_value']['table']['join'] = array( | |
20 | 'node' => array( | |
21 | 'left_table' => 'profile_value', | |
22 | 'left_field' => 'uid', | |
23 | 'field' => 'uid', | |
24 | ), | |
25 | 'users' => array( | |
26 | 'left_table' => 'profile_value', | |
27 | 'left_field' => 'uid', | |
28 | 'field' => 'uid', | |
29 | ), | |
30 | ); | |
31 | ||
32 | $fields = profile_views_get_fields(); | |
33 | foreach ($fields as $field) { | |
34 | $table_name = 'profile_value_' . str_replace('-', '_', $field->name); | |
35 | $data[$table_name] = array( | |
36 | 'table' => array( | |
37 | 'group' => t('Profile'), | |
38 | 'join' => array( | |
39 | 'node' => array( | |
40 | 'table' => 'profile_value', | |
41 | 'left_table' => 'users', | |
42 | 'left_field' => 'uid', | |
43 | 'field' => 'uid', | |
44 | 'extra' => array(array('field' => 'fid', 'value' => $field->fid)), | |
45 | ), | |
46 | 'users' => array( | |
47 | 'table' => 'profile_value', | |
48 | 'left_field' => 'uid', | |
49 | 'field' => 'uid', | |
50 | 'extra' => array(array('field' => 'fid', 'value' => $field->fid)), | |
51 | ), | |
52 | ), | |
53 | ), | |
54 | ); | |
55 | // All fields in the table are named 'value'. | |
56 | $data[$table_name]['value'] = profile_views_fetch_field($field); | |
57 | } | |
58 | ||
59 | return $data; | |
60 | } | |
61 | ||
62 | /** | |
63 | * Get all profile fields | |
64 | */ | |
65 | function profile_views_get_fields() { | |
66 | static $fields = NULL; | |
67 | ||
68 | if (!isset($fields)) { | |
69 | $fields = array(); | |
70 | $results = db_query("SELECT * FROM {profile_field} ORDER BY category, weight"); | |
71 | ||
72 | foreach ($results as $row) { | |
73 | if (!empty($row->options)) { | |
74 | if (!in_array(substr($row->options, 0, 2), array('a:', 'b:', 'i:', 'f:', 'o:', 's:', ))) { | |
75 | // unserialized fields default version | |
76 | $options = $row->options; | |
77 | unset($row->options); | |
78 | $row->options = $options; | |
79 | } | |
80 | else { | |
81 | // serialized fields or modified version | |
82 | $row->options = unserialize($row->options); | |
83 | } | |
84 | } | |
85 | $fields[$row->fid] = $row; | |
86 | } | |
87 | } | |
88 | return $fields; | |
89 | } | |
90 | ||
91 | ||
92 | /** | |
93 | * Add profile fields to view table | |
94 | */ | |
95 | function profile_views_fetch_field($field) { | |
96 | $data = array( | |
97 | 'title' => t('@category: @field-name', array('@category' => $field->category, '@field-name' => $field->title)), | |
98 | ); | |
99 | ||
100 | // Add fields specific to the profile type. | |
101 | switch ($field->type) { | |
102 | case 'textfield': | |
103 | $data += array( | |
104 | 'help' => t('Profile textfield'), | |
105 | 'field' => array( | |
106 | 'handler' => 'views_handler_field_user', | |
107 | 'click sortable' => TRUE, | |
108 | ), | |
109 | 'sort' => array( | |
110 | 'handler' => 'views_handler_sort', | |
111 | ), | |
112 | 'filter' => array( | |
113 | 'handler' => 'views_handler_filter_string', | |
114 | ), | |
115 | 'argument' => array( | |
116 | 'handler' => 'views_handler_argument_string', | |
117 | ), | |
118 | ); | |
119 | ||
120 | break; | |
121 | case 'textarea': | |
122 | $data += array( | |
123 | 'help' => t('Profile textarea'), | |
124 | 'field' => array( | |
125 | 'handler' => 'views_handler_field_markup', | |
126 | 'format' => filter_default_format(), | |
127 | ), | |
128 | 'sort' => array( | |
129 | 'handler' => 'views_handler_sort', | |
130 | ), | |
131 | 'filter' => array( | |
132 | 'handler' => 'views_handler_filter_string', | |
133 | ), | |
134 | ); | |
135 | ||
136 | break; | |
137 | case 'checkbox': | |
138 | $data += array( | |
139 | 'help' => t('Profile checkbox'), | |
140 | 'field' => array( | |
141 | 'handler' => 'views_handler_field_boolean', | |
142 | 'click sortable' => TRUE, | |
143 | ), | |
144 | 'sort' => array( | |
145 | 'handler' => 'views_handler_sort', | |
146 | ), | |
147 | 'filter' => array( | |
148 | 'handler' => 'views_handler_filter_boolean_operator', | |
149 | 'accept null' => TRUE, | |
150 | ), | |
151 | // @todo there ought to be a boolean argument handler | |
152 | ); | |
153 | ||
154 | break; | |
155 | case 'url': | |
156 | $data += array( | |
157 | 'help' => t('Profile URL'), | |
158 | 'field' => array( | |
159 | 'handler' => 'views_handler_field_url', | |
160 | 'click sortable' => TRUE, | |
161 | ), | |
162 | 'sort' => array( | |
163 | 'handler' => 'views_handler_sort', | |
164 | ), | |
165 | 'filter' => array( | |
166 | 'handler' => 'views_handler_filter_string', | |
167 | ), | |
168 | ); | |
169 | ||
170 | break; | |
171 | case 'selection': | |
172 | $data += array( | |
173 | 'help' => t('Profile selection'), | |
174 | 'field' => array( | |
175 | 'handler' => 'views_handler_field', | |
176 | 'click sortable' => TRUE, | |
177 | ), | |
178 | 'sort' => array( | |
179 | 'handler' => 'views_handler_sort', | |
180 | ), | |
181 | 'filter' => array( | |
182 | 'handler' => 'views_handler_filter_profile_selection', | |
183 | 'fid' => $field->fid, | |
184 | ), | |
185 | 'argument' => array( | |
186 | 'handler' => 'views_handler_argument_string', | |
187 | ), | |
188 | ); | |
189 | ||
190 | break; | |
191 | case 'list': | |
192 | $data += array( | |
193 | 'help' => t('Profile freeform list %field-name.', array('%field-name' => $field->title)), | |
194 | 'field' => array( | |
195 | 'handler' => 'views_handler_field_profile_list', | |
196 | 'no group by' => TRUE, | |
197 | ), | |
198 | 'filter' => array( | |
199 | 'handler' => 'views_handler_filter_string', | |
200 | ), | |
201 | ); | |
202 | ||
203 | break; | |
204 | case 'date': | |
205 | $data += array( | |
206 | 'help' => t('Profile date %field-name.', array('%field-name' => $field->title)), | |
207 | 'field' => array( | |
208 | 'handler' => 'views_handler_field_profile_date', | |
209 | ), | |
210 | ); | |
211 | ||
212 | break; | |
213 | } | |
214 | ||
215 | // @todo: add access control to hidden fields. | |
216 | return $data; | |
217 | } |