public function load_from_resultset($rs) { $main = $rs[0]; $this->id = $main->id; $this->website = $main->website; $this->parent = $main->parent; $this->position = $main->position; $this->template = $main->template; $this->access = $main->access; $this->permission = $main->permission; $this->icon = $main->icon; $this->metatags = $main->metatags; $this->date_published = empty($main->date_published) ? '' : $main->date_published; $this->date_unpublish = empty($main->date_unpublish) ? '' : $main->date_unpublish; $this->votes = $main->votes; $this->score = $main->score; $this->views = $main->views; $this->dictionary = webdictionary::load_element_strings('structure', $this->id); $this->paths = path::loadElementPaths('structure', $this->id, $this->website); $this->visible = $main->visible; // to get the array of groups first we remove the "g" character $groups = str_replace('g', '', $main->groups); $this->groups = explode(',', $groups); if (!is_array($this->groups)) { $this->groups = array($groups); } }
public function homepage_from_structure($all_languages = false) { $homepage_relative_url = $this->homepage; if (is_numeric($homepage_relative_url)) { $homepage_relative_url = path::loadElementPaths('structure', $homepage_relative_url); if (!$all_languages) { $homepage_relative_url = array_shift($homepage_relative_url); } } return $homepage_relative_url; }
public function load_from_resultset($rs) { $main = $rs[0]; $this->id = $main->id; $this->website = $main->website; $this->association = $main->association; $this->category = $main->category; $this->embedding = $main->embedding; $this->template = $main->template; $this->date_to_display = empty($main->date_to_display) ? '' : $main->date_to_display; $this->date_published = empty($main->date_published) ? '' : $main->date_published; $this->date_unpublish = empty($main->date_unpublish) ? '' : $main->date_unpublish; $this->date_created = $main->date_created; $this->date_modified = $main->date_modified; $this->galleries = mb_unserialize($main->galleries); $this->comments_enabled_to = $main->comments_enabled_to; $this->comments_moderator = $main->comments_moderator; $this->access = $main->access; $this->permission = $main->permission; $this->author = $main->author; $this->views = $main->views; $this->votes = $main->votes; $this->score = $main->score; $this->position = $main->position; $this->dictionary = webdictionary::load_element_strings('item', $this->id); $this->paths = path::loadElementPaths('item', $this->id); // to get the array of groups first we remove the "g" character $groups = str_replace('g', '', $main->groups); $this->groups = explode(',', $groups); if (!is_array($this->groups)) { $this->groups = array($groups); } if ($this->association == 'free') { $this->category = ''; } }
function run() { global $layout; global $DB; global $website; global $theme; global $user; $out = ''; $item = new item(); switch ($_REQUEST['act']) { case 'json': case 1: // json data retrieval & operations switch ($_REQUEST['oper']) { case 'del': // remove rows $ids = $_REQUEST['ids']; foreach ($ids as $id) { $item->load($id); $item->delete(); } echo json_encode(true); break; default: // list or search // translation of request search & order fields switch ($_REQUEST['searchField']) { case 'id': $_REQUEST['searchField'] = 'i.id'; break; case 'title': $_REQUEST['searchField'] = 'd.text'; break; case 'language': $_REQUEST['searchField'] = 'd.lang'; break; case 'category': $_REQUEST['searchField'] = 'i.category'; break; case 'dates': $_REQUEST['searchField'] = 'i.date_published'; break; case 'permission': $_REQUEST['searchField'] = 'i.permission'; break; default: } if ($_REQUEST['sidx'] == 'dates') { $_REQUEST['sidx'] = 'i.date_published'; } $page = intval($_REQUEST['page']); $max = intval($_REQUEST['rows']); $offset = ($page - 1) * $max; $orderby = $_REQUEST['sidx'] . ' ' . $_REQUEST['sord']; $where = ' i.website = ' . $website->id; if ($_REQUEST['_search'] == 'true' || isset($_REQUEST['quicksearch'])) { if (isset($_REQUEST['quicksearch'])) { $where .= $item->quicksearch($_REQUEST['quicksearch']); } else { if (isset($_REQUEST['filters'])) { if (is_array($_REQUEST['filters'])) { $filters = json_decode(json_encode($_REQUEST['filters']), FALSE); } else { $filters = json_decode($_REQUEST['filters']); } for ($r = 0; $r < count($filters->rules); $r++) { switch ($filters->rules[$r]->field) { case 'id': $filters->rules[$r]->field = 'i.id'; break; case 'title': $filters->rules[$r]->field = 'd.text'; break; case 'language': $filters->rules[$r]->field = 'd.lang'; break; case 'category': $filters->rules[$r]->field = 'i.category'; break; case 'dates': $filters->rules[$r]->field = 'i.date_published'; break; case 'permission': $filters->rules[$r]->field = 'i.permission'; break; default: } } $where .= navitable::jqgridsearch(json_encode($filters)); } else { // single search $where .= ' AND ' . navitable::jqgridcompare($_REQUEST['searchField'], $_REQUEST['searchOper'], $_REQUEST['searchString']); } } } $sql = ' SELECT SQL_CALC_FOUND_ROWS i.*, d.text as title, d.lang as language, u.username as author_username, ( SELECT COUNT(*) FROM nv_comments cm WHERE cm.item = i.id AND cm.website = ' . $website->id . ' ) as comments FROM nv_items i LEFT JOIN nv_webdictionary d ON i.id = d.node_id AND d.node_type = "item" AND d.subtype = "title" AND d.lang = "' . $website->languages_list[0] . '" AND d.website = ' . $website->id . ' LEFT JOIN nv_users u ON u.id = i.author WHERE ' . $where . ' GROUP BY i.id, d.text, d.lang, u.username ORDER BY ' . $orderby . ' LIMIT ' . $max . ' OFFSET ' . $offset; if (!$DB->query($sql, 'array')) { throw new Exception($DB->get_last_error()); } $dataset = $DB->result(); $total = $DB->foundRows(); $dataset = grid_notes::summary($dataset, 'item', 'id'); $access = array(0 => '<img src="img/icons/silk/page_white_go.png" align="absmiddle" title="' . t(254, 'Everybody') . '" />', 1 => '<img src="img/icons/silk/lock.png" align="absmiddle" title="' . t(361, 'Web users only') . '" />', 2 => '<img src="img/icons/silk/user_gray.png" align="absmiddle" title="' . t(363, 'Users who have not yet signed up or signed in') . '" />', 3 => '<img src="img/icons/silk/group_key.png" align="absmiddle" title="' . t(512, "Selected web user groups") . '" />'); $permissions = array(0 => '<img src="img/icons/silk/world.png" align="absmiddle" /> ' . t(69, 'Published'), 1 => '<img src="img/icons/silk/world_dawn.png" align="absmiddle" /> ' . t(70, 'Private'), 2 => '<img src="img/icons/silk/world_night.png" align="absmiddle" /> ' . t(81, 'Hidden')); $hierarchy = structure::hierarchy(0); // we need to format the values and retrieve the needed strings from the dictionary $out = array(); for ($i = 0; $i < count($dataset); $i++) { if (empty($dataset[$i])) { continue; } if (empty($dataset[$i]['date_published'])) { $dataset[$i]['date_published'] = '∞'; } else { $dataset[$i]['date_published'] = core_ts2date($dataset[$i]['date_published'], false); } if (empty($dataset[$i]['date_unpublish'])) { $dataset[$i]['date_unpublish'] = '∞'; } else { $dataset[$i]['date_unpublish'] = core_ts2date($dataset[$i]['date_unpublish'], false); } if (empty($dataset[$i]['date_to_display'])) { $dataset[$i]['date_to_display'] = ''; } else { $dataset[$i]['date_to_display'] = core_ts2date($dataset[$i]['date_to_display'], false); } if ($dataset[$i]['category'] > 0) { $category_path = structure::hierarchyPath($hierarchy, $dataset[$i]['category']); if (is_array($category_path)) { $dataset[$i]['category_path'] = implode(' › ', $category_path); } else { $dataset[$i]['category_path'] = $category_path; } } $category_text = ''; if ($dataset[$i]['association'] == 'free') { $category_text = '[ ' . strtolower(t(100, 'Free')) . ' ]'; } else { $category_text = $dataset[$i]['category_path']; } $item_views = $dataset[$i]['views']; if ($item_views > 1000) { $item_views = round($item_views / 1000) . "K"; } $item_comments = $dataset[$i]['comments']; if ($item_comments > 1000) { $item_comments = round($item_comments / 1000) . "K"; } //$social_rating = '<img src="img/icons/silk/star.png" align="absmiddle" width="12px" height="12px" /> '. // '<span style="font-size: 90%;">'.$dataset[$i]['score'].' ('.$dataset[$i]['votes'].')</span>'; //$social_rating = '<i class="fa fa-fw fa-eye" /> <span style="font-size: 90%;">'.$dataset[$i]['views'].'</span>'; $social_rating = '<img src="img/icons/silk/eye.png" align="absmiddle" width="12px" height="12px" /> ' . '<span style="font-size: 90%;">' . $item_views . '</span>'; //$social_comments = '<i class="fa fa-fw fa-comments-o" /> <span style="font-size: 90%;">'.$dataset[$i]['comments'].'</span>'; $social_comments = '<img src="img/icons/silk/comments.png" align="absmiddle" width="12px" height="12px" /> ' . '<span style="font-size: 90%;">' . $item_comments . '</span>'; if (empty($dataset[$i]['title'])) { // if title is empty for the default language, // try to load the title in another language $DB->query(' SELECT lang, text FROM nv_webdictionary WHERE website = ' . $website->id . ' AND node_type = "item" AND subtype="title" AND node_id = ' . $dataset[$i]['id'] . ' AND text != "" ORDER BY id ASC'); $titles = $DB->result(); if (!empty($titles)) { $dataset[$i]['title'] = '<img src="img/icons/silk/comment.png" align="absmiddle" />'; $dataset[$i]['title'] .= '<small>' . $titles[0]->lang . '</small> '; $dataset[$i]['title'] .= $titles[0]->text; } } $out[$i] = array(0 => $dataset[$i]['id'], 1 => '<div class="list-row" data-permission="' . $dataset[$i]['permission'] . '">' . $dataset[$i]['title'] . '</div>', 2 => $social_rating . ' ' . $social_comments, 3 => $category_text, 4 => $dataset[$i]['date_to_display'], 5 => $dataset[$i]['date_published'] . ' - ' . $dataset[$i]['date_unpublish'], 6 => $access[$dataset[$i]['access']] . ' ' . $permissions[$dataset[$i]['permission']], 7 => $dataset[$i]['_grid_notes_html']); } navitable::jqgridJson($out, $page, $offset, $max, $total); break; } core_terminate(); break; case 'load': case 'create': case 'edit': case 2: // edit/new form if (!empty($_REQUEST['id'])) { $item->load(intval($_REQUEST['id'])); if ($user->permission("items.edit") == "false" && $item->author != $user->id) { $layout->navigate_notification(t(610, "Sorry, you are not allowed to execute the requested function"), true); $_REQUEST['act'] = 'list'; return run(); } // check if the current user can edit this item if ($item->association == 'category' && !empty($item->category)) { if (!structure::category_allowed($item->category)) { $layout->navigate_notification(t(610, "Sorry, you are not allowed to execute the requested function"), true); $_REQUEST['act'] = 'list'; return run(); } } } if (isset($_REQUEST['form-sent'])) { $item->load_from_post(); try { $item->save(); property::save_properties_from_post('item', $item->id); if (!empty($_REQUEST['items-order'])) { item::reorder($_REQUEST['items-order']); } $layout->navigate_notification(t(53, "Data saved successfully."), false, false, 'fa fa-check'); $item->load($item->id); users_log::action($_REQUEST['fid'], $item->id, 'save', $item->dictionary[$website->languages_list[0]]['title'], json_encode($_REQUEST)); } catch (Exception $e) { $layout->navigate_notification($e->getMessage(), true, true); } } else { users_log::action($_REQUEST['fid'], $item->id, 'load', $item->dictionary[$website->languages_list[0]]['title']); } $out = items_form($item); break; case 'delete': case 4: // remove if (!empty($_REQUEST['id'])) { $item->load(intval($_REQUEST['id'])); try { if (!empty($item->id)) { $deleted = $item->delete() > 0; if ($deleted) { $layout->navigate_notification(t(55, 'Item removed successfully.'), false); $out = items_list(); users_log::action($_REQUEST['fid'], $item->id, 'remove', $item->dictionary[$website->languages_list[0]]['title'], json_encode($_REQUEST)); } } if (!$deleted) { $layout->navigate_notification(t(56, 'Unexpected error.'), false); if (!empty($item->id)) { $out = items_form($item); } else { $out = items_list(); } } } catch (Exception $e) { $layout->navigate_notification($e->getMessage(), true); if (!empty($item->id)) { $out = items_form($item); } } } break; case 'duplicate': if (!empty($_REQUEST['id'])) { $item->load(intval($_REQUEST['id'])); if ($item->association == 'category' && $item->embedding == 1) { // get structure template $category = new structure(); $category->load($item->category); $properties = property::load_properties_associative('structure', $category->template, 'item', $item->id); } else { $properties = property::load_properties_associative('item', $item->template, 'item', $item->id); } // try to duplicate $item->id = 0; $ok = $item->insert(); if ($ok) { // duplicate item properties too (but don't duplicate comments) if ($item->association == 'category' && $item->embedding == 1) { $ok = property::save_properties_from_array('item', $item->id, $category->template, $properties); } else { $ok = property::save_properties_from_array('item', $item->id, $item->template, $properties); } } if ($ok) { $layout->navigate_notification(t(478, 'Item duplicated successfully.'), false, false, 'fa fa-check'); $out = items_form($item); } else { $layout->navigate_notification(t(56, 'Unexpected error.'), false); $item = new item(); $item->load(intval($_REQUEST['id'])); $out = items_form($item); } users_log::action($_REQUEST['fid'], $item->id, 'duplicate', $item->dictionary[$website->languages_list[0]]['title'], json_encode($_REQUEST)); } break; case 89: if (!empty($_REQUEST['id'])) { $DB->execute('DELETE FROM nv_webdictionary_history WHERE id = ' . intval($_REQUEST['id']) . ' LIMIT 1'); echo 'true'; } else { echo 'false'; } core_terminate(); break; case 90: $DB->query('SELECT id, date_created, autosave FROM nv_webdictionary_history WHERE node_type = "item" AND subtype = ' . protect('section-' . $_REQUEST['section']) . ' AND lang = ' . protect($_GET['lang']) . ' AND node_id = ' . protect($_REQUEST['id']) . ' AND website = ' . $website->id . ' ORDER BY date_created DESC', 'array'); $result = $DB->result(); if (!is_array($result)) { $result = array(); } for ($i = 0; $i < count($result); $i++) { $result[$i]['date'] = core_ts2date($result[$i]['date_created'], true); if ($result[$i]['autosave'] == 1) { $result[$i]['date'] .= ' (' . t(273, 'Autosave') . ')'; } } echo json_encode($result); core_terminate(); break; case "search_by_title": case 91: // json search title request (for "copy from" dialog) $DB->query(' SELECT node_id as id, text as label, text as value FROM nv_webdictionary WHERE node_type = "item" AND subtype = "title" AND lang = ' . protect($_REQUEST['lang']) . ' AND website = ' . $website->id . ' AND text LIKE ' . protect('%' . $_REQUEST['title'] . '%') . ' ORDER BY text ASC LIMIT 20', 'array'); echo json_encode($DB->result()); core_terminate(); break; case "raw_zone_content": // return raw item contents if (empty($_REQUEST['section'])) { $_REQUEST['section'] = 'main'; } if ($_REQUEST['history'] == 'true') { $DB->query('SELECT text FROM nv_webdictionary_history WHERE node_type = "item" AND website = ' . $website->id . ' AND id = ' . protect($_REQUEST['id']), 'array'); $data = $DB->first(); echo $data['text']; } else { if ($_REQUEST['zone'] == 'section') { $DB->query('SELECT text FROM nv_webdictionary WHERE node_type = "item" AND subtype = ' . protect('section-' . $_REQUEST['section']) . ' AND lang = ' . protect($_REQUEST['lang']) . ' AND website = ' . $website->id . ' AND node_id = ' . protect($_REQUEST['node_id']), 'array'); $data = $DB->first(); echo $data['text']; } else { if ($_REQUEST['zone'] == 'property') { $DB->query('SELECT text FROM nv_webdictionary WHERE node_type = "property-item" AND subtype = ' . protect('property-' . $_REQUEST['section'] . '-' . $_REQUEST['lang']) . ' AND lang = ' . protect($_REQUEST['lang']) . ' AND website = ' . $website->id . ' AND node_id = ' . protect($_REQUEST['node_id']), 'array'); $data = $DB->first(); echo $data['text']; } } } core_terminate(); break; // return raw template content // return raw template content case 93: $DB->query('SELECT file FROM nv_templates WHERE enabled = 1 AND id = ' . protect($_REQUEST['id']) . ' AND website = ' . $website->id, 'array'); $data = $DB->first(); echo @file_get_contents(NAVIGATE_PRIVATE . '/' . $website->id . '/templates/' . $data['file']); core_terminate(); break; case "copy_from_template_zones": // return template sections and (textarea) properties for a content id $item = new item(); $item->load(intval($_REQUEST['id'])); $template = $item->load_template(); $zones = array(); for ($ts = 0; $ts < count($template->sections); $ts++) { $title = $template->sections[$ts]['name']; if (!empty($theme)) { $title = $theme->t($title); } if ($title == '#main#') { $title = t(238, 'Main content'); } $zones[] = array('type' => 'section', 'id' => $template->sections[$ts]['id'], 'title' => $title); } for ($ps = 0; $ps < count($template->properties); $ps++) { // ignore structure properties if (isset($template->properties[$ps]->element) && $template->properties[$ps]->element != 'item') { continue; } // ignore non-textual properties if (!in_array($template->properties[$ps]->type, array("text", "textarea", "rich_textarea"))) { continue; } $title = $template->properties[$ps]->name; if (!empty($theme)) { $title = $theme->t($title); } $zones[] = array('type' => 'property', 'id' => $template->properties[$ps]->id, 'title' => $title); } echo json_encode($zones); core_terminate(); break; case 95: // free path checking $path = $_REQUEST['path']; $id = $_REQUEST['id']; $DB->query('SELECT type, object_id, lang FROM nv_paths WHERE path = ' . protect($path) . ' AND website = ' . $website->id); $rs = $DB->result(); echo json_encode($rs); core_terminate(); break; case 96: // return category paths echo json_encode(path::loadElementPaths('structure', intval($_REQUEST['id']))); core_terminate(); break; case 'json_find_user': // json find user by name request (for "moderator" autocomplete) $DB->query(' SELECT id, username as text FROM nv_users WHERE username LIKE ' . protect('%' . $_REQUEST['username'] . '%') . ' ORDER BY username ASC LIMIT 30', 'array '); $rows = $DB->result(); $total = $DB->foundRows(); echo json_encode(array('items' => $rows, 'total_count' => $total)); core_terminate(); break; case 'json_find_item': // find items by its title // any language $template_filter = ''; if (!empty($_REQUEST['template'])) { $template_filter = ' AND nvi.template = ' . protect($_REQUEST['template']) . ' '; } if (!empty($_REQUEST['association'])) { $template_filter = ' AND nvi.association = ' . protect($_REQUEST['association']) . ' '; } if (isset($_REQUEST['embedding'])) { $template_filter = ' AND nvi.embedding = ' . protect($_REQUEST['embedding']) . ' '; } $text = $_REQUEST['title']; if (!empty($_REQUEST['term'])) { // tagit request $text = $_REQUEST['term']; } $DB->query(' SELECT SQL_CALC_FOUND_ROWS DISTINCT nvw.node_id as id, nvw.text as text FROM nv_webdictionary nvw, nv_items nvi WHERE nvw.node_type = "item" AND nvw.node_id = nvi.id ' . $template_filter . ' AND nvw.subtype = "title" AND nvw.website = ' . $website->id . ' AND nvw.website = nvi.website AND nvw.text LIKE ' . protect('%' . $text . '%') . ' GROUP BY nvw.node_id, nvw.text ORDER BY nvw.text ASC LIMIT ' . intval($_REQUEST['page_limit']) . ' OFFSET ' . max(0, intval($_REQUEST['page_limit']) * (intval($_REQUEST['page']) - 1)), 'array'); $rows = $DB->result(); $total = $DB->foundRows(); if ($_REQUEST['association'] == 'free') { for ($i = 0; $i < count($rows); $i++) { $rows[$i]['path'] = $DB->query_single('path', 'nv_paths', ' website = ' . protect($website->id) . ' AND type="item" AND object_id="' . $rows[$i]['id'] . '" AND lang="' . $website->languages_list[0] . '" '); if (empty($rows[$i]['path'])) { $rows[$i]['path'] = '/node/' . $rows[$i]['id']; } } } if (empty($_REQUEST['format']) || $_REQUEST['format'] == 'select2') { echo json_encode(array('items' => $rows, 'totalCount' => $total)); } else { if ($_REQUEST['format'] == 'tagit') { $tags_json = array(); foreach ($rows as $row) { $tags_json[] = json_decode('{ "id": "' . $row['id'] . '", "label": "' . $row['text'] . '", "value": "' . $row['text'] . '" }'); } echo json_encode($tags_json); } } core_terminate(); break; case 98: // change comment status if (empty($_REQUEST['id'])) { echo "false"; core_terminate(); } switch ($_REQUEST['opt']) { case 'publish': $DB->execute(' UPDATE nv_comments SET status = 0 WHERE website = ' . $website->id . ' AND id = ' . $_REQUEST['id']); break; case 'unpublish': $DB->execute(' UPDATE nv_comments SET status = 1 WHERE website = ' . $website->id . ' AND id = ' . $_REQUEST['id']); break; case 'delete': $DB->execute(' DELETE FROM nv_comments WHERE website = ' . $website->id . ' AND id = ' . $_REQUEST['id']); break; } $error = $DB->get_last_error(); if (empty($error)) { echo 'true'; } else { echo 'false'; } core_terminate(); break; case 'autosave': if (!empty($_REQUEST['id'])) { $iDictionary = array(); foreach ($_REQUEST as $key => $value) { if (strpos($key, 'section-') === 0) { $lang = substr($key, -2, 2); $kname = substr($key, 0, strlen($key) - 3); $iDictionary[$lang][$kname] = $value; } } $changed = webdictionary_history::save_element_strings('item', intval($_REQUEST['id']), $iDictionary, true); if ($changed) { echo 'changes_saved'; } else { echo 'no_changes'; } core_terminate(); } echo 'false'; core_terminate(); break; case 'votes_reset': webuser_vote::remove_object_votes('item', intval($_REQUEST['id'])); echo 'true'; core_terminate(); break; case 'votes_by_webuser': if ($_POST['oper'] == 'del') { $ids = explode(',', $_POST['id']); for ($i = 0; $i < count($ids); $i++) { if ($ids[$i] > 0) { $vote = new webuser_vote(); $vote->load($ids[$i]); $vote->delete(); } } webuser_vote::update_object_score('item', $vote->object_id); echo 'true'; core_terminate(); } $max = intval($_GET['rows']); $page = intval($_GET['page']); $offset = ($page - 1) * $max; if ($_REQUEST['_search'] == 'false') { list($dataset, $total) = webuser_vote::object_votes_by_webuser('item', intval($_REQUEST['id']), $_REQUEST['sidx'] . ' ' . $_REQUEST['sord'], $offset, $max); } $out = array(); for ($i = 0; $i < count($dataset); $i++) { if (empty($dataset[$i])) { continue; } $out[$i] = array(0 => $dataset[$i]['id'], 1 => core_ts2date($dataset[$i]['date'], true), 2 => $dataset[$i]['username']); } navitable::jqgridJson($out, $page, $offset, $max, $total); core_terminate(); break; case 'items_order': if (!empty($_POST['items-order'])) { // save new order $response = item::reorder($_POST['items-order']); if ($response !== true) { echo $response['error']; } else { echo 'true'; } } else { // show ordered list echo items_order($_REQUEST['category']); } core_terminate(); break; case 'json_tags_search': $tags = nvweb_tags_retrieve(null, null, 'top', $_REQUEST['term'], $_REQUEST['lang']); $tags_json = array(); foreach (array_keys($tags) as $tag) { $tags_json[] = json_decode('{ "id": "' . $tag . '", "label": "' . $tag . '", "value": "' . $tag . '" }'); } echo json_encode($tags_json); core_terminate(); break; case 'json_tags_ranking': $tags = nvweb_tags_retrieve(100, null, 'top', null, $_REQUEST['lang']); $tags = array_keys($tags); echo json_encode($tags); core_terminate(); break; case 'list': case 0: // list / search result // list / search result default: $out = items_list(); break; } return $out; }
public static function generate_feed($id = NULL) { global $current; global $website; global $DB; if (empty($id)) { $id = $current['id']; } $item = new feed(); $item->load($id); $permission = nvweb_object_enabled($item); if (!$permission) { return; } $feed = new UniversalFeedCreator(); $feed->encoding = 'UTF-8'; $feed->title = $item->dictionary[$current['lang']]['title']; $feed->description = $item->dictionary[$current['lang']]['description']; $feed->link = $website->absolute_path(); $feed->syndicationURL = $website->absolute_path() . $item->paths[$current['lang']]; if (!empty($item->image)) { $image = new FeedImage(); $image->url = $website->absolute_path() . '/object?type=image&id=' . $item->image; $image->link = $website->absolute_path(); //$image->description = $vars['dictionary_description']; $feed->image = $image; } if (!empty($item->categories[0])) { $limit = intval($item->entries); if ($limit <= 0) { $limit = 10; } $DB->query(' SELECT SQL_CALC_FOUND_ROWS i.id, i.permission, i.date_published, i.date_unpublish, i.date_to_display, COALESCE(NULLIF(i.date_to_display, 0), i.date_created) as pdate, d.text as title, i.position as position, i.galleries as galleries, i.template as template FROM nv_items i, nv_structure s, nv_webdictionary d WHERE i.category IN(' . implode(",", $item->categories) . ') AND i.website = ' . $website->id . ' AND i.permission = 0 AND (i.date_published = 0 OR i.date_published < ' . core_time() . ') AND (i.date_unpublish = 0 OR i.date_unpublish > ' . core_time() . ') AND s.id = i.category AND (s.date_published = 0 OR s.date_published < ' . core_time() . ') AND (s.date_unpublish = 0 OR s.date_unpublish > ' . core_time() . ') AND s.permission = 0 AND (s.access = 0) AND (i.access = 0) AND d.website = i.website AND d.node_type = "item" AND d.subtype = "title" AND d.node_id = i.id AND d.lang = ' . protect($current['lang']) . ' ORDER BY pdate DESC LIMIT ' . $limit . ' OFFSET 0'); $rs = $DB->result(); for ($x = 0; $x < count($rs); $x++) { if (nvweb_object_enabled($rs[$x])) { $texts = webdictionary::load_element_strings('item', $rs[$x]->id); $paths = path::loadElementPaths('item', $rs[$x]->id); $fitem = new FeedItem(); $fitem->title = $texts[$current['lang']]['title']; $fitem->link = $website->absolute_path() . $paths[$current['lang']]; switch ($item->content) { case 'title': // no description break; case 'content': $fitem->description = $texts[$current['lang']]['section-main']; break; case 'summary': default: $fitem->description = $texts[$current['lang']]['section-main']; $fitem->description = str_replace(array('</p>', '<br />', '<br/>', '<br>'), array('</p>' . "\n", '<br />' . "\n", '<br/>' . "\n", '<br>' . "\n"), $fitem->description); $fitem->description = core_string_cut($fitem->description, 500, '…'); break; } $fitem->date = $rs[$x]->date_to_display; // find an image to attach to the item // A) first enabled image in item gallery // B) first image on properties $image = ''; if (!empty($rs[$x]->galleries)) { $galleries = mb_unserialize($rs[$x]->galleries); $photo = @array_shift(array_keys($galleries[0])); if (!empty($photo)) { $image = $website->absolute_path(false) . '/object?type=image&id=' . $photo; } } if (empty($image)) { // no image found on galleries, look for image properties $properties = property::load_properties("item", $rs[$x]->template, "item", $rs[$x]->id); for ($p = 0; $p < count($properties); $p++) { if ($properties[$p]->type == 'image') { if (!empty($properties[$p]->value)) { $image = $properties[$p]->value; } else { if (!empty($properties[$p]->dvalue)) { $image = $properties[$p]->dvalue; } } if (is_array($image)) { $image = array_values($image); $image = $image[0]; } if (!empty($image)) { $image = $website->absolute_path(false) . '/object?type=image&id=' . $image; } } // we only need the first image if (!empty($image)) { break; } } } if (!empty($image)) { $fitem->image = $image; // feedly will only display images of >450px --> http://blog.feedly.com/2015/07/31/10-ways-to-optimize-your-feed-for-feedly/ if (strpos($item->format, 'RSS') !== false) { $fitem->description = '<img src="' . $image . '&width=640"><br />' . $fitem->description; } } //$item->author = $contents->rows[$x]->author_name; $feed->addItem($fitem); } } // valid format strings are: RSS0.91, RSS1.0, RSS2.0, PIE0.1 (deprecated), // MBOX, OPML, ATOM, ATOM10, ATOM0.3, HTML, JS //echo $rss->saveFeed("RSS1.0", "news/feed.xml"); } $xml = $feed->createFeed($item->format); if ($item->format == "RSS2.0") { // add extra tweaks to improve the feed $xml = str_replace('<rss ', '<rss xmlns:webfeeds="http://webfeeds.org/rss/1.0" ', $xml); // also available: // <webfeeds:cover image="http://yoursite.com/a-large-cover-image.png" />\n // <webfeeds:accentColor>00FF00</webfeeds:accentColor> $xml = str_replace('<channel>', '<channel>' . "\n\t\t" . '<webfeeds:related layout="card" target="browser" />', $xml); $xml = str_replace('<channel>', '<channel>' . "\n\t\t" . '<webfeeds:logo>' . file::file_url($item->image) . '</webfeeds:logo>', $xml); $xml = str_replace('<channel>', '<channel>' . "\n\t\t" . '<webfeeds:icon>' . file::file_url($website->favicon) . '</webfeeds:icon>', $xml); } return $xml; }
function run() { global $user; global $layout; global $DB; global $website; $out = ''; $item = new website(); switch ($_REQUEST['act']) { case 'json': case 1: // json data retrieval & operations switch ($_REQUEST['oper']) { case 'search_links': // active website only! $text = $_REQUEST['text']; $lang = $_REQUEST['lang']; if (empty($lang)) { $lang = array_keys($website->languages)[0]; } $DB->query(' SELECT p.path, d.text FROM nv_paths p, nv_webdictionary d WHERE p.website = ' . protect($website->id) . ' AND p.lang = ' . protect($lang) . ' AND d.website = p.website AND d.node_type = p.type AND d.node_id = p.object_id AND d.lang = p.lang AND d.subtype = "title" AND ( p.path LIKE ' . protect('%' . $text . '%') . ' OR d.text LIKE ' . protect('%' . $text . '%') . ' ) ORDER BY d.id DESC LIMIT 10 '); $result = $DB->result(); echo json_encode($result); core_terminate(); break; case 'del': // remove rows if ($user->permission('websites.delete') == 'true') { $ids = $_REQUEST['ids']; foreach ($ids as $id) { $item->load($id); $item->delete(); } echo json_encode(true); } core_terminate(); break; default: // list or search $page = intval($_REQUEST['page']); $max = intval($_REQUEST['rows']); $offset = ($page - 1) * $max; $orderby = $_REQUEST['sidx'] . ' ' . $_REQUEST['sord']; $where = " 1=1 "; if ($_REQUEST['_search'] == 'true' || isset($_REQUEST['quicksearch'])) { if (isset($_REQUEST['quicksearch'])) { $where .= $item->quicksearch($_REQUEST['quicksearch']); } else { if (isset($_REQUEST['filters'])) { $where .= navitable::jqgridsearch($_REQUEST['filters']); } else { // single search $where .= ' AND ' . navitable::jqgridcompare($_REQUEST['searchField'], $_REQUEST['searchOper'], $_REQUEST['searchString']); } } } $DB->queryLimit('id,name,subdomain,domain,folder,homepage,permission,favicon', 'nv_websites', $where, $orderby, $offset, $max); $dataset = $DB->result(); $total = $DB->foundRows(); //echo $DB->get_last_error(); $out = array(); $permissions = array(0 => '<img src="img/icons/silk/world.png" align="absmiddle" /> ' . t(69, 'Published'), 1 => '<img src="img/icons/silk/world_dawn.png" align="absmiddle" /> ' . t(70, 'Private'), 2 => '<img src="img/icons/silk/world_night.png" align="absmiddle" /> ' . t(81, 'Hidden')); for ($i = 0; $i < count($dataset); $i++) { $homepage = 'http://'; $homepage_relative_url = $dataset[$i]['homepage']; if (is_numeric($homepage_relative_url)) { $homepage_relative_url = path::loadElementPaths('structure', $homepage_relative_url); $homepage_relative_url = array_shift($homepage_relative_url); } if (!empty($dataset[$i]['subdomain'])) { $homepage .= $dataset[$i]['subdomain'] . '.'; } $homepage .= $dataset[$i]['domain'] . $dataset[$i]['folder'] . $homepage_relative_url; $favicon = ''; if (!empty($dataset[$i]['favicon'])) { $favicon = '<img src="' . NVWEB_OBJECT . '?type=img&id=' . $dataset[$i]['favicon'] . '&width=16&height=16" align="absmiddle" height="16" />'; } $out[$i] = array(0 => $dataset[$i]['id'], 1 => $favicon, 2 => $dataset[$i]['name'], 3 => '<a href="' . $homepage . '" target="_blank"><img align="absmiddle" src="' . NAVIGATE_URL . '/img/icons/silk/house_link.png"></a> ' . $homepage, 4 => $permissions[$dataset[$i]['permission']]); } navitable::jqgridJson($out, $page, $offset, $max, $total); break; } session_write_close(); exit; break; case 'edit': case 2: // edit/new form if (!empty($_REQUEST['id'])) { $item->load(intval($_REQUEST['id'])); } if (isset($_REQUEST['form-sent']) && $user->permission('websites.edit') == 'true') { $item->load_from_post(); try { $item->save(); $id = $item->id; unset($item); $item = new website(); $item->load($id); $layout->navigate_notification(t(53, "Data saved successfully."), false, false, 'fa fa-check'); } catch (Exception $e) { $layout->navigate_notification($e->getMessage(), true, true); } if (!empty($item->id)) { users_log::action($_REQUEST['fid'], $item->id, 'save', $item->name, json_encode($_REQUEST)); } } else { if (!empty($item->id)) { users_log::action($_REQUEST['fid'], $item->id, 'load', $item->name); } } $out = websites_form($item); break; case 'remove': case 4: if (!empty($_REQUEST['id']) && $user->permission('websites.delete') == 'true') { $item->load(intval($_REQUEST['id'])); if ($item->delete() > 0) { $layout->navigate_notification(t(55, 'Item removed successfully.'), false); if (!empty($item->id)) { users_log::action($_REQUEST['fid'], $item->id, 'remove', $item->name, json_encode($_REQUEST)); } // if we don't have any websites, tell user a new one will be created $test = $DB->query_single('id', 'nv_websites'); if (empty($test) || !$test) { $layout->navigate_notification(t(520, 'No website found; a default one has been created.'), false, true); $nwebsite = new website(); $nwebsite->create_default(); } $out = websites_list(); } else { $layout->navigate_notification(t(56, 'Unexpected error.'), false); $out = websites_form($item); } } break; case 5: // search an existing path $DB->query('SELECT path as id, path as label, path as value FROM nv_paths WHERE path LIKE ' . protect('%' . $_REQUEST['term'] . '%') . ' AND website = ' . protect($_REQUEST['wid']) . ' ORDER BY path ASC LIMIT 30', 'array'); echo json_encode($DB->result()); core_terminate(); break; case 'email_test': $website->mail_mailer = $_REQUEST['mail_mailer']; $website->mail_server = $_REQUEST['mail_server']; $website->mail_port = $_REQUEST['mail_port']; $website->mail_address = $_REQUEST['mail_address']; $website->mail_user = $_REQUEST['mail_user']; $website->mail_security = $_REQUEST['mail_security'] == "true" || $_REQUEST['mail_security'] == "1" ? "1" : "0"; if (!empty($_REQUEST['mail_password'])) { $website->mail_password = $_REQUEST['mail_password']; } $ok = navigate_send_email(APP_NAME, APP_NAME . '<br /><br />' . NAVIGATE_URL, $_REQUEST['send_to']); echo json_encode($ok); core_terminate(); break; case 'reset_statistics': if ($user->permission('websites.edit') == 'true') { $website_id = trim($_REQUEST['website']); $website_id = intval($website_id); $DB->execute('UPDATE nv_items SET views = 0 WHERE website = ' . $website_id); $DB->execute('UPDATE nv_paths SET views = 0 WHERE website = ' . $website_id); $DB->execute('UPDATE nv_structure SET views = 0 WHERE website = ' . $website_id); echo 'true'; users_log::action($_REQUEST['fid'], $website_id, 'reset_statistics', "", json_encode($_REQUEST)); } core_terminate(); break; case 'replace_urls': $old = trim($_REQUEST['old']); $new = trim($_REQUEST['new']); $website_id = trim($_REQUEST['website']); if (!empty($old) && !empty($new)) { // replace occurrences in nv_webdictionary $ok = $DB->execute(' UPDATE nv_webdictionary SET text = replace(text, :old, :new) WHERE website = :wid', array(':old' => $old, ':new' => $new, ':wid' => $website_id)); // replace occurrences in nv_blocks (triggers & actions) $ok = $DB->execute(' UPDATE nv_blocks SET `trigger` = replace(`trigger`, :old, :new), `action` = replace(`action`, :old, :new) WHERE website = :wid', array(':old' => $old, ':new' => $new, ':wid' => $website_id)); echo $ok ? 'true' : 'false'; if ($ok) { users_log::action($_REQUEST['fid'], $website_id, 'replace_urls', "", json_encode($_REQUEST)); } } else { echo 'false'; } core_terminate(); break; case 'remove_content': $website_id = trim($_REQUEST['website']); $website_id = intval($website_id); $password = trim($_REQUEST['password']); $authenticated = $user->authenticate($user->username, $password); if ($authenticated) { // remove all content except Webusers and Files @set_time_limit(0); $ok = $DB->execute(' DELETE FROM nv_blocks WHERE website = ' . $website_id . '; DELETE FROM nv_block_groups WHERE website = ' . $website_id . '; DELETE FROM nv_comments WHERE website = ' . $website_id . '; DELETE FROM nv_structure WHERE website = ' . $website_id . '; DELETE FROM nv_feeds WHERE website = ' . $website_id . '; DELETE FROM nv_items WHERE website = ' . $website_id . '; DELETE FROM nv_notes WHERE website = ' . $website_id . '; DELETE FROM nv_paths WHERE website = ' . $website_id . '; DELETE FROM nv_properties WHERE website = ' . $website_id . '; DELETE FROM nv_properties_items WHERE website = ' . $website_id . '; DELETE FROM nv_search_log WHERE website = ' . $website_id . '; DELETE FROM nv_webdictionary WHERE website = ' . $website_id . '; DELETE FROM nv_webdictionary_history WHERE website = ' . $website_id . '; '); if ($ok) { users_log::action($_REQUEST['fid'], $website_id, 'remove_content', "", json_encode($_REQUEST)); } echo $ok ? 'true' : $DB->error(); } else { echo ''; } core_terminate(); break; case 0: // list / search result // list / search result default: $out = websites_list(); break; } return $out; }
function run() { global $user; global $layout; global $DB; global $website; global $theme; $out = ''; $item = new structure(); switch ($_REQUEST['act']) { case 'load': case 'edit': case 2: // edit/new form if (!empty($_REQUEST['id'])) { $item->load(intval($_REQUEST['id'])); } if (isset($_REQUEST['form-sent'])) { $item->load_from_post(); try { $item->save(); property::save_properties_from_post('structure', $item->id); $item = $item->reload(); // reorder associated category elements if (!empty($_POST['elements-order'])) { $response = item::reorder($_POST['elements-order']); if ($response !== true) { throw new Exception($response); } } $layout->navigate_notification(t(53, "Data saved successfully."), false, false, 'fa fa-check'); } catch (Exception $e) { $layout->navigate_notification($e->getMessage(), true, true); } if (!empty($item->id)) { users_log::action($_REQUEST['fid'], $item->id, 'save', $item->dictionary[$website->languages_list[0]]['title'], json_encode($_REQUEST)); } } else { if (!empty($item->id)) { users_log::action($_REQUEST['fid'], $item->id, 'load', $item->dictionary[$website->languages_list[0]]['title']); } } $out = structure_form($item); break; case 3: case "reorder": $ok = structure::reorder($_REQUEST['parent'], $_REQUEST['children_order']); echo json_encode($ok); core_terminate(); break; case "homepager": $node = $_REQUEST['node']; $website->homepage = $node; $ok = $website->save(); echo json_encode($ok); core_terminate(); break; case 4: case "remove": if (!empty($_REQUEST['id'])) { $item->load(intval($_REQUEST['id'])); if ($item->delete() > 0) { $layout->navigate_notification(t(55, 'Item removed successfully.'), false); $structure = structure::hierarchy(-1); // root level (0) including Web node (-1) $out = structure_tree($structure); users_log::action($_REQUEST['fid'], $item->id, 'remove'); } else { $layout->navigate_notification(t(56, 'Unexpected error.'), false); $out = structure_form($item); } } break; case 95: // free path checking $path = $_REQUEST['path']; $id = $_REQUEST['id']; $DB->query('SELECT type, object_id, lang FROM nv_paths WHERE path = ' . protect($path) . ' AND website = ' . $website->id); $rs = $DB->result(); echo json_encode($rs); core_terminate(); break; case "category_path": // return category paths echo json_encode(path::loadElementPaths('structure', intval($_REQUEST['id']))); core_terminate(); break; case 'json_find_item': // find items by its title // the items must have its own path (free OR not embedded to a category) $DB->query(' SELECT SQL_CALC_FOUND_ROWS nvw.node_id as id, nvw.text as text FROM nv_webdictionary nvw, nv_items nvi WHERE nvw.node_type = "item" AND nvw.node_id = nvi.id AND nvw.subtype = "title" AND ( nvi.association = "free" OR (nvi.association = "category" AND nvi.embedding=0) ) AND nvw.lang = ' . protect($_REQUEST['lang']) . ' AND nvw.website = ' . $website->id . ' AND nvw.website = nvi.website AND nvw.text LIKE ' . protect('%' . $_REQUEST['title'] . '%') . ' ORDER BY nvw.text ASC LIMIT ' . intval($_REQUEST['page_limit']) . ' OFFSET ' . max(0, intval($_REQUEST['page_limit']) * (intval($_REQUEST['page']) - 1)), 'array'); $rows = $DB->result(); $total = $DB->foundRows(); echo json_encode(array('items' => $rows, 'totalCount' => $total)); core_terminate(); break; case "search_by_title": // json search title request (for "copy from" properties dialog) $DB->query(' SELECT node_id as id, text as label, text as value FROM nv_webdictionary WHERE node_type = "structure" AND subtype = "title" AND lang = ' . protect($_REQUEST['lang']) . ' AND website = ' . $website->id . ' AND text LIKE ' . protect('%' . $_REQUEST['title'] . '%') . ' ORDER BY text ASC LIMIT 30', 'array'); echo json_encode($DB->result()); core_terminate(); break; case "copy_from_template_zones": // return template properties for a structure id $item = new structure(); $item->load(intval($_REQUEST['id'])); $template = new template(); $template->load($item->template); $zones = array(); for ($ps = 0; $ps < count($template->properties); $ps++) { // ignore non structure properties if (!isset($template->properties[$ps]->element) || $template->properties[$ps]->element != 'structure') { continue; } // ignore non-textual properties if (!in_array($template->properties[$ps]->type, array("text", "textarea", "rich_textarea"))) { continue; } $title = $template->properties[$ps]->name; if (!empty($theme)) { $title = $theme->t($title); } $zones[] = array('type' => 'property', 'code' => $template->properties[$ps]->id, 'title' => $title); } echo json_encode($zones); core_terminate(); break; case "raw_zone_content": // return raw item contents if ($_REQUEST['zone'] == 'property') { $DB->query('SELECT text FROM nv_webdictionary WHERE node_type = "property-structure" AND subtype = ' . protect('property-' . $_REQUEST['section'] . '-' . $_REQUEST['lang']) . ' AND lang = ' . protect($_REQUEST['lang']) . ' AND website = ' . $website->id . ' AND node_id = ' . protect($_REQUEST['node_id']), 'array'); $data = $DB->first(); echo $data['text']; } core_terminate(); break; case 'votes_reset': webuser_vote::remove_object_votes('structure', intval($_REQUEST['id'])); echo 'true'; core_terminate(); break; case 'votes_by_webuser': if ($_POST['oper'] == 'del') { $ids = explode(',', $_POST['id']); for ($i = 0; $i < count($ids); $i++) { if ($ids[$i] > 0) { $vote = new webuser_vote(); $vote->load($ids[$i]); $vote->delete(); } } webuser_vote::update_object_score('structure', $vote->object_id); echo 'true'; core_terminate(); } $max = intval($_GET['rows']); $page = intval($_GET['page']); $offset = ($page - 1) * $max; if ($_REQUEST['_search'] == 'false') { list($dataset, $total) = webuser_vote::object_votes_by_webuser('structure', intval($_REQUEST['id']), $_REQUEST['sidx'] . ' ' . $_REQUEST['sord'], $offset, $max); } $out = array(); for ($i = 0; $i < count($dataset); $i++) { if (empty($dataset[$i])) { continue; } $out[$i] = array(0 => $dataset[$i]['id'], 1 => core_ts2date($dataset[$i]['date'], true), 2 => $dataset[$i]['username']); } navitable::jqgridJson($out, $page, $offset, $max, $total); core_terminate(); break; case 0: // tree / search result // tree / search result default: $structure = structure::hierarchy(-1); // root level (0) including Web node (-1) $out = structure_tree($structure); break; } return $out; }