I have been working on MediaWiki for my Google Summer of Code 2014 program. I am making an extension in MediaWiki which can store traits of materials in an organized way, display them, allow them to be searched, support import / export and so on. The project can be split up into two parts–Back-end and Front-end. The Back-end consists of a well structured database to store the material traits and the Front-end consists of making a web interface in MediaWiki using its special page functionality.
MediaWiki is a free and open source wiki software, used to power wiki websites such as Wikipedia, Wiktionary and Commons, developed by the Wikimedia Foundation and others. It also runs thousands of other websites. It is written in the PHP programming language and uses a backend database.
There had been some work done on this project in the previous years but that was a standalone project in PHP not in MediaWiki. I have retained the primary database design and trying to port the whole previous work into MediaWiki extension. Whole of my MediaWiki extension is mainly written in PHP but it’s been wrapped in the functions of MediaWiki which means simple PHP , HTML , SQL etc. cannot be embedded as it is.
The extension at present supports:
- sign up and sign in using the MediaWiki modules.
- adding a new material through a form,
- adding a new trait through a form,
- adding a new trait-type through a form,
- adding a new material-type through a form.
- viewing all materials and their traits with values etc.
- storing all the data in the database of MediaWiki.
- keeping track of when a material/trait was added using timestamp.
- keeping track of the user who added material/trait.
I have displayed the materials and their properties by storing the names of all the tables in an array-variable and then by using for loop and MediaWiki Joins, displayed the contents of all the tables. For preventing the user adding the same material or trait again and again, I have added the names of all the materials and traits in an array and then compared the value of the textfield in the form with the values at the array-indices. One of the biggest problem I faced was how to embed the code of various extensions into one extension to get all the functionalitites into a single extension. Finally I jumped over this pitfall by storing the new classes which extend SpecialPage class of MediaWiki into a single file using variables which are meant for this.
I have also deployed the extension on my college server which can be seen working here:
The code is structured into five files which have all the coding to be executed, loading classes, displaying messages on wiki and internationalization of extension and the SQL file for defining database design respectively.
The hardest part encountered till date was displaying all the contents of all the tables by using MediaWiki joins and merging the code of various extensions to make it a single extension exhibiting all the functionalities. Also executing SQL queries according to MediaWiki is a bit tough to grab at once and trying to code anything at first seems hard as the documentation of MediaWiki is quite mature.
What keeps me motivated is my mentor and the beauty of mediawiki although it appears to be sophisticated sometimes but being deployed worldwide and used by giants like WikiPedia motivates me to learn it all.
Lines of code: 700 approximately (effective). Github shows 10 commits / 2,508 ++ / 1,501 — in the main repository and 4 commits / 276 ++ / 10 — in the testing repository. I have written this extension from scratch so no refactoring.
My next steps would include implementing features like:
- editing the added data,
- importing/exporting in CSV, JSON formats,
- advanced search,
- making the number of edits viewable for both
- and a few other things like better search filters etc.