public function index() { $request = PRequest::get()->request; if (!isset($request[1])) { $this->_redirect(''); } switch ($request[1]) { case 'admin': $BW_Rights = new MOD_right(); if (!$BW_Rights->hasRight('Admin') || !$BW_Rights->hasRight('Notify')) { $this->_redirect(''); } $page = new NotifyAdminPage(); $page->setModel($this->_model); if (isset($_GET['sort'])) { $page->sortorder = $_GET['sort']; } $page->active_page = $this->getPageNumber($request, 2); return $page; break; case 'search': $terms = isset($_GET['GroupsSearchInput']) ? $_GET['GroupsSearchInput'] : ''; $resultpage = isset($_GET['Page']) ? $_GET['Page'] : 0; $order = isset($_GET['Order']) ? $_GET['Order'] : 'nameasc'; $page = new GroupsSearchPage(); $page->search_result = $this->_model->findGroups($terms, $resultpage, $order); $page->result_page = $resultpage; $page->result_order = $order; $page->search_terms = $terms; break; default: // check wether there's a note with id = $request[1] if ($note = $this->_model->findNote($request[1])) { switch ($request[2]) { case 'check': // Ajax function $this->checkNote($note); PPHP::PExit(); default: break; } } } $page->member = $this->_model->getLoggedInMember(); $page->model = $this->_model; return $page; }
/** * checks if a member has a certain old-type right * if member has one of the asked for rights returns true * * @param array $rights - array of right/scope pairs to check for * * @access public * @return bool */ public function hasOldRight(array $rights) { if (!$this->isLoaded()) { return false; } $mod_right = new MOD_right(); foreach ($rights as $right => $scope) { if ($mod_right->hasRight($right, $scope, $this->getPKValue())) { return true; } } return false; }
public function getWiki($page, $title = true) { global $ewiki_db, $ewiki_links, $ewiki_plugins, $ewiki_ring, $ewiki_t, $ewiki_errmsg, $ewiki_data, $ewiki_title, $ewiki_id, $ewiki_action, $ewiki_config, $ewiki_author; // Some settings define("EWIKI_NAME", "BeWelcome Wiki"); define('EWIKI_SCRIPT', 'wiki/'); define("EWIKI_SPLIT_TITLE", 1); define("EWIKI_SCRIPT_URL", PVars::getObj("env")->baseuri . 'wiki/'); # absolute URL define("EWIKI_SCRIPT_BINARY", 0); define("EWIKI_PROTECTED_MODE", 1); define("EWIKI_RESCUE_HTML", 1); define("EWIKI_URLENCODE", 0); define("EWIKI_URLDECODE", 0); define("EWIKI_ALLOW_HTML", 1); define("EWIKI_DESC", "Document and share content about hospitality exchange and travel on bewelcome.org"); # site description define("EWIKI_COPY", "PrimarilyPublicDomain"); # site copyright define("EWIKI_CATEGORY", "Hospitality Exchange"); # site subject define("EWIKI_LOGO_URL", "http://www.bewelcome.org/images/logo_index_top.png"); if (!$title) { define("EWIKI_PRINT_TITLE", 0); } # <h2>WikiPageName</h2> on top // Authentification require_once "erfurtwiki/plugins/auth/auth_perm_ring.php"; $ewiki_perm_rings['rss'] = 3; $model = new MembersModel(); $member = $model->getLoggedInMember(); $Right = new MOD_right(); if ($member && $Right->hasRight('Admin', 'Wiki')) { $ewiki_author = $member->Username; define("EWIKI_AUTH_DEFAULT_RING", 0); // 0 = admin } elseif ($member) { $ewiki_author = $member->Username; define("EWIKI_AUTH_DEFAULT_RING", 2); // 2 = edit allowed } else { $ewiki_author = 'guest'; define("EWIKI_AUTH_DEFAULT_RING", 3); // 3 = read/view/browse-only } $this->defineMarkup($ewiki_config); // More plugins require_once "erfurtwiki/plugins/aview/toc.php"; // Table of contents $ewiki_plugins["view_final"][] = "ewiki_add_title"; require_once "erfurtwiki/plugins/markup/mediawiki.php"; // load our own mediawiki plugin require_once "erfurtwiki/plugins/aview/fpage_copyright.php"; // Copyleft Info require_once "erfurtwiki/plugins/markup/bbcode.php"; // BBcode plugin require_once "erfurtwiki/plugins/markup/smilies.php"; // smilies ;) require_once "erfurtwiki/plugins/markup/rescuehtml.php"; // safe html tags ;) require_once "erfurtwiki/plugins/admin/control.php"; // load some plugins require_once "erfurtwiki/plugins/action/diff.php"; // stupid diff ;) require_once "erfurtwiki/plugins/action/info_qdiff.php"; // quick diff require_once "erfurtwiki/plugins/linking/titlefix.php"; // quick diff // require_once("erfurtwiki/plugins/markup/htmltable.php"); // quick diff // require_once("erfurtwiki/plugins/action/verdiff.php"); // version diff - not needed right now!? // RSS support require_once "erfurtwiki/plugins/lib/feed.php"; // load our own mediawiki plugin require_once "erfurtwiki/plugins/action/rss.php"; // load our own mediawiki plugin // Static pages require_once "erfurtwiki/plugins/page/wikinews.php"; // load some plugins require_once "erfurtwiki/plugins/page/recentchanges.php"; // load some plugins require_once "erfurtwiki/plugins/page/powersearch.php"; // load some plugins require_once "erfurtwiki/plugins/page/wantedpages.php"; // load some plugins require_once "erfurtwiki/plugins/page/orphanedpages.php"; // load some plugins require_once "erfurtwiki/plugins/page/recentchanges.php"; // load some plugins // require_once("erfurtwiki/plugins/aview/control2.php"); // quick diff require_once 'erfurtwiki/ewiki.php'; $ewiki_config["smilies"] = array(":)" => "emoticon_happy.png", ";)" => "emoticon_grin.png", ":D" => "emoticon_smile.png"); $wiki = ewiki_page($page); echo $wiki; }
/** * Update Member's Profile * * @param unknown_type $vars * @return unknown */ public function updateProfile(&$vars) { $IdMember = (int) $vars['memberid']; $words = new MOD_words(); $rights = new MOD_right(); $m = $vars['member']; // fantastic ... love the implementation. Fake $CanTranslate = false; // $CanTranslate = CanTranslate($vars["memberid"], $_SESSION['IdMember']); $ReadCrypted = "MemberReadCrypted"; // This might be changed in the future if ($rights->hasRight('Admin') || $rights->hasRight('SafetyTeam')) { // admin or CanTranslate can alter other profiles $ReadCrypted = "AdminReadCrypted"; // In this case the AdminReadCrypted will be used } $m->removeLanguages(); foreach ($vars['languages_selected'] as $lang) { if ($language = $this->createEntity('Language')->findById($lang->IdLanguage)) { $ml = $this->createEntity('MemberLanguage'); $ml->setSpokenLanguage($m, $language, $lang->Level); } } // Set the language that ReplaceinMTrad uses for writing $words->setlangWrite($vars['profile_language']); // refactoring to use member entity // $m->LastLogin = '******' ? 'Never' : $layoutbits->ago(strtotime($TM->LastLogin)); // Members lastlogin is no to be updated here if (isset($vars['Status']) && !empty($vars['Status'])) { // this can only happen when an admin or the safety team edits a profile $m->Status = $vars['Status']; } $m->Gender = $vars['gender']; $m->HideGender = $vars['HideGender']; $m->BirthDate = $vars['BirthYear'] . '-' . $vars['BirthMonth'] . '-' . $vars['BirthDay']; $m->bday = $vars['BirthDay']; $m->bmonth = $vars['BirthMonth']; $m->byear = $vars['BirthYear']; $m->HideBirthDate = $vars['HideBirthDate']; $m->HideGender = $vars['HideGender']; $m->ProfileSummary = $words->ReplaceInMTrad($vars['ProfileSummary'], "members.ProfileSummary", $IdMember, $m->ProfileSummary, $IdMember); $m->WebSite = strip_tags($vars['WebSite']); $m->Accomodation = $vars['Accomodation']; $m->Organizations = $words->ReplaceInMTrad($vars['Organizations'], "members.Organizations", $IdMember, $m->Organizations, $IdMember); $m->Occupation = $words->ReplaceInMTrad(strip_tags($vars['Occupation']), "members.Occupation", $IdMember, $m->Occupation, $IdMember); $m->ILiveWith = $words->ReplaceInMTrad($vars['ILiveWith'], "members.ILiveWith", $IdMember, $m->ILiveWith, $IdMember); $m->MaxGuest = strip_tags($vars['MaxGuest']); $m->MaxLenghtOfStay = $words->ReplaceInMTrad($vars['MaxLenghtOfStay'], "members.MaxLenghtOfStay", $IdMember, $m->MaxLenghtOfStay, $IdMember); $m->AdditionalAccomodationInfo = $words->ReplaceInMTrad($vars['AdditionalAccomodationInfo'], "members.AdditionalAccomodationInfo", $IdMember, $m->AdditionalAccomodationInfo, $IdMember); $m->TypicOffer = strip_tags($vars['TypicOffer']); $m->Restrictions = strip_tags($vars['Restrictions']); $m->OtherRestrictions = $words->ReplaceInMTrad($vars['OtherRestrictions'], "members.OtherRestrictions", $IdMember, $m->OtherRestrictions, $IdMember); $m->Hobbies = $words->ReplaceInMTrad($vars['Hobbies'], "members.Hobbies", $IdMember, $m->Hobbies, $IdMember); $m->Books = $words->ReplaceInMTrad($vars['Books'], "members.Books", $IdMember, $m->Books, $IdMember); $m->Music = $words->ReplaceInMTrad($vars['Music'], "members.Music", $IdMember, $m->Music, $IdMember); $m->Movies = $words->ReplaceInMTrad($vars['Movies'], "members.Movies", $IdMember, $m->Movies, $IdMember); $m->PastTrips = $words->ReplaceInMTrad($vars['PastTrips'], "members.PastTrips", $IdMember, $m->PastTrips, $IdMember); $m->PlannedTrips = $words->ReplaceInMTrad($vars['PlannedTrips'], "members.PlannedTrips", $IdMember, $m->PlannedTrips, $IdMember); $m->PleaseBring = $words->ReplaceInMTrad($vars['PleaseBring'], "members.PleaseBring", $IdMember, $m->PleaseBring, $IdMember); $m->OfferGuests = $words->ReplaceInMTrad($vars['OfferGuests'], "members.OfferGuests", $IdMember, $m->OfferGuests, $IdMember); $m->OfferHosts = $words->ReplaceInMTrad($vars['OfferHosts'], "members.OfferHosts", $IdMember, $m->OfferHosts, $IdMember); $m->PublicTransport = $words->ReplaceInMTrad($vars['PublicTransport'], "members.PublicTransport", $IdMember, $m->PublicTransport, $IdMember); // as $CanTranslate is set explicitly above, this is disabled // if (!$CanTranslate) { // a volunteer translator will not be allowed to update crypted data if ($vars["HouseNumber"] != $m->get_housenumber()) { $this->logWrite("Housenumber updated", "Address Update"); } if ($vars["Street"] != $m->get_street()) { $this->logWrite("Street updated", "Address Update"); } if ($vars["Zip"] != $m->get_zip()) { $this->logWrite("Zip updated", "Address Update"); } if ($vars["Email"] == "cryptedhidden") { $this->logWrite("members.model updateprofile email keeps previous value (cryptedhidden detected)", "Debug"); } else { if ($vars["Email"] != $m->email) { $this->logWrite("Email updated (previous was " . $m->email . ")", "Email Update"); // Sticking to old BW, the previous email is stored in logs, // this might be discussed, but if the member fills a bad email, // there is no more way to retrieve him // Todo : get rid with this, but implement a confimmation mail $m->Email = MOD_crypt::NewReplaceInCrypted(strip_tags($vars['Email']), "members.Email", $IdMember, $m->Email, $IdMember, $this->ShallICrypt($vars, "Email")); } } if ($vars["HomePhoneNumber"] != "cryptedhidden") { $m->HomePhoneNumber = MOD_crypt::NewReplaceInCrypted(addslashes(strip_tags($vars['HomePhoneNumber'])), "members.HomePhoneNumber", $IdMember, $m->HomePhoneNumber, $IdMember, $this->ShallICrypt($vars, "HomePhoneNumber")); } if ($vars["CellPhoneNumber"] != "cryptedhidden") { $m->CellPhoneNumber = MOD_crypt::NewReplaceInCrypted(addslashes(strip_tags($vars['CellPhoneNumber'])), "members.CellPhoneNumber", $IdMember, $m->CellPhoneNumber, $IdMember, $this->ShallICrypt($vars, "CellPhoneNumber")); } if ($vars["WorkPhoneNumber"] != "cryptedhidden") { $m->WorkPhoneNumber = MOD_crypt::NewReplaceInCrypted(addslashes(strip_tags($vars['WorkPhoneNumber'])), "members.WorkPhoneNumber", $IdMember, $m->WorkPhoneNumber, $IdMember, $this->ShallICrypt($vars, "WorkPhoneNumber")); } if ($vars["chat_SKYPE"] != "cryptedhidden") { $m->chat_SKYPE = MOD_crypt::NewReplaceInCrypted(addslashes(strip_tags($vars['chat_SKYPE'])), "members.chat_SKYPE", $IdMember, $m->chat_SKYPE, $IdMember, $this->ShallICrypt($vars, "chat_SKYPE")); } if ($vars["chat_AOL"] != "cryptedhidden") { $m->chat_AOL = MOD_crypt::NewReplaceInCrypted(addslashes(strip_tags($vars['chat_AOL'])), "members.chat_AOL", $IdMember, $m->chat_AOL, $IdMember, $this->ShallICrypt($vars, "chat_AOL")); } if ($vars["chat_YAHOO"] != "cryptedhidden") { $m->chat_YAHOO = MOD_crypt::NewReplaceInCrypted(addslashes(strip_tags($vars['chat_YAHOO'])), "members.chat_YAHOO", $IdMember, $m->chat_YAHOO, $IdMember, $this->ShallICrypt($vars, "chat_YAHOO")); } if ($vars["chat_ICQ"] != "cryptedhidden") { $m->chat_ICQ = MOD_crypt::NewReplaceInCrypted(addslashes(strip_tags($vars['chat_ICQ'])), "members.chat_ICQ", $IdMember, $m->chat_ICQ, $IdMember, $this->ShallICrypt($vars, "chat_ICQ")); } if ($vars["chat_Others"] != "cryptedhidden") { $m->chat_Others = MOD_crypt::NewReplaceInCrypted(addslashes(strip_tags($vars['chat_Others'])), "members.chat_Others", $IdMember, $m->chat_Others, $IdMember, $this->ShallICrypt($vars, "chat_Others")); } if ($vars["chat_GOOGLE"] != "cryptedhidden") { $m->chat_GOOGLE = MOD_crypt::NewReplaceInCrypted(addslashes(strip_tags($vars['chat_GOOGLE'])), "members.chat_GOOGLE", $IdMember, $m->chat_GOOGLE, $IdMember, $this->ShallICrypt($vars, "chat_GOOGLE")); } $firstname = MOD_crypt::AdminReadCrypted($m->FirstName); $secondname = MOD_crypt::AdminReadCrypted($m->SecondName); $lastname = MOD_crypt::AdminReadCrypted($m->LastName); if ($firstname != strip_tags($vars['FirstName']) || $secondname != strip_tags($vars['SecondName']) || $lastname != strip_tags($vars['LastName'])) { $this->logWrite("{$m->Username} changed name. Firstname: {$firstname} -> " . strip_tags($vars['FirstName']) . ", second name: {$secondname} -> " . strip_tags($vars['SecondName']) . ", second name: {$lastname} -> " . strip_tags($vars['LastName']), 'Profile update'); } if ($vars["FirstName"] != "cryptedhidden") { MOD_crypt::NewReplaceInCrypted($this->dao->escape(strip_tags($vars['FirstName'])), "members.FirstName", $IdMember, $m->FirstName, $IdMember, $this->ShallICrypt($vars, "FirstName")); } if ($vars["SecondName"] != "cryptedhidden") { $cryptId = MOD_crypt::NewReplaceInCrypted($this->dao->escape(strip_tags($vars['SecondName'])), "members.SecondName", $IdMember, $m->SecondName, $IdMember, $this->ShallICrypt($vars, "SecondName")); // Update member if a new crypted SecondName value was added if ($cryptId != $m->SecondName) { $m->SecondName = $cryptId; } } if ($vars["LastName"] != "cryptedhidden") { MOD_crypt::NewReplaceInCrypted($this->dao->escape(strip_tags($vars['LastName'])), "members.LastName", $IdMember, $m->LastName, $IdMember, $this->ShallICrypt($vars, "LastName")); } if ($vars["Zip"] != "cryptedhidden") { $this->logWrite("in members.model updateprofile() Before Zip update addresss.Zip=" . $m->address->Zip, "Debug"); $cryptId = MOD_crypt::NewReplaceInCrypted($this->dao->escape(strip_tags($vars['Zip'])), "addresses.Zip", $m->IdAddress, $m->address->Zip, $IdMember, $this->ShallICrypt($vars, "Zip")); // Update addresses table if a new crypted zip value was added if ($cryptId != $m->address->Zip) { $m->setCryptedZip($cryptId); } $this->logWrite("in members.model updateprofile() After Zip update addresss.Zip=" . $m->address->Zip . " \$cryptId=" . $cryptId, "Debug"); } if ($vars["HouseNumber"] != "cryptedhidden") { $cryptId = MOD_crypt::NewReplaceInCrypted($this->dao->escape(strip_tags($vars['HouseNumber'])), "addresses.HouseNumber", $m->IdAddress, $m->address->HouseNumber, $IdMember, $this->ShallICrypt($vars, "Address")); // Update addresses table if a new crypted HouseNumber value was added if ($cryptId != $m->address->HouseNumber) { $m->setCryptedHouseNumber($cryptId); } } if ($vars["Street"] != "cryptedhidden") { $cryptId = MOD_crypt::NewReplaceInCrypted($this->dao->escape(strip_tags($vars['Street'])), "addresses.StreetName", $m->IdAddress, $m->address->StreetName, $IdMember, $this->ShallICrypt($vars, "Address")); // Update addresses table if a new crypted StreetName value was added if ($cryptId != $m->address->StreetName) { $m->setCryptedStreetName($cryptId); } } // Check relations, and update them if they have changed $Relations = $m->get_all_relations(); foreach ($Relations as $Relation) { if ($words->mInTrad($Relation->Comment, $vars['profile_language']) != $vars["RelationComment_" . $Relation->id] and !empty($vars["RelationComment_" . $Relation->id])) { // echo "Relation #".$Relation->id,"<br />", $words->mInTrad($Relation->Comment,$vars['profile_language']),"<br />",$vars['RelationComment_'.$Relation->id],"<br />" ; $IdTrad = $words->ReplaceInMTrad(strip_tags($vars["RelationComment_" . $Relation->id]), "specialrelations.Comment", $Relation->id, $Relation->Comment, $IdMember); // Empty comments have trad id 0. Causing ReplaceInMTrad to create // a new trad id and returning the new number. if ($IdTrad != $Relation->id) { $m->update_relation($Relation->id, $IdTrad); } $this->logWrite("updating relation #" . $Relation->id . " Relation Confirmed=" . $Relation->Confirmed, "Profile update"); } } // Check groups membership description, and update them if they have changed // Tod od with Peter: check if there is other feature to update a group membership (a groupmembership model for example, or entity) /* group membership should not be present here, disabled for now $Groups=$m->getGroups() ; for ($i = 0; $i < count($Groups) ; $i++) { $group=$Groups[$i] ; $group_id = $group->getPKValue() ; $group_name_translated = $words->get("Group_".$group->Name); $group_comment_translated = htmlspecialchars($words->mInTrad($m->getGroupMembership($group)->Comment,$vars['profile_language']), ENT_QUOTES); $IdMemberShip=$m->getGroupMembership($group)->id ; if (($words->mInTrad($m->getGroupMembership($group)->Comment,$vars['profile_language'])!=$vars["GroupMembership_".$IdMemberShip]) and (!empty($vars["GroupMembership_".$IdMemberShip]))) { echo "Group #".$group_id,"<br />",$words->mInTrad($m->getGroupMembership($group)->Comment,$vars['profile_language']),"<br />",$vars["GroupMembership_".$IdMemberShip],"<br />" ; $words->ReplaceInMTrad(strip_tags($vars["GroupMembership_".$IdMemberShip]),"membersgroups.Comment", $IdMemberShip, $m->getGroupMembership($group)->Comment, $IdMember); $this->logWrite("updating membership description in group #".$group_id." Group name=".$group->name, "Profil update"); } } */ // if a member with status NeedMore updates her/his profile, moving them back to pending if ($m->Status == 'NeedMore') { $m->Status = 'Pending'; } $status = $m->update(); if (!empty($_FILES['profile_picture']) && !empty($_FILES['profile_picture']['tmp_name'])) { if (isset($_FILES['profile_picture']) && $_FILES['profile_picture']['error'] == 0) { $this->avatarMake($vars['memberid'], $_FILES['profile_picture']['tmp_name']); } } if ($IdMember == $_SESSION['IdMember']) { $this->logWrite("Profile update by member himself [Status={$m->Status}]", "Profile update"); } else { $this->logWrite("update of another profile <b>" . $m->Username . "</b>", "Profile update"); // It can be an admin update or a delegated translation update } return $status; }
/** * handles edit profile form post - profile updating * * @param object $args * @param object $action * @param object $mem_redirect * @param object $mem_resend * @access public * @return string */ public function editMyProfileCallback($args, $action, $mem_redirect, $mem_resend) { if (isset($args->post)) { $vars = $this->cleanVars($args->post); $request = $args->request; $errors = $this->model->checkProfileForm($vars); $uploadFailed = false; if (in_array('UploadedProfileImageTooBig', $errors) === false || in_array('ProfileImageUploadFailed', $errors) === false) { $uploadFailed = true; } else { // check if uploaded file is image $img = new MOD_images_Image($_FILES['profile_picture']['tmp_name']); if (!$img->isImage()) { $errors[] = 'ProfileUploadNotImage'; $uploadFailed = true; } } $vars['errors'] = array(); if (count($errors) > 0) { $vars['errors'] = $errors; // Activate fieldset tab "Contact Info" if needed. if (in_array('SignupErrorInvalidBirthDate', $vars['errors']) === false && $uploadFailed === false) { $vars['activeFieldset'] = 'contactinfo'; } // show form again $mem_redirect->post = $vars; return false; } $rights = new MOD_right(); if (!($rights->hasRight('Admin') || $rights->hasRight('SafetyTeam'))) { $vars['memberid'] = $this->model->getLoggedInMember()->getPKValue(); } $vars['member'] = $this->getMember($vars['memberid']); $vars = $this->model->polishProfileFormValues($vars); $success = $this->model->updateProfile($vars); if (!$success) { $mem_redirect->problems = array('Could not update profile'); } // Redirect to a nice location like editmyprofile/finish $str = implode('/', $request); if (in_array('finish', $request)) { return $str; } return $str . '/finish'; } }
/** * deleteMTrad function * * This delete a translations * */ public function deleteMTrad($IdTrad, $IdOwner, $IdLanguage) { $IdMember = $_SESSION['IdMember']; $str = <<<SQL SELECT * FROM memberstrads WHERE IdTrad = '{$IdTrad}' AND IdOwner = '{$IdOwner}' AND IdLanguage = '{$IdLanguage}' SQL; $s = $this->_dao->query($str); if (!$s) { return false; } if ($s->numRows() == 0) { return false; } $Trad = $s->fetch(PDB::FETCH_OBJ); $BW_Right = new MOD_right(); if ($IdOwner != $IdMember && !$BW_Right->hasRight('Admin')) { return false; } $this->MakeRevision($Trad->id, "memberstrads"); // create revision before the delete // If the IdTrad for this language was already deleted // SQL will throw an exception as the triple IdTrad, IdOwner and IdLanguage is already set // live DB has an index on this. $query = "\nDELETE FROM\n memberstrads\nWHERE\n IdTrad = '" . -$IdTrad . "' AND\n IdOwner = '{$IdMember}' AND\n IdLanguage = '{$IdLanguage}'"; $this->_dao->query($query); // Mark the tradId as deleted by turning it into -IdTrad $query = "\nUPDATE\n memberstrads\nSET\n IdTrad = '" . -$IdTrad . "'\nWHERE\n IdTrad = '{$IdTrad}' AND\n IdOwner = '{$IdMember}' AND\n IdLanguage = '{$IdLanguage}'"; $this->_dao->query($query); return false; }
/** * Search for tags to suggest * Checks which word is being edited and looks for possible matches * * @param string $search comma-delimited search words * @return stringarray 2dimensional array with the new suggested tags */ public function suggestTags($search) { // Split words $words = explode(',', $search); $cleaned = array(); // Clean up foreach ($words as $word) { $word = trim($word); if ($word) { $cleaned[] = $word; } } $words = $cleaned; // Which word is the person changing? $number_words = count($words); if ($number_words && isset($_SESSION['prev_tag_content']) && $_SESSION['prev_tag_content']) { $search_for = false; $pos = false; for ($i = 0; $i < $number_words; $i++) { if (isset($words[$i]) && (!isset($_SESSION['prev_tag_content'][$i]) || $words[$i] != $_SESSION['prev_tag_content'][$i])) { $search_for = $words[$i]; $pos = $i; } } if (!$search_for) { return array(); } } else { if ($number_words) { $search_for = $words[count($words) - 1]; // last word $pos = false; } else { return array(); } } if ($search_for) { $_SESSION['prev_tag_content'] = $words; // look for possible matches (from ALL tags) // TODO: // Limit number of returned tags? Order by popularity? // TODO: // Use $this->getTagsIt()? $query = "SELECT `name`\n FROM `blog_tags`\n WHERE `name` LIKE '" . $this->dao->escape($search_for) . "%'"; $s = $this->dao->query($query); if (!$s) { throw new PException('Could not retrieve tag entries'); } // select tags based on rights $member = $this->getLoggedInMember(); $communityNews = false; if ($member) { $right = new MOD_right(); $communityNews = $right->hasRight('CommunityNews'); } $tags = array(); while ($row = $s->fetch(PDB::FETCH_OBJ)) { if (strcasecmp($row->name, "Community news for the frontpage") == 0 && !$communityNews) { continue; } $tags[] = $row->name; } if ($tags) { $out = array(); $suggestion_number = 0; foreach ($tags as $w) { $out[$suggestion_number] = array(); for ($i = 0; $i < count($words); $i++) { if ($i == $pos) { $out[$suggestion_number][] = $w; } else { $out[$suggestion_number][] .= $words[$i]; } } $suggestion_number++; } return $out; } } return array(); }