cc9449053887cedc2fa59842df27f7ec33eaf284
[living-lab-site.git] / application / libraries / Content.class.php
1 <?php
2 require_once('includes.inc.php');
3 require_once('util.inc.php');
4
5 /** 
6 * Handles information from database
7 */
8 class Content
9 {
10         protected $db;
11         protected $languages;
12         protected $content;
13         protected $lang;
14
15         public function __construct($namespace)
16         {
17                 try {
18                         $this->db = SingletonDB::connect();
19                         
20                         // Get languages from DB.
21                         if(!$this->db->query("SET NAMES 'utf8'")) throw new DBException('query');
22                         if( !($result = $this->db->query("SELECT * FROM `languages`")) )
23                                 throw new DBException('query');
24                         while($row = $result->fetch_assoc())
25                         {
26                                 $this->languages[$row['code']]['name'] = $row['name'];
27                                 $this->languages[$row['code']]['img'] = $row['image'];
28                         }
29                         
30                         // Set current language
31                         // TODO: language
32                         $matchedLang = DEFAULT_LANG;//$this->matchLanguage();
33                         if(isset($_GET['lang']))
34                         {
35                                 $lang = $this->processLangCode($_GET['lang']);
36                                 $this->lang = $lang;
37                                 if($lang != $matchedLang)
38                                         setcookie("lang", $lang, time() + 30*24*60*60);
39                                 else
40                                         setcookie("lang", $lang, time() - 3600);
41                         }
42                         else if(isset($_COOKIE['lang']))
43                                 $this->lang = $this->processLangCode($_COOKIE['lang']);
44                         else
45                                 $this->lang = $matchedLang;
46                         
47                         // Get content from DB, from common and specified namespace.
48                                 if( !($result = $this->db->query("SELECT * FROM `content` WHERE namespace = 'common' OR namespace = '" 
49                                         . $namespace . "'")) )
50                                 throw new DBException('query');
51                         while($row = $result->fetch_assoc())
52                         {
53                                 $this->content[$row['name']] = json_decode($row['value'], true);
54                         }
55                 
56                 }
57                 catch(DBException $e) {
58                         echo $e->errorMessage();
59                         die();
60                 }
61         }
62         
63         // Verifies if the lang code exists in the database and if so it returns it
64         // in lower case. It not it returns the default language.
65         public function processLangCode($lang)
66         {
67                 $lang = strtolower($lang);
68                 if(isset($this->languages[$lang]))
69                         return $lang;
70                 else
71                         return DEFAULT_LANG;
72         }
73         
74         public function getLanguages()
75         {
76                 return $this->languages;
77         }
78         
79         public function getLanguage($code)
80         {
81                 if(isset($this->languages[$code]))
82                         return $this->languages[$code];
83                 else
84                         return null;
85         }
86         
87         public function getCrtLanguage()
88         {
89                 return $this->lang;
90         }
91         
92         public function getContent($name, $lang)
93         {
94                 if(isset($this->content[$name]))
95                         return $this->content[$name][$lang];
96                 else
97                         return null;
98         }
99         
100         public function __get($name)
101         {
102                 if(isset($this->content[$name]))
103                         return $this->content[$name][$this->lang];
104                 else
105                         return null;
106         }
107         
108         // Returns user's prefered language if the site supports it or english otherwise.
109         public function matchLanguage()
110         {
111                 $pattern = '/^(?P<primarytag>[a-zA-Z]{2,8})'.
112     '(?:-(?P<subtag>[a-zA-Z]{2,8}))?(?:(?:;q=)'.
113     '(?P<quantifier>\d\.\d))?$/';
114                 
115                 foreach (explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $lang) 
116                 {
117                         $splits = array();
118
119                         if (preg_match($pattern, $lang, $splits)) 
120                         {
121                                 $language = $splits['primarytag'];
122                                 if(isset($this->languages[$language]))
123                                         return $language;
124                         } 
125                         else 
126                                 return 'en';
127                 }
128                 
129                 return 'en';
130         }
131
132         public function isRowIncomplete($row)
133         {
134                 $incomplete = '';
135
136                 if(empty($row['name']))
137                         $incomplete .= 'n';
138                 if(empty($row['address']))
139                         $incomplete .= 'a';
140                 if(empty($row['developer']))
141                         $incomplete .= 'd';
142                 if(empty($row['chief_architect']))
143                         $incomplete .= '{ca}';
144                 if($row['whole_area'] == null || $row['whole_area'] == '0000')
145                         $incomplete .= '{wa}';
146                 if(empty($row['height']))
147                         $incomplete .= 'h';
148                 if(empty($row['phase']))
149                         $incomplete .= '{ph}';
150                 if($row['year_begin'] == null)
151                         $incomplete .= '{yb}';
152
153                 $descriptions = json_decode($row['description'], true);
154                 foreach($this->getLanguages() as $code => $value)
155                 {
156                         if(empty($descriptions[$code]))
157                                 $incomplete .= '{de}';
158                 }
159
160                 $images = json_decode($row['images'], true);
161                 if(count($images) < 1)
162                         $incomplete .= 'i';
163                 
164                 return $incomplete;
165         }
166         
167         // Returns a list of buildings with a specified category as an 
168         // associative array with ID keys. Every element has associated:
169         // name, year_begin, image (thumbnail).
170         public function getPortofolioSummary($category, $page, $checkIncomplete=false)
171         {
172                 $portofolio = null;
173
174                 if(!$checkIncomplete)
175                         $columns = "id, name, year_begin, images, category";
176                 else
177                         $columns = "*";
178                 
179                 $query = "SELECT ". $columns. " FROM `portofolio`";
180                 if($category != null)
181                         $query .= " WHERE category = '". $category . "'";
182                 $query .= " ORDER BY year_begin DESC, name ASC";
183                 if($page != null)
184                         $query .= " LIMIT ". ($page * PRJ_PER_PAGE) . ", " . PRJ_PER_PAGE;
185                 $result = $this->db->query($query);
186                         
187                 while($row = $result->fetch_assoc())
188                 {
189                         $portofolio[$row['id']]['name'] = $row['name'];
190                         $portofolio[$row['id']]['year_begin'] = $row['year_begin'];
191                         $images = json_decode($row['images'], true);
192                         if(!$images)
193                                 $portofolio[$row['id']]['image'] = null;
194                         else
195                                 $portofolio[$row['id']]['image'] = getThumbFileName($images[0]);
196                         $portofolio[$row['id']]['category'] = $row['category'];
197
198                         if($checkIncomplete)
199                                 $portofolio[$row['id']]['incomplete'] = $this->isRowIncomplete($row);
200                 }
201                 
202                 return $portofolio;
203         }
204         
205         // Returns 3 dictionaries representing projects from portofolio.
206         // Each dictionary has id as key and another dictionary as value with:
207         // name, year_begin, description, thumnail.
208         public function getPortofolioAds()
209         {
210                 $portofolio = null;
211                 
212                 $query = "SELECT id, name, year_begin, description, images FROM `portofolio` ORDER BY RAND() LIMIT "
213                         . P_ADS_COUNT;
214                 $result = $this->db->query($query);
215                         
216                 while($row = $result->fetch_assoc())
217                 {
218                         $portofolio[$row['id']]['name'] = $row['name'];
219                         $portofolio[$row['id']]['year_begin'] = $row['year_begin'];
220                         $images = json_decode($row['images'], true);
221                         if(!$images)
222                                 $portofolio[$row['id']]['image'] = null;
223                         else
224                                 $portofolio[$row['id']]['image'] = getThumbFileName($images[0]);
225                         $descriptions = json_decode($row['description'], true);
226                         $portofolio[$row['id']]['description'] = $descriptions[$this->lang];
227                 }
228                 
229                 return $portofolio;
230         }
231         
232         public function getPortofolioCardinality($category)
233         {
234                 $query = "SELECT count(id) c FROM `portofolio` WHERE category = '". $category. "'";
235                 $result = $this->db->query($query);
236                 
237                 $row = $result->fetch_row();
238                 if($row)
239                         return $row[0];
240         }
241         
242         public function getRowNumber($id, $category)
243         {
244                 $query = "
245 SELECT id id_t, name name_t, year_begin year_begin_t, (
246
247         SELECT COUNT( * ) 
248         FROM  `portofolio` 
249         WHERE category =  '". $category. "'
250         AND id <> id_t
251         AND (year_begin = year_begin_t AND name < name_t OR year_begin > year_begin_t)
252         ORDER BY year_begin DESC , name ASC
253 ) pos
254 FROM  `portofolio` 
255 WHERE id = ". $id;
256                 $result = $this->db->query($query);
257                 
258                 $row = $result->fetch_assoc();
259                 if($row)
260                         return $row['pos'];
261         }
262
263         // If fullInfo is true, information for all languages will be returned.
264         public function getProject($id, $fullInfo = false)
265         {
266                 $result = $this->db->query(
267                         "SELECT * from `portofolio` WHERE id = " . $id);
268                 $row = $result->fetch_assoc();
269                 
270                 if(!$row)
271                         return null;
272                 
273                 $row['category_code'] = $row['category'];
274                 switch($row['category_code'])
275                 {
276                 case 'office':
277                         $row['category'] = $this->project_category_office;
278                         break;
279                 case 'residential':
280                         $row['category'] = $this->project_category_residential;
281                         break;
282                 case 'hotel':
283                         $row['category'] = $this->project_category_hotel;
284                         break;
285                 case 'industrial':
286                         $row['category'] = $this->project_category_industrial;
287                         break;
288                 case 'commercial':
289                         $row['category'] = $this->project_category_commercial;
290                         break;
291                 case 'restorations':
292                         $row['category'] = $this->project_category_restorations;
293                         break;
294                 case 'hospitals':
295                         $row['category'] = $this->project_category_category;
296                         break;
297                 default: // other
298                         $row['category'] = $this->project_category_other;
299                         break;
300                 }
301
302                 // Translate NULL values.
303                 if(!isset($project['whole_area']) || $project['whole_area'] == null)
304                         $project['whole_area'] = '';
305                 if(!isset($project['year_begin']) || $project['year_begin'] == null)
306                         $project['year_begin'] = '';
307                 if(!isset($project['year_end']) || $project['year_end'] == null)
308                         $project['year_end'] = '';
309                 
310                 $descriptions = json_decode($row['description'], true);
311                 $row['description'] = $descriptions[$this->lang];
312                 if($fullInfo)
313                         $row['descriptions'] = $descriptions;
314                 
315                 $images = json_decode($row['images'], true);
316                 $row['images'] = $images;
317
318                 return $row;
319         }
320         
321         public static function insertProject($project)
322         {
323                 try {
324                         $db = SingletonDB::connect();
325                         
326                         $db->query("SET NAMES 'utf8'");
327                         
328                         $project['name'] = str_replace("'", "`", $project['name']);
329                         $project['description'] = json_encode(str_replace("'", "`", $project['descriptions']));
330                         $project['images'] = json_encode($project['images']);
331                         
332                         $result = $db->query(
333                                 "INSERT INTO `portofolio` (name, category, address, developer, chief_architect, whole_area, height, phase, year_begin, year_end, description, images)
334                                  VALUES ('". $project['name']. "', '". $project['category_code']. "', '". $project['address']. "', '". $project['developer']. "', '". $project['chief_architect']. "', ". $project['whole_area']. ", '". $project['height']. "', '". $project['phase']. "', ". $project['year_begin']. ", ". $project['year_end']. ", '". $project['description']. "', '". $project['images']. "')");
335                         
336                         if(!$result)
337                                 throw new DBException('query');
338                 }
339                 catch(DBException $e) {
340                         echo $e->errorMessage();
341                         die();
342                 }
343         }
344         
345         public static function updateProject($id, $project)
346         {
347                 try {
348                         $db = SingletonDB::connect();
349                         
350                         $db->query("SET NAMES 'utf8'");
351                         
352                         $project['name'] = str_replace("'", "`", $project['name']);
353                         $project['description'] = json_encode(str_replace("'", "`", $project['descriptions']));
354                         $project['images'] = json_encode($project['images']);
355                         
356                         $query = "UPDATE `portofolio` SET name='". $project['name']. "', category='". $project['category_code']. "', address='". $project['address']. "', developer='". $project['developer']. "', chief_architect='". $project['chief_architect']. "', whole_area=". $project['whole_area']. ", height='". $project['height']. "', phase='". $project['phase']. "', year_begin=". $project['year_begin']. ", year_end=". $project['year_end']. ", description='". $project['description']. "', images='". $project['images']. "' WHERE id=". $id;
357                         $result = $db->query($query);
358                         
359                         if(!$result)
360                                 throw new DBException('query');
361                 }
362                 catch(DBException $e) {
363                         echo $e->errorMessage();
364                         die();
365                 }
366         }
367
368         public static function deleteProject($id, $project)
369         {
370                 foreach($project['images'] as $image)
371                 {
372                         deleteImage($image);
373                 }
374
375                 try {
376                         $db = SingletonDB::connect();
377                         
378                         $query = "DELETE FROM `portofolio` WHERE id=". $id;
379                         $result = $db->query($query);
380                         
381                         if(!$result)
382                                 throw new DBException('query');
383                 }
384                 catch(DBException $e) {
385                         echo $e->errorMessage();
386                         die();
387                 }
388         }
389 }
390
391 //$x = new Content('common');
392 //echo $x->getRowNumber(56, 'residential');
393 ?>