Как использовать инструменты Wiki Media API внутри расширения Wiki (WPMW) для записи/добавления контента на страницу

Привет!

Вот сцена:

Я работаю над сайтом Wordpress, пользователи которого должны быть интегрированы в настройку Media Wiki. Все отлично работает при использовании расширения Media Wiki под названием WPMW. Когда пользователи Wordpress входят в систему, они автоматически добавляются в базу данных пользователей Media Wiki, а также становятся аффилированными с Wiki. Успешно.

Вот что мне нужно сделать:

Мне нужно после входа пользователя Wordpress + Media Wiki (через расширение WPMW) найти способ обновить одну конкретную страницу Media Wiki на основе информации, которую я получаю от текущего пользователя в процессе. Например: когда пользователь Wordpress с именем Olaf (роль Редактор) подключается к Media Wiki, я хочу просто написать (добавить) на специальную страницу Wiki (называемую >Редактор) имя Олаф, которое будет вместе с другими существующими именами.

Поэтому я исследовал Media Wiki API и после нескольких примеров смог создать PHP-файл, в котором после обращения к серверу он находит определенный код и добавляет к нему текст (даже используя созданный ранее шаблон Media Wiki). Снова успех, но только для автономного использования... Мне нужно перейти на example.com/my-script.php, чтобы заставить его работать.

Вот проблема:

Я попытался вставить свой код API внутрь расширения WPMW, но очевидно, что все не так просто, и все перестало работать. Итак, мне интересно, каким может быть правильный способ внутри расширения Media Wiki вызвать API Media Wiki и дать ему инструкции по добавлению текста на страницу Media Wiki на основе Переменные PHP присутствуют в момент входа в систему WPMW?

Например: когда Олаф (редактор) входит в Wordpress и переходит на вики, расширение WPMW становится активным и создает мост — путем автоматической регистрации Олафа в базе данных вики (если это его первый раз) — или просто путем регистрации Олафа на сайт Media Wiki.

На данный момент я могу получить из Wordpress в качестве переменных все данные, относящиеся ко мне, Имя пользователя и Роль пользователя. Но как использовать их для добавления имени Олафа к странице вики под названием Редакторы?

Вот мой код API, основанный на найденных мною примерах:

<?php
$settings['wikiroot'] = "http://example.com/wiki";
$settings['user'] =  "shangchi";
$settings['pass'] =  "my-password";
$settings['domain'] = 'Windows';
$settings['cookiefile'] = "cookies.tmp";

// Test: use a Wiki template to append to page
$prepend = "{{test}}\n\n";


function httpRequest($url, $post="") {
        global $settings;

        $ch = curl_init();
        //Change the user agent below suitably
        curl_setopt($ch, CURLOPT_USERAGENT, 'application/x-www-form-urlencoded');
        curl_setopt($ch, CURLOPT_URL, ($url));
        curl_setopt($ch, CURLOPT_ENCODING, "UTF-8" );
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $settings['cookiefile']);
        curl_setopt($ch, CURLOPT_COOKIEJAR, $settings['cookiefile']);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        if (!empty($post)) curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
        #UNCOMMENT TO DEBUG TO output.tmp
        curl_setopt($ch, CURLOPT_VERBOSE, true); // Display communication with server
        $fp = fopen("output.tmp", "w");
        curl_setopt($ch, CURLOPT_STDERR, $fp); // Display communication with server

        $xml = curl_exec($ch);

        if (!$xml) {
                throw new Exception("Error getting data from server ($url): " . curl_error($ch));
        }

        //var_dump($xml);

        curl_close($ch);

        return $xml;
}


function login ($user, $pass, $token='') {
        global $settings;

        $url = $settings['wikiroot'] . "/api.php?action=login&format=xml";

        $params = "action=login&lgname=$user&lgpassword=$pass";
        if (!empty($settings['domain'])) {
            $params .= "&lgdomain=" . $settings['domain'];
        }
        if (!empty($token)) {
                $params .= "&lgtoken=$token";
        }

        $data = httpRequest($url, $params);

        if (empty($data)) {
                throw new Exception("No data received from server. Check that API is enabled.");
        }

        $xml = simplexml_load_string($data);

        if (!empty($token)) {
                //Check for successful login
                $expr = "/api/login[@result='Success']";
                $result = $xml->xpath($expr);

                if(!count($result)) {
                        throw new Exception("Login failed");
                }
        } else {
                $expr = "/api/login[@token]";
                $result = $xml->xpath($expr);

                if(!count($result)) {
                        throw new Exception("Login token not found in XML");
                }
        }

        return $result[0]->attributes()->token;
}


try {
        global $settings;
        $token = login($settings['user'], $settings['pass']);
        login($settings['user'], $settings['pass'], $token);

        // get edit token
        $result = httpRequest($settings['wikiroot'] . "/api.php?action=query&format=json&meta=tokens");

        $result = json_decode($result);
        $editToken = $result->query->tokens->csrftoken;

        // Get a specific wiki page: Main Page for testing
        $result = httpRequest($settings['wikiroot'] . "/api.php?action=query&titles=Main%20Page&format=json&aplimit=500");
        $result = json_decode($result);
        $allpages = $result->query->pages;

        foreach ($allpages as $page) {
            echo "Fetching '{$page->title}' ({$page->pageid})...\n";
            $revisions = httpRequest(sprintf($settings['wikiroot'] . "/api.php?action=query&prop=revisions&rvlimit=1&format=json&rvprop=content&titles=%s", urlencode($page->title)));
            $revisions = json_decode($revisions);
            if (isset($revisions->error)) {
                echo "ERROR: " . $revisions->error->info . "\n";
                continue;
            }
            $content = $revisions->query->pages->{$page->pageid}->revisions[0]->$star;
            if (preg_match("/\{\{migration_/", $content)) {
                echo "Already marked ... skipping.\n";
                continue;
            }
            echo "Updating...";
            // add text to content and edit page
            $content = $prepend . $content;
            $post = sprintf("title=%s&text=%s&token=%s", urlencode($page->title), urlencode($content), urlencode($editToken));
            $result = httpRequest($settings['wikiroot'] . "/api.php?action=edit&format=json", $post);
            echo "done\n";
        }
        echo ("Finished (".sizeof($allpages)." pages).\n");
} catch (Exception $e) {
        die("FAILED: " . $e->getMessage());
}

?>

person Cospefogo    schedule 10.02.2015    source источник


Ответы (1)


Во-первых, ознакомьтесь с этой статьей, чтобы узнать о правильном внутреннем вызове API.

Во-вторых, правильный способ реагировать на событие — использовать крючок (в вашем случае , возможно, AddNewAccount).

В-третьих, вы уверены, что хотите сделать это, отредактировав обычную страницу? Создание специальной страницы, которая просто генерирует список пользователей на лету, кажется мне гораздо менее хлопотным делом.

person Tgr    schedule 22.02.2015
comment
Спасибо, Тгр. Спасибо за ваши указания. Сейчас проект приостановлен, мои коллеги ищут другой подход. С уважением! - person Cospefogo; 22.02.2015