diff --git a/lib/Fins.pmod/Helpers.pmod/Macros.pmod/Basic.pike b/lib/Fins.pmod/Helpers.pmod/Macros.pmod/Basic.pike --- a/lib/Fins.pmod/Helpers.pmod/Macros.pmod/Basic.pike +++ b/lib/Fins.pmod/Helpers.pmod/Macros.pmod/Basic.pike @@ -1,821 +1,833 @@ inherit .Base; object localeLogger = Tools.Logging.get_logger("fins.macros.LOCALE"); object logger = Tools.Logging.get_logger("fins.macros.Basic"); Tools.Mapping.MappingCache feed_data = Tools.Mapping.MappingCache(600); //! string simple_macro_sessionid(Fins.Template.TemplateData data, mapping|void args) { return data->get_request()->misc->session_id; } //! args id, string string simple_macro_LOCALE(Fins.Template.TemplateData data, mapping|void args) { object r = data->get_request(); string t; if(!r) { t = args["string"]; } else { if(!objectp(r)) // a real request will be an object, otherwise we won't be able to make Locale work. { localeLogger->debug("returning string without Locale translation. request=%O, args=%O", r, args); return args["string"]; } mixed e; if(e = catch(t = Locale.translate(r->get_project(), r->get_lang(), (int)args["id"], args["string"]))) localeLogger->exception(sprintf("LOCALE macro failed: %O, args: %O\n", r, args), e); } return t; } +//! args: var | options +string simple_macro_val_from_options(Fins.Template.TemplateData data, mapping|void args) +{ + if(!args->var || !args->options) return "val_from_options missing arguments"; + + foreach(args->options;int o; mixed v) + { + if(v["value"] == args->var) + return v["name"]; + } +} + //! args: var string simple_macro_humanize(Fins.Template.TemplateData data, mapping|void args) { // werror("humanize: %O\n", args->var); return Tools.Language.Inflect.humanize(args->var || ""); } string simple_macro_set(Fins.Template.TemplateData data, mapping|void args) { data->add(args->var, get_var_value(args->val, data)); return ""; } //! args: string simple_macro_dump_data(Fins.Template.TemplateData data, mapping|void args) { return sprintf("%O\n", mkmapping(indices(data->get_data()), values(data->get_data()))); } //! args: string simple_macro_dump_id(Fins.Template.TemplateData data, mapping|void args) { return sprintf("%O\n", mkmapping(indices(data->get_request()), values(data->get_request()))); } //! populate a data field with a mapping containing available language codes (keys) and native names (values) //! //! args: name string simple_macro_available_languages(Fins.Template.TemplateData data, mapping|void args) { // we do this to force a language update, if it hasn't happened already. string lang = data->get_request()->get_lang(); data->get_data()[args->name] = app->available_languages(); return ""; } //! produce a drop down language selector //! //! args: text string simple_macro_language_selector(Fins.Template.TemplateData data, mapping|void args) { String.Buffer buf = String.Buffer(); // we do this to force a language update, if it hasn't happened already. string lang = data->get_request()->get_lang(); mapping l = app->available_languages(); buf += "
\n"; return buf->get(); } //! args: controller, action, args, _id=dom element id //! //! any arguments other than those above will be considered variables to //! be added to the url above. string simple_macro_action_link(Fins.Template.TemplateData data, mapping|void args) { object controller; object request = data->get_request(); string event = "index"; if(args->action) event = args->action; // if(!event) throw(Error.Generic("action_link: event name must be provided.\n")); catch(controller = request->controller); if(args->controller) controller = app->get_controller_for_path(args->controller, controller); if(!controller) throw(Error.Generic("action_link: controller " + args->controller + " can not be resolved.\n")); mixed action = controller[event]; if(!action) throw(Error.Generic("action_link: action " + args->action + " can not be resolved.\n")); array uargs; if(args->args) uargs = ((string)args->args)/"/"; string target = (args["#"]?("#" + args["#"]):""); string id, title; if(args->_id) id = args->_id; if(args->_title) title = args->_title; m_delete(args, "_id"); m_delete(args, "_title"); m_delete(args, "controller"); m_delete(args, "action"); m_delete(args, "args"); m_delete(args, "#"); string url = app->url_for_action(action, uargs, args); return ""):">"); } //! args: controller, action, args, method, enctype //! //! any arguments other than those above will be considered variables to //! be added to the url above. string simple_macro_action_form(Fins.Template.TemplateData data, mapping|void args) { object controller; object request = data->get_request(); string event = "index"; if(args->action) event = args->action; // if(!event) throw(Error.Generic("action_form: event name must be provided.\n")); controller = request->controller; if(args->controller) controller = app->get_controller_for_path(args->controller, controller); if(!controller) throw(Error.Generic("action_form: controller " + args->controller + " can not be resolved.\n")); mixed action = controller[event]; if(!action) throw(Error.Generic("action_form: action " + args->action + " can not be resolved.\n")); array uargs; if(args->args) uargs = args->args/"/"; string other = ""; if(args->method) other += " method=\"" + args->method + "\""; if(args->enctype) other += " enctype=\"" + args->enctype + "\""; if(args->id) other += " id=\"" + args->id + "\""; m_delete(args, "controller"); m_delete(args, "action"); m_delete(args, "args"); m_delete(args, "method"); m_delete(args, "enctype"); m_delete(args, "id"); string url = app->url_for_action(action, uargs, args); return "