LPS:Nastavení a úpravy Mediawiki pro support.zcu.cz (OLD)

Z Support
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(reorganizace odstavcu)
(Aktualizováno pro verzi 1.19.)
Řádka 1: Řádka 1:
Tato stránka vzniká během instalace mediawiki pro support.zcu.cz. Dokumentace se nemusí úplně ve všem shodovat, je třeba provést kontrolu přímo na serveru.  
+
Návod je aktuální k Mediawiki verze 1.19.
  
==Instalace==
+
==Konfigurace serveru==
Balík mediawiki je v debianu ve starší verzi, která neumí rozšíření, jenž bychom potřebovali, je třeba provést instalaci z archivu. Archiv se rozbalí do <tt>/usr/local/mediawiki-VERZE</tt>. Adresáře a soubory, které mají být vidět se linkují z <tt>/var/lib/mediawiki-VERZE</tt> (dále bude název adresáře mediawiki uvádět bez verze). Přidané soubory by se měli dávat do <tt>/var/lib/mediawiki/</tt> (jako je <tt>favicon.ico</tt> či rozšíření pro autentizaci). V adresáři <tt>/usr/local/mediawiki</tt> by měla být ponechána nezměněná distribuce s případnými patchi.
+
  
 
===MySQL===
 
===MySQL===
 +
 
Dle http://meta.wikimedia.org/wiki/Help:Short_words_in_searches je potřeba nastavit minimální délku slova pro vyhledávání na 3 znaky.
 
Dle http://meta.wikimedia.org/wiki/Help:Short_words_in_searches je potřeba nastavit minimální délku slova pro vyhledávání na 3 znaky.
  
==Apache==
+
===Apache===
 +
 
 
Idea provozu supportu ve dvou režimech (public, user) autentizovaný WebAuthem je založena na tom, že je Apache provozován na více portech:
 
Idea provozu supportu ve dvou režimech (public, user) autentizovaný WebAuthem je založena na tom, že je Apache provozován na více portech:
 +
 
* port 80 (http) - neautentizovaný uživatel, pokuď je uživatel přihlášen, je mu umožněn uživatelský provoz
 
* port 80 (http) - neautentizovaný uživatel, pokuď je uživatel přihlášen, je mu umožněn uživatelský provoz
 +
 
* port 443 (https) - chráněno WebAuthem a je vyžadováno přihlášení
 
* port 443 (https) - chráněno WebAuthem a je vyžadováno přihlášení
  
===Konfigurace Apache===
 
 
Apache2 s podporou autentizace WebAuth lze nakonfigurovat následnovně:
 
Apache2 s podporou autentizace WebAuth lze nakonfigurovat následnovně:
 
<pre>
 
<pre>
 
<VirtualHost _default_:80>
 
<VirtualHost _default_:80>
 
   ServerAdmin webmaster@service.zcu.cz
 
   ServerAdmin webmaster@service.zcu.cz
   Servername morpheus.civ.zcu.cz
+
   ServerName daphne.civ.zcu.cz
 +
  ServerAlias daphne
  
 
   ErrorLog /var/log/apache2/wiki-error.log
 
   ErrorLog /var/log/apache2/wiki-error.log
Řádka 32: Řádka 35:
  
 
   Alias /images /var/lib/mediawiki/images
 
   Alias /images /var/lib/mediawiki/images
 +
  Include /etc/apache2/redirect.conf
 +
 +
  RewriteEngine On
 +
  RewriteRule ^/nagios/cgi-bin/extinfo.cgi.*$ http://support.zcu.cz/index.php/P%C5%99ehled_dostupnosti_poskytovan%C3%BDch_slu%C5%BEeb
 +
 
   <Directory /var/lib/mediawiki/images>
 
   <Directory /var/lib/mediawiki/images>
           Options -FollowSymLinks
+
           Options +FollowSymLinks -Indexes
 
           AllowOverride None
 
           AllowOverride None
 
   </Directory>
 
   </Directory>
</VirtualHost>
+
</VirtualHost><VirtualHost _default_:443>
 
+
<VirtualHost _default_:443>
+
 
   ServerAdmin webmaster@service.zcu.cz
 
   ServerAdmin webmaster@service.zcu.cz
   ServerName morpheus.civ.zcu.cz
+
   ServerName daphne.civ.zcu.cz
 +
  ServerAlias daphne
 
   ServerSignature off
 
   ServerSignature off
  
Řádka 48: Řádka 55:
 
   SSLEngine on
 
   SSLEngine on
 
   SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
 
   SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
 +
  SSLVerifyDepth 3
 
   SSLCertificateFile /etc/apache2/ssl/server.crt
 
   SSLCertificateFile /etc/apache2/ssl/server.crt
 
   SSLCertificateKeyFile /etc/apache2/ssl/server.key
 
   SSLCertificateKeyFile /etc/apache2/ssl/server.key
   SSLCACertificateFile /etc/apache2/ssl/zcu-ca.crt
+
   SSLCertificateChainFile /etc/apache2/ssl/ca-chain.pem
  
 
   ServerSignature Off
 
   ServerSignature Off
 +
 +
  Include /etc/apache2/redirect.conf
  
 
   DocumentRoot /var/lib/mediawiki
 
   DocumentRoot /var/lib/mediawiki
Řádka 61: Řádka 71:
 
           allow from all
 
           allow from all
  
#           SSLVerifyClient optional
+
          #SSLVerifyClient optional
#           SSLVerifyDepth 9
+
          #SSLVerifyDepth 9
 
           SSLOptions +ExportCertData +StdEnvVars +FakeBasicAuth +OptRenegotiate
 
           SSLOptions +ExportCertData +StdEnvVars +FakeBasicAuth +OptRenegotiate
 
           AuthType WebAuth
 
           AuthType WebAuth
           Require privgroup civ lps
+
           require privgroup civ lps helps
#           require user vbaxa hana tana zewelova jhodis simha rskarda fiser kvochova
+
          #require user vbaxa hana tana zewelova jhodis simha rskarda fiser kvochova
 
   </Directory>
 
   </Directory>
  
Řádka 74: Řádka 84:
 
           AllowOverride None
 
           AllowOverride None
  
#           SSLVerifyClient optional
+
          #SSLVerifyClient optional
#           SSLVerifyDepth 9
+
          #SSLVerifyDepth 9
 
           SSLOptions +ExportCertData +StdEnvVars +FakeBasicAuth +OptRenegotiate
 
           SSLOptions +ExportCertData +StdEnvVars +FakeBasicAuth +OptRenegotiate
 
           AuthType WebAuth
 
           AuthType WebAuth
           Require privgroup civ lps
+
           Require privgroup civ lps helps
#           require user vbaxa hana tana zewelova jhodis simha rskarda fiser kvochova
+
          #require user vbaxa hana tana zewelova jhodis simha rskarda fiser kvochova
  
 
         </Directory>
 
         </Directory>
Řádka 85: Řádka 95:
 
</pre>
 
</pre>
  
 +
Dále se musí v /etc/php5/apache2/php.ini nastavit tyto volby (v sec):
  
==Rozšíření autentizace pro WebAuth==
+
<pre>
Základem je konfigurace použitá pro [http://wiki.case.edu/CaseWiki:External_Authentication PubCookie na CASE Univerzity] a návodu pro [http://meta.wikipedia.org/wiki/Auto_Login_via_REMOTE_USER automatické přihlášení přes REMOTE_USER]. Pro správnou funkčnost je třeba mít nastaven WebAuth v Apachi. Ve všech uvedených kódech je třeba zkontrolovat přesměrování, nejčastěji se používá volání <tt>header('Location: <cílové URL>');</tt>
+
session.cookie_lifetime = 36000
 +
session.gc_maxlifetime = 36000
 +
</pre>
  
Chybí doplnit kód do <tt>index.php</tt>, který by při každém použití mediawiki zkontroloval aktuálnost přihlášení. Pokud se mediawiki nepoužívá, přihlášení vyprchá, v tom případě stačí klepnout na tlačítko <tt>přihlásit</tt> a vše je v pořádku. V tomto ohledu jsou problémy i s keší, kdy se občas stane, že zobrazuje stránku s právy, které už uživatel dávno nemá, nebo právě naopak, neukazuje akce na které právo má. Pravděpodobně stačí vyladit mechanismus keše nebo do redirectu přidat žádost o vyčištění (<tt>action=purge</tt>).
+
Toto musi byt v souladu s hodnotou $wgCookieExpiration v konfiguraci wiki (soubor LocalSettings.php).
  
===Nastavení LocalSettings.php===
+
 
Následující řádky je třeba přidat do <tt>LocalSettings.php</tt>. Do proměnné <tt>$wgLoginFormKey</tt> se
+
===Další závislosti===
ukládá náhodný řetězec.
+
 
 +
Některá rozšíření vyžadují, aby byl na serveru nainstalován balík graphviz.
 +
 
 +
==Upgrade o patch level==
 +
Stáhnout novou verzi a rozbalit ji do <tt>/usr/local/mediawiki-VERZE/</tt>. Dalším krokem je úprava
 +
skriptů, které byly upraveny (jedná se zvláště o přihlašování). Seznam (nemusí být úplný je zde):
 +
* aplikovat patch pro Restrict stránky, '''neprovádět upgrade''' pokud patch neexistuje
 +
* upravit <tt>includes/SpecialSearch.php</tt> tak, aby podporoval vyhledávání google
 +
* <tt>includes/templates/Userlogin.php</tt> - změna přesměrování při přihlášení
 +
* zkontrolovat [[LPS:Nastavení a úpravy Mediawiki pro support.zcu.cz#Zrušení tlačítek pro nepřihlášené uživatele|zákaz zobrazování tlačítek]] pro nepřihlášené uživatele
 +
* zkontrolovat [[LPS:Nastavení a úpravy Mediawiki pro support.zcu.cz#Zrušení zobrazování tlačítka pro diskusi|zrušení zobrazování tlačítka pro diskusi]] pro všechny uživatele
 +
* zkontrolovat změny ve skinu
 +
* zkontrolovat kompatibilitu všech rozšíření a aktualizovat je
 +
 
 +
Viz také [http://www.mediawiki.org/wiki/Manual:Upgrading Manuálovou stránku k upgradování]
 +
 
 +
===Postup upgrade===
 +
Předpokládáme, že jsme na stroji, co na něm je wiki již nainstalována. Tzn. v databázi máme data wiki a obrázky v <tt>/opt/wiki-images</tt>.
 +
 
 +
Nejprve se ujistíme, že Apache a MySQL jsou nakonfigurovány v souladu s touto dokumentací.
 +
 
 +
Stáhneme mediawiki a rozbalíme do <tt>/opt/mediawiki-<verze></tt>.
 +
 
 +
Prolinkujeme:
 
<pre>
 
<pre>
# prihlaseni webauthem
+
ln -sfn /opt/mediawiki-<verze> /var/lib/mediawiki
require_once ("$IP/extensions/Auth_apache.php");
+
rm -r /opt/mediawiki-<verze>/images
$wgLoginFormKey = "oh33ad928sfh2359k7fg3xt39";
+
ln -s /opt/wiki-images /var/lib/mediawiki/images
$wgAuth = new Auth_apache();
+
</pre>
  
# expirace prihlaseni po 10 hodinach
+
Máme dvě možnosti. Buď si zobrazíme wiki v prohlížeči a projdeme webový instalátor. Ten nám vygeneruje základ souboru <tt>LocalSettings.php</tt> a updatne databázi. Nebo si soubor <tt>LocalSettings.php</tt> přetáhneme ze staré instalace a spustíme:
$wgCookieExpiration = 36000;
+
<pre>
 +
php maintenance/update.php
 
</pre>
 
</pre>
 +
čím zaktualizujeme databázi.
 +
 +
Upravíme <tt>LocalSettings.php</tt>.
 +
 +
Aplikujeme patch pro Page Restriction.
 +
 +
Nainstalujeme rozšíření.
 +
 +
==Úpravy v LocalSettings.php==
 +
  
===Rozšíření o externí autentizaci===
+
Kvůli starším rozšířením se musí na začátek souboru přidat následující řádky:
Je třeba přepsat standardní autentizační funkce vlastními. K tomu nám bude sloužit vlastní rozšíření
+
uložené v souboru <tt>/var/lib/mediawiki/extensions/Auth_apache.php</tt> s tímto obsahem:
+
 
<pre>
 
<pre>
<?php
+
if ( !defined( 'MEDIAWIKI' ) ) {
require_once('AuthPlugin.php');
+
        exit;
 +
}
  
class Auth_apache extends AuthPlugin {
+
+$path = array( $IP, "$IP/includes", "$IP/languages" );
 +
+set_include_path( implode( PATH_SEPARATOR, $path ) . PATH_SEPARATOR . get_include_path() );
 +
</pre>
  
  //return whether $username is a valid username
+
$path = array( $IP, "$IP/includes", "$IP/languages" );
  function userExists($username) {
+
set_include_path( implode( PATH_SEPARATOR, $path ) . PATH_SEPARATOR . get_include_path() );
    //since the username will be passed from our external source, this will probably always be true
+
    //however, the security paranoid says to check the data
+
    //you could do an LDAP verify here, just to be safe
+
  
    return true; //or return false if the username is invalid
+
Změna nastavení cache:
   }
+
<pre>
 +
$wgMainCacheType = CACHE_MEMCACHED;
 +
$wgMemCachedServers = array (
 +
   0 => '127.0.0.1:11211',
 +
  );
 +
</pre>
  
  //whether the given username and password authenticate
+
Dál je třeba dát pozor na to aby proměnná <tt>$wgServer</tt> byla nastavená bez protokolu. Jinak se nenačítá css po přesměrování z webauthu. Takže něco jako:
  function authenticate($username, $password) {
+
<pre>
    //the external authentication actually handles this part, but we still need a security check
+
$wgServer          = "//support.zcu.cz";
 +
</pre>
  
    //this form element will be set by our login script. this security check is important!
+
Následující nastavení je třeba přidat nakonec <tt>LocalSettings.php</tt>:
    global $wgLoginFormKey;
+
<pre>
 +
ini_set( 'memory_limit', '80M' );
  
    return isset($_POST[$wgLoginFormKey]);
+
$wgShowIPinHeader = false;
  }
+
$wgDisableAnonTalk = true;
  
  //The authorization is external, so autocreate accounts as necessary
+
# nastaveni defaultniho uzivatele
  function autoCreate() {
+
$wgDefaultUserOptions ['editsection'] = 0;
    return true;
+
$wgDefaultUserOptions ['date'] = 2;
  }
+
$wgDefaultUserOptions ['timecorrection'] = '02:00';
  
  //tell MediaWiki to not look in its database for user authentication and that our authentication method is all that counts
+
# enable patrolling
  function strict() {
+
# http://meta.wikimedia.org/wiki/Patrol
    return true;
+
$wgUseRCPatrol = true;
  }
+
# --- NAMESPACES ------------------------------------------------------------
 +
$wgExtraNamespaces = array (
 +
100 => "CIV",
 +
101 => "CIV diskuse",
 +
102 => "LPS",
 +
103 => "LPS diskuse",
 +
104 => "SIS",
 +
105 => "SIS diskuse",
 +
106 => "HelpDesk",
 +
107 => "HelpDesk diskuse",
 +
108 => "Aktuality",
 +
109 => "Aktuality diskuse",
 +
110 => "Public",
 +
111 => "Public diskuse",
 +
112 => "PIS",
 +
113 => "PIS diskuse",
 +
114 => "KPS",
 +
115 => "KPS diskuse"
 +
);
  
  //this function gets called when the user is created
+
$wgNamespacesToBeSearchedDefault = array(
  //$user is an instance of the User class (see includes/User.php)
+
'NS_MEDIA'            => false,
   function initUser(&$user) {
+
'NS_SPECIAL'          => false,
    //unless you want the person to be nameless, you should probably populate info about this user here
+
'NS_MAIN'            => true,
    //we do some LDAP queries to populate their name and e-mail
+
'NS_TALK'            => false,
 +
'NS_USER'            => false,
 +
'NS_USER_TALK'        => false,
 +
'NS_WIKIPEDIA'        => false,
 +
'NS_WIKIPEDIA_TALK'   => false,
 +
'NS_IMAGE'            => false,
 +
'NS_IMAGE_TALK'      => false,
 +
'NS_MEDIAWIKI'        => false,
 +
'NS_MEDIAWIKI_TALK'  => false,
 +
'NS_TEMPLATE'        => false,
 +
'NS_TEMPLATE_TALK'    => false,
 +
'NS_HELP'            => false,
 +
'NS_HELP_TALK'        => false,
 +
'NS_CATEGORY'        => true,
 +
'NS_CATEGORY_TALK'    => false,
 +
100 => false,
 +
101 => false,
 +
102 => false,
 +
103 => false,
 +
104 => false,
 +
105 => false,
 +
106 => false,
 +
107 => false,
 +
108 => true,
 +
109 => false,
 +
110 => true,
 +
111 => false,
 +
112 => false,
 +
113 => false,
 +
114 => false,
 +
115 => false
 +
);
  
//    $user->setRealName("John Smith");
+
# Enable subpages in the namespace
//    $user->setEmail("john.smith@case.edu");
+
$wgNamespacesWithSubpages[0] = 1;
 +
$wgNamespacesWithSubpages[100] = 1;
 +
$wgNamespacesWithSubpages[102] = 1;
 +
$wgNamespacesWithSubpages[104] = 1;
 +
$wgNamespacesWithSubpages[106] = 1;
 +
$wgNamespacesWithSubpages[108] = 1;
 +
$wgNamespacesWithSubpages[110] = 1;
 +
$wgNamespacesWithSubpages[112] = 1;
 +
$wgNamespacesWithSubpages[114] = 1;
  
//  $user->setRealName("John Smith");
+
$wgUploadPath      = "$wgScriptPath/images";
  // global $wgUser;
+
$wgUploadDirectory = "$IP/images";
    //  global $_SERVER;
+
# --- PERMISSIONS ---
    //   $user->setEmail($_SERVER['REMOTE_USER'] . "@tbp.berkeley.edu");
+
$wgGroupPermissions['*'    ]['createaccount']  = false;
 +
$wgGroupPermissions['*'   ]['read']            = true;
 +
$wgGroupPermissions['*'   ]['edit']            = false;
  
    //if using MediaWiki 1.5, we can set some e-mail options
+
$wgGroupPermissions['user' ]['move']            = false;
    $user->mEmailAuthenticated = wfTimestampNow();
+
$wgGroupPermissions['user' ]['edit']            = false;
 +
$wgGroupPermissions['user' ]['upload']          = true;
 +
$wgGroupPermissions['user' ]['viewrestrict']    = false;
  
    //turn on e-mail notifications by default
+
$wgGroupPermissions['editor']['edit']          = true;
    $user->setOption('enotifwatchlistpages', 1);
+
$wgGroupPermissions['editor']['restrict']      = true;
    $user->setOption('enotifusertalkpages', 1);
+
$wgGroupPermissions['editor']['upload']        = true;
    $user->setOption('enotifminoredits', 1);
+
$wgGroupPermissions['editor']['move']          = true;
    $user->setOption('enotifrevealaddr', 1);
+
$wgGroupPermissions['editor']['delete']        = true;
  }
+
  
  //if using MediaWiki 1.5, we have a new function to modify the UI template!
+
$wgGroupPermissions['mediator']['protect']      = true;
  function modifyUITemplate(&$template) {
+
$wgGroupPermissions['mediator']['patrol']      = true;
     //disable the mail new password box
+
$wgGroupPermissions['mediator']['rollback']     = true;
    $template->set("useemail", false);
+
  
    //disable 'remember me' box
+
$wgGroupPermissions['sysop']['restrict']        = true;
    $template->set("remember", false);
+
  
    $template->set("create", false);
+
$wgGroupPermissions['pis']['edit']              = true;
  
    $template->set("domain", true);
+
#Na logo CIV se lze dostat odkazem [[Image:Logo_ZCU-support.png]]
  }
+
$wgLogo = "{$wgUploadPath}/8/83/Logo_ZCU-support.png";
}
+
?>
+
</pre>
+
  
====TODO====
+
$wgVerifyMimeType = false;
* chybí doplnit dotaz do LDAPu pro zjištění reálného jména a emailové adresy.
+
$wgMimeDetectorCommand = "/usr/bin/file -bi";
* přidat kontrolu obsahu (nejen existenci) proměnné $LoginFormKey
+
$wgFileExtensions = array('png', 'jpg', 'jpeg', 'gif', 'dia', 'tar.gz', 'tgz', 'gz', 'pdf', 'zip', 'odt', 'odg');
  
===Přihlašovací skript===
+
## To enable image uploads, make sure the 'images' directory
Následující skript <tt>/var/lib/mediawiki/login/index.php</tt> provádí přihlášení uživatele (je vyžadován balík <tt>php-http-request</tt>). Tento skript je provede přihlášení na základě proměnné <tt>REMOTE_USER</tt>. Ve
+
## is writable, then uncomment this:
skutečnosti provede volání standardního přihlašovacího skriptu <tt>includes/SpecialUserlogin.php</tt> s tím,
+
$wgEnableUploads                = true;
že se mu podvrhne request, který se vytvoří uvnitř tohoto skriptu. Adresu requestu je třeba zkontrolovat.
+
$wgUseImageResize              = true;
 +
$wgUseImageMagick = true;
 +
$wgImageMagickConvertCommand = "/usr/bin/convert";
 +
 
 +
# expirace prihlaseni po 10 hodinach
 +
$wgCookieExpiration = 36000;
 +
 
 +
# Debug
 +
#error_reporting(E_ALL);
 +
#ini_set( 'display_errors', 1 );
 +
#$wgShowExceptionDetails = true;
 +
 
 +
# Pokud je povolena cache parseru, vede to na bezpecnostni diru v page protectu
 +
$wgParserCacheType  = CACHE_NONE;
 +
</pre>
 +
 
 +
==Úpravy kódu a vzhledu==
 +
===Úpravy stylu===
 +
Následující css je třeba vložit do <tt>MediaWiki:Common.css</tt>:
 
<pre>
 
<pre>
<?php
+
table.tabulka {
 +
  background: #f9f9f9;
 +
  padding: 1pt;
 +
  border: 1px solid silver;
 +
}
 +
table.tabulka th {
 +
  background: #a2bdc8;
 +
  border: 1px solid black;
 +
  padding: 0 2pt;
 +
}
 +
table.tabulka td {
 +
  border: 1px dotted gray;
 +
}
  
define('MEDIAWIKI', true); //needed to include LocalSettings.php without MediaWiki spazzing out
+
table.tabulka-red {
 +
  background: #f9f9f9;
 +
  padding: 1pt;
 +
  border: 1px solid silver;
 +
}
 +
table.tabulka-red th {
 +
  background: #ff3939;
 +
  border: 1px solid black;
 +
  padding: 0 2pt;
 +
  color: white;
 +
}
  
//we need to bring in $wgLoginFormKey
 
require_once('../LocalSettings.php');
 
  
//this script must be run behind some type of Apache user authorization
+
table.tabulka-red td {
//fail immediately if it isn't
+
   border: 1px dotted gray;
if (!isset($_SERVER['REMOTE_USER'])) {
+
   die("The remote user variable is not set");
+
 
}
 
}
  
//set the login username
+
body.page-Hlavní_strana h1.firstHeading { display:none; }
//on our wiki, we actual do some voodoo and rename the user to something else because our network usernames are not supposed to be published
+
body.page-Kiosek h1.firstHeading { display:none; }
//we do that in this script before it even hits MediaWiki
+
$username = $_SERVER['REMOTE_USER'];
+
session_start();
+
  
$redirect = $_SESSION['http_referrer'];
+
/* X3 - FACELIFT na modrou JVS compliant variantu - srpen 2014 ----------------------------- */
unset($_SESSION['http_referrer']);
+
  
ini_set('include_path','/usr/share/php');
+
/* V podstate predelani standardniho skinu Vector na neco, co je v souladu s JVS ZCU
require_once "HTTP/Request.php";
+
  - uprava zahlavi (pozice, background, logo)
 +
  - uprava horizontalni navigace (pozice, barvy)
 +
  - pridani hacku obarvujiciho element p-cactions v pripade, ze je stranka restricted a uzivatl ma moznost ji zverejnit
 +
*/
  
//create the request to the login form
+
div#mw-head {
$req = &new HTTP_Request('http://morpheus.civ.zcu.cz/index.php?title=Special:Userlogin&action=submitlogin',
+
  background: url("/skins/vector/headerBackground.png") repeat-x scroll 0 0 #23549b;
        array('method'=>'POST'));
+
  height: 95px;
 +
}
  
global $wgLoginFormKey;
+
#mw-page-base {
 +
    height: 95px;
 +
}
  
//set up the request with fake data
+
#left-navigation {
$req->addPostData("wpName", $username);
+
    top: 66px;
$req->addPostData("wpPassword", "password"); //we could change "password" to some value and double check in our custom login extension if we wanted added security
+
    left: 159px;
$req->addPostdata("wpLoginattempt", "Log in");
+
}
$req->addPostdata($wgLoginFormKey, "value here doesn't matter");
+
  
$req->sendRequest();
+
#right-navigation {
 +
    margin-top: 66px;
 +
}
  
//uncomment to debug mediawiki response
+
div.vectorMenu,
//print_r($req->getResponseCookies());
+
div.vectorMenu h5 a,
//print_r($req->getResponseHeader());
+
div.vectorTabs,
//print_r($req->getResponseBody());
+
div.vectorTabs ul li {
//die();
+
    height: 28px;
 +
}
  
//intercept the cookies sent by mediawiki and set them for the client
+
div.vectorTabs,
//you could change the expiration time of the cookies for added security
+
div.vectorTabs ul,
global $wgCookieExpiration;
+
div.vectorTabs ul li,
foreach ($req->getResponseCookies() as $c) {
+
div.vectorTabs ul li.selected,
        if ($c['name'] == "PHPSESSID") {
+
div.vectorTabs span,
          setcookie("PHPSESSID", $c['value'], Time()+$wgCookieExpiration, '/');
+
div.vectorMenu h5 a {
        }
+
    background-image: none;
        else {
+
          setcookie($c['name'], $c['value'], Time()+$wgCookieExpiration, $c['path']);
+
        }
+
 
}
 
}
  
//finally redirect the user back to his original page
+
div.vectorTabs span a {
//echo "RETURNTO: ".$_GET['returnto'];
+
    padding-top: 6px;
 +
}
  
header("Location: https://morpheus.civ.zcu.cz/index.php/".$_GET['returnto']."");
+
#p-search form, #p-search input {
 +
    margin: 0;
 +
}
  
?>
+
div.vectorMenu,
</pre>
+
div.vectorTabs ul li {
 +
    background-color: white;
 +
}
  
====TODO====
+
div#mw-panel {
* chybí nastavení platnosti cookie dle přihlášení WebAuthu.
+
    top: 115px;
 +
}
  
===Úprava přihlašovací stránky===
+
a.new,
Do souboru <tt>includes/templates/Userlogin.php</tt> je třeba vložit přesměrování na <tt>login/index.php</tt> v případě, že nejde o request. Přidáme tedy řádky:
+
#p-personal a.new,
<pre>
+
a.new:visited,
header('Location: https://morpheus.civ.zcu.cz/login/index.php?returnto='.$_GET['returnto'].'');
+
#p-personal:visited a.new {
exit;
+
    color: #FFCB00 !important;
</pre>
+
    font-weight: bold !important;
Změna je provedena okolo 25. řádku, výřez z takto upraveného souboru:
+
}
<pre>
+
class UserloginTemplate extends QuickTemplate {
+
        function execute() {
+
  
                if( $this->data['error'] ) {
+
#p-personal a {
?>
+
    color: white;
        <h2><?php $this->msg('loginerror') ?>:</h2>
+
}
        <p class='error'><?php $this->html('error') ?></p>
+
<?php } ?>
+
  
<?php
+
#pt-userpage, #pt-anonuserpage, #pt-login {
header('Location: https://morpheus.civ.zcu.cz/login/index.php?returnto='.$_GET['returnto'].'');
+
    background: url("/skins/vector/icon_user.png") no-repeat scroll 0 0 transparent;
exit;
+
}
?>
+
        <h2><?php $this->msg('login'      ) ?>:</h2>
+
        <?php  $this->msgWiki('loginprompt') ?>
+
<?php } ?>
+
<form name="userlogin" id="userlogin" method="post" action="<?php $this->text('action') ?>">
+
</pre>
+
  
=== Prodloužení doby platnosti pro cookie ===
+
div.vectorMenu,
Nepodařilo se zatím jinak, jediná možnost je v <tt>/etc/php4/apache2/php.ini</tt> nastavit tyto volby (v sec):
+
div.vectorTabs li {
session.cookie_lifetime = 36000
+
    border-right: 1px solid #e8e8e8;
session.gc_maxlifetime = 36000
+
    border-top: 1px solid #132d52;
 +
}
  
Toto musi byt v souladu s hodnotou <tt>$wgCookieExpiration</tt> v konfiguraci wiki (soubor <tt>LocalSettings.php</tt>).
+
div.vectorTabs li:first-child {
 +
    border-left: 1px solid #132d52;
 +
}
  
==Změna vzhledu (CSS)==
+
#left-navigation div.vectorTabs li:last-child {
===Vytvoření nového skinu===
+
    border-right: 1px solid #132d52;
Vzhled je založen na skinu ''monobook'' a jmenuje se  ''zcumonobook''. Postup vychází z dokumentu http://meta.wikimedia.org/wiki/Skins, pro support bylo postupováno následovně:
+
}
* okopírování monobooku pod nový název
+
 
cd /var/lib/mediawiki/skins
+
div.vectorMenu {
cp -R monobook zcumonobook
+
    border-right: 1px solid #132d52;
cp MonoBook.php ZCUMonoBook.php
+
}
* úprava názvů funkcí v <tt>ZCUMonoBook.php</tt>, provést dle dokumentu http://meta.wikimedia.org/wiki/Skins, odstavec ''Creating a Skin based on MonoBook (1.6.x)'', diff pro verzi 1.6.3 je:
+
<pre>
+
#  
+
--- MonoBook.php        2006-04-11 03:17:51.000000000 +0200
+
+++ ZCUMonoBook.php    2006-07-11 13:07:25.000000000 +0200
+
@@ -22,13 +22,13 @@
+
  * @package MediaWiki
+
  * @subpackage Skins
+
  */
+
-class SkinMonoBook extends SkinTemplate {
+
-       /** Using monobook. */
+
+class SkinZCUMonoBook extends SkinTemplate {
+
+      /** Using zcumonobook. */
+
        function initPage( &$out ) {
+
                SkinTemplate::initPage( $out );
+
-              $this->skinname  = 'monobook';
+
-              $this->stylename = 'monobook';
+
-              $this->template  = 'MonoBookTemplate';
+
+              $this->skinname  = 'zcumonobook';
+
+              $this->stylename = 'zcumonobook';
+
+              $this->template  = 'ZCUMonoBookTemplate';
+
        }
+
}
+
+
@@ -37,7 +37,7 @@
+
  * @package MediaWiki
+
  * @subpackage Skins
+
  */
+
-class MonoBookTemplate extends QuickTemplate {
+
+class ZCUMonoBookTemplate extends QuickTemplate {
+
        /**
+
        * Template filter callback for MonoBook skin.
+
        * Takes an associative array of data set from a SkinTemplate-based
+
@@ -217,7 +217,7 @@
+
                                <li id="t-ispermalink"><?php $this->msg('permalink') ?></li><?php
+
                }
+
+
-              wfRunHooks( 'MonoBookTemplateToolboxEnd', array( &$this ) );
+
+              wfRunHooks( 'ZCUMonoBookTemplateToolboxEnd', array( &$this ) );
+
?>
+
                        </ul>
+
                </div>
+
 
</pre>
 
</pre>
  
===Konfigurace===
+
Dále je třeba přetáhnout následující věci:
Skin je potřeba nastavit jako defaultní v <tt>LocalSettings.php</tt> úpravou volby <tt>$wgDefaultSkin</tt>:
+
$wgDefaultSkin = 'zcumonobook';
+
  
Vhodné je vyřadit z provozu ostatní skiny nastavením volby <tt>$wgSkipSkins</tt>:
+
*2x NEW soubor
$wgSkipSkins = array("monobook", "chick", "cologneblue", "myskin", "nostalgia", "simple", "standard");
+
**/skins/Vector.php - 2 zmeny
 +
**/skind/vector/screen.css - 1 zmena
 +
*2x "OLD" soubor
 +
**/skins/Vector_old.php
 +
**/skind/vector/screen_old.css
 +
*3x obrazek
 +
**/skins/vector/headerBackground.png
 +
**/skins/vector/headerLogo.png
 +
**/skins/vector/icon_user.png
  
Uložení loga jako obrázku do wiki a jeho nastavení:
+
===Zrušení tlačítek pro nepřihlášené uživatele===
$wgLogo = "{$wgUploadPath}/Logo_ZCU-support.png";
+
V souboru <tt>includes/SkinTemplate.php</tt> je třeba řádek:
 +
<pre>
 +
$userCanRead = $title->quickUserCan( 'read', $user );
 +
</pre>
  
===Úprava stylu===
+
změnit na:
Celý tento odstavec se týká úprav v souborech pro kaskádové styly. Veškeré úpravy jsou prováděny v adresáři <tt>skins/zcumonobook/</tt>
+
  
'''main.css'''
 
 
<pre>
 
<pre>
--- monobook/main.css  2006-05-01 22:04:15.000000000 +0200
+
$userCanRead = $user->getId() != 0 && $title->quickUserCan( 'read', $user );
+++ zcumonobook/main.css        2006-07-12 13:57:40.000000000 +0200
+
@@ -14,22 +14,22 @@
+
        float: right;
+
        margin: 0 0 .6em -12.2em;
+
        padding: 0;
+
}
+
#content {
+
-      margin: 2.8em 0 0 12.2em;
+
+      margin: 4.8em 0 0 12.2em;
+
        padding: 0 1em 1.5em 1em;
+
        background: white;
+
        color: black;
+
        border: 1px solid #aaa;
+
        border-right: none;
+
        line-height: 1.5em;
+
        position: relative;
+
        z-index: 2;
+
}
+
#column-one {
+
-      padding-top: 160px;
+
+      padding-top: 76px;
+
}
+
/* the left column width is specified in class .portlet */
+
+
/* Font size:
+
** We take advantage of keyword scaling- browsers won't go below 9px
+
@@ -37,11 +37,11 @@
+
** http://style.cleverchimp.com/font_size_intervals/altintervals.html
+
*/
+
+
body {
+
        font: x-small sans-serif;
+
-      background: #f9f9f9 url(headbg.jpg) 0 0 no-repeat;
+
+      background: #e0e0e0 url(headbg2.jpg) 0 0 no-repeat;
+
        color: black;
+
        margin: 0;
+
        padding: 0;
+
}
+
+
@@ -244,10 +244,13 @@
+
#bodyContent h3, #bodyContent h4, #bodyContent h5 {
+
        margin-bottom: .3em;
+
}
+
.firstHeading {
+
        margin-bottom: .1em;
+
+      color: #005cab;
+
+      border: 0;
+
+      font-weight: bold;
+
}
+
+
/* user notification thing */
+
.usermessage {
+
        background-color: #ffce7b;
+
@@ -687,26 +690,26 @@
+
*/
+
+
#p-logo {
+
        z-index: 3;
+
        position: absolute; /*needed to use z-index */
+
-      top: 0;
+
-      left: 0;
+
-      height: 155px;
+
-      width: 12em;
+
+      top: 2px;
+
+      left: 2px;
+
+      height: 69px;
+
+      width: 420px;
+
        overflow: visible;
+
}
+
#p-logo h5 {
+
        display: none;
+
}
+
#p-logo a,
+
#p-logo a:hover {
+
        display: block;
+
-      height: 155px;
+
-      width: 12.2em;
+
+      height: 69px;
+
+      width: 420px;
+
        background-repeat: no-repeat;
+
-      background-position: 35% 50% !important;
+
+      background-position: left top !important;
+
        text-decoration: none;
+
}
+
+
/*
+
** the navigation portlet
+
@@ -763,20 +766,22 @@
+
*/
+
+
#p-personal {
+
        width: 100%;
+
        white-space: nowrap;
+
-      padding: 0;
+
+/*    padding: 0.5em;*/
+
        margin: 0;
+
        position: absolute;
+
        left: 0;
+
        top: 0;
+
        z-index: 0;
+
        border: none;
+
-      background: none;
+
+      background: #a2bdc8;
+
        overflow: visible;
+
        line-height: 1.2em;
+
+      padding-top: 0.5em;
+
+      padding-bottom: 0.5em;
+
}
+
+
#p-personal h5 {
+
        display: none;
+
}
+
@@ -821,11 +826,10 @@
+
        color: #005896;
+
        padding-bottom: .2em;
+
        background: none;
+
}
+
#p-personal li a:hover {
+
-      background-color: white;
+
        padding-bottom: .2em;
+
        text-decoration: none;
+
}
+
#p-personal li.active a:hover {
+
        background-color: transparent;
+
@@ -843,23 +847,24 @@
+
/*
+
** the page-related actions- page/talk, edit etc
+
*/
+
#p-cactions {
+
        position: absolute;
+
-      top: 1.3em;
+
-      left: 11.5em;
+
+      top: 3.4em;
+
        margin: 0;
+
        white-space: nowrap;
+
-      width: 76%;
+
+      width: 100%;
+
        line-height: 1.1em;
+
        overflow: visible;
+
        background: none;
+
        border-collapse: collapse;
+
-      padding-left: 1em;
+
        list-style: none;
+
        font-size: 95%;
+
}
+
+#p-cactions ul {
+
+      text-align: right;
+
+}
+
#p-cactions .hiddenStructure {
+
        display: none;
+
}
+
#p-cactions ul {
+
        list-style: none;
+
@@ -940,14 +945,13 @@
+
}
+
/*
+
** footer
+
*/
+
#footer {
+
-      background-color: white;
+
-      border-top: 1px solid #fabd23;
+
-      border-bottom: 1px solid #fabd23;
+
-      margin: .6em 0 1em 0;
+
+      background-color: none;
+
+      border-top: 1px solid navy;
+
+      margin: .6em 0 0 0;
+
        padding: .4em 0 1.2em 0;
+
        text-align: center;
+
        font-size: 90%;
+
}
+
#footer li {
+
@@ -962,14 +966,16 @@
+
        top: -2px; /* Bump it up just a tad */
+
}
+
#f-poweredbyico {
+
        float: right;
+
        height: 1%;
+
+      display: none;
+
}
+
#f-copyrightico {
+
        float: left;
+
        height: 1%;
+
+      display: none;
+
}
+
+
/* js pref toc */
+
#preftoc {
+
        margin: 0;
+
@@ -1443,6 +1449,11 @@
+
+
/* restriction patch tab style (white link on red background) */
+
li#ca-unrestrict a {
+
        color: white !important;
+
        background-color: #ba0000 !important;
+
-}
+
\ No newline at end of file
+
+}
+
+
+
+#about a, #privacy a {
+
+      display: none;
+
+}     
+
+
+
 
</pre>
 
</pre>
  
'''*Fixes.css'''<br>
+
===Zrušení zobrazování tlačítka pro diskusi===
Ve všech souborech <tt>*Fixes.css</tt> je potřeba provést následnou úpravu (pokud tomu odpovídá nalezený řetězec) tohoto textu
+
V <tt>includes/SkinTemplate.php</tt> zakomentovat následující řádky:
  
#column-content #content {
+
<pre>
        margin-top: <b>3em; </b>
+
                        $content_navigation['namespaces'][$talkId] = $this->tabAction(
        height: 1%;
+
                                      $talkPage, array( "nstab-$talkId", 'talk' ), $isTalk && !$preventActiveTabs, '', $userCanRead
}
+
                        );
 +
                        $content_navigation['namespaces'][$talkId]['context'] = 'talk';
 +
</pre>
  
na hodnotu
+
A pro zrušení vyhledávání v diskusích se v ''includes/search/SearchEngine.php'' ve funkci ''searchableNamespaces()'', podmínka
#column-content #content {
+
<pre>
        margin-top: <b>5em;</b>
+
                        if( $ns >= NS_MAIN ) {
        height: 1%;
+
                                $arr[$ns] = $name;
}
+
                        }
 +
</pre>
  
A zakomentovat následující kód úpravující patičku:
+
upraví na
#footer {
+
<pre>
        margin-left: 13.6em;
+
                        if( ($ns >= NS_MAIN) && (($ns%2) == 0) ) {
        border-left: 1px solid #fabd23;
+
                                $arr[$ns] = $name;
}
+
                        }
 +
</pre>
 +
Trik spočívá v tom, že diskuse jsou vždy liché.
  
==Page Restriction - omezení přístupu==
+
===Změna diskuse v uživatelských url na Public===
Jedná se o [http://meta.wikimedia.org/wiki/Page_access_restriction_with_MediaWiki patch z MediaWiki]. Rozšíření přidává možnost blokovat/odblokovávat stránky (právo <tt>restrict</tt>) a prohlížení blokovaných stránek (právo <tt>viewrestrict</tt>). Na tyto stránky je třeba mít zvláštní právo.
+
V souboru ''/includes/SkinTemplate.php'' je ve funkci ''builPersonalUrls()'' přidat nový kód pro zobrazení public namespace a zakomentovat starý kód pro diskuse. Výsledek by měl vypadat takto:
 
+
<pre>
Patch pro verzi 1.5.2 lze použít i na verzi 1.5.3. Aplikace patche dle odkazované dokumentace.
+
                        $userpublicUrlDetails = $this->makeUrlDetails('Public:' .$this->username);
 +
                        $personal_urls['public'] = array(
 +
                                'text' => 'public',
 +
                                'href' => &$userpublicUrlDetails['href'],
 +
                                'class' => $userpublicUrlDetails['exists']?false:'new',
 +
                                'active' => ( $userpublicUrlDetails['href'] == $pageurl )
 +
                        );
 +
#                      $usertalkUrlDetails = $this->makeTalkUrlDetails($this->userpage);
 +
#                      $personal_urls['mytalk'] = array(
 +
#                              'text' => wfMsg('mytalk'),
 +
#                              'href' => &$usertalkUrlDetails['href'],
 +
#                              'class' => $usertalkUrlDetails['exists']?false:'new',
 +
#                              'active' => ( $usertalkUrlDetails['href'] == $pageurl )
 +
#                      );
 +
</pre>
  
==Práva==
+
==Popis uživatelských skupin==
 
Práva se uživatelům nastavují tak, že se zařadí do patřičné skupiny. Práva skupiny se nastavují
 
Práva se uživatelům nastavují tak, že se zařadí do patřičné skupiny. Práva skupiny se nastavují
 
v <tt>LocalSettings.php</tt> proměnnou <tt>$wgGroupPermissions</tt>.
 
v <tt>LocalSettings.php</tt> proměnnou <tt>$wgGroupPermissions</tt>.
  
===Popis skupin===
+
===anonymous===
Pozor, tento text nemusí být aktuální.<br>
+
Chtelo by pridat novou skupinu (snad restrict), ktera by vydelila pravo restrikce ze skupiny 'editor'.
+
 
+
 
+
====anonymous====
+
 
Nepřihlášený uživatel, který má právo jen prohlížet nechráněné stránky. Pro získání vyšších práv je třeba se přihlásit.
 
Nepřihlášený uživatel, který má právo jen prohlížet nechráněné stránky. Pro získání vyšších práv je třeba se přihlásit.
  
====editor====
+
===editor===
 
Možnost editovat stránky, nemá právo pro zamykání, ale je mu umožněna restrikce.
 
Možnost editovat stránky, nemá právo pro zamykání, ale je mu umožněna restrikce.
  
====mediator====
+
===mediator===
 
Má právo zamykání stránek proti editaci a nastavení restrict.
 
Má právo zamykání stránek proti editaci a nastavení restrict.
  
====sysop====
+
===sysop===
 
Administrátor, má všechny práva, kromě změny práv.
 
Administrátor, má všechny práva, kromě změny práv.
  
====byrokrat====
+
===byrokrat===
 
Umožňuje měnit oprávnění.
 
Umožňuje měnit oprávnění.
  
==Rozšíření==
+
===restrict===
Seznam všech rozšíření, které byly provedeny. Tyto rozšíření nejsou vetšinou počeštěny.
+
Může označovat stránky za stránky s omezeným přístupem.
  
Žádné z rozšíření nesmí obsahovat prázdný řádek, který je mimo PHP kód. První řádek musí začínat řetězcem <tt>&lt;?php</tt> a poslední řádek končit <tt>?&gt;</tt> (neodřádkovává se). V opačném případě je problém se stránkou [[Speciální:Recentchanges]], tuto stránku je vhodné zkontrolovat například [http://feedvalidator.org/check.cgi?url=http%3A%2F%2Fsupport.zcu.cz%2Findex.php%3Ftitle%3DSpeci%25C3%25A1ln%25C3%25AD%253ARecentchanges%26feed%3Drss tímto validátorem], kde na začátku nesmí být žádný prázdný znak (řádek, mezera, ...).
+
===viewrestrict===
 +
Může prohlížet stránky s omezeným přístupem.
  
'''Žádné rozšíření nesmí mít jakékoliv znaky mimo PHP kod, jde hlavně o prázné řádky a mezery, chyba je popsána [http://www.mediawiki.org/wiki/Extension_talk:Anysite#Error_After_adding_Anysite v diskusi]'''
+
==Příhlášení webauthem==
 +
Příhlášení webauthem je realizováné prostřednictvím rozšíření [http://www.mediawiki.org/wiki/Extension:AutomaticREMOTE_USER AutomaticREMOTE_USER] s droubnou úpravou.
  
===ExternalLinks===
+
===Instalace===
Kód pro [http://www.mediawiki.org/wiki/Extension:ExternalLinks správu a testování externích linků] s možností online testování. Rozšíření je určeno pro 1.14+, bohužel máme starší a tak některá vykreslování nefungují. Stažený kód stačí rozbalit do <tt>/var/lib/mediawiki/extensions</tt> a do <tt>LocalSettings.php</tt> přidat:
+
Rozšíření rozbalíme do složky extensions a do <tt>LocalSettings.php</tt> přidáme následující řádky:
 
<pre>
 
<pre>
#http://www.mediawiki.org/wiki/Extension:ExternalLinks
+
require_once( "$IP/extensions/Auth_remoteuser/Auth_remoteuser.php" );
require_once( "$IP/extensions/ExternalLinks/ExternalLinks.php" );
+
$wgAuth = new Auth_remoteuser();
$wgELuserRight = 'delete'; // default: edit
+
$wgELvalidationMode = 'cURL';
+
 
</pre>
 
</pre>
  
Pozn.: od verze 1.14 je zahrnuto rozšíření [http://www.mediawiki.org/wiki/Extension:LinkSearch LinkSearch] přímo do jádra mediawiki, sice neumí online testy, ale funkcionalita je podobná. Zdrojové samostatné kódy z doby samostatného pluginu se nepodařilo najít, proto byl nasazen [http://www.mediawiki.org/wiki/Extension:ExternalLinks].
+
Dále je třeba v <tt>LocalSettings.php</tt> vypnout cache parseru, jinak to vede na bezpečnostní díru:
 +
<pre>
 +
$wgParserCacheType  = CACHE_NONE;
 +
</pre>
 +
 
 +
===Úpravy===
 +
Je třeba upravit dva soubory. V zdrojovém kódu rozšíření se musí zakomentovat řádek následujícím způsobem:
 +
<pre>
 +
--- Auth_remoteuser.php
 +
+++ Auth_remoteuser.php
 +
@@ -81,7 +81,7 @@ $wgAuthRemoteuserDomain = "NETBIOSDOMAIN"; /* Remove NETBIOSDOMAIN\ from the beg
 +
/* User's mail domain to append to the user name to make their email address */
 +
$wgAuthRemoteuserMailDomain = "example.com";
 +
 
 +
-$wgExtensionFunctions[] = 'Auth_remote_user_hook';
 +
+//$wgExtensionFunctions[] = 'Auth_remote_user_hook';
 +
 
 +
/**
 +
  * This hook is registered by the Auth_remoteuser constructor.  It will be
 +
</pre>
 +
 
 +
Dále je třeba vložit následující řádky do souboru <tt>includes/templates/Userlogin.php</tt>:
 +
<pre>
 +
--- Userlogin.php
 +
+++ Userlogin.php
 +
@@ -29,6 +29,21 @@ class UserloginTemplate extends QuickTemplate {
 +
        <div class="visualClear"></div>
 +
<?php } ?>
 +
 
 +
+<?php
 +
+# zcu login hack
 +
+# presmerujeme na https
 +
+if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === "off") {
 +
+      header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
 +
+      die();
 +
+}
 +
+# zavolame rozsireni na autentikaci
 +
+require_once( "extensions/Auth_remoteuser/Auth_remoteuser.php" );
 +
+Auth_remote_user_hook();
 +
+# presmerujeme uzivatele zpet odkud prisel
 +
+header("Location: https://daphne.civ.zcu.cz/index.php/".$_GET['returnto']."");
 +
+die();
 +
+?>
 +
+
 +
<div id="loginstart"><?php $this->msgWiki( 'loginstart' ); ?></div>
 +
<div id="userloginForm">
 +
<form name="userlogin" method="post" action="<?php $this->text('action') ?>">
 +
</pre>
 +
 
 +
==Page Restriction - omezení přístupu==
 +
Jedná se o [http://www.mediawiki.org/wiki/Extension:Page_access_restriction patch z MediaWiki]. Rozšíření přidává možnost blokovat/odblokovávat stránky (právo restrict) a prohlížení blokovaných stránek (právo viewrestrict). Na tyto stránky je třeba mít zvláštní právo.
 +
 
 +
Verze na stránce s rozšířením je zastaralá. Patch upravený pro verzi 1.19 lze najít [https://gist.github.com/Remedan/425e631fb184144c4dd2 zde] (přišel mi příliš dlouhý pro vložení přímo sem).
 +
 
 +
==Vyhledávání přes Google==
 +
Postup zhruba podle stránek [http://meta.wikimedia.org/wiki/How_to_add_Google_search_to_your_MediaWiki_Search_Results_Page]. V souboru <tt>includes/specials/SpecialSearch.php</tt> upravíme funkci <tt>showResults( $term )</tt> následovně:
 +
<pre>
 +
--- SpecialSearch.php
 +
+++ SpecialSearch.php
 +
@@ -403,6 +403,10 @@ class SpecialSearch extends SpecialPage {
 +
                if( $num || $this->offset ) {
 +
                        $out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
 +
                }
 +
+                if ( ! $wgDisableTextSearch ) {
 +
+                        $out->addWikiText( wfMsg( 'Googlesearchheader' ) );
 +
+                        $out->addHTML( wfMsg( 'Googlesearch', $term ) );
 +
+                }
 +
                wfProfileOut( __METHOD__ );
 +
        }
 +
 
 +
</pre>
 +
 
 +
Dále vytvoříme systémové hlášení <tt>Googlesearchheader</tt> přístupem na [[MediaWiki:Googlesearchheader]] kam vložíme něco chytrého jako:
 +
<pre>
 +
===Hledání Googlem===
 +
Můžete zkusit vyhledávání Googlem; je ale možné, že jeho výsledky nemusí být aktuální.
 +
</pre>
 +
 
 +
Dále je potřeba nastavit odeslání hledaného řetězce v utf-8, to se provede úpravou [[MediaWiki:Googlesearch]], tak aby skryté položky 'ie' a 'oe' obsahovaly 'utf-8' (nahradí se proměnna $2), asi takto:
 +
<input type="hidden" name="ie" value="utf-8" />
 +
<input type="hidden" name="oe" value="utf-8" />
 +
 
 +
==Google Analytics==
 +
Postupovat dle návodu http://www.mediawiki.org/wiki/Extension:Google_Analytics_Integration, identifikátor je '''UA-19622695-1'''.
 +
Prohlížení je dostupné na https://www.google.com/analytics/reporting/?id=38863334 (je třeba získat oprávnění od phanousk nebo svamberg, předpokládá se vlastnictví google účtu).
 +
 
 +
==Rozšíření==
 +
 
 +
===Rozšíření s přímočarou instalací===
 +
Instalace následujích rozšíření vyžaduje pouze jejich stažení, rozbalení do adresáře<tt>extensions</tt> a vložení příslušného include do <tt>LocalSettings.php</tt>.
 +
* [http://www.mediawiki.org/wiki/Extension:InputBox InputBox]
 +
* [http://www.mediawiki.org/wiki/Extension:Winter Winter]
 +
* [http://www.mediawiki.org/wiki/Cite Cite]
 +
* [http://www.mediawiki.org/wiki/Extension:ImageMap ImageMap]
  
 
===AnyWebSite===
 
===AnyWebSite===
Řádka 679: Řádka 691:
 
  include("extensions/anywebsite.php");
 
  include("extensions/anywebsite.php");
  
===SiteGraph===
 
[http://www.mediawiki.org/wiki/Extension:SiteGraph SiteGraph] vykresluje mapu stránek z namespace Main, avšak v kódu jsou 2 chyby (regularním výrazu a v parametrech str_replace()). Vzhledem k objemu stránek na supportu a jeho alespoň částečné přehlednosti je třeba použít vykreslování <tt>fdp</tt>, které je výrazně pomalé. Tudíž skript omezíme na prosté vygenerování kódu pro graphviz a kompilaci si provedeme bokem. Ostatní nastavení lze vzít ze stránek.
 
  
Patch pro skript s opravami a úpravami
+
===External Links===
 +
Stáheneme ze [http://www.mediawiki.org/wiki/Extension:ExternalLinks stránky rozšíření] a do <tt>LocalSettings.php</tt> přidáme:
 
<pre>
 
<pre>
--- SiteGraph.php.orig  2010-03-15 07:41:55.000000000 +0100
+
#http://www.mediawiki.org/wiki/Extension:ExternalLinks
+++ SiteGraph.php      2010-03-15 01:05:10.000000000 +0100
+
require_once( "$IP/extensions/ExternalLinks/ExternalLinks.php" );
@@ -108,7 +108,8 @@
+
$wgELuserRight = 'delete'; // default: edit
        $layout = $params['layout'];
+
$wgELvalidationMode = 'cURL';
 
+
  $html = array();
+
-  $html[] = "<graphviz layout='$layout'>$type A {";
+
//$html[] = "<graphviz layout='$layout'>$type A {";
+
+  $html[] = "&lt;pre>$type A {";
+
  $html[] = $text;
+
 
+
  $res = $dbr->query("SELECT
+
@@ -170,7 +171,8 @@
+
    $html[] = "\"". $row->title1 ."\" ". $connector ." \"". $row->title2 ."\";";
+
  }
+
 
+
-  $html[] = "}</graphviz>";
+
//$html[] = "}</graphviz>";
+
+  $html[] = "}&lt;/pre>";
+
 
+
  return '<!-- ENCODED_SITEGRAPH '. base64_encode(implode($html, "\n")) . ' -->';
+
}
+
@@ -183,7 +185,7 @@
+
        # Find all hidden content and restore to normal
+
        $matches = array();
+
        $nmatch = preg_match_all(
+
-            '/<!-- ENCODED_SITEGRAPH ([0-9a-zA-Z\\+]+=*) -->/esm',
+
+            '#<!-- ENCODED_SITEGRAPH ([0-9a-zA-Z/+]+={0,2}) -->#esm',
+
            $text,
+
            $matches,
+
            PREG_SET_ORDER);
+
@@ -191,10 +193,11 @@
+
        for ($i = 0; $i < $nmatch; $i++) {
+
            $text = str_replace(
+
                $matches[$i][0],
+
+//               $wgOut->parse(($matches[$i][1])),
+
                $wgOut->parse(base64_decode($matches[$i][1])),
+
                $text);
+
        }
+
        return true;
+
    }
+
}
+
-
+
+?>
+
 
</pre>
 
</pre>
 
Poznámka: vložený kód obsahuje tag <tt>&lt;pre&gt;</tt>, kterému je třeba upravit alespoň první závorku na sekvenci (ampersand)lt(středník), jinak se bude kód nesprávně interpretovat a bude roztrhaný.
 
  
 
===Graphical Category Browser===
 
===Graphical Category Browser===
[http://www.mediawiki.org/wiki/Extension:Graphical_Category_Browser Graphical Category Browser] zobrazuje závislosti kategorií mezi sebou, lze postupovat
+
[http://www.mediawiki.org/wiki/Extension:Graphical_Category_Browser Graphical Category Browser] zobrazuje závislosti kategorií mezi sebou, lze postupovat podle návodu, ale je třeba dát pozor na:
podle návodu, ale je třeba dát pozor na:
+
* upravu práv adresáře images/xyGraphvizCache: chmod www-data:www-data /var/lib/mediawiki/images/xyGraphvizCache
* upravu práv adresáře images/xyGraphvizCache: <tt>chmod www-data:www-data /var/lib/mediawiki/images/xyGraphvizCache</tt>
+
* poslední znak ve skriptu musí být ?> jinak hlásí chybu, že nelze modifikovat hlavičku, protože již byla odeslána, tedy ani odřádkování
* poslední znak ve skriptu musí být <tt>?&gt;</tt> jinak hlásí chybu, že nelze modifikovat hlavičku, protože již byla odeslána, tedy ani odřádkování
+
* ve skriptu zakomentovat řádek $wgHooks['CategoryPageView'][] = 'xyCategoryGraphHook'; jinak nezobrazuje stránky s kategoriemi, dočasně může zobrazovat chybu memcached, ktery hlásí problem se serializací, mělo by stačit jej restartnout nebo chvíli vyčkat
* ve skriptu zakomentovat řádek <tt>$wgHooks['CategoryPageView'][] = 'xyCategoryGraphHook';</tt> jinak nezobrazuje stránky s kategoriemi, dočasně může zobrazovat chybu memcached, ktery hlásí problem se serializací, mělo by stačit jej restartnout nebo chvíli vyčkat
+
  
===Page Protection===
+
Dále chceme, aby se graf kategorií zobrazoval pouze na stránkách kategorií, které obsahují tag <tt><nowiki><GraphicalCategory /></nowiki></tt>. Proto je třeba na rozšíření aplikovat následující patch:
[http://meta.wikimedia.org/wiki/PageProtection Page Protection] slouží pro zakrytí citlivých údajů. Postup zprovoznění ve zkratce:
+
* stáhnout zdrojový kód, uvnitř je obsazen návod na zprovoznění
+
* <tt>pear install Crypt_RSA-1.2.0b</tt>
+
* v případě užití PHP4 je třeba doinstalovat <tt>pear install PHP_Compat</tt>
+
* vytvořit linky:
+
** <tt>ln -s /usr/share/php/PEAR /var/lib/mediawiki/PEAR</tt>
+
** <tt>ln -s /usr/share/php/Crypt /var/lib/mediawiki/Crypt</tt>
+
** <tt>ln -s /usr/share/php/PHP /var/lib/mediawiki/PHP</tt>
+
** <tt>ln -s /usr/share/php/PEAR.php /var/lib/mediawiki/PEAR.php</tt>
+
* vytvořit adresář <tt>/var/lib/mediawiki/extensions/PageProtection/</tt> a nakopírovat do něj obsah staženého archívu
+
* do souboru <tt>extensions/PageProtection/Encryption.php</tt> řádek:
+
  require_once('PHP/Compat/Function/file_put_contents.php');
+
* vložit konfigurační řádky do <tt>LocalSettings.php</tt>:
+
<pre>
+
# PageProtection
+
# http://meta.wikimedia.org/wiki/PageProtection
+
require_once("extensions/PageProtection/PageProtection.php");
+
  
$wgCachePages      = false;
 
$wgCacheEpoch = 'date +%Y%m%d%H%M%S';
 
</pre>
 
 
Aby mohla skupina ''viewrestrict'' a ''editor'' v parametru <tt>groups</tt> taky editovat a nebyla jen pro prohlížení,
 
je třeba upravit soubor <tt>extensions/PageProtection/AccessList.php</tt> a do funkce <tt>hasAcccess(&$user)</tt>
 
přidat stejný kód jako je pro skupinu ''sysop'':
 
 
<pre>
 
<pre>
        if(in_array("viewrestrict", $user->mGroups)){
+
diff --git xyCategoryBrowser.php xyCategoryBrowser.php
            return true;
+
index f406da7..6df7224 100644
        }
+
--- xyCategoryBrowser.php
        if(in_array("editor", $user->mGroups)){
+
+++ xyCategoryBrowser.php
            return true;
+
@@ -97,7 +97,19 @@ class xyCategoryHook {
        }
+
  public static function hookSetup() {
 +
    global $IP, $wgMessageCache, $wgHooks;
 +
 
 +
-   $wgHooks['CategoryPageView'][] = 'xyCategoryHook::hook';
 +
+    //$wgHooks['CategoryPageView'][] = 'xyCategoryHook::hook';
 +
+
 +
+    $wgHooks['ParserFirstCallInit'][] = 'setupParserHook';
 +
+
 +
+    function setupParserHook( Parser $parser ) {
 +
+ $parser->setHook( 'GraphicalCategory', 'xyCategoryHook::parserHook' );
 +
+ return true;
 +
+}
 +
+  }
 +
+
 +
+  public static function parserHook($input, array $args, Parser $parser, PPFrame $frame) {
 +
+ xyCategoryHook::hook($parser->getTitle());
 +
+ return "";
 +
  }
 +
 
 +
  /**
 +
@@ -105,18 +117,18 @@ class xyCategoryHook {
 +
    *
 +
    * @param $cat category
 +
    */
 +
-  public static function hook($cat) {
 +
+  public static function hook($title) {
 +
    require_once 'xyCategoryGraph.php';
 +
    global $wgOut, $xyCategoriesMaxAge;
 +
    $wgOut->setSquidMaxage( $xyCategoriesMaxAge );
 +
-    $title = $cat->getTitle();
 +
+    //$title = $cat->getTitle();
 +
    $dbKey = $title->getDBkey();
 +
    $cap = new xyCategoryGraph();
 +
    $age = $cap->cacheAge($dbKey);
 +
    if (!$age || $age > $xyCategoriesMaxAge ) {
 +
      $cap->doQuery($title);
 +
      $cap->doDot($dbKey);
 +
-      };
 +
+    };
 +
    $cap->showImg($dbKey);
 +
    return true;
 +
    }
 
</pre>
 
</pre>
  
===Vyhledávání přes Google===
+
===Dynamic Page List===
Postup podle stránek [http://meta.wikimedia.org/wiki/How_to_add_Google_search_to_your_MediaWiki_Search_Results_Page]. V souboru <tt>includes/SpecialSearch.php</tt> upravíme funkci <tt>showResults( $term )</tt> následovně:
+
Instalace podle [http://www.mediawiki.org/wiki/Extension:DynamicPageList_%28third-party%29 stránky rozšíření]. Dále je třeba na soubory rozšíření aplikovat následující patch pro přidání volby <tt>addfirstparagraph</tt>:
 
<pre>
 
<pre>
--- /tmp/SpecialSearch.php     2006-07-12 14:28:23.000000000 +0200
+
--- DPL.php
+++ SpecialSearch.php   2006-07-10 16:11:32.000000000 +0200
+
+++ DPL.php
@@ -206,20 +206,24 @@
+
@@ -16,6 +16,7 @@ class DPL {
                        }
+
var $mIncSecLabelsMatch    = array(); // array of match patterns for sections to transclude
                }
+
var $mIncSecLabelsNotMatch = array(); // array of NOT match patterns for sections to transclude
 +
var $mIncParsed;    // whether to match raw parameters or parsed contents
 +
+ var $mIncFirstPar;
 +
var $mParser;
 +
var $mParserOptions;
 +
var $mParserTitle;
 +
@@ -32,7 +33,7 @@ class DPL {
 +
$includemaxlen, $includeseclabels, $includeseclabelsmatch,
 +
$includeseclabelsnotmatch, $includematchparsed, &$parser, $logger,
 +
$replaceInTitle, $iTitleMaxLen, $defaultTemplateSuffix, $aTableRow,
 +
- $bIncludeTrim, $iTableSortCol, $updateRules, $deleteRules
 +
+ $bIncludeTrim, $iTableSortCol, $updateRules, $deleteRules, $includefirstparagraph
 +
) {
 +
  global $wgContLang;
 
   
 
   
                if ( $num == 0 ) {
+
@@ -49,6 +50,8 @@ class DPL {
                        $wgOut->addWikiText( wfMsg( 'nonefound' ) );
+
$this->mIncParsed            = $includematchparsed;
                }
+
}
                if( $num || $this->offset ) {
+
                        $wgOut->addHTML( "<p>{$prevnext}</p>\n" );
+
                }
+
                $wgOut->addHTML( $this->powerSearchBox( $term ) );
+
+              if ( ! $wgDisableTextSearch ) {
+
+                      $wgOut->addWikiText( wfMsg( 'Googlesearchheader' ) );
+
+                      $wgOut->addHTML( wfMsg( 'Googlesearch', $term ) );
+
+              }
+
                wfProfileOut( $fname );
+
        }
+
 
   
 
   
        #------------------------------------------------------------------
+
+ $this->mIncFirstPar = $includefirstparagraph;
        # Private methods below this line
+
+
 +
if ( isset( $includemaxlen ) ) {
 +
$this->mIncMaxLen = $includemaxlen + 1;
 +
} else {
 +
@@ -348,7 +351,7 @@ class DPL {
 +
}
 
   
 
   
        /**
+
// other list modes
        *
+
- $sk = & $wgUser->getSkin();
        */
+
+ $sk = $wgUser->getSkin();
        function setupPage( $term ) {
+
</pre>
+
 
+
Dále vytvoříme systémové hlášení <tt>Googlesearchheader</tt> přístupem na [[MediaWiki:Googlesearchheader]] kam vložíme něco chytrého jako:
+
<pre>
+
===Hledání Googlem===
+
Můžete zkusit vyhledávání Googlem; je ale možné, že jeho výsledky nemusí být aktuální.
+
</pre>
+
 
+
Dále je potřeba nastavit odeslání hledaného řetězce v utf-8, to se provede úpravou [[MediaWiki:Googlesearch]], tak aby skryté položky 'ie' a 'oe' obsahovaly 'utf-8' (nahradí se proměnna $2), asi takto:
+
<input type="hidden" name="ie" value="utf-8" />
+
<input type="hidden" name="oe" value="utf-8" />
+
 
+
===Prohlížení práv===
+
[[Speciální:Permissions|Tato speciální stránka]] zobrazuje aktualní stav mapování skupin na jednotlivá práva. Zdrojový kód a návod je na stránkách
+
http://meta.wikimedia.org/wiki/Permissions.
+
 
+
===Přejmenování uživatele===
+
Na http://meta.wikimedia.org/wiki/Renameuser je speciální stránka umožňující přejmenování uživatele. Administrátor s pověřením přejmenování uživatele má možnost jej přejmenovat na této [[Speciální:Renameuser|speciální stránce]].
+
 
+
===Formuláře===
+
Převzaty z http://meta.wikimedia.org/wiki/Help:Inputbox<br> a měl by sloužit pro napsání nového rozšíření, které umožní odesílání formuláře na jiné URL (požadavky do RT, vyhledávání, žádosti pro hostmastra, ...)
+
 
+
===Dynamic Page List 2===
+
[http://meta.wikimedia.org/wiki/DynamicPageList2 Toto rozšíření] ([http://meta.wikimedia.org/wiki/UsingDynamicPageList2 popis nastavení]) je napsáno na základě předchozího, ale navíc umožňuje dávat kategorie do vztahu AND i OR. Má daleko přehlednější kód.  Bylo však do něj potřeba přidat volbu <tt>addfirstparagraph</tt>.
+
 
+
<pre>
+
--- DynamicPageList2.php.orig  2006-08-20 16:19:25.000000000 +0200
+
+++ DynamicPageList2.php        2006-08-20 17:52:24.000000000 +0200
+
@@ -96,7 +96,8 @@
+
        */
+
        'ordermethod' => array('default' => 'title', 'category,firstedit',  'category,lastedit', 'category,pagetouched',
+
'category,title', 'categoryadd', 'firstedit', 'lastedit', 'pagetouched', 'title', 'user,firstedit', 'user,lastedit'),
+
        'redirects' => array('default' => 'exclude', 'exclude', 'include', 'only'),
+
-       'shownamespace' => array('default' => 'true', 'false', 'true')
+
+      'shownamespace' => array('default' => 'true', 'false', 'true'),
+
+      'addfirstparagraph' => array('default' => 'false',  'false', 'true')
+
);
+
 
   
 
   
/**
+
// process results of query, outputing equivalent of <li>[[Article]]</li> for each result,
@@ -166,6 +167,7 @@
+
// or something similar if the list uses other startlist/endlist;
        $sRedirects = $wgDPL2Options['redirects']['default'];
+
@@ -381,7 +384,7 @@ class DPL {
        $sInlSymbol = $wgDPL2Options['inlinesymbol']['default'];
+
}
        $bShowNamespace = $wgDPL2Options['shownamespace']['default'] == 'true';
+
+      $bAddFirstParagraph = $wgDPL2Options['addfirstparagraph']['default'] == 'true';
+
        $bAddFirstCategoryDate = $wgDPL2Options['addfirstcategorydate']['default'] == 'true';
+
        $bAddPageTouchedDate = $wgDPL2Options['addpagetoucheddate']['default'] == 'true';
+
        $bAddEditDate = $wgDPL2Options['addeditdate']['default'] == 'true';
+
@@ -343,6 +345,13 @@
+
                                        $output .= $logger->msgWrongParam('shownamespace', $sArg);
+
                                break;
+
                               
+
+                      case 'addfirstparagraph':
+
+                              if( in_array($sArg, $wgDPL2Options['addfirstparagraph']))
+
+                                      $bAddFirstParagraph = $sArg == 'true';
+
+                              else
+
+                                      $output .= $logger->msgWrongParam('addfirstparagraph', $sArg);
+
+                              break;
+
+                             
+
                        case 'debug':
+
                                if( in_array($sArg, $wgDPL2Options['debug']) ) {
+
                                        if($iParam > 1)
+
@@ -602,6 +611,8 @@
+
        $aArticles_start_char =array();
+
        $aAddDates = array();
+
        $aAddUsers = array();
+
+      //first paragraphs of articles
+
+      $aFirstParagraphs = array();
+
        //user titles to be checked by $linkBatch for existence (id in $aAddUsers => title)
+
        $aUncheckedUserTitles = array();
+
        $aAddCategories = array();
+
@@ -687,7 +698,26 @@
+
                        }
+
                        $aAddCategories[] = $artCatLinks;
+
                }
+
-             
+
+     
+
+              //ADD FIRST PARAGRAPH
+
+              if ($bAddFirstParagraph) {
+
+                      $parseOptions = ParserOptions::newFromUser($wgUser);
+
+                      $myParser = new Parser();
+
+                      $title = Title::makeTitle($row->page_namespace, $row->page_title);
+
+                      $tmpArticle = new Article( $title );
+
+                      $tmpArticle->fetchContent();
+
+                        if (preg_match("/^(.*)[\n=]/", $tmpArticle->mContent, $match)) {
+
+                                $myParseOutput = $myParser->parse(":" .$match[0], $title, $parseOptions);
+
+                              $aFirstParagraphs[] = $myParseOutput->mText;
+
+                      }
+
+                      else {
+
+                              $aFirstParagraphs[] = '';
+
+                      }
+
+              }
+
+              else {
+
+                      $aFirstParagraphs[] = '';
+
+              }                                                                                                       
+
         
+
+     
+
                $iArticle++;
+
        }
+
        $dbr->freeResult( $res );
+
@@ -712,7 +742,7 @@
+
                        if ($sPageOutputMode == 'category')
+
                                $output .= DPL2OutputCategoryStyle($aArticles, $aArticles_start_char, $headingStart, $hea
+
dingCount);
+
                        else
+
-                              $output .= DPL2OutputListStyle($aArticles, $aAddDates, $aAddUsers, $aAddCategories, $sPag
+
eOutputMode, $sInlSymbol, $headingStart, $headingCount);
+
+                              $output .= DPL2OutputListStyle($aArticles, $aAddDates, $aAddUsers, $aAddCategories, $sPag
+
eOutputMode, $sInlSymbol, $headingStart, $headingCount, $aFirstParagraphs);
+
                        $output .= $headingMode->sEndItem;
+
                        $headingStart += $headingCount;
+
                }
+
@@ -721,7 +751,7 @@
+
        elseif($sPageOutputMode == 'category')
+
                $output .= DPL2OutputCategoryStyle($aArticles, $aArticles_start_char, 0, count($aArticles));
+
        else
+
-              $output .= DPL2OutputListStyle($aArticles, $aAddDates, $aAddUsers, $aAddCategories, $sPageOutputMode, $sI
+
nlSymbol, 0, count($aArticles));
+
+              $output .= DPL2OutputListStyle($aArticles, $aAddDates, $aAddUsers, $aAddCategories, $sPageOutputMode, $sI
+
nlSymbol, 0, count($aArticles), $aFirstParagraphs);
+
 
   
 
   
        return $output;
+
// Page transclusion: get contents and apply selection criteria based on that contents
}
+
- if ( $this->mIncPage ) {
@@ -739,7 +769,7 @@
+
+ if ( $this->mIncPage || $this->mIncFirstPar ) {
                                $sk->makeKnownLinkObj($titleval, $wgContLang->convertHtml($titleval->getText()));
+
$matchFailed = false;
}
+
if ( empty( $this->mIncSecLabels ) || $this->mIncSecLabels[0] == '*' ) { // include whole article
 +
$title = $article->mTitle->getPrefixedText();
 +
@@ -737,11 +740,17 @@ class DPL {
 +
}
 +
 +
// add included contents
 +
- if ( $this->mIncPage ) {
 +
+ if ( $this->mIncPage || $this->mIncFirstPar ) {
 +
DPLInclude::open(
 +
$this->mParser, $this->mParserTitle->getPrefixedText()
 +
);
 +
+
 +
+ if ( $this->mIncFirstPar && preg_match("/^(.*)[\n=]/", $incwiki, $match) ) {
 +
+ $incwiki = $match[0];
 +
+ }
 +
+
 +
$rBody .= $incwiki;
 +
+
 +
DPLInclude::close(
 +
$this->mParser, $this->mParserTitle->getPrefixedText()
 +
);
 +
diff --git DPLMain.php DPLMain.php
 +
index c8a708d..06fd8ad 100644
 +
--- DPLMain.php
 +
+++ DPLMain.php
 +
@@ -230,6 +230,8 @@ class DPLMain {
 +
 +
$bAddEditDate = self::argBoolean( ExtDynamicPageList::$options['addeditdate']['default'] );
 
   
 
   
-function DPL2OutputListStyle ($aArticles, $aAddDates, $aAddUsers, $aAddCategories, $sOutputMode, $sInlSymbol, $iStart, $
+
+ $bAddFirstParagraph = self::argBoolean( ExtDynamicPageList::$options['addfirstparagraph']['default'] );
iCount) {
+
+
+function DPL2OutputListStyle ($aArticles, $aAddDates, $aAddUsers, $aAddCategories, $sOutputMode, $sInlSymbol, $iStart, $
+
$bAddUser = self::argBoolean( ExtDynamicPageList::$options['adduser']['default'] );
iCount, $aFirstParagraphs) {
+
$bAddAuthor   = self::argBoolean( ExtDynamicPageList::$options['addauthor']['default'] );
        global $wgUser, $wgLang;
+
$bAddContribution = self::argBoolean( ExtDynamicPageList::$options['addcontribution']['default'] );
       
+
@@ -1303,6 +1305,13 @@ class DPLMain {
        $sk = & $wgUser->getSkin();
+
}
@@ -762,6 +792,8 @@
+
break;
                        $r .= ' . . <small>' . $sSpecCatsLnk . ': ' . implode(' | ', $aAddCategories[$i]) . '</small>';
+
                if( (($mode->name != 'inline') && ($mode->name != 'none')) || ($i < $iStart + $iCount-1)) //no inline sym
+
+ case 'addfirstparagraph':
bol (inline mode) at end of list
+
+                              if( in_array($sArg, ExtDynamicPageList::$options['addfirstparagraph'] ) )
                        $r .= $mode->sEndItem;
+
+                                      $bAddFirstParagraph = self::argBoolean( $sArg );
+              if ($aFirstParagraphs[$i])  
+
+                              else
+                       $r .= $aFirstParagraphs[$i];
+
+                                      $output .= $logger->msgWrongParam('addfirstparagraph', $sArg);
        }
+
+                               break;
        $r .= $mode->sEndList;
+
+
        return $r;
+
/**
 +
* FORMAT/HTML PARAMETERS
 +
* @todo allow addpagetoucheddate, addeditdate, adduser, addcategories to have effect with 'mode=category'
 +
@@ -3167,7 +3176,7 @@ class DPLMain {
 +
$iIncludeMaxLen, $aSecLabels, $aSecLabelsMatch, $aSecLabelsNotMatch,
 +
$bIncParsed, $parser, $logger, $aReplaceInTitle, $iTitleMaxLen,
 +
$defaultTemplateSuffix, $aTableRow, $bIncludeTrim, $iTableSortCol,
 +
- $sUpdateRules, $sDeleteRules
 +
+ $sUpdateRules, $sDeleteRules, $bAddFirstParagraph
 +
);
 +
 +
if ( $rowcount == - 1 ) {
 +
diff --git DPLSetup.php DPLSetup.php
 +
index 2a57e27..bbadaba 100644
 +
--- DPLSetup.php
 +
+++ DPLSetup.php
 +
@@ -528,6 +528,9 @@ class ExtDynamicPageList {
 +
'addpagetoucheddate'  => array( 'default' => 'false', 'true', 'no', 'yes', '0', '1', 'off', 'on' ),
 +
'adduser'   => array( 'default' => 'false', 'true', 'no', 'yes', '0', '1', 'off', 'on' ),
 +
 +
+ 'addfirstparagraph'  => array( 'default' => 'false', 'true', 'no', 'yes', '0', '1', 'off', 'on' ),
 +
+
 +
+
 +
// default of allowchacheresults depends on behaveasIntersetion and on LocalSettings ...
 +
'allowcachedresults'  => array( 'true', 'false', 'no', 'yes', 'yes+warn', '0', '1', 'off', 'on' ),
 +
/**
 
</pre>
 
</pre>
====TODO====
 
Chybí podmínka pro <tt>IsRestricted</tt>, viz [[LPS:Nastavení_a_úpravy_Mediawiki_pro_support.zcu.cz#RSS_Feed|RSS Feed]]. Nechceme ze zakázaných stránek ukazovat ani první odstavec.
 
  
===Winter===
+
===Wikifeeds===
Winter je '''W'''iki '''Inter'''preter, kterým je možné lehce programovat stránky. Nachází se na http://meta.wikimedia.org/wiki/User:Frantik/Winter.
+
Instalace spočívá v přídání <tt>include</tt> řádku do <tt>LocalSettings.php</tt>:
+
  include ("extensions/Winter.php");
+
  
===GraphViz===
+
Rozšíření se už nevyvíjí, ale mělo by stále fungovat. Překopírujeme ze staré instalace a do <tt>LocalSettings.php</tt> přidáme:
Ze stránek http://meta.wikimedia.org/wiki/GraphViz stačí stáhnout a uložit rozšíření a nastavit
+
cestu k programu <tt>dot</tt>, který je součástí .deb balíku <tt>graphviz</tt> (je třeba nainstalovat).
+
 
+
===Cite===
+
Dle návodu na http://meta.wikimedia.org/wiki/Cite/Cite.php stáhnout soubory a přidat do <tt>LocalSettings.php</tt>.
+
 
+
===RSS Feed===
+
Dle http://meta.wikimedia.org/wiki/WikiFeeds nakopírovat soubor feeds.php do <tt>/var/lib/mediawiki/misc/</tt>, nastavit položku <tt>webmaster</tt> v poli <tt>$feedOptions</tt>. Dle helpu uvnitř skriptu pak nastavit vzdálenou stranu. Do adresáře a ke skriptu musí být apache nastaven tak, aby umožnil
+
spustit php skript.
+
 
+
Aby nebyly distribuovány stránky z namespace 'User' a zamknuté stránky (restrict) je třeba v souboru <tt>extensions/SpecialWikiFeeds.php</tt> uzavřít všechny výskyty
+
$feed->addItem($item);
+
do podmínky:
+
 
<pre>
 
<pre>
 
+
# wiki feeds
if (!($title->isRestricted() or (NS_USER == $title->getNamespace()))) {
+
require_once("extensions/GenericXmlSyndicationFeed.php");
        $feed->addItem($item);
+
require_once("extensions/SpecialWikiFeeds.php");
}
+
$wgWikiFeedsSettings['cacheEnable'] = false;
 
</pre>
 
</pre>
  
Kód není ideální, ale je funkční pro naši konfiguraci, zvláště poslední část podmínky je specifická pro ZČU a řeší volbu <tt>$wgUserPageRestrict = true;</tt> v <tt>LocalSettings.php</tt>.
+
===ZČU rozšíření===
 
+
Rozšíření bylo třeba pro Mediawiki 1.19 mírně předělat. Protože se rozpadla do více souboruů, jsou umístěna souhrně do adresáře <tt>zcu</tt>. Následující přidat do <tt>LocalSettings.php</tt>:
===Multiple Upload===
+
Staženo rozšíření http://www.mediawiki.org/wiki/Extension:MultiUpload a v souboru <tt>SpecialMultipleUpload.php</tt> nastaven počet soubežně nahratelných souborů na deset:
+
// change this parameter to limit the # of files one can upload
+
$wgMaxUploadFiles = 10;
+
 
+
Konfigurace je standardním způsobem v <tt>LocalSettings.php</tt>:
+
require_once("$IP/extensions/MultiUpload/SpecialMultipleUpload.php");
+
 
+
===Image Map===
+
Staženo z http://www.mediawiki.org/wiki/Extension:ImageMap a standardně připojeno do systému v <tt>LocalSettings.php</tt>:
+
require_once("$IP/extensions/ImageMap/ImageMap.php");
+
 
+
==Google Analytics==
+
Postupovat dle návodu http://www.mediawiki.org/wiki/Extension:Google_Analytics_Integration, identifikátor je '''UA-19622695-1'''.
+
Prohlížení je dostupné na https://www.google.com/analytics/reporting/?id=38863334 (je třeba získat oprávnění od phanousk nebo svamberg, předpokládá se vlastnictví google účtu).
+
 
+
==Upgrade o patch level==
+
Stáhnout novou verzi a rozbalit ji do <tt>/usr/local/mediawiki-VERZE/</tt>. Dalším krokem je úprava
+
skriptů, které byly upraveny (jedná se zvláště o přihlašování). Seznam (nemusí být úplný je zde):
+
* aplikovat patch pro Restrict stránky, '''neprovádět upgrade''' pokud patch neexistuje
+
* aplikovat patch pro rozšíření o Protect, '''neprovádět upgrade''' pokud patch neexistuje
+
* upravit <tt>includes/SpecialSearch.php</tt> tak, aby podporoval vyhledávání google
+
* <tt>includes/templates/Userlogin.php</tt> - změna přesměrování při přihlášení
+
* zkontrolovat [[LPS:Nastavení a úpravy Mediawiki pro support.zcu.cz#Zrušení tlačítek pro nepřihlášené uživatele|zákaz zobrazování tlačítek]] pro nepřihlášené uživatele
+
* zkontrolovat [[LPS:Nastavení a úpravy Mediawiki pro support.zcu.cz#Zrušení zobrazování tlačítka pro diskusi|zrušení zobrazování tlačítka pro diskusi]] pro všechny uživatele
+
* zkontrolovat změny ve skinu
+
 
+
==Úpravy kódu a vzhledu==
+
===Jednotný styl tabulek===
+
Do [[MediaWiki:Zcumonobook.css]] lze přidat libovolný kód, nyní se používá:
+
 
<pre>
 
<pre>
table.tabulka {
+
# Hostmaster
  background: #f9f9f9;
+
require_once ("extensions/zcu/SpecialHostmaster.php");
  padding: 1pt;
+
  border: 1px solid silver;
+
}
+
  
table.tabulka th {
+
# UserRequest
  background: #a2bdc8;
+
require_once ("extensions/zcu/SpecialUserRequest.php");
  border: 1px solid black;
+
  padding: 0 2pt;
+
}
+
  
table.tabulka td {
+
# RTRequest
  border: 1px dotted gray;
+
require_once ("extensions/zcu/SpecialRTRequest.php");
}
+
</pre>
+
  
===Zrušení nadpisu na úvodní stránce===
+
# StagRequest
Do [[MediaWiki:Zcumonobook.css]] stačí přidat
+
require_once ("extensions/zcu/SpecialStagRequest.php");
body.page-Hlavní_strana h1.firstHeading { display:none; }
+
Dokumentace je na [http://www.mediawiki.org/wiki/Manual:FAQ#How_do_I_hide_the_main_page_title.3F mediawiki.org].
+
 
+
===Zrušení tlačítek pro nepřihlášené uživatele===
+
Provádí se dle návodu na [http://meta.wikimedia.org/wiki/Layout_customization#How_do_I_remove_the_.22edit.22_.22discussion.22_and_other_tabs_on_my_site_for_users_that_are_not_logged_in.3F http://meta.wikimedia.org]. Provede se jednoduchý test, zda je uživatel přihlášen, pokud není pak se mu negenerují tlačítka a vytvoří se jedno defaultní 'Speciální stránka'. Přihlášenému uživateli funguje vše bez problému.
+
 
+
V souboru ''/includes/SkinTemplate.php'' je třeba nalézt ve funkci ''buildContentActionUrls()'' tento kód
+
  if( $this->iscontent ) {
+
a modifikovat jej na
+
  if( $wgUser->getId() != 0 && $this->iscontent ) {
+
 
+
===Zrušení zobrazování tlačítka pro diskusi===
+
V souboru ''/includes/SkinTemplate.php'' je třeba ve funkci ''buildContentActionUrls()'' zakomentovat vytvoření tlačítka ''talk''. Výsledný stav
+
by mel vypadat přibližně takto:
+
<pre>
+
#                      $content_actions['talk'] = $this->tabAction(
+
#                              $this->mTitle->getTalkPage(),
+
#                              'talk',
+
#                              $this->mTitle->isTalkPage(),
+
#                              '',
+
#                              true);
+
 
</pre>
 
</pre>
 
===Zrušení možnosti vyhledávat v diskusích===
 
Úprava je v ''includes/SearchEngine.php'' ve funkci ''searchableNamespaces()'', kde se podmínka
 
<pre>
 
                        if( $ns >= NS_MAIN ) {
 
                                $arr[$ns] = $name;
 
                        }
 
</pre>
 
 
upraví na
 
<pre>
 
                        if( ($ns >= NS_MAIN) && (($ns%2) == 0) ) {
 
                                $arr[$ns] = $name;
 
                        }
 
</pre>
 
Trik spočívá v tom, že diskuse jsou vždy liché.
 
 
===Změna diskuse v uživatelských url na Public===
 
V souboru ''/includes/SkinTemplate.php'' je ve funkci ''builPersonalUrls()'' přidat nový kód pro zobrazení public namespace a zakomentovat starý kód pro diskuse. Výsledek by měl vypadat takto:
 
<pre>
 
                        $userpublicUrlDetails = $this->makeUrlDetails('Public:' .$this->username);
 
                        $personal_urls['public'] = array(
 
                                'text' => 'public',
 
                                'href' => &$userpublicUrlDetails['href'],
 
                                'class' => $userpublicUrlDetails['exists']?false:'new',
 
                                'active' => ( $userpublicUrlDetails['href'] == $pageurl )
 
                        );
 
#                      $usertalkUrlDetails = $this->makeTalkUrlDetails($this->userpage);
 
#                      $personal_urls['mytalk'] = array(
 
#                              'text' => wfMsg('mytalk'),
 
#                              'href' => &$usertalkUrlDetails['href'],
 
#                              'class' => $usertalkUrlDetails['exists']?false:'new',
 
#                              'active' => ( $usertalkUrlDetails['href'] == $pageurl )
 
#                      );
 
</pre>
 
 
===Generování cache obrázků===
 
 
Pro správné zobrazování aktualizovaných obrázků, tj. obrázků u kterých byla nahrána jejich nová verze, je zapotřebí, aby MediaWiki ukládala obrázky do adresářů podle hash funkce. Ověření zda-li MediaWiki správně generuje cache obrázků se provede vymazáním stavající cache obrázku ve složce images/thumb. Pokud se po vymazání cache obrázek na stránce nezobrazí správně je nutné provést následující kroky. Nastavit proměnnou v souboru LocalSettings.php:
 
<pre>
 
$wgHashedUploadDirectory = true;
 
</pre>
 
 
Pokud je toto nastavení prováděno ve chvíli, kdy jsou v MediaWiki nahrány nějaké obrázky, které nejsou uloženy v adresářích podle hash funkce, ale nachází se přímo ve složce images na jedné hromadě, pak je nutné tyto obrázky uložit do adresářů podle hash funkce. To se provede spuštěním následujícího skriptu:
 
<pre>
 
#!/bin/bash
 
 
if [ x$1 == x ] || [ $1 == "help" ]; then
 
echo "Script for building hashed folder structure for Mediawiki upload folder"
 
echo "Usage: script path"
 
exit
 
fi
 
 
echo -e "Working directory is $PWD/$1"
 
path=`echo $1 | sed s./$..`
 
echo -n "Creating backup folder $path.bck: "
 
cp -r $1 $path.bck
 
echo -e "done \n"
 
 
for i in `ls -lA $1 | grep -v ^d | awk {'print $9'} ` ; do
 
echo -e "Name of file is $i"
 
 
hash=`echo -n $i | md5sum | awk {'print $1'}`
 
echo -e "it's hash is $hash"
 
 
folder1=`echo $hash | cut -b1`
 
echo -e "so first folder will be $folder1"
 
folder2=`echo $hash | cut -b1-2`
 
echo -e "and second folder $folder2"
 
 
echo -n "Creating folders: "
 
mkdir -p $1/$folder1/$folder2
 
echo -e "done"
 
echo -n "Moving file: "
 
mv $1/$i $1/$folder1/$folder2
 
echo -e "done"
 
echo ""
 
done
 
 
echo -e "Now taking archive directory\n\n"
 
archive="$path/archive"
 
 
for i in `ls -lA $archive | grep -v ^d | awk {'print $9'} ` ; do
 
echo -e "Name of file is $i"
 
sname=`echo $i | cut -d'!' -f2-`
 
echo -e "short name is $sname"
 
 
hash=`echo -n $sname | md5sum | awk {'print $1'}`
 
echo -e "it's hash is $hash"
 
 
folder1=`echo $hash | cut -b1`
 
echo -e "so first folder will be $folder1"
 
folder2=`echo $hash | cut -b1-2`
 
echo -e "and second folder $folder2"
 
 
echo -n "Creating folders: "
 
mkdir -p $archive/$folder1/$folder2
 
echo -e "done"
 
echo -n "Moving file: "
 
mv $archive/$i $archive/$folder1/$folder2
 
echo -e "done"
 
echo ""
 
done
 
</pre>
 
 
Skript se spustí příkazem:
 
<pre>
 
./nazev_skriptu cesta_k_slozce_s_obrazky
 
</pre>
 
 
===Názvy obrázků s diakritikou===
 
Pro správné zobrazování obrázků obsahujících v názvů znaky s (českou) diakritikou je zapotřebí provést úpravy v souboru includes/GlobalFunction.php. Zde problémy způsobuje php funkce escapeshellarg(), která je volána ve funkcích wfEscapeShellArg() a wfShellExec(). V tomto souboru je tedy nutné následujícím způsobem obměnit kód:
 
<pre>
 
1015c1015
 
<              if ( wfIsWindows() ) {
 
---
 
>
 
1039,1041c1039
 
<              } else {
 
<                      $retVal .= escapeshellarg( $arg );
 
<              }
 
---
 
>
 
1827c1825
 
<                              $cmd = escapeshellarg( $script ) . " $time $mem $filesize " . escapeshellarg( $cmd );
 
---
 
>                              $cmd = escapeshellarg( $script ) . " $time $mem $filesize " . wfEscapeShellArg( $cmd );
 
 
</pre>
 
 
==TODO==
 
* dát pod nadpis motto CIVu, něco ve stylu 'jsme tu pro Vás'. Máme takové motto?
 
* zjednodušit kód hlavní strany
 
 
=Konfigurace=
 
==Opravdu velké obrázky==
 
Pro velké obrázky (hlavně rozlišením, nikoliv velikostí) je třeba nastavit v <tt>LocalSettings.php</tt>.
 
Limit pro max. velikost paměti u externích programů:
 
## Maximum amount of virtual memory available to shell processes under linux, in KB.
 
$wgMaxShellMemory = 307200;
 
 
Jde o počet bodů, tedy vynásobíme max. rozlišení:
 
# Don't thumbnail an image if it will use too much working memory.
 
# Default is 50 MB if decompressed to RGBA form, which corresponds to 12.5 million pixels or 3500x3500.
 
$wgMaxImageArea = 20000000;
 
 
Ačkoliv výstupní soubor může být několik KB, convert využívá odkládací prostor a ten se započítává do limitu, přestože se pak zruší:
 
#Maximum file size created by shell processes under linux, in KB.
 
#ImageMagick convert for example can be fairly hungry for scratch space.
 
$wgMaxShellFileSize = 1024000;
 
 
  
 
[[Kategorie:Interní dokumentace|Nastavení a úpravy Mediawiki pro support.zcu.cz]]
 
[[Kategorie:Interní dokumentace|Nastavení a úpravy Mediawiki pro support.zcu.cz]]

Verze z 23:29, 27 srpen 2014

Návod je aktuální k Mediawiki verze 1.19.

Obsah

Konfigurace serveru

MySQL

Dle http://meta.wikimedia.org/wiki/Help:Short_words_in_searches je potřeba nastavit minimální délku slova pro vyhledávání na 3 znaky.

Apache

Idea provozu supportu ve dvou režimech (public, user) autentizovaný WebAuthem je založena na tom, že je Apache provozován na více portech:

  • port 80 (http) - neautentizovaný uživatel, pokuď je uživatel přihlášen, je mu umožněn uživatelský provoz
  • port 443 (https) - chráněno WebAuthem a je vyžadováno přihlášení

Apache2 s podporou autentizace WebAuth lze nakonfigurovat následnovně:

<VirtualHost _default_:80>
   ServerAdmin webmaster@service.zcu.cz
   ServerName daphne.civ.zcu.cz
   ServerAlias daphne

   ErrorLog /var/log/apache2/wiki-error.log
   TransferLog /var/log/apache2/wiki-access.log
   ServerSignature Off

   DocumentRoot /var/lib/mediawiki
   <Directory /var/lib/mediawiki/>
           Options +FollowSymLinks
           AllowOverride All
           order allow,deny
           allow from all
   </Directory>

   Alias /images /var/lib/mediawiki/images
   Include /etc/apache2/redirect.conf

   RewriteEngine On
   RewriteRule ^/nagios/cgi-bin/extinfo.cgi.*$ http://support.zcu.cz/index.php/P%C5%99ehled_dostupnosti_poskytovan%C3%BDch_slu%C5%BEeb

   <Directory /var/lib/mediawiki/images>
           Options +FollowSymLinks -Indexes
           AllowOverride None
   </Directory>
</VirtualHost><VirtualHost _default_:443>
   ServerAdmin webmaster@service.zcu.cz
   ServerName daphne.civ.zcu.cz
   ServerAlias daphne
   ServerSignature off

   ErrorLog /var/log/apache2/ssl-wiki-error.log
   TransferLog /var/log/apache2/ssl-wiki-access.log

   SSLEngine on
   SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
   SSLVerifyDepth 3
   SSLCertificateFile /etc/apache2/ssl/server.crt
   SSLCertificateKeyFile /etc/apache2/ssl/server.key
   SSLCertificateChainFile /etc/apache2/ssl/ca-chain.pem

   ServerSignature Off

   Include /etc/apache2/redirect.conf

   DocumentRoot /var/lib/mediawiki
   <Directory /var/lib/mediawiki/>
           Options +FollowSymLinks
           AllowOverride All
           order allow,deny
           allow from all

           #SSLVerifyClient optional
           #SSLVerifyDepth 9
           SSLOptions +ExportCertData +StdEnvVars +FakeBasicAuth +OptRenegotiate
           AuthType WebAuth
           require privgroup civ lps helps
           #require user vbaxa hana tana zewelova jhodis simha rskarda fiser kvochova
   </Directory>

   Alias /images /var/lib/mediawiki/images
   <Directory /var/lib/images>
           Options -FollowSymLinks
           AllowOverride None

           #SSLVerifyClient optional
           #SSLVerifyDepth 9
           SSLOptions +ExportCertData +StdEnvVars +FakeBasicAuth +OptRenegotiate
           AuthType WebAuth
           Require privgroup civ lps helps
           #require user vbaxa hana tana zewelova jhodis simha rskarda fiser kvochova

        </Directory>
</VirtualHost>

Dále se musí v /etc/php5/apache2/php.ini nastavit tyto volby (v sec):

session.cookie_lifetime = 36000
session.gc_maxlifetime = 36000

Toto musi byt v souladu s hodnotou $wgCookieExpiration v konfiguraci wiki (soubor LocalSettings.php).


Další závislosti

Některá rozšíření vyžadují, aby byl na serveru nainstalován balík graphviz.

Upgrade o patch level

Stáhnout novou verzi a rozbalit ji do /usr/local/mediawiki-VERZE/. Dalším krokem je úprava skriptů, které byly upraveny (jedná se zvláště o přihlašování). Seznam (nemusí být úplný je zde):

  • aplikovat patch pro Restrict stránky, neprovádět upgrade pokud patch neexistuje
  • upravit includes/SpecialSearch.php tak, aby podporoval vyhledávání google
  • includes/templates/Userlogin.php - změna přesměrování při přihlášení
  • zkontrolovat zákaz zobrazování tlačítek pro nepřihlášené uživatele
  • zkontrolovat zrušení zobrazování tlačítka pro diskusi pro všechny uživatele
  • zkontrolovat změny ve skinu
  • zkontrolovat kompatibilitu všech rozšíření a aktualizovat je

Viz také Manuálovou stránku k upgradování

Postup upgrade

Předpokládáme, že jsme na stroji, co na něm je wiki již nainstalována. Tzn. v databázi máme data wiki a obrázky v /opt/wiki-images.

Nejprve se ujistíme, že Apache a MySQL jsou nakonfigurovány v souladu s touto dokumentací.

Stáhneme mediawiki a rozbalíme do /opt/mediawiki-<verze>.

Prolinkujeme:

ln -sfn /opt/mediawiki-<verze> /var/lib/mediawiki
rm -r /opt/mediawiki-<verze>/images
ln -s /opt/wiki-images /var/lib/mediawiki/images

Máme dvě možnosti. Buď si zobrazíme wiki v prohlížeči a projdeme webový instalátor. Ten nám vygeneruje základ souboru LocalSettings.php a updatne databázi. Nebo si soubor LocalSettings.php přetáhneme ze staré instalace a spustíme:

php maintenance/update.php

čím zaktualizujeme databázi.

Upravíme LocalSettings.php.

Aplikujeme patch pro Page Restriction.

Nainstalujeme rozšíření.

Úpravy v LocalSettings.php

Kvůli starším rozšířením se musí na začátek souboru přidat následující řádky:

if ( !defined( 'MEDIAWIKI' ) ) {
        exit;
}

+$path = array( $IP, "$IP/includes", "$IP/languages" );
+set_include_path( implode( PATH_SEPARATOR, $path ) . PATH_SEPARATOR . get_include_path() );

$path = array( $IP, "$IP/includes", "$IP/languages" ); set_include_path( implode( PATH_SEPARATOR, $path ) . PATH_SEPARATOR . get_include_path() );

Změna nastavení cache:

$wgMainCacheType = CACHE_MEMCACHED;
$wgMemCachedServers = array (
  0 => '127.0.0.1:11211',
  );

Dál je třeba dát pozor na to aby proměnná $wgServer byla nastavená bez protokolu. Jinak se nenačítá css po přesměrování z webauthu. Takže něco jako:

$wgServer           = "//support.zcu.cz";

Následující nastavení je třeba přidat nakonec LocalSettings.php:

ini_set( 'memory_limit', '80M' );

$wgShowIPinHeader = false;
$wgDisableAnonTalk = true;

# nastaveni defaultniho uzivatele
$wgDefaultUserOptions ['editsection'] = 0;
$wgDefaultUserOptions ['date'] = 2;
$wgDefaultUserOptions ['timecorrection'] = '02:00';

# enable patrolling
# http://meta.wikimedia.org/wiki/Patrol
$wgUseRCPatrol = true;
# --- NAMESPACES ------------------------------------------------------------
$wgExtraNamespaces = array ( 
	100 => "CIV",
	101 => "CIV diskuse",
	102 => "LPS",
	103 => "LPS diskuse",
	104 => "SIS",
	105 => "SIS diskuse",
	106 => "HelpDesk",
	107 => "HelpDesk diskuse",
	108 => "Aktuality",
	109 => "Aktuality diskuse",
	110 => "Public",
	111 => "Public diskuse",
	112 => "PIS",
	113 => "PIS diskuse",
	114 => "KPS",
	115 => "KPS diskuse"
);

$wgNamespacesToBeSearchedDefault = array(
'NS_MEDIA'            => false,
'NS_SPECIAL'          => false,
'NS_MAIN'             => true,
'NS_TALK'             => false,
'NS_USER'             => false,
'NS_USER_TALK'        => false,
'NS_WIKIPEDIA'        => false,
'NS_WIKIPEDIA_TALK'   => false,
'NS_IMAGE'            => false,
'NS_IMAGE_TALK'       => false,
'NS_MEDIAWIKI'        => false,
'NS_MEDIAWIKI_TALK'   => false,
'NS_TEMPLATE'         => false,
'NS_TEMPLATE_TALK'    => false,
'NS_HELP'             => false,
'NS_HELP_TALK'        => false,
'NS_CATEGORY'         => true,
'NS_CATEGORY_TALK'    => false,
100 => false,
101 => false,
102 => false,
103 => false,
104 => false,
105 => false,
106 => false,
107 => false,
108 => true,
109 => false,
110 => true,
111 => false,
112 => false,
113 => false,
114 => false,
115 => false
);

# Enable subpages in the namespace
$wgNamespacesWithSubpages[0] = 1;
$wgNamespacesWithSubpages[100] = 1;
$wgNamespacesWithSubpages[102] = 1;
$wgNamespacesWithSubpages[104] = 1;
$wgNamespacesWithSubpages[106] = 1;
$wgNamespacesWithSubpages[108] = 1;
$wgNamespacesWithSubpages[110] = 1;
$wgNamespacesWithSubpages[112] = 1;
$wgNamespacesWithSubpages[114] = 1;

$wgUploadPath       = "$wgScriptPath/images";
$wgUploadDirectory  = "$IP/images";
# --- PERMISSIONS ---
$wgGroupPermissions['*'    ]['createaccount']   = false;
$wgGroupPermissions['*'    ]['read']            = true;
$wgGroupPermissions['*'    ]['edit']            = false;

$wgGroupPermissions['user' ]['move']            = false;
$wgGroupPermissions['user' ]['edit']            = false;
$wgGroupPermissions['user' ]['upload']          = true;
$wgGroupPermissions['user' ]['viewrestrict']    = false;

$wgGroupPermissions['editor']['edit']           = true;
$wgGroupPermissions['editor']['restrict']       = true;
$wgGroupPermissions['editor']['upload']         = true;
$wgGroupPermissions['editor']['move']           = true;
$wgGroupPermissions['editor']['delete']         = true;

$wgGroupPermissions['mediator']['protect']      = true;
$wgGroupPermissions['mediator']['patrol']       = true;
$wgGroupPermissions['mediator']['rollback']     = true;

$wgGroupPermissions['sysop']['restrict']        = true;

$wgGroupPermissions['pis']['edit']              = true;

#Na logo CIV se lze dostat odkazem [[Image:Logo_ZCU-support.png]]
$wgLogo = "{$wgUploadPath}/8/83/Logo_ZCU-support.png";

$wgVerifyMimeType = false;
$wgMimeDetectorCommand = "/usr/bin/file -bi";
$wgFileExtensions = array('png', 'jpg', 'jpeg', 'gif', 'dia', 'tar.gz', 'tgz', 'gz', 'pdf', 'zip', 'odt', 'odg');

## To enable image uploads, make sure the 'images' directory
## is writable, then uncomment this:
$wgEnableUploads                = true;
$wgUseImageResize               = true;
$wgUseImageMagick = true;
$wgImageMagickConvertCommand = "/usr/bin/convert";

# expirace prihlaseni po 10 hodinach
$wgCookieExpiration = 36000;

# Debug
#error_reporting(E_ALL);
#ini_set( 'display_errors', 1 );
#$wgShowExceptionDetails = true;

# Pokud je povolena cache parseru, vede to na bezpecnostni diru v page protectu
$wgParserCacheType  = CACHE_NONE;

Úpravy kódu a vzhledu

Úpravy stylu

Následující css je třeba vložit do MediaWiki:Common.css:

table.tabulka {
  background: #f9f9f9;
  padding: 1pt;
  border: 1px solid silver;
}
table.tabulka th {
  background: #a2bdc8;
  border: 1px solid black;
  padding: 0 2pt;
}
table.tabulka td {
  border: 1px dotted gray;
}

table.tabulka-red {
  background: #f9f9f9;
  padding: 1pt;
  border: 1px solid silver;
}
table.tabulka-red th {
  background: #ff3939;
  border: 1px solid black;
  padding: 0 2pt;
  color: white;
}


table.tabulka-red td {
  border: 1px dotted gray;
}

body.page-Hlavní_strana h1.firstHeading { display:none; }
body.page-Kiosek h1.firstHeading { display:none; }

/* X3 - FACELIFT na modrou JVS compliant variantu - srpen 2014 ----------------------------- */

/* V podstate predelani standardniho skinu Vector na neco, co je v souladu s JVS ZCU
   - uprava zahlavi (pozice, background, logo)
   - uprava horizontalni navigace (pozice, barvy) 
   - pridani hacku obarvujiciho element p-cactions v pripade, ze je stranka restricted a uzivatl ma moznost ji zverejnit
*/

div#mw-head {
  background: url("/skins/vector/headerBackground.png") repeat-x scroll 0 0 #23549b; 
  height: 95px;
}

#mw-page-base {
    height: 95px;
}

#left-navigation {
    top: 66px;
    left: 159px;
}

#right-navigation {
    margin-top: 66px;
}

div.vectorMenu,
div.vectorMenu h5 a,
div.vectorTabs,
div.vectorTabs ul li {
    height: 28px;
}

div.vectorTabs,
div.vectorTabs ul,
div.vectorTabs ul li,
div.vectorTabs ul li.selected,
div.vectorTabs span,
div.vectorMenu h5 a {
    background-image: none;
}

div.vectorTabs span a {
    padding-top: 6px;
}

#p-search form, #p-search input {
    margin: 0;
}

div.vectorMenu,
div.vectorTabs ul li {
    background-color: white;
}

div#mw-panel {
    top: 115px;
}

a.new, 
#p-personal a.new,
a.new:visited, 
#p-personal:visited a.new {
    color: #FFCB00 !important;
    font-weight: bold !important;
}

#p-personal a {
    color: white;
}

#pt-userpage, #pt-anonuserpage, #pt-login {
    background: url("/skins/vector/icon_user.png") no-repeat scroll 0 0 transparent;
}

div.vectorMenu,
div.vectorTabs li {
    border-right: 1px solid #e8e8e8;
    border-top: 1px solid #132d52;
}

div.vectorTabs li:first-child {
    border-left: 1px solid #132d52;
}

#left-navigation div.vectorTabs li:last-child {
    border-right: 1px solid #132d52;
}

div.vectorMenu {
    border-right: 1px solid #132d52;
}

Dále je třeba přetáhnout následující věci:

  • 2x NEW soubor
    • /skins/Vector.php - 2 zmeny
    • /skind/vector/screen.css - 1 zmena
  • 2x "OLD" soubor
    • /skins/Vector_old.php
    • /skind/vector/screen_old.css
  • 3x obrazek
    • /skins/vector/headerBackground.png
    • /skins/vector/headerLogo.png
    • /skins/vector/icon_user.png

Zrušení tlačítek pro nepřihlášené uživatele

V souboru includes/SkinTemplate.php je třeba řádek:

$userCanRead = $title->quickUserCan( 'read', $user );

změnit na:

$userCanRead = $user->getId() != 0 && $title->quickUserCan( 'read', $user );

Zrušení zobrazování tlačítka pro diskusi

V includes/SkinTemplate.php zakomentovat následující řádky:

                        $content_navigation['namespaces'][$talkId] = $this->tabAction(
                                      $talkPage, array( "nstab-$talkId", 'talk' ), $isTalk && !$preventActiveTabs, '', $userCanRead
                        );
                        $content_navigation['namespaces'][$talkId]['context'] = 'talk';

A pro zrušení vyhledávání v diskusích se v includes/search/SearchEngine.php ve funkci searchableNamespaces(), podmínka

                        if( $ns >= NS_MAIN ) {
                                $arr[$ns] = $name;
                        }

upraví na

                        if( ($ns >= NS_MAIN) && (($ns%2) == 0) ) {
                                $arr[$ns] = $name;
                        }

Trik spočívá v tom, že diskuse jsou vždy liché.

Změna diskuse v uživatelských url na Public

V souboru /includes/SkinTemplate.php je ve funkci builPersonalUrls() přidat nový kód pro zobrazení public namespace a zakomentovat starý kód pro diskuse. Výsledek by měl vypadat takto:

                        $userpublicUrlDetails = $this->makeUrlDetails('Public:' .$this->username);
                        $personal_urls['public'] = array(
                                'text' => 'public',
                                'href' => &$userpublicUrlDetails['href'],
                                'class' => $userpublicUrlDetails['exists']?false:'new',
                                'active' => ( $userpublicUrlDetails['href'] == $pageurl )
                        );
#                       $usertalkUrlDetails = $this->makeTalkUrlDetails($this->userpage);
#                       $personal_urls['mytalk'] = array(
#                               'text' => wfMsg('mytalk'),
#                               'href' => &$usertalkUrlDetails['href'],
#                               'class' => $usertalkUrlDetails['exists']?false:'new',
#                               'active' => ( $usertalkUrlDetails['href'] == $pageurl )
#                       );

Popis uživatelských skupin

Práva se uživatelům nastavují tak, že se zařadí do patřičné skupiny. Práva skupiny se nastavují v LocalSettings.php proměnnou $wgGroupPermissions.

anonymous

Nepřihlášený uživatel, který má právo jen prohlížet nechráněné stránky. Pro získání vyšších práv je třeba se přihlásit.

editor

Možnost editovat stránky, nemá právo pro zamykání, ale je mu umožněna restrikce.

mediator

Má právo zamykání stránek proti editaci a nastavení restrict.

sysop

Administrátor, má všechny práva, kromě změny práv.

byrokrat

Umožňuje měnit oprávnění.

restrict

Může označovat stránky za stránky s omezeným přístupem.

viewrestrict

Může prohlížet stránky s omezeným přístupem.

Příhlášení webauthem

Příhlášení webauthem je realizováné prostřednictvím rozšíření AutomaticREMOTE_USER s droubnou úpravou.

Instalace

Rozšíření rozbalíme do složky extensions a do LocalSettings.php přidáme následující řádky:

require_once( "$IP/extensions/Auth_remoteuser/Auth_remoteuser.php" );
$wgAuth = new Auth_remoteuser();

Dále je třeba v LocalSettings.php vypnout cache parseru, jinak to vede na bezpečnostní díru:

$wgParserCacheType  = CACHE_NONE;

Úpravy

Je třeba upravit dva soubory. V zdrojovém kódu rozšíření se musí zakomentovat řádek následujícím způsobem:

--- Auth_remoteuser.php
+++ Auth_remoteuser.php
@@ -81,7 +81,7 @@ $wgAuthRemoteuserDomain = "NETBIOSDOMAIN"; /* Remove NETBIOSDOMAIN\ from the beg
 /* User's mail domain to append to the user name to make their email address */
 $wgAuthRemoteuserMailDomain = "example.com";

-$wgExtensionFunctions[] = 'Auth_remote_user_hook';
+//$wgExtensionFunctions[] = 'Auth_remote_user_hook';

 /**
  * This hook is registered by the Auth_remoteuser constructor.  It will be

Dále je třeba vložit následující řádky do souboru includes/templates/Userlogin.php:

--- Userlogin.php
+++ Userlogin.php
@@ -29,6 +29,21 @@ class UserloginTemplate extends QuickTemplate {
        <div class="visualClear"></div>
 <?php } ?>

+<?php
+# zcu login hack
+# presmerujeme na https
+if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === "off") {
+       header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
+       die();
+}
+# zavolame rozsireni na autentikaci
+require_once( "extensions/Auth_remoteuser/Auth_remoteuser.php" );
+Auth_remote_user_hook();
+# presmerujeme uzivatele zpet odkud prisel
+header("Location: https://daphne.civ.zcu.cz/index.php/".$_GET['returnto']."");
+die();
+?>
+
 <div id="loginstart"><?php $this->msgWiki( 'loginstart' ); ?></div>
 <div id="userloginForm">
 <form name="userlogin" method="post" action="<?php $this->text('action') ?>">

Page Restriction - omezení přístupu

Jedná se o patch z MediaWiki. Rozšíření přidává možnost blokovat/odblokovávat stránky (právo restrict) a prohlížení blokovaných stránek (právo viewrestrict). Na tyto stránky je třeba mít zvláštní právo.

Verze na stránce s rozšířením je zastaralá. Patch upravený pro verzi 1.19 lze najít zde (přišel mi příliš dlouhý pro vložení přímo sem).

Vyhledávání přes Google

Postup zhruba podle stránek [1]. V souboru includes/specials/SpecialSearch.php upravíme funkci showResults( $term ) následovně:

--- SpecialSearch.php
+++ SpecialSearch.php
@@ -403,6 +403,10 @@ class SpecialSearch extends SpecialPage {
                if( $num || $this->offset ) {
                        $out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
                }
+                if ( ! $wgDisableTextSearch ) {
+                        $out->addWikiText( wfMsg( 'Googlesearchheader' ) );
+                        $out->addHTML( wfMsg( 'Googlesearch', $term ) );
+                }
                wfProfileOut( __METHOD__ );
        }

Dále vytvoříme systémové hlášení Googlesearchheader přístupem na MediaWiki:Googlesearchheader kam vložíme něco chytrého jako:

===Hledání Googlem===
Můžete zkusit vyhledávání Googlem; je ale možné, že jeho výsledky nemusí být aktuální.

Dále je potřeba nastavit odeslání hledaného řetězce v utf-8, to se provede úpravou MediaWiki:Googlesearch, tak aby skryté položky 'ie' a 'oe' obsahovaly 'utf-8' (nahradí se proměnna $2), asi takto:

<input type="hidden" name="ie" value="utf-8" />
<input type="hidden" name="oe" value="utf-8" />

Google Analytics

Postupovat dle návodu http://www.mediawiki.org/wiki/Extension:Google_Analytics_Integration, identifikátor je UA-19622695-1. Prohlížení je dostupné na https://www.google.com/analytics/reporting/?id=38863334 (je třeba získat oprávnění od phanousk nebo svamberg, předpokládá se vlastnictví google účtu).

Rozšíření

Rozšíření s přímočarou instalací

Instalace následujích rozšíření vyžaduje pouze jejich stažení, rozbalení do adresářeextensions a vložení příslušného include do LocalSettings.php.

AnyWebSite

Původní je k dosažení na mediawiki, my máme dopsanou podporu pro parametry 'width' a 'height' trošičku jinak. Následující kód vložit do /var/lib/mediawiki/extensions/anywebsite.php:

<?php
# Tag :
#   <anyweb [width="<size in px>"] [height="<size in px>"]>website</anyweb>
# Ex :
#   from url http://aurora1.sourceforge.net
#   <anyweb>http://aurora1.sourceforge.net</anyweb>
#   <anyweb width="100" height="200">http://aurora1.sourceforge.net</anyweb>
# 
# Enjoy !
$wgExtensionFunctions[] = 'wfanyweb';
$wgExtensionCredits['parserhook'][] = array(
        'name' => 'anysite extension',
        'description' => 'Display sites',
        'author' => 'Minseong Kim and Others',
        'url' => 'http://www.mediawiki.org/wiki/Extension:Anysite'
);

function wfanyweb() {
        global $wgParser;
        $wgParser->setHook('anyweb', 'renderanyweb');
}

# The callback function for converting the input text to HTML output
function renderanyweb($input, $params = array()) {
        $width = 800;
        $height = 600;

        if (array_key_exists('width', $params))
                $width = $params['width'];

        if (array_key_exists('height', $params))
                $height = $params['height'];

        $output= '<iframe name="anyweb" src="'.htmlspecialchars($input).'" width="'.$width.'" height="'.$height.'" frameborder="0">'.'</iframe>';
        return $output;
}

?>

A do LocalSettings.php přidat řádky:

# embeding webpages
include("extensions/anywebsite.php");


External Links

Stáheneme ze stránky rozšíření a do LocalSettings.php přidáme:

#http://www.mediawiki.org/wiki/Extension:ExternalLinks
require_once( "$IP/extensions/ExternalLinks/ExternalLinks.php" );
$wgELuserRight = 'delete'; // default: edit
$wgELvalidationMode = 'cURL';

Graphical Category Browser

Graphical Category Browser zobrazuje závislosti kategorií mezi sebou, lze postupovat podle návodu, ale je třeba dát pozor na:

  • upravu práv adresáře images/xyGraphvizCache: chmod www-data:www-data /var/lib/mediawiki/images/xyGraphvizCache
  • poslední znak ve skriptu musí být ?> jinak hlásí chybu, že nelze modifikovat hlavičku, protože již byla odeslána, tedy ani odřádkování
  • ve skriptu zakomentovat řádek $wgHooks['CategoryPageView'][] = 'xyCategoryGraphHook'; jinak nezobrazuje stránky s kategoriemi, dočasně může zobrazovat chybu memcached, ktery hlásí problem se serializací, mělo by stačit jej restartnout nebo chvíli vyčkat

Dále chceme, aby se graf kategorií zobrazoval pouze na stránkách kategorií, které obsahují tag <GraphicalCategory />. Proto je třeba na rozšíření aplikovat následující patch:

diff --git xyCategoryBrowser.php xyCategoryBrowser.php
index f406da7..6df7224 100644
--- xyCategoryBrowser.php
+++ xyCategoryBrowser.php
@@ -97,7 +97,19 @@ class xyCategoryHook {
   public static function hookSetup() {
     global $IP, $wgMessageCache, $wgHooks;
  
-    $wgHooks['CategoryPageView'][] = 'xyCategoryHook::hook';
+    //$wgHooks['CategoryPageView'][] = 'xyCategoryHook::hook';
+
+    $wgHooks['ParserFirstCallInit'][] = 'setupParserHook';
+ 
+    function setupParserHook( Parser $parser ) {
+	$parser->setHook( 'GraphicalCategory', 'xyCategoryHook::parserHook' );
+	return true;
+}
+  }
+
+  public static function parserHook($input, array $args, Parser $parser, PPFrame $frame) {
+	xyCategoryHook::hook($parser->getTitle());
+	return "";
   }
  
   /**
@@ -105,18 +117,18 @@ class xyCategoryHook {
    *
    * @param $cat category
    */ 
-  public static function hook($cat) {
+  public static function hook($title) {
     require_once 'xyCategoryGraph.php';
     global $wgOut, $xyCategoriesMaxAge;
     $wgOut->setSquidMaxage( $xyCategoriesMaxAge );
-    $title = $cat->getTitle();
+    //$title = $cat->getTitle();
     $dbKey = $title->getDBkey();
     $cap = new xyCategoryGraph();
     $age = $cap->cacheAge($dbKey);
     if (!$age || $age > $xyCategoriesMaxAge ) {
       $cap->doQuery($title);
       $cap->doDot($dbKey);
-      };
+    };
     $cap->showImg($dbKey);
     return true;
     }

Dynamic Page List

Instalace podle stránky rozšíření. Dále je třeba na soubory rozšíření aplikovat následující patch pro přidání volby addfirstparagraph:

--- DPL.php
+++ DPL.php
@@ -16,6 +16,7 @@ class DPL {
 	var $mIncSecLabelsMatch    = array(); // array of match patterns for sections to transclude
 	var $mIncSecLabelsNotMatch = array(); // array of NOT match patterns for sections to transclude
 	var $mIncParsed;    // whether to match raw parameters or parsed contents
+	var $mIncFirstPar;
 	var $mParser;
 	var $mParserOptions;
 	var $mParserTitle;
@@ -32,7 +33,7 @@ class DPL {
 		$includemaxlen, $includeseclabels, $includeseclabelsmatch,
 		$includeseclabelsnotmatch, $includematchparsed, &$parser, $logger,
 		$replaceInTitle, $iTitleMaxLen, $defaultTemplateSuffix, $aTableRow,
-		$bIncludeTrim, $iTableSortCol, $updateRules, $deleteRules
+		$bIncludeTrim, $iTableSortCol, $updateRules, $deleteRules, $includefirstparagraph
 	) {
 	   	global $wgContLang;
 
@@ -49,6 +50,8 @@ class DPL {
 			$this->mIncParsed            = $includematchparsed;
 		}
 
+		$this->mIncFirstPar = $includefirstparagraph;
+
 		if ( isset( $includemaxlen ) ) {
 			$this->mIncMaxLen = $includemaxlen + 1;
 		} else {
@@ -348,7 +351,7 @@ class DPL {
 		}
 
 		// other list modes
-		$sk = & $wgUser->getSkin();
+		$sk = $wgUser->getSkin();
 
 		// process results of query, outputing equivalent of <li>[[Article]]</li> for each result,
 		// or something similar if the list uses other startlist/endlist;
@@ -381,7 +384,7 @@ class DPL {
 			}
 
 			// Page transclusion: get contents and apply selection criteria based on that contents
-			if ( $this->mIncPage ) {
+			if ( $this->mIncPage || $this->mIncFirstPar ) {
 				$matchFailed = false;
 				if ( empty( $this->mIncSecLabels ) || $this->mIncSecLabels[0] == '*' ) { // include whole article
 					$title = $article->mTitle->getPrefixedText();
@@ -737,11 +740,17 @@ class DPL {
 			}
 
 			// add included contents
-			if ( $this->mIncPage ) {
+			if ( $this->mIncPage || $this->mIncFirstPar ) {
 				DPLInclude::open(
 					$this->mParser, $this->mParserTitle->getPrefixedText()
 				);
+
+				if ( $this->mIncFirstPar && preg_match("/^(.*)[\n=]/", $incwiki, $match) ) {
+					$incwiki = $match[0];
+				}
+
 				$rBody .= $incwiki;
+
 				DPLInclude::close(
 					$this->mParser, $this->mParserTitle->getPrefixedText()
 				);
diff --git DPLMain.php DPLMain.php
index c8a708d..06fd8ad 100644
--- DPLMain.php
+++ DPLMain.php
@@ -230,6 +230,8 @@ class DPLMain {
 
 		$bAddEditDate = self::argBoolean( ExtDynamicPageList::$options['addeditdate']['default'] );
 
+		$bAddFirstParagraph = self::argBoolean( ExtDynamicPageList::$options['addfirstparagraph']['default'] );
+
 		$bAddUser		 = self::argBoolean( ExtDynamicPageList::$options['adduser']['default'] );
 		$bAddAuthor	   = self::argBoolean( ExtDynamicPageList::$options['addauthor']['default'] );
 		$bAddContribution = self::argBoolean( ExtDynamicPageList::$options['addcontribution']['default'] );
@@ -1303,6 +1305,13 @@ class DPLMain {
 					}
 					break;
 
+				case 'addfirstparagraph':
+                               		if( in_array($sArg, ExtDynamicPageList::$options['addfirstparagraph'] ) )
+                                       		$bAddFirstParagraph = self::argBoolean( $sArg );
+                               		else
+                                       		$output .= $logger->msgWrongParam('addfirstparagraph', $sArg);
+	                               break;
+
 				/**
 				 * FORMAT/HTML PARAMETERS
 				 * @todo allow addpagetoucheddate, addeditdate, adduser, addcategories to have effect with 'mode=category'
@@ -3167,7 +3176,7 @@ class DPLMain {
 			$iIncludeMaxLen, $aSecLabels, $aSecLabelsMatch, $aSecLabelsNotMatch,
 			$bIncParsed, $parser, $logger, $aReplaceInTitle, $iTitleMaxLen,
 			$defaultTemplateSuffix, $aTableRow, $bIncludeTrim, $iTableSortCol,
-			$sUpdateRules, $sDeleteRules
+			$sUpdateRules, $sDeleteRules, $bAddFirstParagraph
 		);
 
 		if ( $rowcount == - 1 ) {
diff --git DPLSetup.php DPLSetup.php
index 2a57e27..bbadaba 100644
--- DPLSetup.php
+++ DPLSetup.php
@@ -528,6 +528,9 @@ class ExtDynamicPageList {
 		'addpagetoucheddate'   => array( 'default' => 'false', 'true', 'no', 'yes', '0', '1', 'off', 'on' ),
 		'adduser'			  => array( 'default' => 'false', 'true', 'no', 'yes', '0', '1', 'off', 'on' ),
 
+		'addfirstparagraph'  => array( 'default' => 'false', 'true', 'no', 'yes', '0', '1', 'off', 'on' ),
+
+
 		// default of allowchacheresults depends on behaveasIntersetion and on LocalSettings ...
 		'allowcachedresults'   => array( 'true', 'false', 'no', 'yes', 'yes+warn', '0', '1', 'off', 'on' ),
 		/**

Wikifeeds

Rozšíření se už nevyvíjí, ale mělo by stále fungovat. Překopírujeme ze staré instalace a do LocalSettings.php přidáme:

# wiki feeds
require_once("extensions/GenericXmlSyndicationFeed.php");
require_once("extensions/SpecialWikiFeeds.php");
$wgWikiFeedsSettings['cacheEnable'] = false;

ZČU rozšíření

Rozšíření bylo třeba pro Mediawiki 1.19 mírně předělat. Protože se rozpadla do více souboruů, jsou umístěna souhrně do adresáře zcu. Následující přidat do LocalSettings.php:

# Hostmaster
require_once ("extensions/zcu/SpecialHostmaster.php");

# UserRequest
require_once ("extensions/zcu/SpecialUserRequest.php");

# RTRequest
require_once ("extensions/zcu/SpecialRTRequest.php");

# StagRequest
require_once ("extensions/zcu/SpecialStagRequest.php");
Osobní nástroje
Jmenné prostory

Varianty
Zobrazení
Akce
Kdo jsem
Navigace
Často hledaná témata
Nástroje