Blockly Editor
![]() | Adds a new document template based on Google Blockly |
Type | XAR |
Category | Application |
Developed by | |
Active Installs | 8 |
Rating | |
License | GNU Lesser General Public License 2.1 |
Compatibility | 9.11.7 |
Table of contents
Description
This extension adds the Google Blockly Template to XWiki, to make programming easier for users who have little/no previous experience of programming, by allowing the creation of script using visual blocks. It supports generating scripting code.
This extension was created by Vivek Iyer as a project for GSoC 2018.
Usage
To create a document using the Blockly template, please follow the steps given below:
- Make sure you're logged in
- Click on create page at the top right corner, and choose the "Blockly" template in the create page document.
Selecting Blockly editor to edit the page - This should take you to the Blockly template page. Drag and drop the blocks from the toolbox onto the adjacent div and combine them like puzzle pieces, as desired. For example:
Combining blocks appropriately - To delete any of the blocks, drag and drop the blocks into the bin.
- To view the source code for the blocks generated in the figure, click on the Source tab.
Source Code View - Save the code using either the "Save and View", or the "Save and Continue" buttons.
- If you want to view the code you generated and/or execute it, go to the View Page. It looks like this:
Viewing the Generated Code - To run the code, click on "Run Code". Now after the code has been run, to view the original code again, click on "View Code".
The code executed - In case you want to edit the page, click on the edit button once again and all the Blockly blocks are loaded as they should be
Categories
There are two categories in the XML Toolbox, the default categories like logic, loops, variables, text, colour, lists etc which are there by default in the Blockly toolbox developed by Google, and the custom categories which have been added to meet XWiki-specific requirements and use cases, like queries, XWiki Bindings etc
Default Categories
The blockly documentation contains the documentation for the default categories such as logic (if-else), loops, variables, text, colour, lists etc
Custom Categories
The following custom categories have been introduced:
XWiki Bindings
Text Block
- A simple text input block, used to generate attribute/object names
XWiki Bindings Block
- Defines the common XWiki Bindings, as defined here
XWiki Bindings Attribute Block
- Used to access the attributes of the XWiki Bindings
- Takes the XWiki binding as one input and the attribute name as the other text input
- For the static XWiki Bindings, the block defined above can be input.
- For dynamic XWiki Bindings, a variable can be created with the desired name, and that can become the input.
XWiki Bindings Method Block
- Used to call the methods of the XWiki Bindings
- Takes the XWiki binding as one input and the method name as the other text input
- The number of arguments to the method call is variable, and can be added/removed by clicking on the cog icon in the top left corner
- For the static XWiki Bindings, the block defined above can be input.
- For dynamic XWiki Bindings, a variable can be created with the desired name, and that can become the input.
Queries
This category contains the following blocks:
Execute Block
- Takes the query string/variable as input
- Outputs $services.query.xwql(query).execute()
Select, From, Where Block
- This is the main block that generates the query, and it has SELECT, FROM and WHERE clauses each of which takes arguments as input. These arguments can be constructed using the other blocks on this category.
- The "SELECT" input block takes a list of attributes while "FROM" takes a list of objects to be selected "from" as input.
- Where takes a boolean expression as input, which can be constructed using the AND/OR blocks and the comparison blocks, described below.
Arguments Block
- Takes variable number of arguments as input, and the arguments can be added/removed by clicking the cog on the top left corner
- Returns comma separated list of the arguments provided, which can be input to either the "SELECT" or the "FROM" input blocks.
Get XObject Block
- Returns the specified XObject in the current document
- The input is the XWiki Class Name (for example to get get the XObject of class XWiki.XWikiUsers, the inputs in the two text fields will be XWiki and XWikiUsers. The code output for this example would be doc.object(XWiki.XWikiUsers)
Get Object Property Block
- Returns the properties/attributes of an object
- The first input field takes the object as input, and the second input field is a text input which takes the attribute name as input.
- For example, to get attribute space.name, we do:
As Block
- This provides the AS keyword
- It takes the value to be aliased as one input, and the alias itself as another text input. The checkbox is used to indicate whether the word "as" itself should be added or not, since specifically mentioning "as" is optional in XWQL.
- For example, keeping the checkbox checked and aliasing XWikiSpace as space, the code generated would be XWikiSpace as space but on unchecking it, the code generated is simply XWikiSpace space
AND/OR Block
- This block takes as input two boolean returning blocks, and returns the "AND" or "OR" of these expressions.
- By default the boolean expression in input is false.
- It is also possible to chain "AND"/"OR" expressions by giving another AND/OR block as input to the first block.
Comparison Operators Block
- This block takes as input two expressions, and returns an expression with the two values joined by an operator.
- The operators can be chosen from the dropdown menu and are one among "=", "≠", ">", "<", "≥", "≤" etc
- It is possible to chain these expressions too, similar to the AND/OR block.
Like Block
- This block provides the LIKE keyword
- Selecting the checkbox on either side adds a "%" on either side to the text input given in the textbook
- This is given as input to the AND/OR block
Order by Block
- This block provides the Order by keyword
- The ascending/descending order can be chosen from the menu and it takes the XWiki property to be ordered as input.
- Again this is given as input to the AND/OR block
Not Block
- The NOT operator is used to negate the predicate that follows it.
Distinct Block
- Returns only distinct, not duplicate, results
- Takes an object attribute as input
How to use Blockly template to code some common Scripting Actions
This section demonstrates how to code the common scripting actions given here, using the Blockly Template Extension.
Create a new Document
#set ($discard = $newDoc.setContent("new content"))
#set ($discard = $newDoc.save("some comment explaining the save", true))
The above snippet can be used to create a new document and can be coded using Blockly as shown below.
Accessing the request
The above snippet can be used to access the action parameter in request and can be coded using Blockly as shown below.
Add objects to a page
$obj.set("field1",$value1)
$obj.set("field2",$value2)
$doc.save()
The above snippet can be used to access the action parameter in request and can be coded using Blockly as shown below.
Redirecting to another page
The above snippet can be used to redirect the user to another page and can be coded using Blockly as shown below.
Add an Attachment to a page
The above snippet can be used to redirect the user to another page and can be coded using Blockly as shown below.
Create an XClass
#set ($myinternaldoc = $mydoc.getDocument())
#set ($myclass = $myinternaldoc.getXClass())
#set ($discard = $myclass.addTextAreaField("mytextarea", "My Text Area", 100, 5))
#set ($discard = $mydoc.save('created doc + xclass'))
The above snippet can be used to create an XClass and can be coded using Blockly as shown below.
Modify the last update date
#set ($date = $datetool.toDate('yyyy-MM-dd', '2013-01-01'))
#set ($mydocinternal = $mydoc.getDocument())
#set ($discard = $mydocinternal.setDate($date))
#set ($discard = $mydocinternal.setMetaDataDirty(false))
#set ($discard = $mydocinternal.setContentDirty(false))
$xwiki.getXWiki().saveDocument($mydocinternal, "change update date", true, $xcontext.getContext())
The above snippet can be used to modify the last update date and can be coded using Blockly as shown below.
Features
- A toolbox containing the default categories for loops, logic statements, variables, macros, math, text etc and the customly added categories for XWiki Script bindings and XWQL queries. (Check Categories section given above for more detail)
The Blockly toolbox - A bin for deleting unnecessary blocks, and features for creating duplicate blocks, adding comments etc by right-clicking on a block
Right clicking on Blockly blocks generates this menu - Converting, saving and later running the generated Velocity code
- Running the generated Velocity code in the XWiki context
(For screenshots and more information on how to use these features, please check the Usage section given above )
Sources
- The Blockly fork, where I added support for Velocity Templating Language, and the custom blocks described above (XWiki Bindings category, Queries category etc)
- The source code of the Blockly extension for XWiki, which depends on the Blockly webjar generated by building the code on the above mentioned fork
- The issues page, to keep track of the issues and bugs
- The Blockly design page,
- The maven repository for the Blockly webjar
Future
Refer to the issues page and the Blockly design page for further details.
Prerequisites & Installation Instructions
We recommend using the Extension Manager to install this extension (Make sure that the text "Installable with the Extension Manager" is displayed at the top right location on this page to know if this extension can be installed with the Extension Manager). Note that installing Extensions when being offline is currently not supported and you'd need to use some complex manual method.
You can also use the following manual method, which is useful if this extension cannot be installed with the Extension Manager or if you're using an old version of XWiki that doesn't have the Extension Manager:
- Log in the wiki with a user having Administration rights
- Go to the Administration page and select the Import category
- Follow the on-screen instructions to upload the downloaded XAR
- Click on the uploaded XAR and follow the instructions
- You'll also need to install all dependent Extensions that are not already installed in your wiki
Dependencies
Dependencies for this extension (org.xwiki.contrib:application-blockly-ui 0.9):
- org.xwiki.platform:xwiki-platform-webjars-api 9.11
- org.xwiki.contrib:blockly 0.7