예제 #1
0
function wfTalkHereAjaxEditor( $page, $section, $returnto ) {
	global $wgRequest, $wgTitle, $wgOut;

	$title = Title::newFromText( $page );
	if ( !$title ) {
		return false;
	}

	//fake editor environment
	$args = array(
		'wpTalkHere' => '1',
		'wpReturnTo' => $returnto,
		'action' => 'edit',
		'section' => $section
	);

	$wgRequest = new FauxRequest( $args );
	$wgTitle = $title;

	$article = Article::newFromTitle( $title, RequestContext::getMain() );
	$editor = new TalkHereEditPage( $article );

	//generate form
	$editor->importFormData( $wgRequest );
	$editor->showEditForm();

	$response = new AjaxResponse();
	$response->addText( $wgOut->getHTML() );
	$response->setCacheDuration( false ); //don't cache, because of tokens etc

	return $response;
}
 /**
  * Ajax call. This is called by efCategoryTreeAjaxWrapper, which is used to
  * load CategoryTreeFunctions.php on demand.
  */
 function ajax($category, $mode)
 {
     global $wgDBname;
     $title = self::makeTitle($category);
     if (!$title) {
         return false;
     }
     #TODO: error message?
     $this->mIsAjaxRequest = true;
     # Retrieve page_touched for the category
     $dbkey = $title->getDBkey();
     $dbr =& wfGetDB(DB_SLAVE);
     $touched = $dbr->selectField('page', 'page_touched', array('page_namespace' => NS_CATEGORY, 'page_title' => $dbkey), __METHOD__);
     $mckey = "{$wgDBname}:categorytree({$mode}):{$dbkey}";
     //FIXME: would need to add depth parameter.
     $response = new AjaxResponse();
     if ($response->checkLastModified($touched)) {
         return $response;
     }
     if ($response->loadFromMemcached($mckey, $touched)) {
         return $response;
     }
     $html = $this->renderChildren($title, $mode);
     //FIXME: would need to pass depth parameter.
     if ($html == '') {
         $html = ' ';
     }
     #HACK: Safari doesn't like empty responses.
     #see Bug 7219 and http://bugzilla.opendarwin.org/show_bug.cgi?id=10716
     $response->addText($html);
     $response->storeInMemcached($mckey, 86400);
     return $response;
 }
예제 #3
0
 /**
  *
  * cmd posible values:
  * 'getCasesInfo' - in response there will be returned set of cases and subcases info formated in WikiText
  * 'getComment' - in response there will be returned comments for particular case
  */
 public static function getFogbugzServiceResponse()
 {
     global $wgRequest, $wgHTTPProxy, $wgFogbugzAPIConfig;
     $command = $wgRequest->getText('cmd');
     $myFBService = new FogbugzService($wgFogbugzAPIConfig['apiUrl'], $wgFogbugzAPIConfig['username'], $wgFogbugzAPIConfig['password'], $wgHTTPProxy);
     // there should be made some kind of protection from setting different value as cmd
     if ($command == 'getCasesInfo') {
         $outerIDs = $wgRequest->getArray('IDs');
         $results = array();
         try {
             $results = $myFBService->logon()->getCasesBasicInfo($outerIDs);
         } catch (Exception $e) {
             $results = array();
         }
         $preparedResults = FogbugzTag::sortAndMakeTickets($results);
         $response = new AjaxResponse();
         $response->addText(json_encode($preparedResults));
     } else {
         // this part is not in use now; it will be after adding displaying comments
         $outerIDs = $wgRequest->getText('ID');
         /* ... */
     }
     if (!$response) {
         $response = new AjaxResponse();
         $response->addText(json_encode(array('status' => wfMsg('fbtag-unknown-error'))));
     }
     return $response;
 }
 static function blockArticle()
 {
     global $wgUser, $wgExternalDatawareDB, $wgRequest;
     $response = new AjaxResponse();
     if (!$wgUser->isAllowed('corporatepagemanager') || !$wgRequest->wasPosted()) {
         $response->addText(json_encode(array('status' => "ERROR1")));
         return $response;
     }
     $dbw = wfGetDB(DB_MASTER, array(), $wgExternalDatawareDB);
     $dbw->begin();
     $article = $wgRequest->getVal('wiki') . ":" . $wgRequest->getVal('name');
     if (!WikiaGlobalStats::excludeArticle($article)) {
         $response->addText(json_encode(array('status' => "ERROR2")));
         return $response;
     }
     $response->addText(json_encode(array('status' => "OK")));
     $dbw->commit();
     return $response;
 }
예제 #5
0
function playerAjaxHandler($file, $options)
{
    $response = new AjaxResponse();
    try {
        #TODO: caching!
        $player = Player::newFromName($file, $options, 'thumbsize');
        $html = $player->getPlayerHTML();
        $response->addText($html);
    } catch (PlayerException $ex) {
        $response->setResponseCode($ex->getHTTPCode());
        $response->addText($ex->getHTML());
    }
    return $response;
}
예제 #6
0
 function ajaxModalChooseName()
 {
     global $wgRequest;
     $response = new AjaxResponse();
     $specialConnect = new SpecialConnect();
     $form = new ChooseNameForm($wgRequest, 'signup');
     $form->mainLoginForm($specialConnect, '');
     $tmpl = $form->getAjaxTemplate();
     $tmpl->set('isajax', true);
     ob_start();
     $tmpl->execute();
     $html = ob_get_clean();
     $response->addText($html);
     return $response;
 }
예제 #7
0
 /**
  * Ajax call. This is called by efCategoryTreeAjaxWrapper, which is used to
  * load CategoryTreeFunctions.php on demand.
  * @param $category
  * @param $depth int
  * @return AjaxResponse|bool
  */
 function ajax($category, $depth = 1)
 {
     global $wgLang, $wgContLang, $wgRenderHashAppend;
     $title = self::makeTitle($category);
     if (!$title) {
         return false;
         # TODO: error message?
     }
     # Retrieve page_touched for the category
     $dbkey = $title->getDBkey();
     $dbr = wfGetDB(DB_SLAVE);
     $touched = $dbr->selectField('page', 'page_touched', array('page_namespace' => NS_CATEGORY, 'page_title' => $dbkey), __METHOD__);
     $mckey = wfMemcKey("categorytree(" . $this->getOptionsAsCacheKey($depth) . ")", $dbkey, $wgLang->getCode(), $wgContLang->getExtraHashOptions(), $wgRenderHashAppend);
     $response = new AjaxResponse();
     if ($response->checkLastModified($touched)) {
         return $response;
     }
     if ($response->loadFromMemcached($mckey, $touched)) {
         return $response;
     }
     $html = $this->renderChildren($title, $depth);
     if ($html == '') {
         # HACK: Safari doesn't like empty responses.
         # see Bug 7219 and http://bugzilla.opendarwin.org/show_bug.cgi?id=10716
         $html = ' ';
     }
     $response->addText($html);
     $response->storeInMemcached($mckey, 86400);
     return $response;
 }
 static function hideFeed()
 {
     global $wgUser, $wgRequest, $wgLang;
     $response = new AjaxResponse();
     $result = array();
     if (!$wgUser->isAllowed('corporatepagemanager')) {
         $result['response'] = 'error';
         $response->addText(json_encode($result));
         return $response;
     }
     $tag_id = (int) $wgRequest->getVal('tag_id', 0);
     $city_id = (int) $wgRequest->getVal('city_id', 0);
     $page_id = (int) $wgRequest->getVal('page_id', 0);
     $dir = $wgRequest->getVal('dir', 'add');
     $ws = new WikiaStatsAutoHubsConsumerDB(DB_MASTER);
     $result = array();
     if ($dir == 'add') {
         if ($wgRequest->getVal('type') == 'article') {
             if ($ws->addExludeArticle($tag_id, $city_id, $page_id, $wgLang->getCode())) {
                 $result['response'] = 'ok';
             }
         }
         if ($wgRequest->getVal('type') == 'blog') {
             if ($ws->addExludeBlog($tag_id, $city_id, $page_id, $wgLang->getCode())) {
                 $result['response'] = 'ok';
             }
         }
         if ($wgRequest->getVal('type') == 'city') {
             if ($ws->addExludeWiki($tag_id, $city_id, $wgLang->getCode())) {
                 $result['response'] = 'ok';
             }
         }
     } else {
         $result['response'] = 'ok';
         if ($wgRequest->getVal('type') == 'article') {
             $ws->removeExludeArticle($tag_id, $city_id, $page_id, $wgLang->getCode());
         }
         if ($wgRequest->getVal('type') == 'blog') {
             $ws->removeExludeBlog($tag_id, $city_id, $page_id, $wgLang->getCode());
         }
         if ($wgRequest->getVal('type') == 'city') {
             $ws->removeExludeWiki($tag_id, $city_id, $wgLang->getCode());
         }
     }
     $result['response'] = 'ishide';
     $response->addText(json_encode($result));
     return $response;
 }
예제 #9
0
 /**
  Returns colored markup.
 	 
  @return colored markup.
 */
 static function ajax_getColoredText($page_title_raw, $page_id_raw = NULL, $rev_id_raw = NULL)
 {
     global $wgParser, $wgWikiTrustContentServerURL, $wgWikiTrustApiURL, $wgUser;
     global $wgMemc;
     $response = new AjaxResponse("");
     $request_headers = apache_request_headers();
     // Try to use gzip for the content, if possible.
     // Ian - This isn't working with redherring, for some reason.
     if (strstr($request_headers["Accept-Encoding"], "gzip")) {
         //  $response->setContentType("gzip");
     }
     // Can set this to use client side caching, but this can also cause
     // problems.
     // Mark that the content can be cached
     // $response->setCacheDuration(self::TRUST_CACHE_VALID);
     if (!$page_id_raw || !$rev_id_raw) {
         $data = array('action' => 'query', 'prop' => 'revisions', 'titles' => $page_title_raw, 'rvlimit' => '1', 'rvprop' => 'ids', 'format' => 'json');
         $page_info_raw = file_get_contents($wgWikiTrustApiURL . http_build_query($data));
         $page_json = json_decode($page_info_raw, true);
         $pages_arr = array_keys($page_json["query"]["pages"]);
         // Now, parse out only what we need
         if (!$page_id_raw) {
             $page_id_raw = $pages_arr[0];
         }
         if (!$rev_id_raw) {
             $rev_id_raw = $page_json["query"]["pages"][$page_id_raw]["revisions"][0]["revid"];
         }
     }
     $dbr =& wfGetDB(DB_SLAVE);
     $page_id = $dbr->strencode($page_id_raw, $dbr);
     $rev_id = $dbr->strencode($rev_id_raw, $dbr);
     $page_title = $dbr->strencode($page_title_raw, $dbr);
     // Check the If-Modified-Since header.
     // If the timestamp of the requested revision is earlier than the IMS
     // header, return 304 and do nothing further.
     $rev_ts = '19700101000000';
     $res = $dbr->select(self::util_getDbTable('wikitrust_colored_markup'), array('revision_createdon'), array('revision_id' => $rev_id), array());
     if ($res && $dbr->numRows($res) > 0) {
         $row = $dbr->fetchRow($res);
         $rev_ts = $row['revision_createdon'];
         if (!$rev_ts) {
             $rev_ts = '19700101000000';
         }
     }
     $dbr->freeResult($res);
     if ($response->checkLastModified($rev_ts)) {
         return $response;
     }
     // See if we have a cached version of the colored text, or if
     // we need to generate new text.
     $memcKey = wfMemcKey('revisiontext', 'revid', $rev_id);
     $cached_text = $wgMemc->get($memcKey);
     if ($cached_text) {
         $response->addText($cached_text);
         return $response;
     }
     // Since we are here, we need to get the colored HTML the hard way.
     $ctx = stream_context_create(array('http' => array('timeout' => self::TRUST_TIMEOUT)));
     // TODO: Should we do doing this via HTTPS?  Or POST?
     // TODO: in RemoteMode, shouldn't we use local database?
     $colored_raw = file_get_contents($wgWikiTrustContentServerURL . "rev=" . urlencode($rev_id) . "&page=" . urlencode($page_id) . "&page_title=" . urlencode($page_title) . "&time=" . urlencode(wfTimestampNow()) . "&user=0", 0, $ctx);
     if ($colored_raw && $colored_raw != self::NOT_FOUND_TEXT_TOKEN) {
         // Inflate. Pick off the first 10 bytes for python-php conversion.
         $colored_raw = gzinflate(substr($colored_raw, 10));
         // Pick off the median value first.
         $colored_data = explode(",", $colored_raw, 2);
         $colored_text = $colored_data[1];
         if (preg_match("/^[+-]?(([0-9]+)|([0-9]*\\.[0-9]+|[0-9]+\\.[0-9]*)|\n\t\t\t    (([0-9]+|([0-9]*\\.[0-9]+|[0-9]+\\.[0-9]*))[eE][+-]?[0-9]+))\$/", $colored_data[0])) {
             self::$median = $colored_data[0];
             if ($colored_data[0] == 0) {
                 self::$median = self::TRUST_DEFAULT_MEDIAN;
             }
         }
         // First, make sure that there are not any instances of our tokens in the colored_text
         $colored_text = str_replace(self::TRUST_OPEN_TOKEN, "", $colored_text);
         $colored_text = str_replace(self::TRUST_CLOSE_TOKEN, "", $colored_text);
         $colored_text = preg_replace("/'/", "'", $colored_text, -1);
         $colored_text = preg_replace("/&/", "&", $colored_text, -1);
         $colored_text = preg_replace("/</", self::TRUST_OPEN_TOKEN, $colored_text, -1);
         $colored_text = preg_replace("/>/", self::TRUST_CLOSE_TOKEN, $colored_text, -1);
         $title = Title::newFromText($page_title);
         $options = ParserOptions::newFromUser($wgUser);
         $parsed = $wgParser->parse($colored_text, $title, $options);
         $text = $parsed->getText();
         $count = 0;
         // Update the trust tags
         $text = preg_replace_callback("/\\{\\{#t:(\\d+),(\\d+),(.*?)\\}\\}/", "WikiTrust::color_handleParserRe", $text, -1, $count);
         // Update open, close, images, and links.
         $text = preg_replace('/' . self::TRUST_OPEN_TOKEN . '/', "<", $text, -1, $count);
         // Regex broken for some pages.
         // Removing for now.
         /**
               $text = preg_replace('/<a href="(.*?)(File):(.*?)" (.*?)>/'
         			   , self::TRUST_OPEN_TOKEN, $text, -1, $count);
               $text = preg_replace('/<a href="(.*?)(Image):(.*?)" (.*?)>/'
               , self::TRUST_OPEN_TOKEN, $text, -1, $count); */
         $text = preg_replace('/<a href="(.*?)title=(.*?)&amp;action=edit&amp;redlink=1" class="new" title="(.*?) \\(not yet written\\)">/', '<a href="/wiki/$2" title="$3">', $text, -1, $count);
         /* $text = preg_replace_callback(
         	    '/'.self::TRUST_OPEN_TOKEN
         	    .'(Image|File):(.*?)<\/a>/'
         	    ,"WikiTrust::color_getImageInfo"
         	    ,$text, -1, $count);
            */
         $text = preg_replace('/' . self::TRUST_CLOSE_TOKEN . '/', ">", $text, -1, $count);
         $text = preg_replace('/<\\/p>/', "</span></p>", $text, -1, $count);
         $text = preg_replace('/<p><\\/span>/', "<p>", $text, -1, $count);
         $text = preg_replace('/<li><\\/span>/', "<li>", $text, -1, $count);
         // Save the finished text in the cache.
         $wgMemc->set($memcKey, $text, self::TRUST_CACHE_VALID);
         // And finally return the colored HTML.
         $response->addText($text);
         // And mark that we have the colored version, for cache control.
         $dbw = wfGetDB(DB_MASTER);
         $dbw->begin();
         $dbw->insert('wikitrust_colored_markup', array('revision_id' => $rev_id, 'revision_text' => "memcached", 'revision_createdon' => wfTimestampNow()), 'Database::insert', array('IGNORE'));
         $dbw->commit();
     } else {
         // text not found.
         $response = new AjaxResponse(self::NOT_FOUND_TEXT_TOKEN);
     }
     return $response;
 }
예제 #10
0
 /**
  Returns colored markup.
 	 
  @return colored markup.
 */
 static function ajax_getColoredText($page_title, $page_id = 0, $rev_id = 0)
 {
     global $wgTitle, $wgMemc;
     wfWikiTrustDebug(__FILE__ . ":" . __LINE__ . ": ajax_getColoredText({$page_title}, {$page_id}, {$rev_id})");
     wfLoadExtensionMessages('WikiTrust');
     list($page_title, $page_id, $rev_id) = self::util_ResolveRevSpec($page_title, $page_id, $rev_id);
     wfWikiTrustDebug(__FILE__ . ":" . __LINE__ . ": computed=({$page_title}, {$page_id}, {$rev_id})");
     // See if we have a cached version of the colored text, or if
     // we need to generate new text.
     $memcKey = wfMemcKey('revisiontext', 'revid', $rev_id);
     $cached_text = $wgMemc->get($memcKey);
     if ($cached_text) {
         wfWikiTrustDebug(__FILE__ . ":" . __LINE__ . " {$rev_id}: using cached text.");
         $response = new AjaxResponse("");
         $response->addText($cached_text);
         return $response;
     }
     wfWikiTrustDebug(__FILE__ . ":" . __LINE__ . " {$memcKey}: not cached.");
     try {
         $colored_text = WikiTrust::color_getColorData($page_title, $page_id, $rev_id);
         self::color_fixup($colored_text);
     } catch (Exception $e) {
         wfWikiTrustDebug(__FILE__ . ":" . __LINE__ . ": exception caught: " . $e->getMessage());
     }
     $text = '';
     if (!$colored_text) {
         wfWikiTrustDebug(__FILE__ . ":" . __LINE__ . " {$rev_id}: colored text not found.");
         // text not found.
         global $wgUser, $wgParser, $wgTitle;
         $options = ParserOptions::newFromUser($wgUser);
         $msg = $wgParser->parse(wfMsgNoTrans("wgNoTrustExplanation"), $wgTitle, $options);
         $text = $msg->getText() . $text;
     } else {
         self::color_Wiki2Html($colored_text, $text, $rev_id);
         self::vote_showButton($text);
         self::color_addTracker($text);
         // Save the finished text in the cache.
         $wgMemc->set($memcKey, $text);
         wfWikiTrustDebug(__FILE__ . ":" . __LINE__ . " {$memcKey}: saving to cache. ");
     }
     return new AjaxResponse($text);
 }
예제 #11
0
 /**
  * showAll -- ajax function to show all feeds on follow list
  *
  * @static
  * @access public
  *
  *
  * @return bool
  */
 public static function showAll()
 {
     global $wgRequest, $wgUser, $wgExternalSharedDB, $wgWikiaEnableConfirmEditExt;
     wfProfileIn(__METHOD__);
     $user_id = $wgRequest->getVal('user_id');
     $head = $wgRequest->getVal('head');
     $from = $wgRequest->getVal('from');
     $response = new AjaxResponse();
     $user = User::newFromId($user_id);
     if (empty($user) || $user->getOption('hidefollowedpages')) {
         if ($user->getId() != $wgUser->getId()) {
             $response->addText(wfMsg('wikiafollowedpages-special-hidden'));
             return $response;
         }
     }
     $template = new EasyTemplate(dirname(__FILE__) . '/templates/');
     $template->set_vars(array("data" => FollowModel::getWatchList($user_id, $from, FollowModel::$ajaxListLimit, $head), "owner" => $wgUser->getId() == $user_id, "user_id" => $user_id, "more" => true));
     $text = $template->render("followedPages");
     $response->addText($text);
     wfProfileOut(__METHOD__);
     return $response;
 }
예제 #12
0
function createUserLogin()
{
    global $wgRequest, $wgUser, $wgExternalSharedDB, $wgWikiaEnableConfirmEditExt, $wgEnableCOPPA, $wgDefaultSkin;
    // Init session if necessary
    if (session_id() == '') {
        wfSetupSession();
    }
    $response = new AjaxResponse();
    $response->setCacheDuration(3600 * 24 * 365);
    if (!(($wgRequest->getCheck("wpCreateaccountMail") || $wgRequest->getCheck("wpCreateaccount")) && $wgRequest->wasPosted())) {
        $response->addText(json_encode(array('status' => "ERROR", 'msg' => wfMsgExt('comboajaxlogin-post-not-understood', array('parseinline')), 'type' => 'error')));
        return $response;
    }
    if ($wgRequest->getVal('type', '') == '') {
        $wgRequest->setVal('type', 'signup');
    }
    $form = new AjaxLoginForm($wgRequest);
    $form->load();
    if ($wgEnableCOPPA && !$form->checkDate()) {
        // If the users is too young to legally register.
        $response->addText(json_encode(array('status' => "ERROR", 'msg' => wfMsg('userlogin-unable-info'), 'type' => 'error')));
        return $response;
    }
    $dbw = wfGetDB(DB_MASTER, array(), $wgExternalSharedDB);
    $dbl = wfGetDB(DB_MASTER);
    $dbw->begin();
    $dbl->begin();
    $form->execute('signup');
    $dbw->commit();
    $dbl->commit();
    if ($form->msgtype == "error") {
        if (!$wgWikiaEnableConfirmEditExt) {
            /*theoretically impossible because the only possible error is captcha error*/
            $response->addText(json_encode(array('status' => "ERROR", 'msg' => $form->msg, 'type' => $form->msgtype, 'captchaUrl' => '', 'captcha' => '')));
            return $response;
        }
        $captchaObj = new FancyCaptcha();
        $captcha = $captchaObj->pickImage();
        $captchaIndex = $captchaObj->storeCaptcha($captcha);
        $titleObj = SpecialPage::getTitleFor('Captcha/image');
        $captchaUrl = $titleObj->getLocalUrl('wpCaptchaId=' . urlencode($captchaIndex));
        $response->addText(json_encode(array('status' => "ERROR", 'msg' => $form->msg, 'type' => $form->msgtype, 'captchaUrl' => $captchaUrl, 'captcha' => $captchaIndex)));
        return $response;
    }
    $response->addText(json_encode(array('status' => "OK")));
    return $response;
}
예제 #13
0
/**
 * This is used when an author wants to CLONE a title from outside the Documentation namespace into a
 * title within it.  We must be passed the title of the original/source topic and then the destination
 * title which should be a full form PONYDOCS_DOCUMENTATION_NAMESPACE_NAME . ':<manual>:<topicName>:<version>'
 * which it will then tag with the supplied version and strip out any other Category tags (since they are
 * invalid in the Documentation namespace unless a DEFINED version).
 *
 * This will return an AjaxResponse object which MAY contain an error in the case the version is not
 * valid or the topic already exists (destination).
 *
 * @FIXME:  Should validate version is defined.
 *
 * @param string $topic Title of topic to clone.
 * @param string $destTitle Title of destination topic.
 * @return AjaxResponse
 */
function efPonyDocsAjaxCloneExternalTopic($topic, $destTitle)
{
    $response = new AjaxResponse();
    $response->setCacheDuration(false);
    $pieces = split(':', $destTitle);
    if (sizeof($pieces) < 4 || strcasecmp($pieces[0], PONYDOCS_DOCUMENTATION_NAMESPACE_NAME) != 0) {
        $response->addText('Destination title is not valid.');
        return $response;
    }
    if (!PonyDocsManual::IsManual($pieces[1])) {
        $response->addText('Destination title references an invalid manual.');
        return $response;
    }
    if (!PonyDocsVersion::IsVersion($pieces[3])) {
        $response->addText('Destination title references an undefined version.');
        return $response;
    }
    $destArticle = new Article(Title::newFromText($destTitle));
    if ($destArticle->exists()) {
        $response->addText('Destination title already exists.');
        return $response;
    }
    $article = new Article(Title::newFromText($topic));
    if (!$article->exists()) {
        $response->addText('Source article could not be found.');
        return $response;
    }
    $content = $article->getContent();
    //$content = preg_replace( '/\[\[
    return $response;
}
예제 #14
0
function wfAjaxPostCollection($collection = '', $redirect = '')
{
    $json = new Services_JSON(SERVICES_JSON_LOOSE_TYPE);
    if (session_id() == '') {
        wfSetupSession();
    }
    $collection = $json->decode($collection);
    $collection['enabled'] = true;
    $_SESSION['wsCollection'] = $collection;
    $r = new AjaxResponse();
    if ($redirect) {
        $title = Title::newFromText($redirect);
        $redirecturl = wfExpandUrl($title->getFullURL(), PROTO_CURRENT);
        $r->setResponseCode(302);
        header('Location: ' . $redirecturl);
    } else {
        $title = SpecialPage::getTitleFor('Book');
        $redirecturl = wfExpandUrl($title->getFullURL(), PROTO_CURRENT);
        $r->setContentType('application/json');
        $r->addText($json->encode(array('redirect_url' => $redirecturl)));
    }
    return $r;
}
예제 #15
0
 public static function disconnectFromFB($user = null)
 {
     $response = new AjaxResponse();
     $response->addText(json_encode(self::coreDisconnectFromFB($user)));
     return $response;
 }