<?php if (!defined('PmWiki')) exit(); /* AuxSelect recipe Copyright 2007 Marc Cooper gmane@auxbuss.com http://www.auxbuss.com/ This is a PmWiki recipe. It allows the creation of a dropdown select widget, the value of which persists - usually from web-page to web-page - due to the dropdown's selected item being stored in a session variable. A common example is a widget that allows the site visitor to select their preferred currency. This recipe is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ define(AUXSELECT_VERSION, '20070127'); function AuxSelect($name, $arrayname, $opt) { global $AuxSelectData; $defaults = array( 'default' => '', 'id' => 'auxselect', 'text' => '', 'submittext' => 'set' ); $opt = array_merge($defaults, ParseArgs($opt)); extract($opt); if (! isset($AuxSelectData[$arrayname])) return 'Array does not exist'; $values = $AuxSelectData[$arrayname]; @session_start(); if (!isset($_SESSION[$name])) $_SESSION[$name]=$default; else $default = $_SESSION[$name]; $out = "(:input form '' post id=$id:)$text"; $out .= "(:input default name=$name value='$default':)"; foreach ($values as $v) $out .= "(:input select name=$name value='$v':)"; $out .= "(:input hidden action AuxSelectChange:)"; $out .= "(:input hidden name $name:)"; $out .= "(:input submit value='$submittext':)"; $out .= "(:input end:)"; return $out; } Markup('auxSelect', '<directives', '/\\(:auxSelect\\s+([\\w]+)\\s?(\\w+)*\\s*(.*?)\\s*:\)/ei', "AuxSelect(PSS('$1'),PSS('$2'),PSS('$3'))"); $HandleActions['AuxSelectChange'] = 'HandleAuxSelectChange'; function HandleAuxSelectChange($pagename) { global $HandleActions; $fn = $HandleActions['browse']; $name = $_POST['name']; @session_start(); $_SESSION[$name]=$_POST[$name]; return $fn($pagename); } function AuxSelectData($arrayname, $opt) { global $AuxSelectData; if (isset($AuxSelectData[$arrayname])) return 'Cannot overwrite existing array'; $opt = ParseArgs($opt); foreach ($opt[''] as $v) $AuxSelectData[$arrayname][] = $v; return; } Markup('auxSelectData', 'inline', '/\\(:auxSelectData\\s+([\\w]+)\\s*(.*?)\\s*:\)/ei', "AuxSelectData(PSS('$1'),PSS('$2'))");