Module:CargoQuery

From Dragalia Lost Wiki
Template-info.png Documentation

This module lets you get around the |no html bug that Cargo has by avoiding |format=template.

To use, preface query arguments with q?. Even if you are only using one table, use |q?tables=. You may additionally specify |template= (required), |intro=, |outro=, |delimiter=, and |default=.

Use Lua names of all query parameters, so |q?join=, |q?groupBy, etc.

For simplicity of code, the named args parameter is required to be Yes, and you do not need to specify it.

Unlike |format=template, this wrapper will NOT rename parameters with underscores in them to use spaces instead.

Parameters & Invocation[edit]

{{#invoke:CargoQuery|main
|q?tables= 	corresponds to table / tables
|q?join= 	corresponds to join on
|q?fields= 	corresponds to fields
|q?where= 	corresponds to where
|q?groupBy= 	corresponds to group by
|q?having= 	corresponds to having
|q?orderBy= 	corresponds to order by
|q?limit= 	corresponds to limit
|template=
|intro=
|outro=
|delimiter=
|default=
}}

vardefine trick[edit]

There exists a Template:vardefine such that if it is passed in as the template parameter, the effect will be that every field's value is assigned to a variable named as the field name. Note: If multiple results are returned for a given query, due to the inherent behavior of #vardefine, the last result's values will override those of all the results that came before it. When using this template, the default template output is empty, however output-affecting parameters such as |intro=, |outro=, and |delimiter= will still be included in the return value. As usual, if no results are found, |default= will also still be used as the output, and no variables will be assigned.

Dependencies[edit]


local p = {}
function p.main(frame)
	if frame == mw.getCurrentFrame() then
		args = require('Module:ProcessArgs').merge(true)
	else
		frame = mw.getCurrentFrame()
	end
	
	local query = {}
	for k, v in pairs(args) do
		if string.sub(k, 0, 2) == 'q?' then
			query[string.sub(k, 3)] = v
		end
	end
	
	local result = mw.ext.cargo.query(query.tables, query.fields, query)
	if not next(result) then
		return frame:preprocess(args.default or '')
	end

	local tbl = {}
	for _, row in ipairs(result) do
		tbl[#tbl+1] = frame:expandTemplate{ title = args.template, args = row }
	end
	local intro = frame:preprocess(args.intro or '')
	local outro = frame:preprocess(args.outro or '')
	return intro .. table.concat(tbl,args.delimiter or '') .. outro
end

return p