_phone_mobile' => 'Mobilais tālrunis', 'field_title_town' => 'Pilsēta', 'field_title_address' => 'Adrese', 'field_title_post_code' => 'Pasta indekss', 'field_title_email' => 'E-pasta adrese', 'field_title_url' => 'Mājas lapa', 'field_title_district' => 'Novads', 'field_title_album' => 'Albums', 'field_title_not_keyword' => 'Objekta nosaukums kā atslēgvārds', 'field_not_keyword_label' => 'neizmantot šo objektu kā atslēgvārdu', 'latitude' => 'Ģeogrāfiskais platums (N)', 'longitude' => 'Ģeogrāfiskais garums (E)', 'coordinates' => 'Koordinātes', 'phones' => 'Telefoni', 'phone' => 'Tel.', 'mobile' => 'Mob. tel.', 'surroundings' => 'Apkārtne', 'your_rating' => 'Novērtēt', 'rating' => 'Vērtējums', 'district' => 'Novads', 'categories' => 'Piedāvātie pakalpojumi', 'more_information' => 'Vairāk informācijas', 'send_as_pdf_to_email' => 'Nosūtīt lapu kā PDF pielikumu uz e-pastu', 'download_pdf' => 'Lejupielādēt lapu kā PDF failu', 'object_pdfs' => 'Objektu PDF faili', 'object_pdf' => 'Informācijas nosūtīšana uz e-pastu', 'pdf_subject_before' => 'Informācija par', 'pdf_subject_after' => '', 'from' => 'Jūsu e-pasts', 'your_name' => 'Jūsu vārds', 'to' => 'Saņēmēja e-pasts', 'subject' => 'Tēma', 'message' => 'Teksts', 'send' => 'Nosūtīt', 'sender' => 'Sūtītājs', 'time' => 'Nosūtīšanas laiks', 'sender_ip' => 'Sūtītāja IP', 'confirmed_ip' => 'Apstiprinātāja IP', 'confirmed_at' => 'Apstiprināšanas laiks', 'from_required' => 'Jānorāda sūtītāja adrese', 'to_required' => 'Jānorāda saņēmēja adrese', 'sender_required' => 'Jānorāda sūtītāja vārds', 'invalid_from_address' => 'Nepareizi norādīta sūtītāja adrese', 'invalid_to_address' => 'Nepareizi norādīta saņēmēja adrese', 'confirmation' => 'Apstiprinājums', 'confirmation_sent' => 'Uz jūsu e-pasta adresi ir nosūtīta vēstule ar apstiprinājuma kodu. Lai nosūtītu PDF failu adresātam, sekojiet vēstules instrukcijām.', 'confirmation_email_subject' => 'PDF faila sūtīšanas apstiprinājums', 'confirmation_email_before_portal' => 'Jūs vai kāds cits pieprasīja PDF faila sūtīšanu portālā', 'confirmation_email_before_from' => 'no adreses', 'confirmation_email_before_to' => 'uz adresi', 'confirmation_email_before_subject' => 'ar tēmu', 'confirmation_email_before_link' => 'Lai nosūtītu PDF failu, atveriet šajā vēstulē norādīto adresi. Ja nevēlaties sūtīt failu, jums nekas nav jādara.', 'confirmation_email_after_link' => '', 'confirmation_email_ip' => 'PDF faila sūtīšana tika pieprasīta no IP adreses', 'pdf_email_subject' => 'PDF fails', 'pdf_email_before_portal' => 'Jums ir nosūtīta informācija portālā', 'pdf_email_before_from' => 'no adreses', 'pdf_email_before_subject' => 'ar tēmu', 'pdf_email_before_text' => 'Vēstules teksts:', 'pdf_email_after_text' => '', 'pdf_email_ip' => 'Fails tika nosūtīts no IP adreses', 'pdf_email_confirmed_ip' => 'un apstiprināts no', 'sending_confirmation_failed' => 'Neizdevās nosūtīt apstiprinājuma vēstuli', 'sending_card_failed' => 'Neizdevās nosūtīt vēstuli ar PDF failu', 'sid_not_found' => 'PDF fails ar šādu kodu nav atrasts', 'sid_already_confirmed' => 'Šī PDF faila sūtīšana jau ir apstiprināta', 'pdf_sent' => 'Informāciju par objektu ir nosūtīta adresātam', ), ); $this->_string_namespaces = array('0' => 'Objects:/@', '1' => ':/objects/@', ); $this->_class_name = 'f_Objects_objects__folder'; class f_Objects_objects__folder extends dgFolder { private $search_fields = null; function init() { $ignored = dingo::stringToArray($this->ignore_categories); $this->categories = array_diff(array( 'bathhouse', 'camping', 'conference_premise', 'craft', 'cultural_history', 'internet_access', 'meal_place', 'museum', 'nature', 'overnight_countryside', 'overnight_town', 'relax_water', 'riding', 'recreation', 'spa' ), $ignored); $this->descriptions = array( 'camping' => 'description', 'cultural_history' => 'description', 'museum' => 'permanent_exposition', 'nature' => 'description', 'other_offer' => 'description', 'overnight_countryside' => 'places_description', 'overnight_town' => 'rooms_description', 'relax_water' => 'description', 'riding' => 'description', 'recreation' => 'description', ); } function getObjectsById($id, $limit=null) { $lang = $this->getDataLanguage(); $sql = 'SELECT objects.*'; foreach ($this->categories as $i => $category) { $sql .= ','. $category .'.id AS '. $category .'_id'; } $sql .= ', (SELECT SUM(rating)/COUNT(*) FROM object_ratings WHERE object_id=objects.id) AS rating'; $sql .= ' FROM objects'; foreach ($this->categories as $i => $category) { $sql .= ' LEFT JOIN ' . $category; $sql .= ' ON ' . $category . '.id=objects.id'; $sql .= ' AND '. $category .'.published_at_'. $lang .' IS NOT NULL'; } $sep = ' WHERE '; if (is_array($id)) { $ids = array_filter(array_map('intval', $id)); $sql .= $sep . 'objects.id IN (' . implode(',', $ids) . ')'; } else { $sql .= $sep . 'objects.id=' . intval($id); } $sep = ' AND '; $sql .= $sep . 'objects.published_at_' . $lang . ' IS NOT NULL'; // // $sql .= ' ORDER BY name'; // if ($limit) { // $sql .= ' LIMIT ' . $limit; // } // if ($offset) { // $sql .= ' OFFSET ' . $offset; // } $db = $this->getDatabase(); $items = array(); $res = $db->query($sql); if (!$db->isError($res)) { while ($row = $res->fetchRow()) { // if (!$row['name']) { // $row['name'] = $row['id']; // } $items[] = $row; } } return $items; } function getObjects($ids, $draft=false, $rating=false, $limit=null, $offset=null) { $db = $this->getDatabase(); $sql = $this->getSelectObjectsSql($draft, $rating); if (is_array($ids)) { $ids = array_filter(array_map('intval', $ids)); if (!$ids) { return array(); } $sql .= 'o.id IN (' . implode(',', $ids) . ')'; } else { $sql .= 'o.id=' . intval($ids); } // // $order = $this->getSearchOrder(); // if ($order) { // $sql .= ' ORDER BY ' . $order; // } $limit = intval($limit); if ($limit) { $sql .= ' LIMIT ' . $limit; } $offset = intval($offset); if ($offset) { $sql .= ' OFFSET ' . $offset; } $items = array(); $res = $db->query($sql); if (!$db->isError($res)) { while ($row = $res->fetchRow()) { $items[] = $row; } } return $items; } function countObjectsBySearch($search) { $lang = $this->getDataLanguage(); $db = $this->getDatabase(); $sql = 'SELECT count(*) FROM objects'; foreach ($this->categories as $i => $category) { $sql .= ' LEFT JOIN ' . $category; $sql .= ' ON ' . $category . '.id=objects.id'; $sql .= ' AND '. $category .'.published_at_'. $lang .' IS NOT NULL'; } $sep = ' WHERE '; if ($search) { $sql .= $sep . $search; $sep = ' AND '; } $sql .= $sep . 'objects.published_at_' . $lang . ' IS NOT NULL'; $total = $db->getOne($sql); if ($db->isError($this->total)) { throw new dgRenderingHalted; } return $total; } function countSearchObjects($draft=false) { $db = $this->getDatabase(); $sql = $this->getSelectObjectsSql($draft, false, false, true); list($where, $qs, $qsa) = $this->parseSearch($draft); if ($where) { $sql .= $where; } else { $sql .= '1=1'; } $total = $db->getOne($sql); if ($total && $db->isError($total)) { throw new dgRenderingHalted; } return $total; } function getObjectsBySearch($search, $order=null, $limit=null, $offset=null) { $_ = $this->Strings; $lang = $this->getDataLanguage(); $model = $this->getModel('object'); $db = $this->getDatabase(); $sql = 'SELECT '; $sep = ''; foreach ($model->fields as $name => $def) { $type = $def['type']; if ($type == 'has_and_belongs_to_many') { continue; } if ($type == 'belongs_to' || $type == 'has_one') { $sql .= $sep .'objects.'. $def['field'] .'_id'; } elseif (isset($def['multilang']) && $def['multilang']) { $sql .= $sep .'objects.'. $def['field'] .'_'. $lang .' AS '. $name; } else { $sql .= $sep .'objects.'. $def['field']; } $sep = ','; } foreach ($this->categories as $i => $category) { $sql .= ','. $category .'.id AS '. $category .'_id'; } $sql .= ', (SELECT SUM(rating)/COUNT(*) FROM object_ratings WHERE object_id=objects.id) AS rating'; $sql .= ' FROM objects'; foreach ($this->categories as $i => $category) { $sql .= ' LEFT JOIN ' . $category; $sql .= ' ON ' . $category . '.id=objects.id'; $sql .= ' AND '. $category .'.published_at_'. $lang .' IS NOT NULL'; } $sep = ' WHERE '; if ($search) { $sql .= $sep . $search; $sep = ' AND '; } $sql .= $sep . 'objects.published_at_' . $lang . ' IS NOT NULL'; $sql .= ' ORDER BY name'; if ($limit) { $sql .= ' LIMIT ' . $limit; } if ($offset) { $sql .= ' OFFSET ' . $offset; } $items = array(); $res = $db->query($sql); if (!$db->isError($res)) { while ($row = $res->fetchRow()) { if (!$row['name']) { $row['name'] = $row['id']; } $addr = implode(', ', array_filter(array($row['address'], $row['town'], $row['post_code']))); $row['address_string'] = $addr; $phones = ''; $sep = ''; if ($row['phone']) { $phones .= $_->PHONE . ' ' . $row['phone']; $sep = '. '; } if ($row['phone_mobile']) { $phones .= $sep . $_->MOBILE . ' ' . $row['phone_mobile']; } $row['phones_string'] = $phones; $lst = array(); $cats = array(); foreach ($this->categories as $category) { if ($row[$category . '_id']) { $lst[] = $_->get($category); $cat = array(); $cat['name'] = $category; $cat['label'] = $_->get($category); $cats[] = $cat; } } $row['categories'] = $cats; $row['categories_string'] = implode(', ', $lst); $items[] = $row; } } return $items; } function searchObjects($draft=false, $rating=false, $catdesc=false, $limit=null, $offset=null) { $db = $this->getDatabase(); $sql = $this->getSelectObjectsSql($draft, $rating, $catdesc); list($where, $qs, $qsa) = $this->parseSearch($draft); if ($where) { $sql .= $where; } else { $sql .= '1=1'; } if ($draft) { $order = 'name'; } else { $order = $this->getSearchOrder(); } if ($order) { $sql .= ' ORDER BY ' . $order; } $limit = intval($limit); if ($limit) { $sql .= ' LIMIT ' . $limit; } $offset = intval($offset); if ($offset) { $sql .= ' OFFSET ' . $offset; } $items = array(); $res = $db->query($sql); if (!$db->isError($res)) { while ($row = $res->fetchRow()) { $items[] = $row; } } return $items; } function getSearchOrder() { $data = $this->Data; $order = $data->takeInt('o'); if ($order == 1) { return 'rating DESC,name'; } return 'ranking DESC,name'; } function prepareObjectData($item) { $lang = $this->getDataLanguage(); $_ = $this->Strings; if (!isset($item['name']) || !$item['name']) { $item['name'] = $item['id']; } $address = array(); $address[] = trim(isset($item['address']) ? $item['address'] : ''); $address[] = $town = trim(isset($item['town']) ? $item['town'] : ''); $district = trim(isset($item['district']) ? $item['district'] : ''); if ($town != $district) { if (isset($item['district2']) && $item['district2']) { $address[] = trim($item['district2']); } else { $address[] = $district; } } $address[] = trim(isset($item['post_code']) ? $item['post_code'] : ''); $item['address_string'] = implode(', ', array_filter($address)); $phones = ''; $sep = ''; if (isset($item['phone']) && $item['phone']) { $phones .= $_->PHONE . ' ' . $item['phone']; $sep = '. '; } if (isset($item['phone_mobile']) && $item['phone_mobile']) { $phones .= $sep . $_->MOBILE . ' ' . $item['phone_mobile']; } $item['phones_string'] = $phones; $tmp = str_replace(';', ',', isset($item['url']) ? $item['url'] : ''); if ($tmp) { $urls = array(); foreach (dingo::stringToArray($tmp) as $url) { if (substr($url, 0, 5) != 'http:') { $url = 'http://' . $url; } $urls[] = $url; } $item['url_array'] = $urls; } $email = isset($item['email']) ? $item['email'] : ''; $email = str_replace(';', ',', $email); $emails = array(); foreach (dingo::stringToArray($email) as $email) { $emails[] = array( 'link' => 'mailto:' . $email, 'label' => htmlspecialchars($email), ); } $item['email_array'] = $emails; $labels = array(); $categories = array(); foreach ($this->categories as $catname) { if (isset($item[$catname . '_id']) && $item[$catname . '_id']) { $label = $_->get($catname); $labels[] = $label; $category = array(); $category['name'] = $catname; $category['label'] = $label; $categories[] = $category; } } $item['categories'] = $categories; $item['categories_string'] = implode(', ', $labels); $lat = $long = null; if ($item['latitude_d']) { $lat = $item['latitude_d'] . '°'; $lat .= $item['latitude_m'] . '\''; if ($item['latitude_s'] !== null) { $lat .= $item['latitude_s'] . '"'; } $item['latitude_string'] = $lat; } if ($item['longitude_d']) { $long = $item['longitude_d'] . '°'; $long .= $item['longitude_m'] . '\''; if ($item['longitude_s'] !== null) { $long .= $item['longitude_s'] . '"'; } $item['longitude_string'] = $long; } if ($lat && $long) { $item['coordinates'] = $lat . ' N, ' . $long . ' E'; } return $item; } function getSelectObjectsSql($draft=false, $rating=false, $catdesc=false, $count=false) { $data = $this->Data; $lang = $this->getDataLanguage(); if ($count) { $sql = 'SELECT COUNT(*)'; } else { $model = $this->getModel('object'); $sql = 'SELECT '; $fields = array(); foreach ($model->fields as $name => $def) { // if ($def['hidden']) { // continue; // } $type = $def['type']; if ($type == 'has_and_belongs_to_many') { continue; } if ($draft && ($def['field'] == 'published_at') || ($def['field'] == 'published_by')) { continue; } if ($type == 'belongs_to' || $type == 'has_one') { $fields[] = 'o.'. $def['field'] .'_id'; } elseif (isset($def['multilang']) && $def['multilang']) { $fields[] = 'o.'. $def['field'] .'_'. $lang .' AS '. $name; } else { $fields[] = 'o.'. $def['field']; } } if ($fields) { $sql .= implode(',', $fields); } else { $sql .= '*'; } $curcat = null; if ($catdesc && $data->takeInt('a') != 1) { $curcat = $data->takeInt('c'); } $cats = array(); foreach ($this->categories as $i => $category) { $sql .= ',' . $category; if ($draft) { $sql .= '_drafts'; } $sql .= '.id AS ' . $category . '_id'; if ($catdesc) { if ($curcat == $i+1 || (!$curcat && $data->takeBool('c_' . $i))) { $cats[] = $category; } } } if ($catdesc && count($cats) == 1) { $category = $cats[0]; $descr = isset($this->descriptions[$category]) ? $this->descriptions[$category] : null; if ($descr) { $sql .= ',' . $category; if ($draft) { $sql .= '_drafts'; } $sql .= '.' . $descr .'_'. $lang . ' AS cat_description'; } } if ($rating) { $sql .= ',(SELECT SUM(rating)/COUNT(*) FROM object_ratings'; $sql .= ' WHERE object_id=o.id) AS rating'; } if (!$count) { $langs = $this->Site->languages; if ($langs) { $def_lang = $langs[0]; } else { $def_lang = 'en'; } $sql .= ', d.name_' . $def_lang . ' AS district'; $sql .= ', d.name2 AS district2'; } } $sql .= ' FROM object'; if ($draft) { $sql .= '_draft'; } $sql .= 's o'; if (!$count) { $sql .= ' LEFT JOIN districts d ON d.id=o.district_id'; } foreach ($this->categories as $i => $category) { $table = $category; if ($draft) { $table .= '_drafts'; } $sql .= ' LEFT JOIN ' . $table; $sql .= ' ON ' . $table . '.id=o.id'; if (!$draft) { $sql .= ' AND '. $table .'.published_at_'. $lang .' IS NOT NULL'; } } $sql .= ' WHERE '; if (!$draft) { $sql .= 'o.published_at_' . $lang . ' IS NOT NULL AND '; } return $sql; } function parseCriteria($draft=false, $data=null) { $request = $this->Site->request; $data = $this->Data; $db = $this->getDatabase(); $lang = $this->getDataLanguage(); $params = array(); $conditions = array(); // categories $cond = array(); $ids = array(); foreach ($this->categories as $i => $category) { $table = $category; if ($draft) { $table .= '_drafts'; } if ($data->takeBool('f_category_' . $i)) { $cond[] = $table . '.id IS NOT NULL'; $params[] = 'f_category_' . $i . '=on'; $ids[] = $i; } } $data->setInt('f_category', $ids); if ($cond) { $conditions[] = '(' . implode(' OR ', $cond) . ')'; } // districts if ($district = $data->takeInt('f_district')) { $conditions[] = 'objects.district_id=' . $db->quote($district); $params[] = 'f_district=' . $district; } // common text fields $text_fields = array( 'objects.name_' . $lang, 'objects.address', 'objects.phone' ); // dynamic fields if ($data->takeInt('adv') == 1) { foreach ($this->getSearchFields() as $field) { $ftype = $field['type']; $mname = $field['search_model']; if ($draft) { $mname .= '_draft'; } $model = $this->getModel($mname); $fname = $model->table; //if ($draft) { // $fname .= '_drafts'; //} $fprefix = $fname . '.'; $fname .= '.' . $field['search_field']; // include in common text search if (in_array($ftype, array('char', 'varchar', 'text')) && $field['search_type'] == 1) { if (isset($field['multilang']) && $field['multilang']) { $text_fields[] = $fname . '_' . $lang; } else { $text_fields[] = $fname; } continue; } $filter = $field['search_model'] .'__'. $field['search_field']; if (!$data->takeBool('f_' . $filter . '_on')) { continue; } $params[] = 'f_' . $filter . '_on=on'; switch ($ftype) { case 'char': case 'varchar': case 'text': // TODO break; case 'integer': case 'float': if ($field['search_type'] == 1) { // exact value if ($request->get('f_' . $filter)) { $val = $data->takeFloat('f_' . $filter); if (!$val) { $val = 0; } $conditions[] = $fname .'='. $db->quote($val); $params[] = 'f_' . $filter . '=' . $val; } } else { // interval if ($request->get('f_' . $filter . '_from')) { $val = $data->takeFloat('f_' . $filter . '_from'); if (!$val) { $val = 0; } $conditions[] = $fname .'>='. $db->quote($val); $params[] = 'f_' . $filter . '_from=' . $val; } if ($request->get('f_' . $filter . '_to')) { $val = $data->takeFloat('f_' . $filter . '_to'); if (!$val) { $val = 0; } $conditions[] = $fname .'<='. $db->quote($val); $params[] = 'f_' . $filter . '_to=' . $val; } } break; case 'boolean': if ($field['search_type'] == 1) { $conditions[] = $fname . '=1'; } else { // TODO } break; case 'belongs_to': case 'has_one': $fname = $fprefix . $field['search_field'] . '_id'; if ($field['search_type'] == 2) { // multiple values $cond = array(); $model = $this->getModel($field['search_model']); $items = $model->getLinkedItemsList($field['search_field']); if ($field['form_layout'] == 1) { foreach ($data->takeInt('f_' . $filter) as $id) { $cond[] = $fname . '=' . $id; $params[] = $fname . '[]=' . $id; } } else { $ids = array(); foreach ($items as $item) { $id = $item['value']; if ($data->takeBool('f_'. $filter .'_'. $id)) { $cond[] = $fname . '=' . $id; $params[] = 'f_'. $filter .'_'. $id . '=on'; } } $data->setBool('f_' . $filter, $ids); } if ($cond) { $conditions[] = '(' . implode(' AND ', $cond) . ')'; } } else { // single value if (!$request->get('f_' . $filter)) { continue; } $val = $data->takeInt('f_' . $filter); $conditions[] = $fname .'='. $db->quote($val); $params[] = 'f_' . $filter . '=' . $val; } break; case 'has_and_belongs_to_many': $mname = $field['search_model']; if ($draft) { $mname .= '_draft'; } $fname = $field['search_field']; $model1 = $this->getModel($mname); if (!array_key_exists($fname, $model1->fields)) { continue; } $def = $model1->fields[$fname]; $model2 = $model1->Node->getModel($def['model']); if (!$model2) { continue; } $lst = array($model1->table, $model2->table); sort($lst); $table = implode('_', $lst); $cond = '(objects.id IN (SELECT '; $cond .= $model1->name . '_id FROM ' . $table; $cond .= ' WHERE ' . $model2->name . '_id'; if ($field['search_type'] == 2) { // multiple values $values = array(); $items = $model1->getLinkedItemsList($field['search_field']); if ($field['form_layout'] == 1) { foreach ($data->takeInt('f_' . $filter) as $id) { $values[] = $fname . '=' . $id; $params[] = 'f_' . $filter . '[]=' . $id; } } else { $ids = array(); foreach ($items as $item) { $id = $item['value']; if ($data->takeBool('f_'. $filter .'_'. $id)) { $values[] = $fname .'='. $id; $params[] = 'f_'. $filter .'_'. $id .'=on'; $ids[] = $id; } } $data->setBool('f_' . $filter, $ids); } if ($values) { $cond .= ' IN (' . implode(',', $values) . ')'; } } else { // single value if (!$request->get('f_' . $filter)) { continue; } $val = $data->takeInt('f_' . $filter); $cond .= '=' . $db->quote($val); $params[] = 'f_' . $filter . '=' . $val; } $cond .= '))'; $conditions[] = $cond; break; } } } // common text if ($val = $data->take('f__query')) { $params[] = 'f__query=' . $val; foreach (array_map('trim', explode(' ', $val)) as $q) { $values[] = $db->quote('%' . $q . '%'); } $items = array(); foreach ($text_fields as $field) { foreach ($values as $val) { $items[] = $field . ' LIKE ' . $val; } } if ($items) { $conditions[] = '(' . implode(' OR ', $items) . ')'; } } $sql = implode(' AND ', $conditions); $qs = implode('&', $params); return array($sql, $qs); } function parseSearch($draft=false) { if ($this->_search !== null) { return $this->_search; } $data = $this->Data; $advanced = $data->takeInt('a') == 1; $request = $this->Site->request; $db = $this->getDatabase(); $lang = $this->getDataLanguage(); $params = array(); $params_adv = array(); $conditions = array(); // categories $cond = array(); if ($advanced) { $ids = array(); } else { $c = $data->takeInt('c'); } foreach ($this->categories as $i => $category) { $table = $category; if ($draft) { $table .= '_drafts'; } if ($advanced) { if ($data->takeBool('c_' . $i)) { $cond[] = $table . '.id IS NOT NULL'; $params_adv[] = 'c_' . $i . '=on'; $ids[] = $i; } } else { if ($i + 1 == $c) { $cond[] = $table . '.id IS NOT NULL'; $params_adv[] = 'c_' . $i . '=on'; $params[] = 'c=' . $c; } } } if ($advanced) { $data->setInt('c', $ids); } if ($cond) { $conditions[] = '(' . implode(' OR ', $cond) . ')'; } $user = $this->User; if ($draft && !$user->grant('admin')) { $getter = $this->Site->getObject('Districts:/getter'); $districts = $getter->getUserDistrictIds($user->id); $sql = '('; if ($districts && $user->grantAny( 'objects_edit,objects_translate,objects_publish')) { $sql .= 'district_id IN ('; $sql .= implode(',', $districts); $sql .= ') OR '; } $sql .= 'o.id IN ('; $sql .= 'SELECT object_id FROM object_users'; $sql .= ' WHERE user_id=' . $user->id; $sql .= ' AND (allow_translate=1 OR allow_edit=1 OR allow_publish=1)'; $sql .= ')'; $sql .= ')'; $conditions[] = $sql; } // districts if ($district = $data->takeInt('d')) { $conditions[] = 'o.district_id=' . $db->quote($district); $params[] = 'd=' . $district; $params_adv[] = 'd=' . $district; } // common text fields $text_fields = array( 'o.name_' . $lang, 'o.address_' . $lang, 'o.phone' ); // dynamic fields if ($advanced) { foreach ($this->getSearchFields() as $field) { $ftype = $field['type']; $mname = $field['search_model']; if ($mname == 'object') { $fname = 'o'; } else { if ($draft) { $mname .= '_draft'; } $model = $this->getModel($mname); $fname = $model->table; //if ($draft) { // $fname .= '_drafts'; //} } $fprefix = $fname . '.'; $fname .= '.' . $field['search_field']; // include in common text search if (in_array($ftype, array('char', 'varchar', 'text')) && $field['search_type'] == 1) { if (isset($field['multilang']) && $field['multilang']) { $text_fields[] = $fname . '_' . $lang; } else { $text_fields[] = $fname; } continue; } $filter = $field['search_model'] .'__'. $field['search_field']; if (!$data->takeBool($filter . '_on')) { continue; } $params_adv[] = $filter . '_on=on'; switch ($ftype) { case 'char': case 'varchar': case 'text': // TODO break; case 'integer': case 'float': if ($field['search_type'] == 1) { // exact value if ($request->get($filter)) { $val = $data->takeFloat($filter); if (!$val) { $val = 0; } $conditions[] = $fname .'='. $db->quote($val); $params_adv[] = $filter . '=' . $val; } } else { // interval if ($request->get($filter . '_from')) { $val = $data->takeFloat($filter . '_from'); if (!$val) { $val = 0; } $conditions[] = $fname .'>='. $db->quote($val); $params_adv[] = $filter . '_from=' . $val; } if ($request->get($filter . '_to')) { $val = $data->takeFloat($filter . '_to'); if (!$val) { $val = 0; } $conditions[] = $fname .'<='. $db->quote($val); $params_adv[] = $filter . '_to=' . $val; } } break; case 'boolean': if ($field['search_type'] == 1) { $conditions[] = $fname . '=1'; } else { // TODO } break; case 'belongs_to': case 'has_one': $fname = $fprefix . $field['search_field'] . '_id'; if ($field['search_type'] == 2) { // multiple values $cond = array(); $model = $this->getModel($field['search_model']); $items = $model->getLinkedItemsList($field['search_field']); if ($field['form_layout'] == 1) { foreach ($data->takeInt($filter) as $id) { $cond[] = $fname . '=' . $id; $params_adv[] = $fname . '[]=' . $id; } } else { $ids = array(); foreach ($items as $item) { $id = $item['value']; if ($data->takeBool($filter .'_'. $id)) { $cond[] = $fname . '=' . $id; $params_adv[] = $filter .'_'. $id . '=on'; } } $data->setBool($filter, $ids); } if ($cond) { $conditions[] = '(' . implode(' AND ', $cond) . ')'; } } else { // single value if (!$request->get($filter)) { continue; } $val = $data->takeInt($filter); $conditions[] = $fname .'='. $db->quote($val); $params_adv[] = $filter . '=' . $val; } break; case 'has_and_belongs_to_many': $mname = $field['search_model']; if ($draft) { $mname .= '_draft'; } $fname = $field['search_field']; $model1 = $this->getModel($mname); if (!array_key_exists($fname, $model1->fields)) { continue; } $def = $model1->fields[$fname]; $model2 = $model1->Node->getModel($def['model']); if (!$model2) { continue; } $lst = array($model1->table, $model2->table); sort($lst); $table = implode('_', $lst); $cond = '(o.id IN (SELECT '; $cond .= $model1->name . '_id FROM ' . $table; $cond .= ' WHERE ' . $model2->name . '_id'; if ($field['search_type'] == 2) { // multiple values $values = array(); $items = $model1->getLinkedItemsList($field['search_field']); if ($field['form_layout'] == 1) { foreach ($data->takeInt($filter) as $id) { $values[] = $fname . '=' . $id; $params_adv[] = $filter . '[]=' . $id; } } else { $ids = array(); foreach ($items as $item) { $id = $item['value']; if ($data->takeBool($filter .'_'. $id)) { $values[] = $fname .'='. $id; $params_adv[] = $filter .'_'. $id .'=on'; $ids[] = $id; } } $data->setBool($filter, $ids); } if ($values) { $cond .= ' IN (' . implode(',', $values) . ')'; } } else { // single value if (!$request->get($filter)) { continue; } $val = $data->takeInt($filter); $cond .= '=' . $db->quote($val); $params_adv[] = $filter . '=' . $val; } $cond .= '))'; $conditions[] = $cond; break; } } } // common text if ($val = $data->take('q')) { $params[] = 'q=' . $val; $params_adv[] = 'q=' . $val; foreach (array_map('trim', explode(' ', $val)) as $q) { $values[] = $db->quote('%' . $q . '%'); } $items = array(); foreach ($text_fields as $field) { foreach ($values as $val) { $items[] = $field . ' LIKE ' . $val; } } if ($items) { $conditions[] = '(' . implode(' OR ', $items) . ')'; } } $search = array( implode(' AND ', $conditions), implode('&', $params), implode('&', $params_adv) ); $this->_search = $search; return $search; } function getSearchFields() { if ($this->search_fields === null) { $o = $this->getObject('/tools/model_tools'); $this->search_fields = $o->getSearchFields(); } return $this->search_fields; } function allowRating($id, $ip) { $model = $this->getModel('object_rating'); $q = $model->createQuery(); $q->filter('object', $id); $q->filter('ip', $ip); $q->filter('created_at', null, '>', 'date_sub(now(), interval 24 hour)'); $count = $model->countAll($q); if ($count) { return false; } return true; } // function getMapId($ids) { if (!$ids) { return null; } $model = $this->getModel('map_ids'); $q = $model->createQuery(); $q->filter('objects', strval($ids)); $record = $model->find($q); if (!$record) { $record = $model->create(); $record->objects = $ids; $record->save(); } return $record->id; } function getMapIds($id) { if (!$id) { return null; } $record = $this->getModel('map_ids')->findByKey($id); if (!$record) { return null; } return explode(',', $record->objects); } function preparePdf($object, $lang) { $site = $this->Site; $_ = $this->Strings; $published = $object->getPublishedAt($lang); if (!$object || !$published) { return null; } $dir = $site->getConf('pdf_cache_dir'); $tcpdf = $site->getConf('tcpdf_dir'); if (!$dir || !$tcpdf || !is_dir($dir)) { return null; } $filename = $dir . '/object-' . $object->id . '-' . $lang . '.pdf'; if (is_file($filename) && filemtime($filename) >= strtotime($published)-24*3600) { return $filename; } $path = ini_get('include_path'); if (DINGO_OS == 'windows') { $sep = ';'; } else { $sep = ':'; } $parts = explode($sep, $path); if (!in_array($tcpdf, $parts)) { $parts[] = $tcpdf; ini_set('include_path', implode($sep, $parts)); } $factory = $site->getObject('Objects:/pdf_writer'); if (!$factory) { return null; } $pdf = $factory->getWriter(); $pdf->initWriter($object->name, $_->SITE_TITLE, $site->getConf('site_url')); $pdf->SetFont('dejavusans', 'B', 14); $pdf->Write(10, $object->name); $pdf->setY($pdf->getY() + 5); $model = $object->getModel(); $fields = array(); foreach ($model->fields as $name => $def) { if ($def['hidden']) { continue; } if (!in_array($name, dingo::stringToArray('name,address,town,post_code,phone,phone_mobile,fax,email,url,surroundings,type'))) { continue; } $field = array(); $type = $def['type']; switch ($type) { case 'belongs_to': case 'has_one': $rec = $object->getLinkedRecord($name); if ($rec) { $field['value'] = $rec->toString($lang); } break; case 'has_and_belongs_to_many': $recs = $object->getLinkedRecords($name); if ($recs) { $vals = array(); foreach ($recs as $rec) { $vals[] = $rec->toString($lang); } $field['value'] = implode(', ', $vals); } break; default: if (isset($def['multilang']) && $def['multilang']) { $field['value'] = $object->getDbFieldValue($name .'_'. $lang); } else { $field['value'] = $object->getDbFieldValue($name); } break; } if ($type == 'text') { $field['value'] = nl2br($field['value']); } $fields[$name] = $field['value']; } $objects = $this->getObjects($object->id); if (!$objects) { return null; } $objarr = $objects[0]; $objarr = $this->prepareObjectData($objarr); if ($fields['type']) { $pdf->WriteField('', $fields['type']); } if ($fields['surroundings']) { $pdf->WriteField('', $fields['surroundings']); } $val = $objarr['address_string']; if ($val) { $pdf->WriteField($_->FIELD_TITLE_ADDRESS, $val); } $val = $objarr['phones']; if ($val) { $pdf->WriteField($_->PHONES, $val); } $val = $objarr['fax']; if ($val) { $pdf->WriteField($_->FIELD_TITLE_FAX, $val); } $val = $objarr['email_array']; if ($val) { $vals = array(); foreach ($val as $email) { $vals[] = $email['label']; } $pdf->WriteField($_->FIELD_TITLE_EMAIL, implode(',', $vals)); } $val = $objarr['url_array']; if ($val) { $pdf->WriteField($_->FIELD_TITLE_URL, implode(',', $val)); } $val = $objarr['coordinates']; if ($val) { $pdf->WriteField($_->COORDINATES, $val); } $this->pdfCategory($pdf, $object, 'main', 'district,album,name,address,town,post_code,phone,phone_mobile,fax,email,url,surroundings,type,homepage'); foreach ($this->categories as $catname) { $this->pdfCategory($pdf, $object, $catname); } if ($object->album) { $pdf->setY($pdf->getY() + 5); $getter = $site->getObject('DImages:/getter'); if ($getter) { $images = $getter->getRandomImages($object->album, 2); if ($images) { $pdf->addImages($images); } } } if ($object->latitude && $object->longitude) { $key = $site->getConf('google_static_maps_api_key'); $map = "https://maps.googleapis.com/maps/api/staticmap?center={$object->latitude},{$object->longitude}&zoom=11&size=900x300&maptype=roadmap&&feature=all&markers=color:red|{$object->latitude},{$object->longitude}&key=$key"; $img = ImageCreateFromPNG($map); $pdf->addGDImage($img); ImageDestroy($img); } $pdf->Output($filename); return $filename; } function pdfCategory($pdf, $object, $catname, $ignore=null) { $_ = $this->Strings; $lang = $this->Site->request->language; if (!$catname) { return; } if ($catname == 'main') { $record = $object; //$this->title = $_->MORE_INFORMATION; } else { $model = $this->getModel($catname); $record = $model->findByKey($object->id); } if (!$record || !$record->getPublishedAt($lang)) { return; } if ($catname != 'main') { $pdf->writeCategory($_->get($catname)); } if ($ignore) { $ignored = dingo::stringToArray($ignore); } else { $ignored = array(); } $fields = array(); if ($record) { foreach ($record->getModel()->fields as $name => $def) { if ($def['hidden']) { continue; } if (in_array($name, $ignored)) { continue; } $field = array(); $type = $def['type']; switch ($type) { case 'belongs_to': case 'has_one': $rec = $record->getLinkedRecord($name); if ($rec) { $field['value'] = $rec->toString($lang); } break; case 'has_and_belongs_to_many': $recs = $record->getLinkedRecords($name); if ($recs) { $vals = array(); foreach ($recs as $rec) { $vals[] = $rec->toString($lang); } $field['value'] = implode(', ', $vals); } break; default: if (isset($def['multilang']) && $def['multilang']) { $field['value'] = $record->getDbFieldValue($name .'_'. $lang); } else { $field['value'] = $record->getDbFieldValue($name); } break; } $field['value'] = trim($field['value']); if ($type == 'text') { $field['value'] = nl2br($field['value']); } $field['title'] = $record->getModel()->getFieldTitle($name, $lang); if ($field['value']) { $pdf->writeField($field['title'], $field['value']); } } } } function getCurrentLanguage() { $lang = $this->Data->take('lang'); if (in_array($lang, $this->getDataLanguages())) { return $lang; } return null; } private $_user_districts = null; function getUserDistrictIds() { if ($this->_user_districts === null) { $getter = $this->Site->getObject('Districts:/getter'); $this->_user_districts = $getter->getUserDistrictIds($this->User->id); } return $this->_user_districts; } private $_user_languages = null; function getUserLanguages() { if ($this->_user_languages === null) { if ($this->isAdmin()) { $this->_user_languages = $this->getDataLanguages(); } else { $this->_user_languages = dingo::stringToArray($this->User->getAttribute('languages')); } } return $this->_user_languages; } function getAdminRights() { return array('admin', 'objects_admin'); } function isAdmin() { foreach ($this->getAdminRights() as $rights) { if ($this->User->grant($rights)) { return true; } } return false; } function adminObjectsBrowseable() { return true; } } ?>