first commit
|
@ -0,0 +1,383 @@
|
||||||
|
Authors ordered by first contribution
|
||||||
|
A list of current team members is available at https://jqueryui.com/about
|
||||||
|
|
||||||
|
Paul Bakaus <paul.bakaus@gmail.com>
|
||||||
|
Richard Worth <rdworth@gmail.com>
|
||||||
|
Yehuda Katz <wycats@gmail.com>
|
||||||
|
Sean Catchpole <sean@sunsean.com>
|
||||||
|
John Resig <jeresig@gmail.com>
|
||||||
|
Tane Piper <piper.tane@gmail.com>
|
||||||
|
Dmitri Gaskin <dmitrig01@gmail.com>
|
||||||
|
Klaus Hartl <klaus.hartl@gmail.com>
|
||||||
|
Stefan Petre <stefan.petre@gmail.com>
|
||||||
|
Gilles van den Hoven <gilles@webunity.nl>
|
||||||
|
Micheil Bryan Smith <micheil@brandedcode.com>
|
||||||
|
Jörn Zaefferer <joern.zaefferer@gmail.com>
|
||||||
|
Marc Grabanski <m@marcgrabanski.com>
|
||||||
|
Keith Wood <kbwood@iinet.com.au>
|
||||||
|
Brandon Aaron <brandon.aaron@gmail.com>
|
||||||
|
Scott González <scott.gonzalez@gmail.com>
|
||||||
|
Eduardo Lundgren <eduardolundgren@gmail.com>
|
||||||
|
Aaron Eisenberger <aaronchi@gmail.com>
|
||||||
|
Joan Piedra <theneojp@gmail.com>
|
||||||
|
Bruno Basto <b.basto@gmail.com>
|
||||||
|
Remy Sharp <remy@leftlogic.com>
|
||||||
|
Bohdan Ganicky <bohdan.ganicky@gmail.com>
|
||||||
|
David Bolter <david.bolter@gmail.com>
|
||||||
|
Chi Cheng <cloudream@gmail.com>
|
||||||
|
Ca-Phun Ung <pazu2k@gmail.com>
|
||||||
|
Ariel Flesler <aflesler@gmail.com>
|
||||||
|
Maggie Wachs <maggie@filamentgroup.com>
|
||||||
|
Scott Jehl <scottjehl@gmail.com>
|
||||||
|
Todd Parker <todd@filamentgroup.com>
|
||||||
|
Andrew Powell <andrew@shellscape.org>
|
||||||
|
Brant Burnett <btburnett3@gmail.com>
|
||||||
|
Douglas Neiner <doug@dougneiner.com>
|
||||||
|
Paul Irish <paul.irish@gmail.com>
|
||||||
|
Ralph Whitbeck <ralph.whitbeck@gmail.com>
|
||||||
|
Thibault Duplessis <thibault.duplessis@gmail.com>
|
||||||
|
Dominique Vincent <dominique.vincent@toitl.com>
|
||||||
|
Jack Hsu <jack.hsu@gmail.com>
|
||||||
|
Adam Sontag <ajpiano@ajpiano.com>
|
||||||
|
Carl Fürstenberg <carl@excito.com>
|
||||||
|
Kevin Dalman <development@allpro.net>
|
||||||
|
Alberto Fernández Capel <afcapel@gmail.com>
|
||||||
|
Jacek Jędrzejewski (https://jacek.jedrzejewski.name)
|
||||||
|
Ting Kuei <ting@kuei.com>
|
||||||
|
Samuel Cormier-Iijima <sam@chide.it>
|
||||||
|
Jon Palmer <jonspalmer@gmail.com>
|
||||||
|
Ben Hollis <bhollis@amazon.com>
|
||||||
|
Justin MacCarthy <Justin@Rubystars.biz>
|
||||||
|
Eyal Kobrigo <kobrigo@hotmail.com>
|
||||||
|
Tiago Freire <tiago.freire@gmail.com>
|
||||||
|
Diego Tres <diegotres@gmail.com>
|
||||||
|
Holger Rüprich <holger@rueprich.de>
|
||||||
|
Ziling Zhao <zilingzhao@gmail.com>
|
||||||
|
Mike Alsup <malsup@gmail.com>
|
||||||
|
Robson Braga Araujo <robsonbraga@gmail.com>
|
||||||
|
Pierre-Henri Ausseil <ph.ausseil@gmail.com>
|
||||||
|
Christopher McCulloh <cmcculloh@gmail.com>
|
||||||
|
Andrew Newcomb <ext.github@preceptsoftware.co.uk>
|
||||||
|
Lim Chee Aun <cheeaun@gmail.com>
|
||||||
|
Jorge Barreiro <yortx.barry@gmail.com>
|
||||||
|
Daniel Steigerwald <daniel@steigerwald.cz>
|
||||||
|
John Firebaugh <john_firebaugh@bigfix.com>
|
||||||
|
John Enters <github@darkdark.net>
|
||||||
|
Andrey Kapitcyn <ru.m157y@gmail.com>
|
||||||
|
Dmitry Petrov <dpetroff@gmail.com>
|
||||||
|
Eric Hynds <eric@hynds.net>
|
||||||
|
Chairat Sunthornwiphat <pipo@sixhead.com>
|
||||||
|
Josh Varner <josh.varner@gmail.com>
|
||||||
|
Stéphane Raimbault <stephane.raimbault@gmail.com>
|
||||||
|
Jay Merrifield <fracmak@gmail.com>
|
||||||
|
J. Ryan Stinnett <jryans@gmail.com>
|
||||||
|
Peter Heiberg <peter@heiberg.se>
|
||||||
|
Alex Dovenmuehle <adovenmuehle@gmail.com>
|
||||||
|
Jamie Gegerson <git@jamiegegerson.com>
|
||||||
|
Raymond Schwartz <skeetergraphics@gmail.com>
|
||||||
|
Phillip Barnes <philbar@gmail.com>
|
||||||
|
Kyle Wilkinson <kai@wikyd.org>
|
||||||
|
Khaled AlHourani <me@khaledalhourani.com>
|
||||||
|
Marian Rudzynski <mr@impaled.org>
|
||||||
|
Jean-Francois Remy <jeff@melix.org>
|
||||||
|
Doug Blood <dougblood@gmail.com>
|
||||||
|
Filippo Cavallarin <filippo.cavallarin@codseq.it>
|
||||||
|
Heiko Henning <heiko@thehennings.ch>
|
||||||
|
Aliaksandr Rahalevich <saksmlz@gmail.com>
|
||||||
|
Mario Visic <mario@mariovisic.com>
|
||||||
|
Xavi Ramirez <xavi.rmz@gmail.com>
|
||||||
|
Max Schnur <max.schnur@gmail.com>
|
||||||
|
Saji Nediyanchath <saji89@gmail.com>
|
||||||
|
Corey Frang <gnarf37@gmail.com>
|
||||||
|
Aaron Peterson <aaronp123@yahoo.com>
|
||||||
|
Ivan Peters <ivan@ivanpeters.com>
|
||||||
|
Mohamed Cherif Bouchelaghem <cherifbouchelaghem@yahoo.fr>
|
||||||
|
Marcos Sousa <falecomigo@marcossousa.com>
|
||||||
|
Michael DellaNoce <mdellanoce@mailtrust.com>
|
||||||
|
George Marshall <echosx@gmail.com>
|
||||||
|
Tobias Brunner <tobias@strongswan.org>
|
||||||
|
Martin Solli <msolli@gmail.com>
|
||||||
|
David Petersen <public@petersendidit.com>
|
||||||
|
Dan Heberden <danheberden@gmail.com>
|
||||||
|
William Kevin Manire <williamkmanire@gmail.com>
|
||||||
|
Gilmore Davidson <gilmoreorless@gmail.com>
|
||||||
|
Michael Wu <michaelmwu@gmail.com>
|
||||||
|
Adam Parod <mystic414@gmail.com>
|
||||||
|
Guillaume Gautreau <guillaume+github@ghusse.com>
|
||||||
|
Marcel Toele <EleotleCram@gmail.com>
|
||||||
|
Dan Streetman <ddstreet@ieee.org>
|
||||||
|
Matt Hoskins <matt@nipltd.com>
|
||||||
|
Giovanni Giacobbi <giovanni@giacobbi.net>
|
||||||
|
Kyle Florence <kyle.florence@gmail.com>
|
||||||
|
Pavol Hluchý <lopo@losys.sk>
|
||||||
|
Hans Hillen <hans.hillen@gmail.com>
|
||||||
|
Mark Johnson <virgofx@live.com>
|
||||||
|
Trey Hunner <treyhunner@gmail.com>
|
||||||
|
Shane Whittet <whittet@gmail.com>
|
||||||
|
Edward A Faulkner <ef@alum.mit.edu>
|
||||||
|
Adam Baratz <adam@adambaratz.com>
|
||||||
|
Kato Kazuyoshi <kato.kazuyoshi@gmail.com>
|
||||||
|
Eike Send <eike.send@gmail.com>
|
||||||
|
Kris Borchers <kris.borchers@gmail.com>
|
||||||
|
Eddie Monge <eddie@eddiemonge.com>
|
||||||
|
Israel Tsadok <itsadok@gmail.com>
|
||||||
|
Carson McDonald <carson@ioncannon.net>
|
||||||
|
Jason Davies <jason@jasondavies.com>
|
||||||
|
Garrison Locke <gplocke@gmail.com>
|
||||||
|
David Murdoch <david@davidmurdoch.com>
|
||||||
|
Benjamin Scott Boyle <benjamins.boyle@gmail.com>
|
||||||
|
Jesse Baird <jebaird@gmail.com>
|
||||||
|
Jonathan Vingiano <jvingiano@gmail.com>
|
||||||
|
Dylan Just <dev@ephox.com>
|
||||||
|
Hiroshi Tomita <tomykaira@gmail.com>
|
||||||
|
Glenn Goodrich <glenn.goodrich@gmail.com>
|
||||||
|
Tarafder Ashek-E-Elahi <mail.ashek@gmail.com>
|
||||||
|
Ryan Neufeld <ryan@neufeldmail.com>
|
||||||
|
Marc Neuwirth <marc.neuwirth@gmail.com>
|
||||||
|
Philip Graham <philip.robert.graham@gmail.com>
|
||||||
|
Benjamin Sterling <benjamin.sterling@kenzomedia.com>
|
||||||
|
Wesley Walser <waw325@gmail.com>
|
||||||
|
Kouhei Sutou <kou@clear-code.com>
|
||||||
|
Karl Kirch <karlkrch@gmail.com>
|
||||||
|
Chris Kelly <ckdake@ckdake.com>
|
||||||
|
Jason Oster <jay@kodewerx.org>
|
||||||
|
Felix Nagel <info@felixnagel.com>
|
||||||
|
Alexander Polomoshnov <alex.polomoshnov@gmail.com>
|
||||||
|
David Leal <dgleal@gmail.com>
|
||||||
|
Igor Milla <igor.fsp.milla@gmail.com>
|
||||||
|
Dave Methvin <dave.methvin@gmail.com>
|
||||||
|
Florian Gutmann <f.gutmann@chronimo.com>
|
||||||
|
Marwan Al Jubeh <marwan.aljubeh@gmail.com>
|
||||||
|
Milan Broum <midlis@googlemail.com>
|
||||||
|
Sebastian Sauer <info@dynpages.de>
|
||||||
|
Gaëtan Muller <m.gaetan89@gmail.com>
|
||||||
|
Michel Weimerskirch <michel@weimerskirch.net>
|
||||||
|
William Griffiths <william@ycymro.com>
|
||||||
|
Stojce Slavkovski <stojce@gmail.com>
|
||||||
|
David Soms <david.soms@gmail.com>
|
||||||
|
David De Sloovere <david.desloovere@outlook.com>
|
||||||
|
Michael P. Jung <michael.jung@terreon.de>
|
||||||
|
Shannon Pekary <spekary@gmail.com>
|
||||||
|
Dan Wellman <danwellman@hotmail.com>
|
||||||
|
Matthew Edward Hutton <meh@corefiling.co.uk>
|
||||||
|
James Khoury <james@jameskhoury.com>
|
||||||
|
Rob Loach <robloach@gmail.com>
|
||||||
|
Alberto Monteiro <betimbrasil@gmail.com>
|
||||||
|
Alex Rhea <alex.rhea@gmail.com>
|
||||||
|
Krzysztof Rosiński <rozwell69@gmail.com>
|
||||||
|
Ryan Olton <oltonr@gmail.com>
|
||||||
|
Genie <386@mail.com>
|
||||||
|
Rick Waldron <waldron.rick@gmail.com>
|
||||||
|
Ian Simpson <spoonlikesham@gmail.com>
|
||||||
|
Lev Kitsis <spam4lev@gmail.com>
|
||||||
|
TJ VanToll <tj.vantoll@gmail.com>
|
||||||
|
Justin Domnitz <jdomnitz@gmail.com>
|
||||||
|
Douglas Cerna <douglascerna@yahoo.com>
|
||||||
|
Bert ter Heide <bertjh@hotmail.com>
|
||||||
|
Jasvir Nagra <jasvir@gmail.com>
|
||||||
|
Yuriy Khabarov <13real008@gmail.com>
|
||||||
|
Harri Kilpiö <harri.kilpio@gmail.com>
|
||||||
|
Lado Lomidze <lado.lomidze@gmail.com>
|
||||||
|
Amir E. Aharoni <amir.aharoni@mail.huji.ac.il>
|
||||||
|
Simon Sattes <simon.sattes@gmail.com>
|
||||||
|
Jo Liss <joliss42@gmail.com>
|
||||||
|
Guntupalli Karunakar <karunakarg@yahoo.com>
|
||||||
|
Shahyar Ghobadpour <shahyar@gmail.com>
|
||||||
|
Lukasz Lipinski <uzza17@gmail.com>
|
||||||
|
Timo Tijhof <krinklemail@gmail.com>
|
||||||
|
Jason Moon <jmoon@socialcast.com>
|
||||||
|
Martin Frost <martinf55@hotmail.com>
|
||||||
|
Eneko Illarramendi <eneko@illarra.com>
|
||||||
|
EungJun Yi <semtlenori@gmail.com>
|
||||||
|
Courtland Allen <courtlandallen@gmail.com>
|
||||||
|
Viktar Varvanovich <non4eg@gmail.com>
|
||||||
|
Danny Trunk <dtrunk90@gmail.com>
|
||||||
|
Pavel Stetina <pavel.stetina@nangu.tv>
|
||||||
|
Michael Stay <metaweta@gmail.com>
|
||||||
|
Steven Roussey <sroussey@gmail.com>
|
||||||
|
Michael Hollis <hollis21@gmail.com>
|
||||||
|
Lee Rowlands <lee.rowlands@previousnext.com.au>
|
||||||
|
Timmy Willison <timmywillisn@gmail.com>
|
||||||
|
Karl Swedberg <kswedberg@gmail.com>
|
||||||
|
Baoju Yuan <the_guy_1987@hotmail.com>
|
||||||
|
Maciej Mroziński <maciej.k.mrozinski@gmail.com>
|
||||||
|
Luis Dalmolin <luis.nh@gmail.com>
|
||||||
|
Mark Aaron Shirley <maspwr@gmail.com>
|
||||||
|
Martin Hoch <martin@fidion.de>
|
||||||
|
Jiayi Yang <tr870829@gmail.com>
|
||||||
|
Philipp Benjamin Köppchen <xgxtpbk@gws.ms>
|
||||||
|
Sindre Sorhus <sindresorhus@gmail.com>
|
||||||
|
Bernhard Sirlinger <bernhard.sirlinger@tele2.de>
|
||||||
|
Jared A. Scheel <jared@jaredscheel.com>
|
||||||
|
Rafael Xavier de Souza <rxaviers@gmail.com>
|
||||||
|
John Chen <zhang.z.chen@intel.com>
|
||||||
|
Robert Beuligmann <robertbeuligmann@gmail.com>
|
||||||
|
Dale Kocian <dale.kocian@gmail.com>
|
||||||
|
Mike Sherov <mike.sherov@gmail.com>
|
||||||
|
Andrew Couch <andy@couchand.com>
|
||||||
|
Marc-Andre Lafortune <github@marc-andre.ca>
|
||||||
|
Nate Eagle <nate.eagle@teamaol.com>
|
||||||
|
David Souther <davidsouther@gmail.com>
|
||||||
|
Mathias Stenbom <mathias@stenbom.com>
|
||||||
|
Sergey Kartashov <ebishkek@yandex.ru>
|
||||||
|
Avinash R <nashpapa@gmail.com>
|
||||||
|
Ethan Romba <ethanromba@gmail.com>
|
||||||
|
Cory Gackenheimer <cory.gack@gmail.com>
|
||||||
|
Juan Pablo Kaniefsky <jpkaniefsky@gmail.com>
|
||||||
|
Roman Salnikov <bardt.dz@gmail.com>
|
||||||
|
Anika Henke <anika@selfthinker.org>
|
||||||
|
Samuel Bovée <samycookie2000@yahoo.fr>
|
||||||
|
Fabrício Matté <ult_combo@hotmail.com>
|
||||||
|
Viktor Kojouharov <vkojouharov@gmail.com>
|
||||||
|
Pawel Maruszczyk (http://hrabstwo.net)
|
||||||
|
Pavel Selitskas <p.selitskas@gmail.com>
|
||||||
|
Bjørn Johansen <post@bjornjohansen.no>
|
||||||
|
Matthieu Penant <thieum22@hotmail.com>
|
||||||
|
Dominic Barnes <dominic@dbarnes.info>
|
||||||
|
David Sullivan <david.sullivan@gmail.com>
|
||||||
|
Thomas Jaggi <thomas@responsive.ch>
|
||||||
|
Vahid Sohrabloo <vahid4134@gmail.com>
|
||||||
|
Travis Carden <travis.carden@gmail.com>
|
||||||
|
Bruno M. Custódio <bruno@brunomcustodio.com>
|
||||||
|
Nathanael Silverman <nathanael.silverman@gmail.com>
|
||||||
|
Christian Wenz <christian@wenz.org>
|
||||||
|
Steve Urmston <steve@urm.st>
|
||||||
|
Zaven Muradyan <megalivoithos@gmail.com>
|
||||||
|
Woody Gilk <shadowhand@deviantart.com>
|
||||||
|
Zbigniew Motyka <zbigniew.motyka@gmail.com>
|
||||||
|
Suhail Alkowaileet <xsoh.k7@gmail.com>
|
||||||
|
Toshi MARUYAMA <marutosijp2@yahoo.co.jp>
|
||||||
|
David Hansen <hansede@gmail.com>
|
||||||
|
Brian Grinstead <briangrinstead@gmail.com>
|
||||||
|
Christian Klammer <christian314159@gmail.com>
|
||||||
|
Steven Luscher <jquerycla@steveluscher.com>
|
||||||
|
Gan Eng Chin <engchin.gan@gmail.com>
|
||||||
|
Gabriel Schulhof <gabriel.schulhof@intel.com>
|
||||||
|
Alexander Schmitz <arschmitz@gmail.com>
|
||||||
|
Vilhjálmur Skúlason <vis@dmm.is>
|
||||||
|
Siebrand Mazeland <siebrand@kitano.nl>
|
||||||
|
Mohsen Ekhtiari <mohsenekhtiari@yahoo.com>
|
||||||
|
Pere Orga <gotrunks@gmail.com>
|
||||||
|
Jasper de Groot <mail@ugomobi.com>
|
||||||
|
Stephane Deschamps <stephane.deschamps@gmail.com>
|
||||||
|
Jyoti Deka <dekajp@gmail.com>
|
||||||
|
Andrei Picus <office.nightcrawler@gmail.com>
|
||||||
|
Ondrej Novy <novy@ondrej.org>
|
||||||
|
Jacob McCutcheon <jacob.mccutcheon@gmail.com>
|
||||||
|
Monika Piotrowicz <monika.piotrowicz@gmail.com>
|
||||||
|
Imants Horsts <imants.horsts@inbox.lv>
|
||||||
|
Eric Dahl <eric.c.dahl@gmail.com>
|
||||||
|
Dave Stein <dave@behance.com>
|
||||||
|
Dylan Barrell <dylan@barrell.com>
|
||||||
|
Daniel DeGroff <djdegroff@gmail.com>
|
||||||
|
Michael Wiencek <mwtuea@gmail.com>
|
||||||
|
Thomas Meyer <meyertee@gmail.com>
|
||||||
|
Ruslan Yakhyaev <ruslan@ruslan.io>
|
||||||
|
Brian J. Dowling <bjd-dev@simplicity.net>
|
||||||
|
Ben Higgins <ben@extrahop.com>
|
||||||
|
Yermo Lamers <yml@yml.com>
|
||||||
|
Patrick Stapleton <github@gdi2290.com>
|
||||||
|
Trisha Crowley <trisha.crowley@gmail.com>
|
||||||
|
Usman Akeju <akeju00+github@gmail.com>
|
||||||
|
Rodrigo Menezes <rod333@gmail.com>
|
||||||
|
Jacques Perrault <jacques_perrault@us.ibm.com>
|
||||||
|
Frederik Elvhage <frederik.elvhage@googlemail.com>
|
||||||
|
Will Holley <willholley@gmail.com>
|
||||||
|
Uri Gilad <antishok@gmail.com>
|
||||||
|
Richard Gibson <richard.gibson@gmail.com>
|
||||||
|
Simen Bekkhus <sbekkhus91@gmail.com>
|
||||||
|
Chen Eshchar <eshcharc@gmail.com>
|
||||||
|
Bruno Pérel <brunoperel@gmail.com>
|
||||||
|
Mohammed Alshehri <m@dralshehri.com>
|
||||||
|
Lisa Seacat DeLuca <ldeluca@us.ibm.com>
|
||||||
|
Anne-Gaelle Colom <coloma@westminster.ac.uk>
|
||||||
|
Adam Foster <slimfoster@gmail.com>
|
||||||
|
Luke Page <luke.a.page@gmail.com>
|
||||||
|
Daniel Owens <daniel@matchstickmixup.com>
|
||||||
|
Michael Orchard <morchard@scottlogic.co.uk>
|
||||||
|
Marcus Warren <marcus@envoke.com>
|
||||||
|
Nils Heuermann <nils@world-of-scripts.de>
|
||||||
|
Marco Ziech <marco@ziech.net>
|
||||||
|
Patricia Juarez <patrixd@gmail.com>
|
||||||
|
Ben Mosher <me@benmosher.com>
|
||||||
|
Ablay Keldibek <atomio.ak@gmail.com>
|
||||||
|
Thomas Applencourt <thomas.applencourt@irsamc.ups-tlse.fr>
|
||||||
|
Jiabao Wu <jiabao.foss@gmail.com>
|
||||||
|
Eric Lee Carraway <github@ericcarraway.com>
|
||||||
|
Victor Homyakov <vkhomyackov@gmail.com>
|
||||||
|
Myeongjin Lee <aranet100@gmail.com>
|
||||||
|
Liran Sharir <lsharir@gmail.com>
|
||||||
|
Weston Ruter <weston@xwp.co>
|
||||||
|
Mani Mishra <manimishra902@gmail.com>
|
||||||
|
Hannah Methvin <hannahmethvin@gmail.com>
|
||||||
|
Leonardo Balter <leonardo.balter@gmail.com>
|
||||||
|
Benjamin Albert <benjamin_a5@yahoo.com>
|
||||||
|
Michał Gołębiowski-Owczarek <m.goleb@gmail.com>
|
||||||
|
Alyosha Pushak <alyosha.pushak@gmail.com>
|
||||||
|
Fahad Ahmad <fahadahmad41@hotmail.com>
|
||||||
|
Matt Brundage <github@mattbrundage.com>
|
||||||
|
Francesc Baeta <francesc.baeta@gmail.com>
|
||||||
|
Piotr Baran <piotros@wp.pl>
|
||||||
|
Mukul Hase <mukulhase@gmail.com>
|
||||||
|
Konstantin Dinev <kdinev@mail.bw.edu>
|
||||||
|
Rand Scullard <rand@randscullard.com>
|
||||||
|
Dan Strohl <dan@wjcg.net>
|
||||||
|
Maksim Ryzhikov <rv.maksim@gmail.com>
|
||||||
|
Amine HADDAD <haddad@allegorie.tv>
|
||||||
|
Amanpreet Singh <apsdehal@gmail.com>
|
||||||
|
Alexey Balchunas <bleshik@gmail.com>
|
||||||
|
Peter Kehl <peter.kehl@gmail.com>
|
||||||
|
Peter Dave Hello <hsu@peterdavehello.org>
|
||||||
|
Johannes Schäfer <johnschaefer@gmx.de>
|
||||||
|
Ville Skyttä <ville.skytta@iki.fi>
|
||||||
|
Ryan Oriecuia <ryan.oriecuia@visioncritical.com>
|
||||||
|
Sergei Ratnikov <sergeir82@gmail.com>
|
||||||
|
milk54 <milk851@gmail.com>
|
||||||
|
Evelyn Masso <evoutofambit@gmail.com>
|
||||||
|
Robin <mail@robin-fowler.com>
|
||||||
|
Simon Asika <asika32764@gmail.com>
|
||||||
|
Kevin Cupp <kevin.cupp@gmail.com>
|
||||||
|
Jeremy Mickelson <Jeremy.Mickelson@gmail.com>
|
||||||
|
Kyle Rosenberg <kyle.rosenberg@gmail.com>
|
||||||
|
Petri Partio <petri.partio@gmail.com>
|
||||||
|
pallxk <github@pallxk.com>
|
||||||
|
Luke Brookhart <luke@onjax.com>
|
||||||
|
claudi <hirt-claudia@gmx.de>
|
||||||
|
Eirik Sletteberg <eiriksletteberg@gmail.com>
|
||||||
|
Albert Johansson <albert@intervaro.se>
|
||||||
|
A. Wells <borgboyone@users.noreply.github.com>
|
||||||
|
Robert Brignull <robertbrignull@gmail.com>
|
||||||
|
Horus68 <pauloizidoro@gmail.com>
|
||||||
|
Maksymenkov Eugene <foatei@gmail.com>
|
||||||
|
OskarNS <soerensen.oskar@gmail.com>
|
||||||
|
Gez Quinn <holla@gezquinn.design>
|
||||||
|
jigar gala <jigar.gala140291@gmail.com>
|
||||||
|
Florian Wegscheider <flo.wegscheider@gmail.com>
|
||||||
|
Fatér Zsolt <fater.zsolt@gmail.com>
|
||||||
|
Szabolcs Szabolcsi-Toth <nec@shell8.net>
|
||||||
|
Jérémy Munsch <github@jeremydev.ovh>
|
||||||
|
Hrvoje Novosel <hrvoje.novosel@gmail.com>
|
||||||
|
Paul Capron <PaulCapron@users.noreply.github.com>
|
||||||
|
Micah Miller <mikhey@runbox.com>
|
||||||
|
sakshi87 <53863764+sakshi87@users.noreply.github.com>
|
||||||
|
Mikolaj Wolicki <wolicki.mikolaj@gmail.com>
|
||||||
|
Patrick McKay <patrick.mckay@vumc.org>
|
||||||
|
c-lambert <58025159+c-lambert@users.noreply.github.com>
|
||||||
|
Josep Sanz <josepsanzcamp@gmail.com>
|
||||||
|
Ben Mullins <benm@umich.edu>
|
||||||
|
Christian Oliff <christianoliff@pm.me>
|
||||||
|
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
|
||||||
|
Adam Lidén Hällgren <adamlh92@gmail.com>
|
||||||
|
James Hinderks <hinderks@gmail.com>
|
||||||
|
Denny Septian Panggabean <97607754+ddevsr@users.noreply.github.com>
|
||||||
|
Matías Cánepa <matias.canepa@gmail.com>
|
||||||
|
Ashish Kurmi <100655670+boahc077@users.noreply.github.com>
|
||||||
|
DeerBear <andrea.raimondi@gmail.com>
|
||||||
|
Дилян Палаузов <dpa-github@aegee.org>
|
||||||
|
Kenneth DeBacker <kcdebacker@gmail.com>
|
||||||
|
Timo Tijhof <krinkle@fastmail.com>
|
||||||
|
Timmy Willison <timmywil@users.noreply.github.com>
|
||||||
|
divdeploy <166095818+divdeploy@users.noreply.github.com>
|
||||||
|
mark van tilburg <markvantilburg@gmail.com>
|
||||||
|
Ralf Koller <1665422+rpkoller@users.noreply.github.com>
|
||||||
|
Porter Clevidence <116387727+porterclev@users.noreply.github.com>
|
|
@ -0,0 +1,43 @@
|
||||||
|
Copyright OpenJS Foundation and other contributors, https://openjsf.org/
|
||||||
|
|
||||||
|
This software consists of voluntary contributions made by many
|
||||||
|
individuals. For exact contribution history, see the revision history
|
||||||
|
available at https://github.com/jquery/jquery-ui
|
||||||
|
|
||||||
|
The following license applies to all parts of this software except as
|
||||||
|
documented below:
|
||||||
|
|
||||||
|
====
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
====
|
||||||
|
|
||||||
|
Copyright and related rights for sample code are waived via CC0. Sample
|
||||||
|
code is defined as all source code contained within the demos directory.
|
||||||
|
|
||||||
|
CC0: http://creativecommons.org/publicdomain/zero/1.0/
|
||||||
|
|
||||||
|
====
|
||||||
|
|
||||||
|
All files located in the node_modules and external directories are
|
||||||
|
externally maintained libraries used by this software which have their
|
||||||
|
own licenses; we recommend you read them, as their terms may differ from
|
||||||
|
the terms above.
|
After Width: | Height: | Size: 512 B |
After Width: | Height: | Size: 420 B |
After Width: | Height: | Size: 360 B |
After Width: | Height: | Size: 442 B |
After Width: | Height: | Size: 301 B |
After Width: | Height: | Size: 5.8 KiB |
After Width: | Height: | Size: 378 B |
After Width: | Height: | Size: 422 B |
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 6.4 KiB |
|
@ -0,0 +1,503 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="us">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>jQuery UI Example Page</title>
|
||||||
|
<link href="jquery-ui.css" rel="stylesheet">
|
||||||
|
<style>
|
||||||
|
body{
|
||||||
|
font-family: "Trebuchet MS", sans-serif;
|
||||||
|
margin: 50px;
|
||||||
|
}
|
||||||
|
.demoHeaders {
|
||||||
|
margin-top: 2em;
|
||||||
|
}
|
||||||
|
#dialog-link {
|
||||||
|
padding: .4em 1em .4em 20px;
|
||||||
|
text-decoration: none;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
#dialog-link span.ui-icon {
|
||||||
|
margin: 0 5px 0 0;
|
||||||
|
position: absolute;
|
||||||
|
left: .2em;
|
||||||
|
top: 50%;
|
||||||
|
margin-top: -8px;
|
||||||
|
}
|
||||||
|
#icons {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
#icons li {
|
||||||
|
margin: 2px;
|
||||||
|
position: relative;
|
||||||
|
padding: 4px 0;
|
||||||
|
cursor: pointer;
|
||||||
|
float: left;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
#icons span.ui-icon {
|
||||||
|
float: left;
|
||||||
|
margin: 0 4px;
|
||||||
|
}
|
||||||
|
.fakewindowcontain .ui-widget-overlay {
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
select {
|
||||||
|
width: 200px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1>Welcome to jQuery UI!</h1>
|
||||||
|
|
||||||
|
<div class="ui-widget">
|
||||||
|
<p>This page demonstrates the widgets and theme you selected in Download Builder. Please make sure you are using them with a compatible jQuery version.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h1>YOUR COMPONENTS:</h1>
|
||||||
|
|
||||||
|
<!-- Accordion -->
|
||||||
|
<h2 class="demoHeaders">Accordion</h2>
|
||||||
|
<div id="accordion">
|
||||||
|
<h3>First</h3>
|
||||||
|
<div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
|
||||||
|
<h3>Second</h3>
|
||||||
|
<div>Phasellus mattis tincidunt nibh.</div>
|
||||||
|
<h3>Third</h3>
|
||||||
|
<div>Nam dui erat, auctor a, dignissim quis.</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Autocomplete -->
|
||||||
|
<h2 class="demoHeaders">Autocomplete</h2>
|
||||||
|
<div>
|
||||||
|
<input id="autocomplete" title="type "a"">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Button -->
|
||||||
|
<h2 class="demoHeaders">Button</h2>
|
||||||
|
<button id="button">A button element</button>
|
||||||
|
<button id="button-icon">An icon-only button</button>
|
||||||
|
|
||||||
|
<!-- Checkboxradio -->
|
||||||
|
<h2 class="demoHeaders">Checkboxradio</h2>
|
||||||
|
<form style="margin-top: 1em;">
|
||||||
|
<div id="radioset">
|
||||||
|
<input type="radio" id="radio1" name="radio"><label for="radio1">Choice 1</label>
|
||||||
|
<input type="radio" id="radio2" name="radio" checked="checked"><label for="radio2">Choice 2</label>
|
||||||
|
<input type="radio" id="radio3" name="radio"><label for="radio3">Choice 3</label>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<!-- Controlgroup -->
|
||||||
|
<h2 class="demoHeaders">Controlgroup</h2>
|
||||||
|
<fieldset>
|
||||||
|
<legend>Rental Car</legend>
|
||||||
|
<div id="controlgroup">
|
||||||
|
<select id="car-type">
|
||||||
|
<option>Compact car</option>
|
||||||
|
<option>Midsize car</option>
|
||||||
|
<option>Full size car</option>
|
||||||
|
<option>SUV</option>
|
||||||
|
<option>Luxury</option>
|
||||||
|
<option>Truck</option>
|
||||||
|
<option>Van</option>
|
||||||
|
</select>
|
||||||
|
<label for="transmission-standard">Standard</label>
|
||||||
|
<input type="radio" name="transmission" id="transmission-standard">
|
||||||
|
<label for="transmission-automatic">Automatic</label>
|
||||||
|
<input type="radio" name="transmission" id="transmission-automatic">
|
||||||
|
<label for="insurance">Insurance</label>
|
||||||
|
<input type="checkbox" name="insurance" id="insurance">
|
||||||
|
<label for="horizontal-spinner" class="ui-controlgroup-label"># of cars</label>
|
||||||
|
<input id="horizontal-spinner" class="ui-spinner-input">
|
||||||
|
<button>Book Now!</button>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
|
<!-- Tabs -->
|
||||||
|
<h2 class="demoHeaders">Tabs</h2>
|
||||||
|
<div id="tabs">
|
||||||
|
<ul>
|
||||||
|
<li><a href="#tabs-1">First</a></li>
|
||||||
|
<li><a href="#tabs-2">Second</a></li>
|
||||||
|
<li><a href="#tabs-3">Third</a></li>
|
||||||
|
</ul>
|
||||||
|
<div id="tabs-1">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
|
||||||
|
<div id="tabs-2">Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.</div>
|
||||||
|
<div id="tabs-3">Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2 class="demoHeaders">Dialog</h2>
|
||||||
|
<p>
|
||||||
|
<button id="dialog-link" class="ui-button ui-corner-all ui-widget">
|
||||||
|
<span class="ui-icon ui-icon-newwin"></span>Open Dialog
|
||||||
|
</button>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2 class="demoHeaders">Overlay and Shadow Classes</h2>
|
||||||
|
<div style="position: relative; width: 96%; height: 200px; padding:1% 2%; overflow:hidden;" class="fakewindowcontain">
|
||||||
|
<p>Lorem ipsum dolor sit amet, Nulla nec tortor. Donec id elit quis purus consectetur consequat. </p><p>Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. </p><p>Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. </p><p>Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. </p><p>Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. </p><p>Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. </p>
|
||||||
|
|
||||||
|
<!-- ui-dialog -->
|
||||||
|
<div class="ui-widget-overlay ui-front"></div>
|
||||||
|
<div style="position: absolute; width: 320px; left: 50px; top: 30px; padding: 1.2em" class="ui-widget ui-front ui-widget-content ui-corner-all ui-widget-shadow">
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ui-dialog -->
|
||||||
|
<div id="dialog" title="Dialog Title">
|
||||||
|
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<h2 class="demoHeaders">Framework Icons (content color preview)</h2>
|
||||||
|
<ul id="icons" class="ui-widget ui-helper-clearfix">
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-n"><span class="ui-icon ui-icon-caret-1-n"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-ne"><span class="ui-icon ui-icon-caret-1-ne"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-e"><span class="ui-icon ui-icon-caret-1-e"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-se"><span class="ui-icon ui-icon-caret-1-se"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-s"><span class="ui-icon ui-icon-caret-1-s"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-sw"><span class="ui-icon ui-icon-caret-1-sw"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-w"><span class="ui-icon ui-icon-caret-1-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-nw"><span class="ui-icon ui-icon-caret-1-nw"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-2-n-s"><span class="ui-icon ui-icon-caret-2-n-s"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-2-e-w"><span class="ui-icon ui-icon-caret-2-e-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-n"><span class="ui-icon ui-icon-triangle-1-n"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-ne"><span class="ui-icon ui-icon-triangle-1-ne"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-e"><span class="ui-icon ui-icon-triangle-1-e"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-se"><span class="ui-icon ui-icon-triangle-1-se"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-s"><span class="ui-icon ui-icon-triangle-1-s"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-sw"><span class="ui-icon ui-icon-triangle-1-sw"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-w"><span class="ui-icon ui-icon-triangle-1-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-nw"><span class="ui-icon ui-icon-triangle-1-nw"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-2-n-s"><span class="ui-icon ui-icon-triangle-2-n-s"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-2-e-w"><span class="ui-icon ui-icon-triangle-2-e-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-n"><span class="ui-icon ui-icon-arrow-1-n"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-ne"><span class="ui-icon ui-icon-arrow-1-ne"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-e"><span class="ui-icon ui-icon-arrow-1-e"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-se"><span class="ui-icon ui-icon-arrow-1-se"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-s"><span class="ui-icon ui-icon-arrow-1-s"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-sw"><span class="ui-icon ui-icon-arrow-1-sw"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-w"><span class="ui-icon ui-icon-arrow-1-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-nw"><span class="ui-icon ui-icon-arrow-1-nw"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-n-s"><span class="ui-icon ui-icon-arrow-2-n-s"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-ne-sw"><span class="ui-icon ui-icon-arrow-2-ne-sw"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-e-w"><span class="ui-icon ui-icon-arrow-2-e-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-se-nw"><span class="ui-icon ui-icon-arrow-2-se-nw"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-n"><span class="ui-icon ui-icon-arrowstop-1-n"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-e"><span class="ui-icon ui-icon-arrowstop-1-e"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-s"><span class="ui-icon ui-icon-arrowstop-1-s"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-w"><span class="ui-icon ui-icon-arrowstop-1-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-n"><span class="ui-icon ui-icon-arrowthick-1-n"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-ne"><span class="ui-icon ui-icon-arrowthick-1-ne"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-e"><span class="ui-icon ui-icon-arrowthick-1-e"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-se"><span class="ui-icon ui-icon-arrowthick-1-se"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-s"><span class="ui-icon ui-icon-arrowthick-1-s"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-sw"><span class="ui-icon ui-icon-arrowthick-1-sw"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-w"><span class="ui-icon ui-icon-arrowthick-1-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-nw"><span class="ui-icon ui-icon-arrowthick-1-nw"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-n-s"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-ne-sw"><span class="ui-icon ui-icon-arrowthick-2-ne-sw"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-e-w"><span class="ui-icon ui-icon-arrowthick-2-e-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-se-nw"><span class="ui-icon ui-icon-arrowthick-2-se-nw"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-n"><span class="ui-icon ui-icon-arrowthickstop-1-n"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-e"><span class="ui-icon ui-icon-arrowthickstop-1-e"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-s"><span class="ui-icon ui-icon-arrowthickstop-1-s"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-w"><span class="ui-icon ui-icon-arrowthickstop-1-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-w"><span class="ui-icon ui-icon-arrowreturnthick-1-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-n"><span class="ui-icon ui-icon-arrowreturnthick-1-n"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-e"><span class="ui-icon ui-icon-arrowreturnthick-1-e"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-s"><span class="ui-icon ui-icon-arrowreturnthick-1-s"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-w"><span class="ui-icon ui-icon-arrowreturn-1-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-n"><span class="ui-icon ui-icon-arrowreturn-1-n"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-e"><span class="ui-icon ui-icon-arrowreturn-1-e"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-s"><span class="ui-icon ui-icon-arrowreturn-1-s"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-w"><span class="ui-icon ui-icon-arrowrefresh-1-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-n"><span class="ui-icon ui-icon-arrowrefresh-1-n"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-e"><span class="ui-icon ui-icon-arrowrefresh-1-e"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-s"><span class="ui-icon ui-icon-arrowrefresh-1-s"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-4"><span class="ui-icon ui-icon-arrow-4"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-4-diag"><span class="ui-icon ui-icon-arrow-4-diag"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-extlink"><span class="ui-icon ui-icon-extlink"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-newwin"><span class="ui-icon ui-icon-newwin"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-refresh"><span class="ui-icon ui-icon-refresh"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-shuffle"><span class="ui-icon ui-icon-shuffle"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-transfer-e-w"><span class="ui-icon ui-icon-transfer-e-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-transferthick-e-w"><span class="ui-icon ui-icon-transferthick-e-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-folder-collapsed"><span class="ui-icon ui-icon-folder-collapsed"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-folder-open"><span class="ui-icon ui-icon-folder-open"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-document"><span class="ui-icon ui-icon-document"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-document-b"><span class="ui-icon ui-icon-document-b"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-note"><span class="ui-icon ui-icon-note"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-mail-open"><span class="ui-icon ui-icon-mail-open"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-suitcase"><span class="ui-icon ui-icon-suitcase"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-comment"><span class="ui-icon ui-icon-comment"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-person"><span class="ui-icon ui-icon-person"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-print"><span class="ui-icon ui-icon-print"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-trash"><span class="ui-icon ui-icon-trash"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-locked"><span class="ui-icon ui-icon-locked"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-unlocked"><span class="ui-icon ui-icon-unlocked"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-bookmark"><span class="ui-icon ui-icon-bookmark"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-tag"><span class="ui-icon ui-icon-tag"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-home"><span class="ui-icon ui-icon-home"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-flag"><span class="ui-icon ui-icon-flag"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-calculator"><span class="ui-icon ui-icon-calculator"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-cart"><span class="ui-icon ui-icon-cart"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-pencil"><span class="ui-icon ui-icon-pencil"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-clock"><span class="ui-icon ui-icon-clock"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-disk"><span class="ui-icon ui-icon-disk"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-calendar"><span class="ui-icon ui-icon-calendar"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-zoomin"><span class="ui-icon ui-icon-zoomin"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-zoomout"><span class="ui-icon ui-icon-zoomout"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-search"><span class="ui-icon ui-icon-search"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-wrench"><span class="ui-icon ui-icon-wrench"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-gear"><span class="ui-icon ui-icon-gear"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-heart"><span class="ui-icon ui-icon-heart"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-star"><span class="ui-icon ui-icon-star"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-link"><span class="ui-icon ui-icon-link"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-cancel"><span class="ui-icon ui-icon-cancel"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-plus"><span class="ui-icon ui-icon-plus"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-minus"><span class="ui-icon ui-icon-minus"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-minusthick"><span class="ui-icon ui-icon-minusthick"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-close"><span class="ui-icon ui-icon-close"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-closethick"><span class="ui-icon ui-icon-closethick"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-key"><span class="ui-icon ui-icon-key"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-lightbulb"><span class="ui-icon ui-icon-lightbulb"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-scissors"><span class="ui-icon ui-icon-scissors"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-clipboard"><span class="ui-icon ui-icon-clipboard"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-copy"><span class="ui-icon ui-icon-copy"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-contact"><span class="ui-icon ui-icon-contact"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-image"><span class="ui-icon ui-icon-image"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-video"><span class="ui-icon ui-icon-video"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-script"><span class="ui-icon ui-icon-script"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-alert"><span class="ui-icon ui-icon-alert"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-info"><span class="ui-icon ui-icon-info"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-notice"><span class="ui-icon ui-icon-notice"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-help"><span class="ui-icon ui-icon-help"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-bullet"><span class="ui-icon ui-icon-bullet"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-radio-off"><span class="ui-icon ui-icon-radio-off"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-radio-on"><span class="ui-icon ui-icon-radio-on"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-pin-w"><span class="ui-icon ui-icon-pin-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-pin-s"><span class="ui-icon ui-icon-pin-s"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-play"><span class="ui-icon ui-icon-play"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-pause"><span class="ui-icon ui-icon-pause"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-next"><span class="ui-icon ui-icon-seek-next"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-prev"><span class="ui-icon ui-icon-seek-prev"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-end"><span class="ui-icon ui-icon-seek-end"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-first"><span class="ui-icon ui-icon-seek-first"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-stop"><span class="ui-icon ui-icon-stop"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-eject"><span class="ui-icon ui-icon-eject"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-volume-off"><span class="ui-icon ui-icon-volume-off"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-volume-on"><span class="ui-icon ui-icon-volume-on"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-power"><span class="ui-icon ui-icon-power"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-signal-diag"><span class="ui-icon ui-icon-signal-diag"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-signal"><span class="ui-icon ui-icon-signal"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-0"><span class="ui-icon ui-icon-battery-0"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-1"><span class="ui-icon ui-icon-battery-1"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-2"><span class="ui-icon ui-icon-battery-2"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-3"><span class="ui-icon ui-icon-battery-3"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-plus"><span class="ui-icon ui-icon-circle-plus"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-minus"><span class="ui-icon ui-icon-circle-minus"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-close"><span class="ui-icon ui-icon-circle-close"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-e"><span class="ui-icon ui-icon-circle-triangle-e"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-s"><span class="ui-icon ui-icon-circle-triangle-s"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-w"><span class="ui-icon ui-icon-circle-triangle-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-n"><span class="ui-icon ui-icon-circle-triangle-n"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-e"><span class="ui-icon ui-icon-circle-arrow-e"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-s"><span class="ui-icon ui-icon-circle-arrow-s"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-w"><span class="ui-icon ui-icon-circle-arrow-w"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-n"><span class="ui-icon ui-icon-circle-arrow-n"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-zoomin"><span class="ui-icon ui-icon-circle-zoomin"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-zoomout"><span class="ui-icon ui-icon-circle-zoomout"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-check"><span class="ui-icon ui-icon-circle-check"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-plus"><span class="ui-icon ui-icon-circlesmall-plus"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-minus"><span class="ui-icon ui-icon-circlesmall-minus"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-close"><span class="ui-icon ui-icon-circlesmall-close"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-plus"><span class="ui-icon ui-icon-squaresmall-plus"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-minus"><span class="ui-icon ui-icon-squaresmall-minus"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-close"><span class="ui-icon ui-icon-squaresmall-close"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-dotted-vertical"><span class="ui-icon ui-icon-grip-dotted-vertical"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-dotted-horizontal"><span class="ui-icon ui-icon-grip-dotted-horizontal"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-solid-vertical"><span class="ui-icon ui-icon-grip-solid-vertical"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-solid-horizontal"><span class="ui-icon ui-icon-grip-solid-horizontal"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-gripsmall-diagonal-se"><span class="ui-icon ui-icon-gripsmall-diagonal-se"></span></li>
|
||||||
|
<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-diagonal-se"><span class="ui-icon ui-icon-grip-diagonal-se"></span></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<!-- Slider -->
|
||||||
|
<h2 class="demoHeaders">Slider</h2>
|
||||||
|
<div id="slider"></div>
|
||||||
|
|
||||||
|
<!-- Datepicker -->
|
||||||
|
<h2 class="demoHeaders">Datepicker</h2>
|
||||||
|
<div id="datepicker"></div>
|
||||||
|
|
||||||
|
<!-- Progressbar -->
|
||||||
|
<h2 class="demoHeaders">Progressbar</h2>
|
||||||
|
<div id="progressbar"></div>
|
||||||
|
|
||||||
|
<!-- Progressbar -->
|
||||||
|
<h2 class="demoHeaders">Selectmenu</h2>
|
||||||
|
<select id="selectmenu">
|
||||||
|
<option>Slower</option>
|
||||||
|
<option>Slow</option>
|
||||||
|
<option selected="selected">Medium</option>
|
||||||
|
<option>Fast</option>
|
||||||
|
<option>Faster</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!-- Spinner -->
|
||||||
|
<h2 class="demoHeaders">Spinner</h2>
|
||||||
|
<input id="spinner">
|
||||||
|
|
||||||
|
<!-- Menu -->
|
||||||
|
<h2 class="demoHeaders">Menu</h2>
|
||||||
|
<ul style="width:100px;" id="menu">
|
||||||
|
<li><div>Item 1</div></li>
|
||||||
|
<li><div>Item 2</div></li>
|
||||||
|
<li><div>Item 3</div>
|
||||||
|
<ul>
|
||||||
|
<li><div>Item 3-1</div></li>
|
||||||
|
<li><div>Item 3-2</div></li>
|
||||||
|
<li><div>Item 3-3</div></li>
|
||||||
|
<li><div>Item 3-4</div></li>
|
||||||
|
<li><div>Item 3-5</div></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><div>Item 4</div></li>
|
||||||
|
<li><div>Item 5</div></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<!-- Tooltip -->
|
||||||
|
<h2 class="demoHeaders">Tooltip</h2>
|
||||||
|
<p id="tooltip">
|
||||||
|
<a href="#" title="That's what this widget is">Tooltips</a> can be attached to any element. When you hover
|
||||||
|
the element with your mouse, the title attribute is displayed in a little box next to the element, just like a native tooltip.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<!-- Highlight / Error -->
|
||||||
|
<h2 class="demoHeaders">Highlight / Error</h2>
|
||||||
|
<div class="ui-widget">
|
||||||
|
<div class="ui-state-highlight ui-corner-all" style="margin-top: 20px; padding: 0 .7em;">
|
||||||
|
<p><span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span>
|
||||||
|
<strong>Hey!</strong> Sample ui-state-highlight style.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<div class="ui-widget">
|
||||||
|
<div class="ui-state-error ui-corner-all" style="padding: 0 .7em;">
|
||||||
|
<p><span class="ui-icon ui-icon-alert" style="float: left; margin-right: .3em;"></span>
|
||||||
|
<strong>Alert:</strong> Sample ui-state-error style.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="external/jquery/jquery.js"></script>
|
||||||
|
<script src="jquery-ui.js"></script>
|
||||||
|
<script>
|
||||||
|
$( "#accordion" ).accordion();
|
||||||
|
|
||||||
|
var availableTags = [
|
||||||
|
"ActionScript",
|
||||||
|
"AppleScript",
|
||||||
|
"Asp",
|
||||||
|
"BASIC",
|
||||||
|
"C",
|
||||||
|
"C++",
|
||||||
|
"Clojure",
|
||||||
|
"COBOL",
|
||||||
|
"ColdFusion",
|
||||||
|
"Erlang",
|
||||||
|
"Fortran",
|
||||||
|
"Groovy",
|
||||||
|
"Haskell",
|
||||||
|
"Java",
|
||||||
|
"JavaScript",
|
||||||
|
"Lisp",
|
||||||
|
"Perl",
|
||||||
|
"PHP",
|
||||||
|
"Python",
|
||||||
|
"Ruby",
|
||||||
|
"Scala",
|
||||||
|
"Scheme"
|
||||||
|
];
|
||||||
|
$( "#autocomplete" ).autocomplete({
|
||||||
|
source: availableTags
|
||||||
|
});
|
||||||
|
|
||||||
|
$( "#button" ).button();
|
||||||
|
$( "#button-icon" ).button({
|
||||||
|
icon: "ui-icon-gear",
|
||||||
|
showLabel: false
|
||||||
|
});
|
||||||
|
|
||||||
|
$( "#radioset" ).controlgroup();
|
||||||
|
|
||||||
|
$( "#controlgroup" ).controlgroup();
|
||||||
|
|
||||||
|
$( "#tabs" ).tabs();
|
||||||
|
|
||||||
|
$( "#dialog" ).dialog({
|
||||||
|
autoOpen: false,
|
||||||
|
width: 400,
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
text: "Ok",
|
||||||
|
click: function() {
|
||||||
|
$( this ).dialog( "close" );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: "Cancel",
|
||||||
|
click: function() {
|
||||||
|
$( this ).dialog( "close" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
// Link to open the dialog
|
||||||
|
$( "#dialog-link" ).click(function( event ) {
|
||||||
|
$( "#dialog" ).dialog( "open" );
|
||||||
|
event.preventDefault();
|
||||||
|
});
|
||||||
|
|
||||||
|
$( "#datepicker" ).datepicker({
|
||||||
|
inline: true
|
||||||
|
});
|
||||||
|
|
||||||
|
$( "#slider" ).slider({
|
||||||
|
range: true,
|
||||||
|
values: [ 17, 67 ]
|
||||||
|
});
|
||||||
|
|
||||||
|
$( "#progressbar" ).progressbar({
|
||||||
|
value: 20
|
||||||
|
});
|
||||||
|
|
||||||
|
$( "#spinner" ).spinner();
|
||||||
|
|
||||||
|
$( "#menu" ).menu();
|
||||||
|
|
||||||
|
$( "#tooltip" ).tooltip();
|
||||||
|
|
||||||
|
$( "#selectmenu" ).selectmenu();
|
||||||
|
|
||||||
|
// Hover states on the static widgets
|
||||||
|
$( "#dialog-link, #icons li" ).hover(
|
||||||
|
function() {
|
||||||
|
$( this ).addClass( "ui-state-hover" );
|
||||||
|
},
|
||||||
|
function() {
|
||||||
|
$( this ).removeClass( "ui-state-hover" );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,863 @@
|
||||||
|
/*!
|
||||||
|
* jQuery UI CSS Framework 1.14.0
|
||||||
|
* https://jqueryui.com
|
||||||
|
*
|
||||||
|
* Copyright OpenJS Foundation and other contributors
|
||||||
|
* Released under the MIT license.
|
||||||
|
* https://jquery.org/license
|
||||||
|
*
|
||||||
|
* https://api.jqueryui.com/category/theming/
|
||||||
|
*/
|
||||||
|
.ui-draggable-handle {
|
||||||
|
touch-action: none;
|
||||||
|
}
|
||||||
|
/* Layout helpers
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-helper-hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.ui-helper-hidden-accessible {
|
||||||
|
border: 0;
|
||||||
|
clip: rect(0 0 0 0);
|
||||||
|
height: 1px;
|
||||||
|
margin: -1px;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0;
|
||||||
|
position: absolute;
|
||||||
|
width: 1px;
|
||||||
|
}
|
||||||
|
.ui-helper-reset {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
outline: 0;
|
||||||
|
line-height: 1.3;
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 100%;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
.ui-helper-clearfix:before,
|
||||||
|
.ui-helper-clearfix:after {
|
||||||
|
content: "";
|
||||||
|
display: table;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
.ui-helper-clearfix:after {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
.ui-helper-zfix {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
position: absolute;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-front {
|
||||||
|
z-index: 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Interaction Cues
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-state-disabled {
|
||||||
|
cursor: default !important;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Icons
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-icon {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin-top: -.25em;
|
||||||
|
position: relative;
|
||||||
|
text-indent: -99999px;
|
||||||
|
overflow: hidden;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-widget-icon-block {
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -8px;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Misc visuals
|
||||||
|
----------------------------------*/
|
||||||
|
|
||||||
|
/* Overlays */
|
||||||
|
.ui-widget-overlay {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
.ui-resizable {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.ui-resizable-handle {
|
||||||
|
position: absolute;
|
||||||
|
font-size: 0.1px;
|
||||||
|
display: block;
|
||||||
|
touch-action: none;
|
||||||
|
}
|
||||||
|
.ui-resizable-disabled .ui-resizable-handle,
|
||||||
|
.ui-resizable-autohide .ui-resizable-handle {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.ui-resizable-n {
|
||||||
|
cursor: n-resize;
|
||||||
|
height: 7px;
|
||||||
|
width: 100%;
|
||||||
|
top: -5px;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
.ui-resizable-s {
|
||||||
|
cursor: s-resize;
|
||||||
|
height: 7px;
|
||||||
|
width: 100%;
|
||||||
|
bottom: -5px;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
.ui-resizable-e {
|
||||||
|
cursor: e-resize;
|
||||||
|
width: 7px;
|
||||||
|
right: -5px;
|
||||||
|
top: 0;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
.ui-resizable-w {
|
||||||
|
cursor: w-resize;
|
||||||
|
width: 7px;
|
||||||
|
left: -5px;
|
||||||
|
top: 0;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
.ui-resizable-se {
|
||||||
|
cursor: se-resize;
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
right: 1px;
|
||||||
|
bottom: 1px;
|
||||||
|
}
|
||||||
|
.ui-resizable-sw {
|
||||||
|
cursor: sw-resize;
|
||||||
|
width: 9px;
|
||||||
|
height: 9px;
|
||||||
|
left: -5px;
|
||||||
|
bottom: -5px;
|
||||||
|
}
|
||||||
|
.ui-resizable-nw {
|
||||||
|
cursor: nw-resize;
|
||||||
|
width: 9px;
|
||||||
|
height: 9px;
|
||||||
|
left: -5px;
|
||||||
|
top: -5px;
|
||||||
|
}
|
||||||
|
.ui-resizable-ne {
|
||||||
|
cursor: ne-resize;
|
||||||
|
width: 9px;
|
||||||
|
height: 9px;
|
||||||
|
right: -5px;
|
||||||
|
top: -5px;
|
||||||
|
}
|
||||||
|
.ui-selectable {
|
||||||
|
touch-action: none;
|
||||||
|
}
|
||||||
|
.ui-selectable-helper {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 100;
|
||||||
|
border: 1px dotted black;
|
||||||
|
}
|
||||||
|
.ui-sortable-handle {
|
||||||
|
touch-action: none;
|
||||||
|
}
|
||||||
|
.ui-accordion .ui-accordion-header {
|
||||||
|
display: block;
|
||||||
|
cursor: pointer;
|
||||||
|
position: relative;
|
||||||
|
margin: 2px 0 0 0;
|
||||||
|
padding: .5em .5em .5em .7em;
|
||||||
|
font-size: 100%;
|
||||||
|
}
|
||||||
|
.ui-accordion .ui-accordion-content {
|
||||||
|
padding: 1em 2.2em;
|
||||||
|
border-top: 0;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
.ui-autocomplete {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
.ui-menu {
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
display: block;
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
.ui-menu .ui-menu {
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
.ui-menu .ui-menu-item {
|
||||||
|
margin: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.ui-menu .ui-menu-item-wrapper {
|
||||||
|
position: relative;
|
||||||
|
padding: 3px 1em 3px .4em;
|
||||||
|
}
|
||||||
|
.ui-menu .ui-menu-divider {
|
||||||
|
margin: 5px 0;
|
||||||
|
height: 0;
|
||||||
|
font-size: 0;
|
||||||
|
line-height: 0;
|
||||||
|
border-width: 1px 0 0 0;
|
||||||
|
}
|
||||||
|
.ui-menu .ui-state-focus,
|
||||||
|
.ui-menu .ui-state-active {
|
||||||
|
margin: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* icon support */
|
||||||
|
.ui-menu-icons {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.ui-menu-icons .ui-menu-item-wrapper {
|
||||||
|
padding-left: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* left-aligned */
|
||||||
|
.ui-menu .ui-icon {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: .2em;
|
||||||
|
margin: auto 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* right-aligned */
|
||||||
|
.ui-menu .ui-menu-icon {
|
||||||
|
left: auto;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
.ui-button {
|
||||||
|
padding: .4em 1em;
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
line-height: normal;
|
||||||
|
margin-right: .1em;
|
||||||
|
cursor: pointer;
|
||||||
|
vertical-align: middle;
|
||||||
|
text-align: center;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-button,
|
||||||
|
.ui-button:link,
|
||||||
|
.ui-button:visited,
|
||||||
|
.ui-button:hover,
|
||||||
|
.ui-button:active {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* to make room for the icon, a width needs to be set here */
|
||||||
|
.ui-button-icon-only {
|
||||||
|
width: 2em;
|
||||||
|
box-sizing: border-box;
|
||||||
|
text-indent: -9999px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* no icon support for input elements */
|
||||||
|
input.ui-button.ui-button-icon-only {
|
||||||
|
text-indent: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* button icon element(s) */
|
||||||
|
.ui-button-icon-only .ui-icon {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
margin-top: -8px;
|
||||||
|
margin-left: -8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-button.ui-icon-notext .ui-icon {
|
||||||
|
padding: 0;
|
||||||
|
width: 2.1em;
|
||||||
|
height: 2.1em;
|
||||||
|
text-indent: -9999px;
|
||||||
|
white-space: nowrap;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
input.ui-button.ui-icon-notext .ui-icon {
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
text-indent: 0;
|
||||||
|
white-space: normal;
|
||||||
|
padding: .4em 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* workarounds */
|
||||||
|
/* Support: Firefox 5 - 125+ */
|
||||||
|
input.ui-button::-moz-focus-inner,
|
||||||
|
button.ui-button::-moz-focus-inner {
|
||||||
|
border: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.ui-controlgroup {
|
||||||
|
vertical-align: middle;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.ui-controlgroup > .ui-controlgroup-item {
|
||||||
|
float: left;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
.ui-controlgroup > .ui-controlgroup-item:focus,
|
||||||
|
.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
|
||||||
|
z-index: 9999;
|
||||||
|
}
|
||||||
|
.ui-controlgroup-vertical > .ui-controlgroup-item {
|
||||||
|
display: block;
|
||||||
|
float: none;
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.ui-controlgroup-vertical .ui-controlgroup-item {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.ui-controlgroup .ui-controlgroup-label {
|
||||||
|
padding: .4em 1em;
|
||||||
|
}
|
||||||
|
.ui-controlgroup .ui-controlgroup-label span {
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
|
||||||
|
border-left: none;
|
||||||
|
}
|
||||||
|
.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
|
||||||
|
border-top: none;
|
||||||
|
}
|
||||||
|
.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
|
||||||
|
border-right: none;
|
||||||
|
}
|
||||||
|
.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Spinner specific style fixes */
|
||||||
|
.ui-controlgroup-vertical .ui-spinner-input {
|
||||||
|
width: calc( 100% - 2.4em );
|
||||||
|
}
|
||||||
|
.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
|
||||||
|
border-top-style: solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-checkboxradio-label .ui-icon-background {
|
||||||
|
box-shadow: inset 1px 1px 1px #ccc;
|
||||||
|
border-radius: .12em;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
.ui-checkboxradio-radio-label .ui-icon-background {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
border-radius: 1em;
|
||||||
|
overflow: visible;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
|
||||||
|
.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
|
||||||
|
background-image: none;
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
border-width: 4px;
|
||||||
|
border-style: solid;
|
||||||
|
}
|
||||||
|
.ui-checkboxradio-disabled {
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
.ui-datepicker {
|
||||||
|
width: 17em;
|
||||||
|
padding: .2em .2em 0;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.ui-datepicker .ui-datepicker-header {
|
||||||
|
position: relative;
|
||||||
|
padding: .2em 0;
|
||||||
|
}
|
||||||
|
.ui-datepicker .ui-datepicker-prev,
|
||||||
|
.ui-datepicker .ui-datepicker-next {
|
||||||
|
position: absolute;
|
||||||
|
top: 2px;
|
||||||
|
width: 1.8em;
|
||||||
|
height: 1.8em;
|
||||||
|
}
|
||||||
|
.ui-datepicker .ui-datepicker-prev-hover,
|
||||||
|
.ui-datepicker .ui-datepicker-next-hover {
|
||||||
|
top: 1px;
|
||||||
|
}
|
||||||
|
.ui-datepicker .ui-datepicker-prev {
|
||||||
|
left: 2px;
|
||||||
|
}
|
||||||
|
.ui-datepicker .ui-datepicker-next {
|
||||||
|
right: 2px;
|
||||||
|
}
|
||||||
|
.ui-datepicker .ui-datepicker-prev-hover {
|
||||||
|
left: 1px;
|
||||||
|
}
|
||||||
|
.ui-datepicker .ui-datepicker-next-hover {
|
||||||
|
right: 1px;
|
||||||
|
}
|
||||||
|
.ui-datepicker .ui-datepicker-prev span,
|
||||||
|
.ui-datepicker .ui-datepicker-next span {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -8px;
|
||||||
|
top: 50%;
|
||||||
|
margin-top: -8px;
|
||||||
|
}
|
||||||
|
.ui-datepicker .ui-datepicker-title {
|
||||||
|
margin: 0 2.3em;
|
||||||
|
line-height: 1.8em;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.ui-datepicker .ui-datepicker-title select {
|
||||||
|
font-size: 1em;
|
||||||
|
margin: 1px 0;
|
||||||
|
}
|
||||||
|
.ui-datepicker select.ui-datepicker-month,
|
||||||
|
.ui-datepicker select.ui-datepicker-year {
|
||||||
|
width: 45%;
|
||||||
|
}
|
||||||
|
.ui-datepicker table {
|
||||||
|
width: 100%;
|
||||||
|
font-size: .9em;
|
||||||
|
border-collapse: collapse;
|
||||||
|
margin: 0 0 .4em;
|
||||||
|
}
|
||||||
|
.ui-datepicker th {
|
||||||
|
padding: .7em .3em;
|
||||||
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
.ui-datepicker td {
|
||||||
|
border: 0;
|
||||||
|
padding: 1px;
|
||||||
|
}
|
||||||
|
.ui-datepicker td span,
|
||||||
|
.ui-datepicker td a {
|
||||||
|
display: block;
|
||||||
|
padding: .2em;
|
||||||
|
text-align: right;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.ui-datepicker .ui-datepicker-buttonpane {
|
||||||
|
background-image: none;
|
||||||
|
margin: .7em 0 0 0;
|
||||||
|
padding: 0 .2em;
|
||||||
|
border-left: 0;
|
||||||
|
border-right: 0;
|
||||||
|
border-bottom: 0;
|
||||||
|
}
|
||||||
|
.ui-datepicker .ui-datepicker-buttonpane button {
|
||||||
|
float: right;
|
||||||
|
margin: .5em .2em .4em;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: .2em .6em .3em .6em;
|
||||||
|
width: auto;
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* with multiple calendars */
|
||||||
|
.ui-datepicker.ui-datepicker-multi {
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
.ui-datepicker-multi .ui-datepicker-group {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
.ui-datepicker-multi .ui-datepicker-group table {
|
||||||
|
width: 95%;
|
||||||
|
margin: 0 auto .4em;
|
||||||
|
}
|
||||||
|
.ui-datepicker-multi-2 .ui-datepicker-group {
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
.ui-datepicker-multi-3 .ui-datepicker-group {
|
||||||
|
width: 33.3%;
|
||||||
|
}
|
||||||
|
.ui-datepicker-multi-4 .ui-datepicker-group {
|
||||||
|
width: 25%;
|
||||||
|
}
|
||||||
|
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
|
||||||
|
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
|
||||||
|
border-left-width: 0;
|
||||||
|
}
|
||||||
|
.ui-datepicker-multi .ui-datepicker-buttonpane {
|
||||||
|
clear: left;
|
||||||
|
}
|
||||||
|
.ui-datepicker-row-break {
|
||||||
|
clear: both;
|
||||||
|
width: 100%;
|
||||||
|
font-size: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* RTL support */
|
||||||
|
.ui-datepicker-rtl {
|
||||||
|
direction: rtl;
|
||||||
|
}
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-prev {
|
||||||
|
right: 2px;
|
||||||
|
left: auto;
|
||||||
|
}
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-next {
|
||||||
|
left: 2px;
|
||||||
|
right: auto;
|
||||||
|
}
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-prev:hover {
|
||||||
|
right: 1px;
|
||||||
|
left: auto;
|
||||||
|
}
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-next:hover {
|
||||||
|
left: 1px;
|
||||||
|
right: auto;
|
||||||
|
}
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-buttonpane {
|
||||||
|
clear: right;
|
||||||
|
}
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-buttonpane button {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-group {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
|
||||||
|
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
|
||||||
|
border-right-width: 0;
|
||||||
|
border-left-width: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Icons */
|
||||||
|
.ui-datepicker .ui-icon {
|
||||||
|
display: block;
|
||||||
|
text-indent: -99999px;
|
||||||
|
overflow: hidden;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
left: .5em;
|
||||||
|
top: .3em;
|
||||||
|
}
|
||||||
|
.ui-dialog {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
padding: .2em;
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
.ui-dialog .ui-dialog-titlebar {
|
||||||
|
padding: .4em 1em;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.ui-dialog .ui-dialog-title {
|
||||||
|
float: left;
|
||||||
|
margin: .1em 0;
|
||||||
|
white-space: nowrap;
|
||||||
|
width: 90%;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
.ui-dialog .ui-dialog-titlebar-close {
|
||||||
|
position: absolute;
|
||||||
|
right: .3em;
|
||||||
|
top: 50%;
|
||||||
|
width: 20px;
|
||||||
|
margin: -10px 0 0 0;
|
||||||
|
padding: 1px;
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
.ui-dialog .ui-dialog-content {
|
||||||
|
position: relative;
|
||||||
|
border: 0;
|
||||||
|
padding: .5em 1em;
|
||||||
|
background: none;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
.ui-dialog .ui-dialog-buttonpane {
|
||||||
|
text-align: left;
|
||||||
|
border-width: 1px 0 0 0;
|
||||||
|
background-image: none;
|
||||||
|
margin-top: .5em;
|
||||||
|
padding: .3em 1em .5em .4em;
|
||||||
|
}
|
||||||
|
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
.ui-dialog .ui-dialog-buttonpane button {
|
||||||
|
margin: .5em .4em .5em 0;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.ui-dialog .ui-resizable-n {
|
||||||
|
height: 2px;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
.ui-dialog .ui-resizable-e {
|
||||||
|
width: 2px;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
.ui-dialog .ui-resizable-s {
|
||||||
|
height: 2px;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
.ui-dialog .ui-resizable-w {
|
||||||
|
width: 2px;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
.ui-dialog .ui-resizable-se,
|
||||||
|
.ui-dialog .ui-resizable-sw,
|
||||||
|
.ui-dialog .ui-resizable-ne,
|
||||||
|
.ui-dialog .ui-resizable-nw {
|
||||||
|
width: 7px;
|
||||||
|
height: 7px;
|
||||||
|
}
|
||||||
|
.ui-dialog .ui-resizable-se {
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
.ui-dialog .ui-resizable-sw {
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
.ui-dialog .ui-resizable-ne {
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
.ui-dialog .ui-resizable-nw {
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
.ui-draggable .ui-dialog-titlebar {
|
||||||
|
cursor: move;
|
||||||
|
}
|
||||||
|
.ui-progressbar {
|
||||||
|
height: 2em;
|
||||||
|
text-align: left;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.ui-progressbar .ui-progressbar-value {
|
||||||
|
margin: -1px;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
.ui-progressbar .ui-progressbar-overlay {
|
||||||
|
background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
|
||||||
|
height: 100%;
|
||||||
|
opacity: 0.25;
|
||||||
|
}
|
||||||
|
.ui-progressbar-indeterminate .ui-progressbar-value {
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
.ui-selectmenu-menu {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.ui-selectmenu-menu .ui-menu {
|
||||||
|
overflow: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
}
|
||||||
|
.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
|
||||||
|
font-size: 1em;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 1.5;
|
||||||
|
padding: 2px 0.4em;
|
||||||
|
margin: 0.5em 0 0 0;
|
||||||
|
height: auto;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
.ui-selectmenu-open {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.ui-selectmenu-text {
|
||||||
|
display: block;
|
||||||
|
margin-right: 20px;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
.ui-selectmenu-button.ui-button {
|
||||||
|
text-align: left;
|
||||||
|
white-space: nowrap;
|
||||||
|
width: 14em;
|
||||||
|
}
|
||||||
|
.ui-selectmenu-icon.ui-icon {
|
||||||
|
float: right;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
.ui-slider {
|
||||||
|
position: relative;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.ui-slider .ui-slider-handle {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 2;
|
||||||
|
width: 1.2em;
|
||||||
|
height: 1.2em;
|
||||||
|
cursor: pointer;
|
||||||
|
touch-action: none;
|
||||||
|
}
|
||||||
|
.ui-slider .ui-slider-range {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1;
|
||||||
|
font-size: .7em;
|
||||||
|
display: block;
|
||||||
|
border: 0;
|
||||||
|
background-position: 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-slider-horizontal {
|
||||||
|
height: .8em;
|
||||||
|
}
|
||||||
|
.ui-slider-horizontal .ui-slider-handle {
|
||||||
|
top: -.3em;
|
||||||
|
margin-left: -.6em;
|
||||||
|
}
|
||||||
|
.ui-slider-horizontal .ui-slider-range {
|
||||||
|
top: 0;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
.ui-slider-horizontal .ui-slider-range-min {
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
.ui-slider-horizontal .ui-slider-range-max {
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-slider-vertical {
|
||||||
|
width: .8em;
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
.ui-slider-vertical .ui-slider-handle {
|
||||||
|
left: -.3em;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-bottom: -.6em;
|
||||||
|
}
|
||||||
|
.ui-slider-vertical .ui-slider-range {
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.ui-slider-vertical .ui-slider-range-min {
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
.ui-slider-vertical .ui-slider-range-max {
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
.ui-spinner {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.ui-spinner-input {
|
||||||
|
border: none;
|
||||||
|
background: none;
|
||||||
|
color: inherit;
|
||||||
|
padding: .222em 0;
|
||||||
|
margin: .2em 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin-left: .4em;
|
||||||
|
margin-right: 2em;
|
||||||
|
}
|
||||||
|
.ui-spinner-button {
|
||||||
|
width: 1.6em;
|
||||||
|
height: 50%;
|
||||||
|
font-size: .5em;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
text-align: center;
|
||||||
|
position: absolute;
|
||||||
|
cursor: default;
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
/* more specificity required here to override default borders */
|
||||||
|
.ui-spinner a.ui-spinner-button {
|
||||||
|
border-top-style: none;
|
||||||
|
border-bottom-style: none;
|
||||||
|
border-right-style: none;
|
||||||
|
}
|
||||||
|
.ui-spinner-up {
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
.ui-spinner-down {
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
.ui-tabs {
|
||||||
|
position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
|
||||||
|
padding: .2em;
|
||||||
|
}
|
||||||
|
.ui-tabs .ui-tabs-nav {
|
||||||
|
margin: 0;
|
||||||
|
padding: .2em .2em 0;
|
||||||
|
}
|
||||||
|
.ui-tabs .ui-tabs-nav li {
|
||||||
|
list-style: none;
|
||||||
|
float: left;
|
||||||
|
position: relative;
|
||||||
|
top: 0;
|
||||||
|
margin: 1px .2em 0 0;
|
||||||
|
border-bottom-width: 0;
|
||||||
|
padding: 0;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
|
||||||
|
float: left;
|
||||||
|
padding: .5em 1em;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.ui-tabs .ui-tabs-nav li.ui-tabs-active {
|
||||||
|
margin-bottom: -1px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
}
|
||||||
|
.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
|
||||||
|
.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
|
||||||
|
.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
|
||||||
|
cursor: text;
|
||||||
|
}
|
||||||
|
.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.ui-tabs .ui-tabs-panel {
|
||||||
|
display: block;
|
||||||
|
border-width: 0;
|
||||||
|
padding: 1em 1.4em;
|
||||||
|
background: none;
|
||||||
|
}
|
||||||
|
.ui-tooltip {
|
||||||
|
padding: 8px;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 9999;
|
||||||
|
max-width: 300px;
|
||||||
|
}
|
||||||
|
body .ui-tooltip {
|
||||||
|
border-width: 2px;
|
||||||
|
}
|
|
@ -0,0 +1,439 @@
|
||||||
|
/*!
|
||||||
|
* jQuery UI CSS Framework 1.14.0
|
||||||
|
* https://jqueryui.com
|
||||||
|
*
|
||||||
|
* Copyright OpenJS Foundation and other contributors
|
||||||
|
* Released under the MIT license.
|
||||||
|
* https://jquery.org/license
|
||||||
|
*
|
||||||
|
* https://api.jqueryui.com/category/theming/
|
||||||
|
*
|
||||||
|
* To view and modify this theme, visit https://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Component containers
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-widget {
|
||||||
|
font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
|
||||||
|
font-size: 1.1em;
|
||||||
|
}
|
||||||
|
.ui-widget .ui-widget {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
.ui-widget input,
|
||||||
|
.ui-widget select,
|
||||||
|
.ui-widget textarea,
|
||||||
|
.ui-widget button {
|
||||||
|
font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
.ui-widget.ui-widget-content {
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
}
|
||||||
|
.ui-widget-content {
|
||||||
|
border: 1px solid #dddddd;
|
||||||
|
background: #eeeeee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
.ui-widget-content a {
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
.ui-widget-header {
|
||||||
|
border: 1px solid #e78f08;
|
||||||
|
background: #f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;
|
||||||
|
color: #ffffff;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.ui-widget-header a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Interaction states
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-state-default,
|
||||||
|
.ui-widget-content .ui-state-default,
|
||||||
|
.ui-widget-header .ui-state-default,
|
||||||
|
.ui-button,
|
||||||
|
|
||||||
|
/* We use html here because we need a greater specificity to make sure disabled
|
||||||
|
works properly when clicked or hovered */
|
||||||
|
html .ui-button.ui-state-disabled:hover,
|
||||||
|
html .ui-button.ui-state-disabled:active {
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
background: #f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #1c94c4;
|
||||||
|
}
|
||||||
|
.ui-state-default a,
|
||||||
|
.ui-state-default a:link,
|
||||||
|
.ui-state-default a:visited,
|
||||||
|
a.ui-button,
|
||||||
|
a:link.ui-button,
|
||||||
|
a:visited.ui-button,
|
||||||
|
.ui-button {
|
||||||
|
color: #1c94c4;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.ui-state-hover,
|
||||||
|
.ui-widget-content .ui-state-hover,
|
||||||
|
.ui-widget-header .ui-state-hover,
|
||||||
|
.ui-state-focus,
|
||||||
|
.ui-widget-content .ui-state-focus,
|
||||||
|
.ui-widget-header .ui-state-focus,
|
||||||
|
.ui-button:hover,
|
||||||
|
.ui-button:focus {
|
||||||
|
border: 1px solid #fbcb09;
|
||||||
|
background: #fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #c77405;
|
||||||
|
}
|
||||||
|
.ui-state-hover a,
|
||||||
|
.ui-state-hover a:hover,
|
||||||
|
.ui-state-hover a:link,
|
||||||
|
.ui-state-hover a:visited,
|
||||||
|
.ui-state-focus a,
|
||||||
|
.ui-state-focus a:hover,
|
||||||
|
.ui-state-focus a:link,
|
||||||
|
.ui-state-focus a:visited,
|
||||||
|
a.ui-button:hover,
|
||||||
|
a.ui-button:focus {
|
||||||
|
color: #c77405;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-visual-focus {
|
||||||
|
box-shadow: 0 0 3px 1px rgb(94, 158, 214);
|
||||||
|
}
|
||||||
|
.ui-state-active,
|
||||||
|
.ui-widget-content .ui-state-active,
|
||||||
|
.ui-widget-header .ui-state-active,
|
||||||
|
a.ui-button:active,
|
||||||
|
.ui-button:active,
|
||||||
|
.ui-button.ui-state-active:hover {
|
||||||
|
border: 1px solid #fbd850;
|
||||||
|
background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #eb8f00;
|
||||||
|
}
|
||||||
|
.ui-icon-background,
|
||||||
|
.ui-state-active .ui-icon-background {
|
||||||
|
border: #fbd850;
|
||||||
|
background-color: #eb8f00;
|
||||||
|
}
|
||||||
|
.ui-state-active a,
|
||||||
|
.ui-state-active a:link,
|
||||||
|
.ui-state-active a:visited {
|
||||||
|
color: #eb8f00;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Interaction Cues
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-state-highlight,
|
||||||
|
.ui-widget-content .ui-state-highlight,
|
||||||
|
.ui-widget-header .ui-state-highlight {
|
||||||
|
border: 1px solid #fed22f;
|
||||||
|
background: #ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;
|
||||||
|
color: #363636;
|
||||||
|
}
|
||||||
|
.ui-state-checked {
|
||||||
|
border: 1px solid #fed22f;
|
||||||
|
background: #ffe45c;
|
||||||
|
}
|
||||||
|
.ui-state-highlight a,
|
||||||
|
.ui-widget-content .ui-state-highlight a,
|
||||||
|
.ui-widget-header .ui-state-highlight a {
|
||||||
|
color: #363636;
|
||||||
|
}
|
||||||
|
.ui-state-error,
|
||||||
|
.ui-widget-content .ui-state-error,
|
||||||
|
.ui-widget-header .ui-state-error {
|
||||||
|
border: 1px solid #cd0a0a;
|
||||||
|
background: #b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.ui-state-error a,
|
||||||
|
.ui-widget-content .ui-state-error a,
|
||||||
|
.ui-widget-header .ui-state-error a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.ui-state-error-text,
|
||||||
|
.ui-widget-content .ui-state-error-text,
|
||||||
|
.ui-widget-header .ui-state-error-text {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.ui-priority-primary,
|
||||||
|
.ui-widget-content .ui-priority-primary,
|
||||||
|
.ui-widget-header .ui-priority-primary {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.ui-priority-secondary,
|
||||||
|
.ui-widget-content .ui-priority-secondary,
|
||||||
|
.ui-widget-header .ui-priority-secondary {
|
||||||
|
opacity: .7;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
.ui-state-disabled,
|
||||||
|
.ui-widget-content .ui-state-disabled,
|
||||||
|
.ui-widget-header .ui-state-disabled {
|
||||||
|
opacity: .35;
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Icons
|
||||||
|
----------------------------------*/
|
||||||
|
|
||||||
|
/* states and images */
|
||||||
|
.ui-icon {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
}
|
||||||
|
.ui-icon,
|
||||||
|
.ui-widget-content .ui-icon {
|
||||||
|
background-image: url("images/ui-icons_222222_256x240.png");
|
||||||
|
}
|
||||||
|
.ui-widget-header .ui-icon {
|
||||||
|
background-image: url("images/ui-icons_ffffff_256x240.png");
|
||||||
|
}
|
||||||
|
.ui-state-hover .ui-icon,
|
||||||
|
.ui-state-focus .ui-icon,
|
||||||
|
.ui-button:hover .ui-icon,
|
||||||
|
.ui-button:focus .ui-icon {
|
||||||
|
background-image: url("images/ui-icons_ef8c08_256x240.png");
|
||||||
|
}
|
||||||
|
.ui-state-active .ui-icon,
|
||||||
|
.ui-button:active .ui-icon {
|
||||||
|
background-image: url("images/ui-icons_ef8c08_256x240.png");
|
||||||
|
}
|
||||||
|
.ui-state-highlight .ui-icon,
|
||||||
|
.ui-button .ui-state-highlight.ui-icon {
|
||||||
|
background-image: url("images/ui-icons_228ef1_256x240.png");
|
||||||
|
}
|
||||||
|
.ui-state-error .ui-icon,
|
||||||
|
.ui-state-error-text .ui-icon {
|
||||||
|
background-image: url("images/ui-icons_ffd27a_256x240.png");
|
||||||
|
}
|
||||||
|
.ui-button .ui-icon {
|
||||||
|
background-image: url("images/ui-icons_ef8c08_256x240.png");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* positioning */
|
||||||
|
/* Three classes needed to override `.ui-button:hover .ui-icon` */
|
||||||
|
.ui-icon-blank.ui-icon-blank.ui-icon-blank {
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
.ui-icon-caret-1-n { background-position: 0 0; }
|
||||||
|
.ui-icon-caret-1-ne { background-position: -16px 0; }
|
||||||
|
.ui-icon-caret-1-e { background-position: -32px 0; }
|
||||||
|
.ui-icon-caret-1-se { background-position: -48px 0; }
|
||||||
|
.ui-icon-caret-1-s { background-position: -65px 0; }
|
||||||
|
.ui-icon-caret-1-sw { background-position: -80px 0; }
|
||||||
|
.ui-icon-caret-1-w { background-position: -96px 0; }
|
||||||
|
.ui-icon-caret-1-nw { background-position: -112px 0; }
|
||||||
|
.ui-icon-caret-2-n-s { background-position: -128px 0; }
|
||||||
|
.ui-icon-caret-2-e-w { background-position: -144px 0; }
|
||||||
|
.ui-icon-triangle-1-n { background-position: 0 -16px; }
|
||||||
|
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
|
||||||
|
.ui-icon-triangle-1-e { background-position: -32px -16px; }
|
||||||
|
.ui-icon-triangle-1-se { background-position: -48px -16px; }
|
||||||
|
.ui-icon-triangle-1-s { background-position: -65px -16px; }
|
||||||
|
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
|
||||||
|
.ui-icon-triangle-1-w { background-position: -96px -16px; }
|
||||||
|
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
|
||||||
|
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
|
||||||
|
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
|
||||||
|
.ui-icon-arrow-1-n { background-position: 0 -32px; }
|
||||||
|
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
|
||||||
|
.ui-icon-arrow-1-e { background-position: -32px -32px; }
|
||||||
|
.ui-icon-arrow-1-se { background-position: -48px -32px; }
|
||||||
|
.ui-icon-arrow-1-s { background-position: -65px -32px; }
|
||||||
|
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
|
||||||
|
.ui-icon-arrow-1-w { background-position: -96px -32px; }
|
||||||
|
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
|
||||||
|
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
|
||||||
|
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
|
||||||
|
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
|
||||||
|
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
|
||||||
|
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
|
||||||
|
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
|
||||||
|
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
|
||||||
|
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
|
||||||
|
.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
|
||||||
|
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
|
||||||
|
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
|
||||||
|
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
|
||||||
|
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
|
||||||
|
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
|
||||||
|
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
|
||||||
|
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
|
||||||
|
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
|
||||||
|
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
|
||||||
|
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
|
||||||
|
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
|
||||||
|
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
|
||||||
|
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
|
||||||
|
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
|
||||||
|
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
|
||||||
|
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
|
||||||
|
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
|
||||||
|
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
|
||||||
|
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
|
||||||
|
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
|
||||||
|
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
|
||||||
|
.ui-icon-arrow-4 { background-position: 0 -80px; }
|
||||||
|
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
|
||||||
|
.ui-icon-extlink { background-position: -32px -80px; }
|
||||||
|
.ui-icon-newwin { background-position: -48px -80px; }
|
||||||
|
.ui-icon-refresh { background-position: -64px -80px; }
|
||||||
|
.ui-icon-shuffle { background-position: -80px -80px; }
|
||||||
|
.ui-icon-transfer-e-w { background-position: -96px -80px; }
|
||||||
|
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
|
||||||
|
.ui-icon-folder-collapsed { background-position: 0 -96px; }
|
||||||
|
.ui-icon-folder-open { background-position: -16px -96px; }
|
||||||
|
.ui-icon-document { background-position: -32px -96px; }
|
||||||
|
.ui-icon-document-b { background-position: -48px -96px; }
|
||||||
|
.ui-icon-note { background-position: -64px -96px; }
|
||||||
|
.ui-icon-mail-closed { background-position: -80px -96px; }
|
||||||
|
.ui-icon-mail-open { background-position: -96px -96px; }
|
||||||
|
.ui-icon-suitcase { background-position: -112px -96px; }
|
||||||
|
.ui-icon-comment { background-position: -128px -96px; }
|
||||||
|
.ui-icon-person { background-position: -144px -96px; }
|
||||||
|
.ui-icon-print { background-position: -160px -96px; }
|
||||||
|
.ui-icon-trash { background-position: -176px -96px; }
|
||||||
|
.ui-icon-locked { background-position: -192px -96px; }
|
||||||
|
.ui-icon-unlocked { background-position: -208px -96px; }
|
||||||
|
.ui-icon-bookmark { background-position: -224px -96px; }
|
||||||
|
.ui-icon-tag { background-position: -240px -96px; }
|
||||||
|
.ui-icon-home { background-position: 0 -112px; }
|
||||||
|
.ui-icon-flag { background-position: -16px -112px; }
|
||||||
|
.ui-icon-calendar { background-position: -32px -112px; }
|
||||||
|
.ui-icon-cart { background-position: -48px -112px; }
|
||||||
|
.ui-icon-pencil { background-position: -64px -112px; }
|
||||||
|
.ui-icon-clock { background-position: -80px -112px; }
|
||||||
|
.ui-icon-disk { background-position: -96px -112px; }
|
||||||
|
.ui-icon-calculator { background-position: -112px -112px; }
|
||||||
|
.ui-icon-zoomin { background-position: -128px -112px; }
|
||||||
|
.ui-icon-zoomout { background-position: -144px -112px; }
|
||||||
|
.ui-icon-search { background-position: -160px -112px; }
|
||||||
|
.ui-icon-wrench { background-position: -176px -112px; }
|
||||||
|
.ui-icon-gear { background-position: -192px -112px; }
|
||||||
|
.ui-icon-heart { background-position: -208px -112px; }
|
||||||
|
.ui-icon-star { background-position: -224px -112px; }
|
||||||
|
.ui-icon-link { background-position: -240px -112px; }
|
||||||
|
.ui-icon-cancel { background-position: 0 -128px; }
|
||||||
|
.ui-icon-plus { background-position: -16px -128px; }
|
||||||
|
.ui-icon-plusthick { background-position: -32px -128px; }
|
||||||
|
.ui-icon-minus { background-position: -48px -128px; }
|
||||||
|
.ui-icon-minusthick { background-position: -64px -128px; }
|
||||||
|
.ui-icon-close { background-position: -80px -128px; }
|
||||||
|
.ui-icon-closethick { background-position: -96px -128px; }
|
||||||
|
.ui-icon-key { background-position: -112px -128px; }
|
||||||
|
.ui-icon-lightbulb { background-position: -128px -128px; }
|
||||||
|
.ui-icon-scissors { background-position: -144px -128px; }
|
||||||
|
.ui-icon-clipboard { background-position: -160px -128px; }
|
||||||
|
.ui-icon-copy { background-position: -176px -128px; }
|
||||||
|
.ui-icon-contact { background-position: -192px -128px; }
|
||||||
|
.ui-icon-image { background-position: -208px -128px; }
|
||||||
|
.ui-icon-video { background-position: -224px -128px; }
|
||||||
|
.ui-icon-script { background-position: -240px -128px; }
|
||||||
|
.ui-icon-alert { background-position: 0 -144px; }
|
||||||
|
.ui-icon-info { background-position: -16px -144px; }
|
||||||
|
.ui-icon-notice { background-position: -32px -144px; }
|
||||||
|
.ui-icon-help { background-position: -48px -144px; }
|
||||||
|
.ui-icon-check { background-position: -64px -144px; }
|
||||||
|
.ui-icon-bullet { background-position: -80px -144px; }
|
||||||
|
.ui-icon-radio-on { background-position: -96px -144px; }
|
||||||
|
.ui-icon-radio-off { background-position: -112px -144px; }
|
||||||
|
.ui-icon-pin-w { background-position: -128px -144px; }
|
||||||
|
.ui-icon-pin-s { background-position: -144px -144px; }
|
||||||
|
.ui-icon-play { background-position: 0 -160px; }
|
||||||
|
.ui-icon-pause { background-position: -16px -160px; }
|
||||||
|
.ui-icon-seek-next { background-position: -32px -160px; }
|
||||||
|
.ui-icon-seek-prev { background-position: -48px -160px; }
|
||||||
|
.ui-icon-seek-end { background-position: -64px -160px; }
|
||||||
|
.ui-icon-seek-start { background-position: -80px -160px; }
|
||||||
|
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
|
||||||
|
.ui-icon-seek-first { background-position: -80px -160px; }
|
||||||
|
.ui-icon-stop { background-position: -96px -160px; }
|
||||||
|
.ui-icon-eject { background-position: -112px -160px; }
|
||||||
|
.ui-icon-volume-off { background-position: -128px -160px; }
|
||||||
|
.ui-icon-volume-on { background-position: -144px -160px; }
|
||||||
|
.ui-icon-power { background-position: 0 -176px; }
|
||||||
|
.ui-icon-signal-diag { background-position: -16px -176px; }
|
||||||
|
.ui-icon-signal { background-position: -32px -176px; }
|
||||||
|
.ui-icon-battery-0 { background-position: -48px -176px; }
|
||||||
|
.ui-icon-battery-1 { background-position: -64px -176px; }
|
||||||
|
.ui-icon-battery-2 { background-position: -80px -176px; }
|
||||||
|
.ui-icon-battery-3 { background-position: -96px -176px; }
|
||||||
|
.ui-icon-circle-plus { background-position: 0 -192px; }
|
||||||
|
.ui-icon-circle-minus { background-position: -16px -192px; }
|
||||||
|
.ui-icon-circle-close { background-position: -32px -192px; }
|
||||||
|
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
|
||||||
|
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
|
||||||
|
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
|
||||||
|
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
|
||||||
|
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
|
||||||
|
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
|
||||||
|
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
|
||||||
|
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
|
||||||
|
.ui-icon-circle-zoomin { background-position: -176px -192px; }
|
||||||
|
.ui-icon-circle-zoomout { background-position: -192px -192px; }
|
||||||
|
.ui-icon-circle-check { background-position: -208px -192px; }
|
||||||
|
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
|
||||||
|
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
|
||||||
|
.ui-icon-circlesmall-close { background-position: -32px -208px; }
|
||||||
|
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
|
||||||
|
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
|
||||||
|
.ui-icon-squaresmall-close { background-position: -80px -208px; }
|
||||||
|
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
|
||||||
|
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
|
||||||
|
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
|
||||||
|
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
|
||||||
|
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
|
||||||
|
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Misc visuals
|
||||||
|
----------------------------------*/
|
||||||
|
|
||||||
|
/* Corner radius */
|
||||||
|
.ui-corner-all,
|
||||||
|
.ui-corner-top,
|
||||||
|
.ui-corner-left,
|
||||||
|
.ui-corner-tl {
|
||||||
|
border-top-left-radius: 4px;
|
||||||
|
}
|
||||||
|
.ui-corner-all,
|
||||||
|
.ui-corner-top,
|
||||||
|
.ui-corner-right,
|
||||||
|
.ui-corner-tr {
|
||||||
|
border-top-right-radius: 4px;
|
||||||
|
}
|
||||||
|
.ui-corner-all,
|
||||||
|
.ui-corner-bottom,
|
||||||
|
.ui-corner-left,
|
||||||
|
.ui-corner-bl {
|
||||||
|
border-bottom-left-radius: 4px;
|
||||||
|
}
|
||||||
|
.ui-corner-all,
|
||||||
|
.ui-corner-bottom,
|
||||||
|
.ui-corner-right,
|
||||||
|
.ui-corner-br {
|
||||||
|
border-bottom-right-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Overlays */
|
||||||
|
.ui-widget-overlay {
|
||||||
|
background: #666666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;
|
||||||
|
opacity: .5;
|
||||||
|
}
|
||||||
|
.ui-widget-shadow {
|
||||||
|
box-shadow: -5px -5px 5px #000000;
|
||||||
|
}
|
|
@ -0,0 +1,83 @@
|
||||||
|
{
|
||||||
|
"name": "jquery-ui",
|
||||||
|
"title": "jQuery UI",
|
||||||
|
"description": "A curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library.",
|
||||||
|
"version": "1.14.0",
|
||||||
|
"homepage": "https://jqueryui.com",
|
||||||
|
"author": {
|
||||||
|
"name": "OpenJS Foundation and other contributors",
|
||||||
|
"url": "https://github.com/jquery/jquery-ui/blob/1.14.0/AUTHORS.txt"
|
||||||
|
},
|
||||||
|
"main": "ui/widget.js",
|
||||||
|
"maintainers": [
|
||||||
|
{
|
||||||
|
"name": "Jörn Zaefferer",
|
||||||
|
"email": "joern.zaefferer@gmail.com",
|
||||||
|
"url": "https://bassistance.de"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Mike Sherov",
|
||||||
|
"email": "mike.sherov@gmail.com",
|
||||||
|
"url": "https://mike.sherov.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "TJ VanToll",
|
||||||
|
"email": "tj.vantoll@gmail.com",
|
||||||
|
"url": "https://www.tjvantoll.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Felix Nagel",
|
||||||
|
"email": "info@felixnagel.com",
|
||||||
|
"url": "https://www.felixnagel.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Alex Schmitz",
|
||||||
|
"email": "arschmitz@gmail.com",
|
||||||
|
"url": "https://github.com/arschmitz"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/jquery/jquery-ui.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/jquery/jquery-ui/issues"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"scripts": {
|
||||||
|
"build": "grunt build",
|
||||||
|
"lint": "grunt lint",
|
||||||
|
"test:server": "node tests/runner/server.js",
|
||||||
|
"test:unit": "node tests/runner/command.js",
|
||||||
|
"test": "grunt && npm run test:unit -- -h"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"jquery": ">=1.12.0 <5.0.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"body-parser": "1.20.2",
|
||||||
|
"browserstack-local": "1.5.5",
|
||||||
|
"commitplease": "3.2.0",
|
||||||
|
"diff": "5.2.0",
|
||||||
|
"eslint-config-jquery": "3.0.2",
|
||||||
|
"exit-hook": "4.0.0",
|
||||||
|
"express": "4.19.2",
|
||||||
|
"express-body-parser-error-handler": "1.0.7",
|
||||||
|
"grunt": "1.6.1",
|
||||||
|
"grunt-bowercopy": "1.2.5",
|
||||||
|
"grunt-cli": "1.4.3",
|
||||||
|
"grunt-compare-size": "0.4.2",
|
||||||
|
"grunt-contrib-concat": "2.1.0",
|
||||||
|
"grunt-contrib-csslint": "2.0.0",
|
||||||
|
"grunt-contrib-requirejs": "1.0.0",
|
||||||
|
"grunt-contrib-uglify": "5.2.2",
|
||||||
|
"grunt-eslint": "24.0.1",
|
||||||
|
"grunt-git-authors": "3.2.0",
|
||||||
|
"grunt-html": "16.0.0",
|
||||||
|
"load-grunt-tasks": "5.1.0",
|
||||||
|
"rimraf": "4.4.1",
|
||||||
|
"selenium-webdriver": "4.18.1",
|
||||||
|
"yargs": "17.7.2"
|
||||||
|
},
|
||||||
|
"keywords": []
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
{include file=$header}
|
||||||
|
<div class="row">
|
||||||
|
<h1>Авторизация</h1>
|
||||||
|
<div class="col-md-4"></div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
{if $err}
|
||||||
|
<div class="alert alert-danger" role="alert">
|
||||||
|
{$err}
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
<form method="post" action="">
|
||||||
|
<input type="input" class="form-control" name="login" placeholder="Логин">
|
||||||
|
<input type="password" class="form-control" name="pwd" placeholder="Пароль">
|
||||||
|
<input type="submit" class="btn btn-secondary" name="ok" value="Войти">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4"></div>
|
||||||
|
</div>
|
||||||
|
{include file=$footer}
|
|
@ -0,0 +1,22 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
Законченный модуль авторизации
|
||||||
|
Получает данные через POST запрос - запрашивает из БД пользователя - если нет - говорит, что нет юзера, если есть - сверяет его пароль и пускает
|
||||||
|
*/
|
||||||
|
ini_set('display_errors', 0);
|
||||||
|
if ($_POST){
|
||||||
|
$user=\DB::getRow("SELECT * FROM `users` WHERE `login`=? LIMIT 1", $_POST['login']);
|
||||||
|
if ($user){
|
||||||
|
if (md5($_POST['pwd'])==$user['pwd']){
|
||||||
|
$_SESSION['user_id']=$user['id'];
|
||||||
|
$_SESSION['dostup']=$user['dostup'];
|
||||||
|
$_SESSION['fio']=$user['fio'];
|
||||||
|
header( 'Location: /' );
|
||||||
|
}else{
|
||||||
|
$smarty->assign('err', 'Не верный логин или пароль');
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
$smarty->assign('err', 'Пользователь не зарегистрирован, обратитесь в отдел информационных технологий');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
|
@ -0,0 +1,22 @@
|
||||||
|
{include file=$header}
|
||||||
|
<div class="row">
|
||||||
|
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<h1>Новости минздрава Свердловской области</h1>
|
||||||
|
<table class="table">
|
||||||
|
{section name=customer loop=$news}
|
||||||
|
<tr><td><img src='{$news[customer].img}' style="width: 250px;"></td><td>
|
||||||
|
<a href="{$news[customer].massiv.link}">{$news[customer].massiv.title}</a>
|
||||||
|
<hr>
|
||||||
|
<small>{$news[customer].massiv.pubDate}</small>
|
||||||
|
</td></tr>
|
||||||
|
{/section}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<h1>События Санатория Руш</h1>
|
||||||
|
<button type="button" class="btn btn-secondary">Добавить</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{include file=$footer}
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?php
|
||||||
|
function getFeeds($url) {
|
||||||
|
$content = file_get_contents($url);
|
||||||
|
$items = new SimpleXmlElement($content);
|
||||||
|
$array = get_object_vars($items);
|
||||||
|
$array2 = get_object_vars($array['channel']);
|
||||||
|
$news= $array2['item'];
|
||||||
|
$c=count($news);
|
||||||
|
for ($i=0; $i<$c;$i++){
|
||||||
|
$news2[$i]['massiv']=get_object_vars($news[$i]);
|
||||||
|
$news2[$i]['img']=get_object_vars($news2[$i]['massiv']['enclosure'])['@attributes']['url'];
|
||||||
|
}
|
||||||
|
return $news2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$smarty->assign('news', getFeeds('https://minzdrav.midural.ru/rss'));
|
||||||
|
?>
|
|
@ -0,0 +1,109 @@
|
||||||
|
{include file=$header}
|
||||||
|
<div class="row">
|
||||||
|
<h1>Задачи <button type="button" class="btn btn-secondary" data-bs-toggle="modal" data-bs-target="#exampleModal">+</button></h1>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<h2>Мои задачи</h2>
|
||||||
|
|
||||||
|
|
||||||
|
{section name=customer loop=$mytask}
|
||||||
|
<div class="card mb-2">
|
||||||
|
<div class="card-header">
|
||||||
|
От: {$mytask[customer].avtor.fio}<br>
|
||||||
|
{$mytask[customer].d}<br>
|
||||||
|
{if $mytask[customer].status==1}<span style="color: #e74c3c;">Новая</span>{/if}
|
||||||
|
{if $mytask[customer].status==2}<span style="color: #27ae60;">Выполняется</span>{/if}
|
||||||
|
{if $mytask[customer].status==3}<span style="color: #95a5a6;">Завершена</span>{/if}
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
|
||||||
|
<p class="card-text">{$mytask[customer].txt|br}</p>
|
||||||
|
<a href="#" class="btn btn-primary">Перейти куда-нибудь</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/section}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<h2>Поставленные мной</h2>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Модальное окно -->
|
||||||
|
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h1 class="modal-title fs-5" id="exampleModalLabel">Новая задача</h1>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
|
||||||
|
<form id="newtask" action="/task/" enctype="multipart/form-data" method="post">
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="target_user" class="form-label">Ответственный</label>
|
||||||
|
|
||||||
|
<select name="target_user" id="target_user" class="form-control">
|
||||||
|
{section name=customer loop=$users}
|
||||||
|
<option value="{$users[customer].id}">{$users[customer].fio} ({$users[customer].dolznost})</option>
|
||||||
|
{/section}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="srok" class="form-label">Срок</label>
|
||||||
|
<input type="input" class="form-control" id="srok" name="srok">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="txt" class="form-label">Суть обращения</label>
|
||||||
|
<textarea class="form-control" id="txt" name="txt" style="height: 200px;"></textarea>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="prioritet" class="form-label">Приоритет</label>
|
||||||
|
<select name="prioritet" id="prioritet" class="form-control">
|
||||||
|
<option value="0">Низкий</option>
|
||||||
|
<option value="1">Средний</option>
|
||||||
|
<option value="2">Срочный</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="doc" class="form-label">Приказ</label>
|
||||||
|
<input type="file" class="form-control" id="doc" name="doc">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="user" class="form-label">Заказчик</label>
|
||||||
|
|
||||||
|
<select name="user" id="user" class="form-control">
|
||||||
|
{section name=customer loop=$users}
|
||||||
|
<option value="{$users[customer].id}" {if ($smarty.session.user_id==$users[customer].id)} selected {/if}>{$users[customer].fio} ({$users[customer].dolznost})</option>
|
||||||
|
{/section}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<input type="submit" name="ok" value="Добавить" class="btn btn-primary">
|
||||||
|
</form>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{include file=$footer}
|
|
@ -0,0 +1,32 @@
|
||||||
|
<?php
|
||||||
|
//Получаем список пользователей
|
||||||
|
$users=DB::getAll("SELECT * FROM `users` WHERE `status`=?", 1);
|
||||||
|
$smarty -> assign( 'users', $users);
|
||||||
|
|
||||||
|
//Ставим задачу
|
||||||
|
if ($_POST){
|
||||||
|
if ($_FILES){
|
||||||
|
@mkdir("files", 0777);
|
||||||
|
@mkdir("files/task", 0777);
|
||||||
|
$fm=rand(10000, 99999) . '_' . $_FILES['doc']['name'];
|
||||||
|
copy ($_FILES['doc']['tmp_name'], 'files/task/' . $fm);
|
||||||
|
}
|
||||||
|
$array['doc']=$fm;
|
||||||
|
$array['srok']=$_POST['srok'];
|
||||||
|
$array['target_user']=$_POST['target_user'];
|
||||||
|
$array['prioritet']=$_POST['prioritet'];
|
||||||
|
$j=core::j($array);
|
||||||
|
DB::add("INSERT INTO `content` (`txt`, `json`, `content_type`, `t`, `user`) VALUES (?,?,?,?,?)", [$_POST['txt'], $j, 2, time(), $_SESSION['user_id']]);
|
||||||
|
header( 'Location: /task/' );
|
||||||
|
}
|
||||||
|
|
||||||
|
//Показываем мои задачи
|
||||||
|
$mytask=DB::getAll("SELECT * FROM `content` WHERE `content_type`=? AND `status`<>? AND `json` LIKE '%\"target_user\":\"" . $_SESSION['user_id'] . "\"%'", [2, 0]);
|
||||||
|
$c=count($mytask);
|
||||||
|
for ($i=0; $i<$c; $i++){
|
||||||
|
$mytask[$i]['array']=core::j($mytask[$i]['json']);
|
||||||
|
$mytask[$i]['avtor']=DB::getRow("SELECT * FROM `users` WHERE `id`=?", $mytask[$i]['user']);
|
||||||
|
$mytask[$i]['d']=date("d.m.Y", $mytask[$i]['t']);
|
||||||
|
}
|
||||||
|
$smarty -> assign( 'mytask', $mytask);
|
||||||
|
?>
|
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
$( function() {
|
||||||
|
$( "#srok" ).datepicker({dateFormat: "dd.mm.yy"});
|
||||||
|
})
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?php
|
||||||
|
class core
|
||||||
|
{
|
||||||
|
public static $settings = '';
|
||||||
|
public static $token = ''; // str
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
27.09.2024
|
||||||
|
Работаем с json
|
||||||
|
---------------------------------------------------------------------- */
|
||||||
|
static function j($a)
|
||||||
|
{
|
||||||
|
return (is_array($a)) ? json_encode($a, JSON_UNESCAPED_UNICODE) : json_decode($a, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,137 @@
|
||||||
|
<?php
|
||||||
|
class DB
|
||||||
|
{
|
||||||
|
public static $dsn = 'mysql:dbname=table;host=localhost';
|
||||||
|
public static $user = 'user';
|
||||||
|
public static $pass = 'password';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Объект PDO.
|
||||||
|
*/
|
||||||
|
public static $dbh = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Statement Handle.
|
||||||
|
*/
|
||||||
|
public static $sth = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Выполняемый SQL запрос.
|
||||||
|
*/
|
||||||
|
public static $query = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Подключение к БД.
|
||||||
|
*/
|
||||||
|
public static function getDbh()
|
||||||
|
{
|
||||||
|
if (!self::$dbh) {
|
||||||
|
try {
|
||||||
|
self::$dbh = new PDO(
|
||||||
|
self::$dsn,
|
||||||
|
self::$user,
|
||||||
|
self::$pass,
|
||||||
|
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")
|
||||||
|
);
|
||||||
|
self::$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
exit('Error connecting to database: ' . $e->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::$dbh;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Закрытие соединения.
|
||||||
|
*/
|
||||||
|
public static function destroy()
|
||||||
|
{
|
||||||
|
self::$dbh = null;
|
||||||
|
return self::$dbh;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Получение ошибки запроса.
|
||||||
|
*/
|
||||||
|
public static function getError()
|
||||||
|
{
|
||||||
|
$info = self::$sth->errorInfo();
|
||||||
|
return (isset($info[2])) ? 'SQL: ' . $info[2] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает структуру таблицы в виде ассоциативного массива.
|
||||||
|
*/
|
||||||
|
public static function getStructure($table)
|
||||||
|
{
|
||||||
|
$res = array();
|
||||||
|
foreach (self::getAll("SHOW COLUMNS FROM {$table}") as $row) {
|
||||||
|
$res[$row['Field']] = (is_null($row['Default'])) ? '' : $row['Default'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Добавление в таблицу, в случаи успеха вернет вставленный ID, иначе 0.
|
||||||
|
*/
|
||||||
|
public static function add($query, $param = array())
|
||||||
|
{
|
||||||
|
self::$sth = self::getDbh()->prepare($query);
|
||||||
|
return (self::$sth->execute((array) $param)) ? self::getDbh()->lastInsertId() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Выполнение запроса.
|
||||||
|
*/
|
||||||
|
public static function set($query, $param = array())
|
||||||
|
{
|
||||||
|
self::$sth = self::getDbh()->prepare($query);
|
||||||
|
return self::$sth->execute((array) $param);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Получение строки из таблицы.
|
||||||
|
*/
|
||||||
|
public static function getRow($query, $param = array())
|
||||||
|
{
|
||||||
|
self::$sth = self::getDbh()->prepare($query);
|
||||||
|
self::$sth->execute((array) $param);
|
||||||
|
return self::$sth->fetch(PDO::FETCH_ASSOC);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Получение всех строк из таблицы.
|
||||||
|
*/
|
||||||
|
public static function getAll($query, $param = array())
|
||||||
|
{
|
||||||
|
self::$sth = self::getDbh()->prepare($query);
|
||||||
|
self::$sth->execute((array) $param);
|
||||||
|
return self::$sth->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Получение значения.
|
||||||
|
*/
|
||||||
|
public static function getValue($query, $param = array(), $default = null)
|
||||||
|
{
|
||||||
|
$result = self::getRow($query, $param);
|
||||||
|
if (!empty($result)) {
|
||||||
|
$result = array_shift($result);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (empty($result)) ? $default : $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Получение столбца таблицы.
|
||||||
|
*/
|
||||||
|
public static function getColumn($query, $param = array())
|
||||||
|
{
|
||||||
|
self::$sth = self::getDbh()->prepare($query);
|
||||||
|
self::$sth->execute((array) $param);
|
||||||
|
return self::$sth->fetchAll(PDO::FETCH_COLUMN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
|
@ -0,0 +1,179 @@
|
||||||
|
Smarty: the PHP compiling template engine
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 3.0 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU Lesser General Public License below for more details.
|
||||||
|
|
||||||
|
|
||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
|
||||||
|
This version of the GNU Lesser General Public License incorporates
|
||||||
|
the terms and conditions of version 3 of the GNU General Public
|
||||||
|
License, supplemented by the additional permissions listed below.
|
||||||
|
|
||||||
|
0. Additional Definitions.
|
||||||
|
|
||||||
|
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||||
|
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||||
|
General Public License.
|
||||||
|
|
||||||
|
"The Library" refers to a covered work governed by this License,
|
||||||
|
other than an Application or a Combined Work as defined below.
|
||||||
|
|
||||||
|
An "Application" is any work that makes use of an interface provided
|
||||||
|
by the Library, but which is not otherwise based on the Library.
|
||||||
|
Defining a subclass of a class defined by the Library is deemed a mode
|
||||||
|
of using an interface provided by the Library.
|
||||||
|
|
||||||
|
A "Combined Work" is a work produced by combining or linking an
|
||||||
|
Application with the Library. The particular version of the Library
|
||||||
|
with which the Combined Work was made is also called the "Linked
|
||||||
|
Version".
|
||||||
|
|
||||||
|
The "Minimal Corresponding Source" for a Combined Work means the
|
||||||
|
Corresponding Source for the Combined Work, excluding any source code
|
||||||
|
for portions of the Combined Work that, considered in isolation, are
|
||||||
|
based on the Application, and not on the Linked Version.
|
||||||
|
|
||||||
|
The "Corresponding Application Code" for a Combined Work means the
|
||||||
|
object code and/or source code for the Application, including any data
|
||||||
|
and utility programs needed for reproducing the Combined Work from the
|
||||||
|
Application, but excluding the System Libraries of the Combined Work.
|
||||||
|
|
||||||
|
1. Exception to Section 3 of the GNU GPL.
|
||||||
|
|
||||||
|
You may convey a covered work under sections 3 and 4 of this License
|
||||||
|
without being bound by section 3 of the GNU GPL.
|
||||||
|
|
||||||
|
2. Conveying Modified Versions.
|
||||||
|
|
||||||
|
If you modify a copy of the Library, and, in your modifications, a
|
||||||
|
facility refers to a function or data to be supplied by an Application
|
||||||
|
that uses the facility (other than as an argument passed when the
|
||||||
|
facility is invoked), then you may convey a copy of the modified
|
||||||
|
version:
|
||||||
|
|
||||||
|
a) under this License, provided that you make a good faith effort to
|
||||||
|
ensure that, in the event an Application does not supply the
|
||||||
|
function or data, the facility still operates, and performs
|
||||||
|
whatever part of its purpose remains meaningful, or
|
||||||
|
|
||||||
|
b) under the GNU GPL, with none of the additional permissions of
|
||||||
|
this License applicable to that copy.
|
||||||
|
|
||||||
|
3. Object Code Incorporating Material from Library Header Files.
|
||||||
|
|
||||||
|
The object code form of an Application may incorporate material from
|
||||||
|
a header file that is part of the Library. You may convey such object
|
||||||
|
code under terms of your choice, provided that, if the incorporated
|
||||||
|
material is not limited to numerical parameters, data structure
|
||||||
|
layouts and accessors, or small macros, inline functions and templates
|
||||||
|
(ten or fewer lines in length), you do both of the following:
|
||||||
|
|
||||||
|
a) Give prominent notice with each copy of the object code that the
|
||||||
|
Library is used in it and that the Library and its use are
|
||||||
|
covered by this License.
|
||||||
|
|
||||||
|
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||||
|
document.
|
||||||
|
|
||||||
|
4. Combined Works.
|
||||||
|
|
||||||
|
You may convey a Combined Work under terms of your choice that,
|
||||||
|
taken together, effectively do not restrict modification of the
|
||||||
|
portions of the Library contained in the Combined Work and reverse
|
||||||
|
engineering for debugging such modifications, if you also do each of
|
||||||
|
the following:
|
||||||
|
|
||||||
|
a) Give prominent notice with each copy of the Combined Work that
|
||||||
|
the Library is used in it and that the Library and its use are
|
||||||
|
covered by this License.
|
||||||
|
|
||||||
|
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||||
|
document.
|
||||||
|
|
||||||
|
c) For a Combined Work that displays copyright notices during
|
||||||
|
execution, include the copyright notice for the Library among
|
||||||
|
these notices, as well as a reference directing the user to the
|
||||||
|
copies of the GNU GPL and this license document.
|
||||||
|
|
||||||
|
d) Do one of the following:
|
||||||
|
|
||||||
|
0) Convey the Minimal Corresponding Source under the terms of this
|
||||||
|
License, and the Corresponding Application Code in a form
|
||||||
|
suitable for, and under terms that permit, the user to
|
||||||
|
recombine or relink the Application with a modified version of
|
||||||
|
the Linked Version to produce a modified Combined Work, in the
|
||||||
|
manner specified by section 6 of the GNU GPL for conveying
|
||||||
|
Corresponding Source.
|
||||||
|
|
||||||
|
1) Use a suitable shared library mechanism for linking with the
|
||||||
|
Library. A suitable mechanism is one that (a) uses at run time
|
||||||
|
a copy of the Library already present on the user's computer
|
||||||
|
system, and (b) will operate properly with a modified version
|
||||||
|
of the Library that is interface-compatible with the Linked
|
||||||
|
Version.
|
||||||
|
|
||||||
|
e) Provide Installation Information, but only if you would otherwise
|
||||||
|
be required to provide such information under section 6 of the
|
||||||
|
GNU GPL, and only to the extent that such information is
|
||||||
|
necessary to install and execute a modified version of the
|
||||||
|
Combined Work produced by recombining or relinking the
|
||||||
|
Application with a modified version of the Linked Version. (If
|
||||||
|
you use option 4d0, the Installation Information must accompany
|
||||||
|
the Minimal Corresponding Source and Corresponding Application
|
||||||
|
Code. If you use option 4d1, you must provide the Installation
|
||||||
|
Information in the manner specified by section 6 of the GNU GPL
|
||||||
|
for conveying Corresponding Source.)
|
||||||
|
|
||||||
|
5. Combined Libraries.
|
||||||
|
|
||||||
|
You may place library facilities that are a work based on the
|
||||||
|
Library side by side in a single library together with other library
|
||||||
|
facilities that are not Applications and are not covered by this
|
||||||
|
License, and convey such a combined library under terms of your
|
||||||
|
choice, if you do both of the following:
|
||||||
|
|
||||||
|
a) Accompany the combined library with a copy of the same work based
|
||||||
|
on the Library, uncombined with any other library facilities,
|
||||||
|
conveyed under the terms of this License.
|
||||||
|
|
||||||
|
b) Give prominent notice with the combined library that part of it
|
||||||
|
is a work based on the Library, and explaining where to find the
|
||||||
|
accompanying uncombined form of the same work.
|
||||||
|
|
||||||
|
6. Revised Versions of the GNU Lesser General Public License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the GNU Lesser General Public License from time to time. Such new
|
||||||
|
versions will be similar in spirit to the present version, but may
|
||||||
|
differ in detail to address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Library as you received it specifies that a certain numbered version
|
||||||
|
of the GNU Lesser General Public License "or any later version"
|
||||||
|
applies to it, you have the option of following the terms and
|
||||||
|
conditions either of that published version or of any later version
|
||||||
|
published by the Free Software Foundation. If the Library as you
|
||||||
|
received it does not specify a version number of the GNU Lesser
|
||||||
|
General Public License, you may choose any version of the GNU Lesser
|
||||||
|
General Public License ever published by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Library as you received it specifies that a proxy can decide
|
||||||
|
whether future versions of the GNU Lesser General Public License shall
|
||||||
|
apply, that proxy's public statement of acceptance of any version is
|
||||||
|
permanent authorization for you to choose that version for the
|
||||||
|
Library.
|
|
@ -0,0 +1,20 @@
|
||||||
|
# Smarty template engine
|
||||||
|
Smarty is a template engine for PHP, facilitating the separation of presentation (HTML/CSS) from application logic.
|
||||||
|
|
||||||
|
![CI](https://github.com/smarty-php/smarty/workflows/CI/badge.svg)
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
Read the [documentation](https://smarty-php.github.io/smarty/) to find out how to use it.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
Smarty can be run with PHP 7.1 to PHP 8.3.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
Smarty versions 3.1.11 or later can be installed with [Composer](https://getcomposer.org/).
|
||||||
|
|
||||||
|
To get the latest stable version of Smarty use:
|
||||||
|
```bash
|
||||||
|
composer require smarty/smarty
|
||||||
|
````
|
||||||
|
|
||||||
|
More in the [Getting Started](./docs/getting-started.md) section of the docs.
|
|
@ -0,0 +1,20 @@
|
||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
Smarty currently supports the latest minor version of Smarty 3 and Smarty 4.
|
||||||
|
|
||||||
|
| Version | Supported |
|
||||||
|
|---------|--------------------|
|
||||||
|
| 4.3.x | :white_check_mark: |
|
||||||
|
| 3.1.x | :white_check_mark: |
|
||||||
|
| < 3.1 | :x: |
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
If you have discovered a security issue with Smarty, please contact us at mail [at] simonwisselink.nl. Do not
|
||||||
|
disclose your findings publicly and **PLEASE** do not file an Issue (because that would disclose your findings
|
||||||
|
publicly.)
|
||||||
|
|
||||||
|
We will try to confirm the vulnerability and develop a fix if appropriate. When we release the fix, we will publish
|
||||||
|
a security release. Please let us know if you want to be credited.
|
|
@ -0,0 +1,49 @@
|
||||||
|
{
|
||||||
|
"name": "smarty/smarty",
|
||||||
|
"type": "library",
|
||||||
|
"description": "Smarty - the compiling PHP template engine",
|
||||||
|
"keywords": [
|
||||||
|
"templating"
|
||||||
|
],
|
||||||
|
"homepage": "https://smarty-php.github.io/smarty/",
|
||||||
|
"license": "LGPL-3.0",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Monte Ohrt",
|
||||||
|
"email": "monte@ohrt.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Uwe Tews",
|
||||||
|
"email": "uwe.tews@googlemail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Rodney Rehm",
|
||||||
|
"email": "rodney.rehm@medialize.de"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Simon Wisselink",
|
||||||
|
"homepage": "https://www.iwink.nl/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/smarty-php/smarty/issues",
|
||||||
|
"forum": "https://github.com/smarty-php/smarty/discussions"
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^7.1 || ^8.0"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"libs/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "4.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^8.5 || ^7.5",
|
||||||
|
"smarty/smarty-lexer": "^3.1"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
title = Welcome to Smarty!
|
||||||
|
cutoff_size = 40
|
||||||
|
|
||||||
|
[setup]
|
||||||
|
bold = true
|
|
@ -0,0 +1,35 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Example Application
|
||||||
|
*
|
||||||
|
* @package Example-application
|
||||||
|
*/
|
||||||
|
require '../libs/Smarty.class.php';
|
||||||
|
$smarty = new Smarty;
|
||||||
|
//$smarty->force_compile = true;
|
||||||
|
$smarty->debugging = true;
|
||||||
|
$smarty->caching = true;
|
||||||
|
$smarty->cache_lifetime = 120;
|
||||||
|
$smarty->assign("Name", "Fred Irving Johnathan Bradley Peppergill", true);
|
||||||
|
$smarty->assign("FirstName", array("John", "Mary", "James", "Henry"));
|
||||||
|
$smarty->assign("LastName", array("Doe", "Smith", "Johnson", "Case"));
|
||||||
|
$smarty->assign(
|
||||||
|
"Class",
|
||||||
|
array(
|
||||||
|
array("A", "B", "C", "D"),
|
||||||
|
array("E", "F", "G", "H"),
|
||||||
|
array("I", "J", "K", "L"),
|
||||||
|
array("M", "N", "O", "P")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$smarty->assign(
|
||||||
|
"contacts",
|
||||||
|
array(
|
||||||
|
array("phone" => "1", "fax" => "2", "cell" => "3"),
|
||||||
|
array("phone" => "555-4444", "fax" => "555-3333", "cell" => "760-1234")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$smarty->assign("option_values", array("NY", "NE", "KS", "IA", "OK", "TX"));
|
||||||
|
$smarty->assign("option_output", array("New York", "Nebraska", "Kansas", "Iowa", "Oklahoma", "Texas"));
|
||||||
|
$smarty->assign("option_selected", "NE");
|
||||||
|
$smarty->display('index.tpl');
|
|
@ -0,0 +1,85 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* APC CacheResource
|
||||||
|
* CacheResource Implementation based on the KeyValueStore API to use
|
||||||
|
* memcache as the storage resource for Smarty's output caching.
|
||||||
|
* *
|
||||||
|
*
|
||||||
|
* @package CacheResource-examples
|
||||||
|
* @author Uwe Tews
|
||||||
|
*/
|
||||||
|
class Smarty_CacheResource_Apc extends Smarty_CacheResource_KeyValueStore
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Smarty_CacheResource_Apc constructor.
|
||||||
|
*
|
||||||
|
* @throws \Exception
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
// test if APC is present
|
||||||
|
if (!function_exists('apc_cache_info')) {
|
||||||
|
throw new Exception('APC Template Caching Error: APC is not installed');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read values for a set of keys from cache
|
||||||
|
*
|
||||||
|
* @param array $keys list of keys to fetch
|
||||||
|
*
|
||||||
|
* @return array list of values with the given keys used as indexes
|
||||||
|
* @return boolean true on success, false on failure
|
||||||
|
*/
|
||||||
|
protected function read(array $keys)
|
||||||
|
{
|
||||||
|
$_res = array();
|
||||||
|
$res = apc_fetch($keys);
|
||||||
|
foreach ($res as $k => $v) {
|
||||||
|
$_res[ $k ] = $v;
|
||||||
|
}
|
||||||
|
return $_res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save values for a set of keys to cache
|
||||||
|
*
|
||||||
|
* @param array $keys list of values to save
|
||||||
|
* @param int $expire expiration time
|
||||||
|
*
|
||||||
|
* @return boolean true on success, false on failure
|
||||||
|
*/
|
||||||
|
protected function write(array $keys, $expire = null)
|
||||||
|
{
|
||||||
|
foreach ($keys as $k => $v) {
|
||||||
|
apc_store($k, $v, $expire);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove values from cache
|
||||||
|
*
|
||||||
|
* @param array $keys list of keys to delete
|
||||||
|
*
|
||||||
|
* @return boolean true on success, false on failure
|
||||||
|
*/
|
||||||
|
protected function delete(array $keys)
|
||||||
|
{
|
||||||
|
foreach ($keys as $k) {
|
||||||
|
apc_delete($k);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove *all* values from cache
|
||||||
|
*
|
||||||
|
* @return boolean true on success, false on failure
|
||||||
|
*/
|
||||||
|
protected function purge()
|
||||||
|
{
|
||||||
|
return apc_clear_cache('user');
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Memcache CacheResource
|
||||||
|
* CacheResource Implementation based on the KeyValueStore API to use
|
||||||
|
* memcache as the storage resource for Smarty's output caching.
|
||||||
|
* Note that memcache has a limitation of 256 characters per cache-key.
|
||||||
|
* To avoid complications all cache-keys are translated to a sha1 hash.
|
||||||
|
*
|
||||||
|
* @package CacheResource-examples
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*/
|
||||||
|
class Smarty_CacheResource_Memcache extends Smarty_CacheResource_KeyValueStore
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* memcache instance
|
||||||
|
*
|
||||||
|
* @var Memcache
|
||||||
|
*/
|
||||||
|
protected $memcache = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty_CacheResource_Memcache constructor.
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
if (class_exists('Memcached')) {
|
||||||
|
$this->memcache = new Memcached();
|
||||||
|
} else {
|
||||||
|
$this->memcache = new Memcache();
|
||||||
|
}
|
||||||
|
$this->memcache->addServer('127.0.0.1', 11211);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read values for a set of keys from cache
|
||||||
|
*
|
||||||
|
* @param array $keys list of keys to fetch
|
||||||
|
*
|
||||||
|
* @return array list of values with the given keys used as indexes
|
||||||
|
* @return boolean true on success, false on failure
|
||||||
|
*/
|
||||||
|
protected function read(array $keys)
|
||||||
|
{
|
||||||
|
$res = array();
|
||||||
|
foreach ($keys as $key) {
|
||||||
|
$k = sha1($key);
|
||||||
|
$res[$key] = $this->memcache->get($k);
|
||||||
|
}
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save values for a set of keys to cache
|
||||||
|
*
|
||||||
|
* @param array $keys list of values to save
|
||||||
|
* @param int $expire expiration time
|
||||||
|
*
|
||||||
|
* @return boolean true on success, false on failure
|
||||||
|
*/
|
||||||
|
protected function write(array $keys, $expire = null)
|
||||||
|
{
|
||||||
|
foreach ($keys as $k => $v) {
|
||||||
|
$k = sha1($k);
|
||||||
|
if (class_exists('Memcached')) {
|
||||||
|
$this->memcache->set($k, $v, $expire);
|
||||||
|
} else {
|
||||||
|
$this->memcache->set($k, $v, 0, $expire);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove values from cache
|
||||||
|
*
|
||||||
|
* @param array $keys list of keys to delete
|
||||||
|
*
|
||||||
|
* @return boolean true on success, false on failure
|
||||||
|
*/
|
||||||
|
protected function delete(array $keys)
|
||||||
|
{
|
||||||
|
foreach ($keys as $k) {
|
||||||
|
$k = sha1($k);
|
||||||
|
$this->memcache->delete($k);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove *all* values from cache
|
||||||
|
*
|
||||||
|
* @return boolean true on success, false on failure
|
||||||
|
*/
|
||||||
|
protected function purge()
|
||||||
|
{
|
||||||
|
return $this->memcache->flush();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,183 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MySQL CacheResource
|
||||||
|
* CacheResource Implementation based on the Custom API to use
|
||||||
|
* MySQL as the storage resource for Smarty's output caching.
|
||||||
|
* Table definition:
|
||||||
|
* <pre>CREATE TABLE IF NOT EXISTS `output_cache` (
|
||||||
|
* `id` CHAR(40) NOT NULL COMMENT 'sha1 hash',
|
||||||
|
* `name` VARCHAR(250) NOT NULL,
|
||||||
|
* `cache_id` VARCHAR(250) NULL DEFAULT NULL,
|
||||||
|
* `compile_id` VARCHAR(250) NULL DEFAULT NULL,
|
||||||
|
* `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
* `content` LONGTEXT NOT NULL,
|
||||||
|
* PRIMARY KEY (`id`),
|
||||||
|
* INDEX(`name`),
|
||||||
|
* INDEX(`cache_id`),
|
||||||
|
* INDEX(`compile_id`),
|
||||||
|
* INDEX(`modified`)
|
||||||
|
* ) ENGINE = InnoDB;</pre>
|
||||||
|
*
|
||||||
|
* @package CacheResource-examples
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*/
|
||||||
|
class Smarty_CacheResource_Mysql extends Smarty_CacheResource_Custom
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var \PDO
|
||||||
|
*/
|
||||||
|
protected $db;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \PDOStatement
|
||||||
|
*/
|
||||||
|
protected $fetch;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \PDOStatement
|
||||||
|
*/
|
||||||
|
protected $fetchTimestamp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \PDOStatement
|
||||||
|
*/
|
||||||
|
protected $save;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty_CacheResource_Mysql constructor.
|
||||||
|
*
|
||||||
|
* @throws \SmartyException
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty");
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||||
|
}
|
||||||
|
$this->fetch = $this->db->prepare('SELECT modified, content FROM output_cache WHERE id = :id');
|
||||||
|
$this->fetchTimestamp = $this->db->prepare('SELECT modified FROM output_cache WHERE id = :id');
|
||||||
|
$this->save = $this->db->prepare(
|
||||||
|
'REPLACE INTO output_cache (id, name, cache_id, compile_id, content)
|
||||||
|
VALUES (:id, :name, :cache_id, :compile_id, :content)'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fetch cached content and its modification time from data source
|
||||||
|
*
|
||||||
|
* @param string $id unique cache content identifier
|
||||||
|
* @param string $name template name
|
||||||
|
* @param string $cache_id cache id
|
||||||
|
* @param string $compile_id compile id
|
||||||
|
* @param string $content cached content
|
||||||
|
* @param integer $mtime cache modification timestamp (epoch)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function fetch($id, $name, $cache_id, $compile_id, &$content, &$mtime)
|
||||||
|
{
|
||||||
|
$this->fetch->execute(array('id' => $id));
|
||||||
|
$row = $this->fetch->fetch();
|
||||||
|
$this->fetch->closeCursor();
|
||||||
|
if ($row) {
|
||||||
|
$content = $row[ 'content' ];
|
||||||
|
$mtime = strtotime($row[ 'modified' ]);
|
||||||
|
} else {
|
||||||
|
$content = null;
|
||||||
|
$mtime = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch cached content's modification timestamp from data source
|
||||||
|
*
|
||||||
|
* @note implementing this method is optional. Only implement it if modification times can be accessed faster than
|
||||||
|
* loading the complete cached content.
|
||||||
|
*
|
||||||
|
* @param string $id unique cache content identifier
|
||||||
|
* @param string $name template name
|
||||||
|
* @param string $cache_id cache id
|
||||||
|
* @param string $compile_id compile id
|
||||||
|
*
|
||||||
|
* @return integer|boolean timestamp (epoch) the template was modified, or false if not found
|
||||||
|
*/
|
||||||
|
protected function fetchTimestamp($id, $name, $cache_id, $compile_id)
|
||||||
|
{
|
||||||
|
$this->fetchTimestamp->execute(array('id' => $id));
|
||||||
|
$mtime = strtotime($this->fetchTimestamp->fetchColumn());
|
||||||
|
$this->fetchTimestamp->closeCursor();
|
||||||
|
return $mtime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save content to cache
|
||||||
|
*
|
||||||
|
* @param string $id unique cache content identifier
|
||||||
|
* @param string $name template name
|
||||||
|
* @param string $cache_id cache id
|
||||||
|
* @param string $compile_id compile id
|
||||||
|
* @param integer|null $exp_time seconds till expiration time in seconds or null
|
||||||
|
* @param string $content content to cache
|
||||||
|
*
|
||||||
|
* @return boolean success
|
||||||
|
*/
|
||||||
|
protected function save($id, $name, $cache_id, $compile_id, $exp_time, $content)
|
||||||
|
{
|
||||||
|
$this->save->execute(
|
||||||
|
array('id' => $id,
|
||||||
|
'name' => $name,
|
||||||
|
'cache_id' => $cache_id,
|
||||||
|
'compile_id' => $compile_id,
|
||||||
|
'content' => $content,)
|
||||||
|
);
|
||||||
|
return !!$this->save->rowCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete content from cache
|
||||||
|
*
|
||||||
|
* @param string $name template name
|
||||||
|
* @param string $cache_id cache id
|
||||||
|
* @param string $compile_id compile id
|
||||||
|
* @param integer|null $exp_time seconds till expiration or null
|
||||||
|
*
|
||||||
|
* @return integer number of deleted caches
|
||||||
|
*/
|
||||||
|
protected function delete($name, $cache_id, $compile_id, $exp_time)
|
||||||
|
{
|
||||||
|
// delete the whole cache
|
||||||
|
if ($name === null && $cache_id === null && $compile_id === null && $exp_time === null) {
|
||||||
|
// returning the number of deleted caches would require a second query to count them
|
||||||
|
$query = $this->db->query('TRUNCATE TABLE output_cache');
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
// build the filter
|
||||||
|
$where = array();
|
||||||
|
// equal test name
|
||||||
|
if ($name !== null) {
|
||||||
|
$where[] = 'name = ' . $this->db->quote($name);
|
||||||
|
}
|
||||||
|
// equal test compile_id
|
||||||
|
if ($compile_id !== null) {
|
||||||
|
$where[] = 'compile_id = ' . $this->db->quote($compile_id);
|
||||||
|
}
|
||||||
|
// range test expiration time
|
||||||
|
if ($exp_time !== null) {
|
||||||
|
$where[] = 'modified < DATE_SUB(NOW(), INTERVAL ' . intval($exp_time) . ' SECOND)';
|
||||||
|
}
|
||||||
|
// equal test cache_id and match sub-groups
|
||||||
|
if ($cache_id !== null) {
|
||||||
|
$where[] =
|
||||||
|
'(cache_id = ' .
|
||||||
|
$this->db->quote($cache_id) .
|
||||||
|
' OR cache_id LIKE ' .
|
||||||
|
$this->db->quote($cache_id . '|%') .
|
||||||
|
')';
|
||||||
|
}
|
||||||
|
// run delete query
|
||||||
|
$query = $this->db->query('DELETE FROM output_cache WHERE ' . join(' AND ', $where));
|
||||||
|
return $query->rowCount();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,346 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PDO Cache Handler
|
||||||
|
* Allows you to store Smarty Cache files into your db.
|
||||||
|
* Example table :
|
||||||
|
* CREATE TABLE `smarty_cache` (
|
||||||
|
* `id` char(40) NOT NULL COMMENT 'sha1 hash',
|
||||||
|
* `name` varchar(250) NOT NULL,
|
||||||
|
* `cache_id` varchar(250) DEFAULT NULL,
|
||||||
|
* `compile_id` varchar(250) DEFAULT NULL,
|
||||||
|
* `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
* `expire` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||||
|
* `content` mediumblob NOT NULL,
|
||||||
|
* PRIMARY KEY (`id`),
|
||||||
|
* KEY `name` (`name`),
|
||||||
|
* KEY `cache_id` (`cache_id`),
|
||||||
|
* KEY `compile_id` (`compile_id`),
|
||||||
|
* KEY `modified` (`modified`),
|
||||||
|
* KEY `expire` (`expire`)
|
||||||
|
* ) ENGINE=InnoDB
|
||||||
|
* Example usage :
|
||||||
|
* $cnx = new PDO("mysql:host=localhost;dbname=mydb", "username", "password");
|
||||||
|
* $smarty->setCachingType('pdo');
|
||||||
|
* $smarty->loadPlugin('Smarty_CacheResource_Pdo');
|
||||||
|
* $smarty->registerCacheResource('pdo', new Smarty_CacheResource_Pdo($cnx, 'smarty_cache'));
|
||||||
|
*
|
||||||
|
* @author Beno!t POLASZEK - 2014
|
||||||
|
*/
|
||||||
|
class Smarty_CacheResource_Pdo extends Smarty_CacheResource_Custom
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var string[]
|
||||||
|
*/
|
||||||
|
protected $fetchStatements = array('default' => 'SELECT %2$s
|
||||||
|
FROM %1$s
|
||||||
|
WHERE 1
|
||||||
|
AND id = :id
|
||||||
|
AND cache_id IS NULL
|
||||||
|
AND compile_id IS NULL',
|
||||||
|
'withCacheId' => 'SELECT %2$s
|
||||||
|
FROM %1$s
|
||||||
|
WHERE 1
|
||||||
|
AND id = :id
|
||||||
|
AND cache_id = :cache_id
|
||||||
|
AND compile_id IS NULL',
|
||||||
|
'withCompileId' => 'SELECT %2$s
|
||||||
|
FROM %1$s
|
||||||
|
WHERE 1
|
||||||
|
AND id = :id
|
||||||
|
AND compile_id = :compile_id
|
||||||
|
AND cache_id IS NULL',
|
||||||
|
'withCacheIdAndCompileId' => 'SELECT %2$s
|
||||||
|
FROM %1$s
|
||||||
|
WHERE 1
|
||||||
|
AND id = :id
|
||||||
|
AND cache_id = :cache_id
|
||||||
|
AND compile_id = :compile_id');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $insertStatement = 'INSERT INTO %s
|
||||||
|
|
||||||
|
SET id = :id,
|
||||||
|
name = :name,
|
||||||
|
cache_id = :cache_id,
|
||||||
|
compile_id = :compile_id,
|
||||||
|
modified = CURRENT_TIMESTAMP,
|
||||||
|
expire = DATE_ADD(CURRENT_TIMESTAMP, INTERVAL :expire SECOND),
|
||||||
|
content = :content
|
||||||
|
|
||||||
|
ON DUPLICATE KEY UPDATE
|
||||||
|
name = :name,
|
||||||
|
cache_id = :cache_id,
|
||||||
|
compile_id = :compile_id,
|
||||||
|
modified = CURRENT_TIMESTAMP,
|
||||||
|
expire = DATE_ADD(CURRENT_TIMESTAMP, INTERVAL :expire SECOND),
|
||||||
|
content = :content';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $deleteStatement = 'DELETE FROM %1$s WHERE %2$s';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $truncateStatement = 'TRUNCATE TABLE %s';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $fetchColumns = 'modified, content';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $fetchTimestampColumns = 'modified';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \PDO
|
||||||
|
*/
|
||||||
|
protected $pdo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var
|
||||||
|
*/
|
||||||
|
protected $table;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var null
|
||||||
|
*/
|
||||||
|
protected $database;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @param PDO $pdo PDO : active connection
|
||||||
|
* @param string $table : table (or view) name
|
||||||
|
* @param string $database : optional - if table is located in another db
|
||||||
|
*
|
||||||
|
* @throws \SmartyException
|
||||||
|
*/
|
||||||
|
public function __construct(PDO $pdo, $table, $database = null)
|
||||||
|
{
|
||||||
|
if (is_null($table)) {
|
||||||
|
throw new SmartyException("Table name for caching can't be null");
|
||||||
|
}
|
||||||
|
$this->pdo = $pdo;
|
||||||
|
$this->table = $table;
|
||||||
|
$this->database = $database;
|
||||||
|
$this->fillStatementsWithTableName();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fills the table name into the statements.
|
||||||
|
*
|
||||||
|
* @return $this Current Instance
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected function fillStatementsWithTableName()
|
||||||
|
{
|
||||||
|
foreach ($this->fetchStatements as &$statement) {
|
||||||
|
$statement = sprintf($statement, $this->getTableName(), '%s');
|
||||||
|
}
|
||||||
|
$this->insertStatement = sprintf($this->insertStatement, $this->getTableName());
|
||||||
|
$this->deleteStatement = sprintf($this->deleteStatement, $this->getTableName(), '%s');
|
||||||
|
$this->truncateStatement = sprintf($this->truncateStatement, $this->getTableName());
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the fetch statement, depending on what you specify
|
||||||
|
*
|
||||||
|
* @param string $columns : the column(s) name(s) you want to retrieve from the database
|
||||||
|
* @param string $id unique cache content identifier
|
||||||
|
* @param string|null $cache_id cache id
|
||||||
|
* @param string|null $compile_id compile id
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @return \PDOStatement
|
||||||
|
*/
|
||||||
|
protected function getFetchStatement($columns, $id, $cache_id = null, $compile_id = null)
|
||||||
|
{
|
||||||
|
$args = array();
|
||||||
|
if (!is_null($cache_id) && !is_null($compile_id)) {
|
||||||
|
$query = $this->fetchStatements[ 'withCacheIdAndCompileId' ] and
|
||||||
|
$args = array('id' => $id, 'cache_id' => $cache_id, 'compile_id' => $compile_id);
|
||||||
|
} elseif (is_null($cache_id) && !is_null($compile_id)) {
|
||||||
|
$query = $this->fetchStatements[ 'withCompileId' ] and
|
||||||
|
$args = array('id' => $id, 'compile_id' => $compile_id);
|
||||||
|
} elseif (!is_null($cache_id) && is_null($compile_id)) {
|
||||||
|
$query = $this->fetchStatements[ 'withCacheId' ] and $args = array('id' => $id, 'cache_id' => $cache_id);
|
||||||
|
} else {
|
||||||
|
$query = $this->fetchStatements[ 'default' ] and $args = array('id' => $id);
|
||||||
|
}
|
||||||
|
$query = sprintf($query, $columns);
|
||||||
|
$stmt = $this->pdo->prepare($query);
|
||||||
|
foreach ($args as $key => $value) {
|
||||||
|
$stmt->bindValue($key, $value);
|
||||||
|
}
|
||||||
|
return $stmt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fetch cached content and its modification time from data source
|
||||||
|
*
|
||||||
|
* @param string $id unique cache content identifier
|
||||||
|
* @param string $name template name
|
||||||
|
* @param string|null $cache_id cache id
|
||||||
|
* @param string|null $compile_id compile id
|
||||||
|
* @param string $content cached content
|
||||||
|
* @param integer $mtime cache modification timestamp (epoch)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected function fetch($id, $name, $cache_id, $compile_id, &$content, &$mtime)
|
||||||
|
{
|
||||||
|
$stmt = $this->getFetchStatement($this->fetchColumns, $id, $cache_id, $compile_id);
|
||||||
|
$stmt->execute();
|
||||||
|
$row = $stmt->fetch();
|
||||||
|
$stmt->closeCursor();
|
||||||
|
if ($row) {
|
||||||
|
$content = $this->outputContent($row[ 'content' ]);
|
||||||
|
$mtime = strtotime($row[ 'modified' ]);
|
||||||
|
} else {
|
||||||
|
$content = null;
|
||||||
|
$mtime = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch cached content's modification timestamp from data source
|
||||||
|
* {@internal implementing this method is optional.
|
||||||
|
* Only implement it if modification times can be accessed faster than loading the complete cached content.}}
|
||||||
|
*
|
||||||
|
* @param string $id unique cache content identifier
|
||||||
|
* @param string $name template name
|
||||||
|
* @param string|null $cache_id cache id
|
||||||
|
* @param string|null $compile_id compile id
|
||||||
|
*
|
||||||
|
* @return integer|boolean timestamp (epoch) the template was modified, or false if not found
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
// protected function fetchTimestamp($id, $name, $cache_id = null, $compile_id = null) {
|
||||||
|
// $stmt = $this->getFetchStatement($this->fetchTimestampColumns, $id, $cache_id, $compile_id);
|
||||||
|
// $stmt -> execute();
|
||||||
|
// $mtime = strtotime($stmt->fetchColumn());
|
||||||
|
// $stmt -> closeCursor();
|
||||||
|
// return $mtime;
|
||||||
|
// }
|
||||||
|
/**
|
||||||
|
* Save content to cache
|
||||||
|
*
|
||||||
|
* @param string $id unique cache content identifier
|
||||||
|
* @param string $name template name
|
||||||
|
* @param string|null $cache_id cache id
|
||||||
|
* @param string|null $compile_id compile id
|
||||||
|
* @param integer|null $exp_time seconds till expiration time in seconds or null
|
||||||
|
* @param string $content content to cache
|
||||||
|
*
|
||||||
|
* @return boolean success
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected function save($id, $name, $cache_id, $compile_id, $exp_time, $content)
|
||||||
|
{
|
||||||
|
$stmt = $this->pdo->prepare($this->insertStatement);
|
||||||
|
$stmt->bindValue('id', $id);
|
||||||
|
$stmt->bindValue('name', $name);
|
||||||
|
$stmt->bindValue('cache_id', $cache_id, (is_null($cache_id)) ? PDO::PARAM_NULL : PDO::PARAM_STR);
|
||||||
|
$stmt->bindValue('compile_id', $compile_id, (is_null($compile_id)) ? PDO::PARAM_NULL : PDO::PARAM_STR);
|
||||||
|
$stmt->bindValue('expire', (int)$exp_time, PDO::PARAM_INT);
|
||||||
|
$stmt->bindValue('content', $this->inputContent($content));
|
||||||
|
$stmt->execute();
|
||||||
|
return !!$stmt->rowCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes the content before saving to database
|
||||||
|
*
|
||||||
|
* @param string $content
|
||||||
|
*
|
||||||
|
* @return string $content
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected function inputContent($content)
|
||||||
|
{
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decodes the content before saving to database
|
||||||
|
*
|
||||||
|
* @param string $content
|
||||||
|
*
|
||||||
|
* @return string $content
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected function outputContent($content)
|
||||||
|
{
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete content from cache
|
||||||
|
*
|
||||||
|
* @param string|null $name template name
|
||||||
|
* @param string|null $cache_id cache id
|
||||||
|
* @param string|null $compile_id compile id
|
||||||
|
* @param integer|null|-1 $exp_time seconds till expiration or null
|
||||||
|
*
|
||||||
|
* @return integer number of deleted caches
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected function delete($name = null, $cache_id = null, $compile_id = null, $exp_time = null)
|
||||||
|
{
|
||||||
|
// delete the whole cache
|
||||||
|
if ($name === null && $cache_id === null && $compile_id === null && $exp_time === null) {
|
||||||
|
// returning the number of deleted caches would require a second query to count them
|
||||||
|
$this->pdo->query($this->truncateStatement);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
// build the filter
|
||||||
|
$where = array();
|
||||||
|
// equal test name
|
||||||
|
if ($name !== null) {
|
||||||
|
$where[] = 'name = ' . $this->pdo->quote($name);
|
||||||
|
}
|
||||||
|
// equal test cache_id and match sub-groups
|
||||||
|
if ($cache_id !== null) {
|
||||||
|
$where[] =
|
||||||
|
'(cache_id = ' .
|
||||||
|
$this->pdo->quote($cache_id) .
|
||||||
|
' OR cache_id LIKE ' .
|
||||||
|
$this->pdo->quote($cache_id . '|%') .
|
||||||
|
')';
|
||||||
|
}
|
||||||
|
// equal test compile_id
|
||||||
|
if ($compile_id !== null) {
|
||||||
|
$where[] = 'compile_id = ' . $this->pdo->quote($compile_id);
|
||||||
|
}
|
||||||
|
// for clearing expired caches
|
||||||
|
if ($exp_time === Smarty::CLEAR_EXPIRED) {
|
||||||
|
$where[] = 'expire < CURRENT_TIMESTAMP';
|
||||||
|
} // range test expiration time
|
||||||
|
elseif ($exp_time !== null) {
|
||||||
|
$where[] = 'modified < DATE_SUB(NOW(), INTERVAL ' . intval($exp_time) . ' SECOND)';
|
||||||
|
}
|
||||||
|
// run delete query
|
||||||
|
$query = $this->pdo->query(sprintf($this->deleteStatement, join(' AND ', $where)));
|
||||||
|
return $query->rowCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the formatted table name
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected function getTableName()
|
||||||
|
{
|
||||||
|
return (is_null($this->database)) ? "`{$this->table}`" : "`{$this->database}`.`{$this->table}`";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
<?php
|
||||||
|
require_once 'cacheresource.pdo.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PDO Cache Handler with GZIP support
|
||||||
|
* Example usage :
|
||||||
|
* $cnx = new PDO("mysql:host=localhost;dbname=mydb", "username", "password");
|
||||||
|
* $smarty->setCachingType('pdo_gzip');
|
||||||
|
* $smarty->loadPlugin('Smarty_CacheResource_Pdo_Gzip');
|
||||||
|
* $smarty->registerCacheResource('pdo_gzip', new Smarty_CacheResource_Pdo_Gzip($cnx, 'smarty_cache'));
|
||||||
|
*
|
||||||
|
* @require Smarty_CacheResource_Pdo class
|
||||||
|
* @author Beno!t POLASZEK - 2014
|
||||||
|
*/
|
||||||
|
class Smarty_CacheResource_Pdo_Gzip extends Smarty_CacheResource_Pdo
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Encodes the content before saving to database
|
||||||
|
*
|
||||||
|
* @param string $content
|
||||||
|
*
|
||||||
|
* @return string $content
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected function inputContent($content)
|
||||||
|
{
|
||||||
|
return gzdeflate($content);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decodes the content before saving to database
|
||||||
|
*
|
||||||
|
* @param string $content
|
||||||
|
*
|
||||||
|
* @return string $content
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected function outputContent($content)
|
||||||
|
{
|
||||||
|
return gzinflate($content);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extends All Resource
|
||||||
|
* Resource Implementation modifying the extends-Resource to walk
|
||||||
|
* through the template_dirs and inherit all templates of the same name
|
||||||
|
*
|
||||||
|
* @package Resource-examples
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*/
|
||||||
|
class Smarty_Resource_Extendsall extends Smarty_Internal_Resource_Extends
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* populate Source Object with meta data from Resource
|
||||||
|
*
|
||||||
|
* @param Smarty_Template_Source $source source object
|
||||||
|
* @param Smarty_Internal_Template $_template template object
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null)
|
||||||
|
{
|
||||||
|
$uid = '';
|
||||||
|
$sources = array();
|
||||||
|
$timestamp = 0;
|
||||||
|
foreach ($source->smarty->getTemplateDir() as $key => $directory) {
|
||||||
|
try {
|
||||||
|
$s = Smarty_Resource::source(null, $source->smarty, 'file:' . '[' . $key . ']' . $source->name);
|
||||||
|
if (!$s->exists) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$sources[ $s->uid ] = $s;
|
||||||
|
$uid .= $s->filepath;
|
||||||
|
$timestamp = $s->timestamp > $timestamp ? $s->timestamp : $timestamp;
|
||||||
|
} catch (SmartyException $e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!$sources) {
|
||||||
|
$source->exists = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$sources = array_reverse($sources, true);
|
||||||
|
reset($sources);
|
||||||
|
$s = current($sources);
|
||||||
|
$source->components = $sources;
|
||||||
|
$source->filepath = $s->filepath;
|
||||||
|
$source->uid = sha1($uid . $source->smarty->_joined_template_dir);
|
||||||
|
$source->exists = true;
|
||||||
|
$source->timestamp = $timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable timestamp checks for extendsall resource.
|
||||||
|
* The individual source components will be checked.
|
||||||
|
*
|
||||||
|
* @return bool false
|
||||||
|
*/
|
||||||
|
public function checkTimestamps()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,101 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MySQL Resource
|
||||||
|
* Resource Implementation based on the Custom API to use
|
||||||
|
* MySQL as the storage resource for Smarty's templates and configs.
|
||||||
|
* Table definition:
|
||||||
|
* <pre>CREATE TABLE IF NOT EXISTS `templates` (
|
||||||
|
* `name` varchar(100) NOT NULL,
|
||||||
|
* `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
|
* `source` text,
|
||||||
|
* PRIMARY KEY (`name`)
|
||||||
|
* ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre>
|
||||||
|
* Demo data:
|
||||||
|
* <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello
|
||||||
|
* world"}{$x}');</pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @package Resource-examples
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*/
|
||||||
|
class Smarty_Resource_Mysql extends Smarty_Resource_Custom
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* PDO instance
|
||||||
|
*
|
||||||
|
* @var \PDO
|
||||||
|
*/
|
||||||
|
protected $db;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* prepared fetch() statement
|
||||||
|
*
|
||||||
|
* @var \PDOStatement
|
||||||
|
*/
|
||||||
|
protected $fetch;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* prepared fetchTimestamp() statement
|
||||||
|
*
|
||||||
|
* @var \PDOStatement
|
||||||
|
*/
|
||||||
|
protected $mtime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty_Resource_Mysql constructor.
|
||||||
|
*
|
||||||
|
* @throws \SmartyException
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty");
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||||
|
}
|
||||||
|
$this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
|
||||||
|
$this->mtime = $this->db->prepare('SELECT modified FROM templates WHERE name = :name');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch a template and its modification time from database
|
||||||
|
*
|
||||||
|
* @param string $name template name
|
||||||
|
* @param string $source template source
|
||||||
|
* @param integer $mtime template modification timestamp (epoch)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function fetch($name, &$source, &$mtime)
|
||||||
|
{
|
||||||
|
$this->fetch->execute(array('name' => $name));
|
||||||
|
$row = $this->fetch->fetch();
|
||||||
|
$this->fetch->closeCursor();
|
||||||
|
if ($row) {
|
||||||
|
$source = $row[ 'source' ];
|
||||||
|
$mtime = strtotime($row[ 'modified' ]);
|
||||||
|
} else {
|
||||||
|
$source = null;
|
||||||
|
$mtime = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch a template's modification time from database
|
||||||
|
*
|
||||||
|
* @note implementing this method is optional. Only implement it if modification times can be accessed faster than
|
||||||
|
* loading the comple template source.
|
||||||
|
*
|
||||||
|
* @param string $name template name
|
||||||
|
*
|
||||||
|
* @return integer timestamp (epoch) the template was modified
|
||||||
|
*/
|
||||||
|
protected function fetchTimestamp($name)
|
||||||
|
{
|
||||||
|
$this->mtime->execute(array('name' => $name));
|
||||||
|
$mtime = $this->mtime->fetchColumn();
|
||||||
|
$this->mtime->closeCursor();
|
||||||
|
return strtotime($mtime);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MySQL Resource
|
||||||
|
* Resource Implementation based on the Custom API to use
|
||||||
|
* MySQL as the storage resource for Smarty's templates and configs.
|
||||||
|
* Note that this MySQL implementation fetches the source and timestamps in
|
||||||
|
* a single database query, instead of two separate like resource.mysql.php does.
|
||||||
|
* Table definition:
|
||||||
|
* <pre>CREATE TABLE IF NOT EXISTS `templates` (
|
||||||
|
* `name` varchar(100) NOT NULL,
|
||||||
|
* `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
|
* `source` text,
|
||||||
|
* PRIMARY KEY (`name`)
|
||||||
|
* ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre>
|
||||||
|
* Demo data:
|
||||||
|
* <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello
|
||||||
|
* world"}{$x}');</pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @package Resource-examples
|
||||||
|
* @author Rodney Rehm
|
||||||
|
*/
|
||||||
|
class Smarty_Resource_Mysqls extends Smarty_Resource_Custom
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* PDO instance
|
||||||
|
*
|
||||||
|
* @var \PDO
|
||||||
|
*/
|
||||||
|
protected $db;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* prepared fetch() statement
|
||||||
|
*
|
||||||
|
* @var \PDOStatement
|
||||||
|
*/
|
||||||
|
protected $fetch;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty_Resource_Mysqls constructor.
|
||||||
|
*
|
||||||
|
* @throws \SmartyException
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty");
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||||
|
}
|
||||||
|
$this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch a template and its modification time from database
|
||||||
|
*
|
||||||
|
* @param string $name template name
|
||||||
|
* @param string $source template source
|
||||||
|
* @param integer $mtime template modification timestamp (epoch)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function fetch($name, &$source, &$mtime)
|
||||||
|
{
|
||||||
|
$this->fetch->execute(array('name' => $name));
|
||||||
|
$row = $this->fetch->fetch();
|
||||||
|
$this->fetch->closeCursor();
|
||||||
|
if ($row) {
|
||||||
|
$source = $row[ 'source' ];
|
||||||
|
$mtime = strtotime($row[ 'modified' ]);
|
||||||
|
} else {
|
||||||
|
$source = null;
|
||||||
|
$mtime = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
</BODY>
|
||||||
|
</HTML>
|
|
@ -0,0 +1,5 @@
|
||||||
|
<HTML>
|
||||||
|
<HEAD>
|
||||||
|
<TITLE>{$title} - {$Name}</TITLE>
|
||||||
|
</HEAD>
|
||||||
|
<BODY bgcolor="#ffffff">
|
|
@ -0,0 +1,87 @@
|
||||||
|
{config_load file="test.conf" section="setup"}
|
||||||
|
{include file="header.tpl" title=foo}
|
||||||
|
|
||||||
|
<PRE>
|
||||||
|
|
||||||
|
{* bold and title are read from the config file *}
|
||||||
|
{if #bold#}<b>{/if}
|
||||||
|
{* capitalize the first letters of each word of the title *}
|
||||||
|
Title: {#title#|capitalize}
|
||||||
|
{if #bold#}</b>{/if}
|
||||||
|
|
||||||
|
The current date and time is {$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}
|
||||||
|
|
||||||
|
The value of global assigned variable $SCRIPT_NAME is {$SCRIPT_NAME}
|
||||||
|
|
||||||
|
Example of accessing server environment variable SERVER_NAME: {$smarty.server.SERVER_NAME}
|
||||||
|
|
||||||
|
The value of {ldelim}$Name{rdelim} is <b>{$Name}</b>
|
||||||
|
|
||||||
|
variable modifier example of {ldelim}$Name|upper{rdelim}
|
||||||
|
|
||||||
|
<b>{$Name|upper}</b>
|
||||||
|
|
||||||
|
|
||||||
|
An example of a section loop:
|
||||||
|
|
||||||
|
{section name=outer
|
||||||
|
loop=$FirstName}
|
||||||
|
{if $smarty.section.outer.index is odd by 2}
|
||||||
|
{$smarty.section.outer.rownum} . {$FirstName[outer]} {$LastName[outer]}
|
||||||
|
{else}
|
||||||
|
{$smarty.section.outer.rownum} * {$FirstName[outer]} {$LastName[outer]}
|
||||||
|
{/if}
|
||||||
|
{sectionelse}
|
||||||
|
none
|
||||||
|
{/section}
|
||||||
|
|
||||||
|
An example of section looped key values:
|
||||||
|
|
||||||
|
{section name=sec1 loop=$contacts}
|
||||||
|
phone: {$contacts[sec1].phone}
|
||||||
|
<br>
|
||||||
|
|
||||||
|
fax: {$contacts[sec1].fax}
|
||||||
|
<br>
|
||||||
|
|
||||||
|
cell: {$contacts[sec1].cell}
|
||||||
|
<br>
|
||||||
|
{/section}
|
||||||
|
<p>
|
||||||
|
|
||||||
|
testing strip tags
|
||||||
|
{strip}
|
||||||
|
<table border=0>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<A HREF="{$SCRIPT_NAME}">
|
||||||
|
<font color="red">This is a test </font>
|
||||||
|
</A>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
{/strip}
|
||||||
|
|
||||||
|
</PRE>
|
||||||
|
|
||||||
|
This is an example of the html_select_date function:
|
||||||
|
|
||||||
|
<form>
|
||||||
|
{html_select_date start_year=1998 end_year=2010}
|
||||||
|
</form>
|
||||||
|
|
||||||
|
This is an example of the html_select_time function:
|
||||||
|
|
||||||
|
<form>
|
||||||
|
{html_select_time use_24_hours=false}
|
||||||
|
</form>
|
||||||
|
|
||||||
|
This is an example of the html_options function:
|
||||||
|
|
||||||
|
<form>
|
||||||
|
<select name=states>
|
||||||
|
{html_options values=$option_values selected=$option_selected output=$option_output}
|
||||||
|
</select>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
{include file="footer.tpl"}
|
|
@ -0,0 +1 @@
|
||||||
|
theme: jekyll-theme-minimal
|
|
@ -0,0 +1,274 @@
|
||||||
|
# Tips & Tricks
|
||||||
|
|
||||||
|
## Blank Variable Handling
|
||||||
|
|
||||||
|
There may be times when you want to print a default value for an empty
|
||||||
|
variable instead of printing nothing, such as printing ` ` so that
|
||||||
|
html table backgrounds work properly. Many would use an
|
||||||
|
[`{if}`](../designers/language-builtin-functions/language-function-if.md) statement to handle this, but there is a
|
||||||
|
shorthand way with Smarty, using the
|
||||||
|
[`default`](../designers/language-modifiers/language-modifier-default.md) variable modifier.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> "Undefined variable" errors will show an E\_NOTICE if not disabled in
|
||||||
|
> PHP's [`error_reporting()`](https://www.php.net/error_reporting) level or
|
||||||
|
> Smarty's [`$error_reporting`](../programmers/api-variables/variable-error-reporting.md) property and
|
||||||
|
> a variable had not been assigned to Smarty.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
|
||||||
|
{* the long way *}
|
||||||
|
{if $title eq ''}
|
||||||
|
|
||||||
|
{else}
|
||||||
|
{$title}
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
{* the short way *}
|
||||||
|
{$title|default:' '}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
See also [`default`](../designers/language-modifiers/language-modifier-default.md) modifier and [default
|
||||||
|
variable handling](#default-variable-handling).
|
||||||
|
|
||||||
|
## Default Variable Handling
|
||||||
|
|
||||||
|
If a variable is used frequently throughout your templates, applying the
|
||||||
|
[`default`](../designers/language-modifiers/language-modifier-default.md) modifier every time it is
|
||||||
|
mentioned can get a bit ugly. You can remedy this by assigning the
|
||||||
|
variable its default value with the
|
||||||
|
[`{assign}`](../designers/language-builtin-functions/language-function-assign.md) function.
|
||||||
|
|
||||||
|
|
||||||
|
{* do this somewhere at the top of your template *}
|
||||||
|
{assign var='title' value=$title|default:'no title'}
|
||||||
|
|
||||||
|
{* if $title was empty, it now contains the value "no title" when you use it *}
|
||||||
|
{$title}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
See also [`default`](../designers/language-modifiers/language-modifier-default.md) modifier and [blank
|
||||||
|
variable handling](#blank-variable-handling).
|
||||||
|
|
||||||
|
## Passing variable title to header template
|
||||||
|
|
||||||
|
When the majority of your templates use the same headers and footers, it
|
||||||
|
is common to split those out into their own templates and
|
||||||
|
[`{include}`](../designers/language-builtin-functions/language-function-include.md) them. But what if the header
|
||||||
|
needs to have a different title, depending on what page you are coming
|
||||||
|
from? You can pass the title to the header as an
|
||||||
|
[attribute](../designers/language-basic-syntax/language-syntax-attributes.md) when it is included.
|
||||||
|
|
||||||
|
`mainpage.tpl` - When the main page is drawn, the title of "Main Page"
|
||||||
|
is passed to the `header.tpl`, and will subsequently be used as the
|
||||||
|
title.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
|
||||||
|
{include file='header.tpl' title='Main Page'}
|
||||||
|
{* template body goes here *}
|
||||||
|
{include file='footer.tpl'}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
`archives.tpl` - When the archives page is drawn, the title will be
|
||||||
|
"Archives". Notice in the archive example, we are using a variable from
|
||||||
|
the `archives_page.conf` file instead of a hard coded variable.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
|
||||||
|
{config_load file='archive_page.conf'}
|
||||||
|
|
||||||
|
{include file='header.tpl' title=#archivePageTitle#}
|
||||||
|
{* template body goes here *}
|
||||||
|
{include file='footer.tpl'}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
`header.tpl` - Notice that "Smarty News" is printed if the `$title`
|
||||||
|
variable is not set, using the [`default`](../designers/language-modifiers/language-modifier-default.md)
|
||||||
|
variable modifier.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{$title|default:'Smarty News'}</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
`footer.tpl`
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Dates
|
||||||
|
|
||||||
|
As a rule of thumb, always pass dates to Smarty as
|
||||||
|
[timestamps](https://www.php.net/time). This allows template designers to
|
||||||
|
use the [`date_format`](../designers/language-modifiers/language-modifier-date-format.md) modifier for
|
||||||
|
full control over date formatting, and also makes it easy to compare
|
||||||
|
dates if necessary.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{$startDate|date_format}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
This will output:
|
||||||
|
|
||||||
|
```
|
||||||
|
Jan 4, 2009
|
||||||
|
```
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
|
||||||
|
{$startDate|date_format:"%Y/%m/%d"}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
This will output:
|
||||||
|
|
||||||
|
```
|
||||||
|
2009/01/04
|
||||||
|
```
|
||||||
|
|
||||||
|
Dates can be compared in the template by timestamps with:
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
|
||||||
|
{if $order_date < $invoice_date}
|
||||||
|
...do something..
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
When using [`{html_select_date}`](../designers/language-custom-functions/language-function-html-select-date.md)
|
||||||
|
in a template, the programmer will most likely want to convert the
|
||||||
|
output from the form back into timestamp format. Here is a function to
|
||||||
|
help you with that.
|
||||||
|
|
||||||
|
```php
|
||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// this assumes your form elements are named
|
||||||
|
// startDate_Day, startDate_Month, startDate_Year
|
||||||
|
|
||||||
|
$startDate = makeTimeStamp($startDate_Year, $startDate_Month, $startDate_Day);
|
||||||
|
|
||||||
|
function makeTimeStamp($year='', $month='', $day='')
|
||||||
|
{
|
||||||
|
if(empty($year)) {
|
||||||
|
$year = strftime('%Y');
|
||||||
|
}
|
||||||
|
if(empty($month)) {
|
||||||
|
$month = strftime('%m');
|
||||||
|
}
|
||||||
|
if(empty($day)) {
|
||||||
|
$day = strftime('%d');
|
||||||
|
}
|
||||||
|
|
||||||
|
return mktime(0, 0, 0, $month, $day, $year);
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
See also [`{html_select_date}`](../designers/language-custom-functions/language-function-html-select-date.md),
|
||||||
|
[`{html_select_time}`](../designers/language-custom-functions/language-function-html-select-time.md),
|
||||||
|
[`date_format`](../designers/language-modifiers/language-modifier-date-format.md) and
|
||||||
|
[`$smarty.now`](../designers/language-variables/language-variables-smarty.md#smarty-now),
|
||||||
|
|
||||||
|
## Componentized Templates
|
||||||
|
|
||||||
|
Traditionally, programming templates into your applications goes as
|
||||||
|
follows: First, you accumulate your variables within your PHP
|
||||||
|
application, (maybe with database queries.) Then, you instantiate your
|
||||||
|
Smarty object, [`assign()`](../programmers/api-functions/api-assign.md) the variables and
|
||||||
|
[`display()`](../programmers/api-functions/api-display.md) the template. So lets say for example we
|
||||||
|
have a stock ticker on our template. We would collect the stock data in
|
||||||
|
our application, then assign these variables in the template and display
|
||||||
|
it. Now wouldn't it be nice if you could add this stock ticker to any
|
||||||
|
application by merely including the template, and not worry about
|
||||||
|
fetching the data up front?
|
||||||
|
|
||||||
|
You can do this by writing a custom plugin for fetching the content and
|
||||||
|
assigning it to a template variable.
|
||||||
|
|
||||||
|
`function.load_ticker.php` - drop file in
|
||||||
|
[`$plugins directory`](../programmers/api-variables/variable-plugins-dir.md)
|
||||||
|
|
||||||
|
```php
|
||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// setup our function for fetching stock data
|
||||||
|
function fetch_ticker($symbol)
|
||||||
|
{
|
||||||
|
// put logic here that fetches $ticker_info
|
||||||
|
// from some ticker resource
|
||||||
|
return $ticker_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
function smarty_function_load_ticker($params, $smarty)
|
||||||
|
{
|
||||||
|
// call the function
|
||||||
|
$ticker_info = fetch_ticker($params['symbol']);
|
||||||
|
|
||||||
|
// assign template variable
|
||||||
|
$smarty->assign($params['assign'], $ticker_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
`index.tpl`
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
|
||||||
|
{load_ticker symbol='SMARTY' assign='ticker'}
|
||||||
|
|
||||||
|
Stock Name: {$ticker.name} Stock Price: {$ticker.price}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
See also: [`{include}`](../designers/language-builtin-functions/language-function-include.md).
|
||||||
|
|
||||||
|
## Obfuscating E-mail Addresses
|
||||||
|
|
||||||
|
Do you ever wonder how your email address gets on so many spam mailing
|
||||||
|
lists? One way spammers collect email addresses is from web pages. To
|
||||||
|
help combat this problem, you can make your email address show up in
|
||||||
|
scrambled javascript in the HTML source, yet it it will look and work
|
||||||
|
correctly in the browser. This is done with the
|
||||||
|
[`{mailto}`](../designers/language-custom-functions/language-function-mailto.md) plugin.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
|
||||||
|
<div id="contact">Send inquiries to
|
||||||
|
{mailto address=$EmailAddress encode='javascript' subject='Hello'}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> This method isn\'t 100% foolproof. A spammer could conceivably program
|
||||||
|
> his e-mail collector to decode these values, but not likely\....
|
||||||
|
> hopefully..yet \... wheres that quantum computer :-?.
|
||||||
|
|
||||||
|
See also [`escape`](../designers/language-modifiers/language-modifier-escape.md) modifier and
|
||||||
|
[`{mailto}`](../designers/language-custom-functions/language-function-mailto.md).
|
|
@ -0,0 +1,104 @@
|
||||||
|
# Troubleshooting
|
||||||
|
|
||||||
|
## Smarty/PHP errors
|
||||||
|
|
||||||
|
Smarty can catch many errors such as missing tag attributes or malformed
|
||||||
|
variable names. If this happens, you will see an error similar to the
|
||||||
|
following:
|
||||||
|
|
||||||
|
```
|
||||||
|
Warning: Smarty: [in index.tpl line 4]: syntax error: unknown tag - '%blah'
|
||||||
|
in /path/to/smarty/Smarty.class.php on line 1041
|
||||||
|
|
||||||
|
Fatal error: Smarty: [in index.tpl line 28]: syntax error: missing section name
|
||||||
|
in /path/to/smarty/Smarty.class.php on line 1041
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Smarty shows you the template name, the line number and the error. After
|
||||||
|
that, the error consists of the actual line number in the Smarty class
|
||||||
|
that the error occurred.
|
||||||
|
|
||||||
|
There are certain errors that Smarty cannot catch, such as missing close
|
||||||
|
tags. These types of errors usually end up in PHP compile-time parsing
|
||||||
|
errors.
|
||||||
|
|
||||||
|
`Parse error: parse error in /path/to/smarty/templates_c/index.tpl.php on line 75`
|
||||||
|
|
||||||
|
When you encounter a PHP parsing error, the error line number will
|
||||||
|
correspond to the compiled PHP script, NOT the template itself. Usually
|
||||||
|
you can look at the template and spot the syntax error. Here are some
|
||||||
|
common things to look for: missing close tags for
|
||||||
|
[`{if}{/if}`](../designers/language-builtin-functions/language-function-if.md) or
|
||||||
|
[`{section}{/section}`](../designers/language-builtin-functions/language-function-section.md),
|
||||||
|
or syntax of logic within an `{if}` tag. If you can\'t find the error, you might have to
|
||||||
|
open the compiled PHP file and go to the line number to figure out where
|
||||||
|
the corresponding error is in the template.
|
||||||
|
|
||||||
|
```
|
||||||
|
Warning: Smarty error: unable to read resource: "index.tpl" in...
|
||||||
|
```
|
||||||
|
or
|
||||||
|
```
|
||||||
|
Warning: Smarty error: unable to read resource: "site.conf" in...
|
||||||
|
```
|
||||||
|
|
||||||
|
- The [`$template_dir`](../programmers/api-variables/variable-template-dir.md) is incorrect, doesn't
|
||||||
|
exist or the file `index.tpl` is not in the `templates/` directory
|
||||||
|
|
||||||
|
- A [`{config_load}`](../designers/language-builtin-functions/language-function-config-load.md) function is
|
||||||
|
within a template (or [`configLoad()`](../programmers/api-functions/api-config-load.md) has been
|
||||||
|
called) and either [`$config_dir`](../programmers/api-variables/variable-config-dir.md) is
|
||||||
|
incorrect, does not exist or `site.conf` is not in the directory.
|
||||||
|
|
||||||
|
```
|
||||||
|
Fatal error: Smarty error: the $compile_dir 'templates_c' does not exist,
|
||||||
|
or is not a directory...
|
||||||
|
```
|
||||||
|
|
||||||
|
- Either the [`$compile_dir`](../programmers/api-variables/variable-compile-dir.md)is incorrectly
|
||||||
|
set, the directory does not exist, or `templates_c` is a file and
|
||||||
|
not a directory.
|
||||||
|
|
||||||
|
```
|
||||||
|
Fatal error: Smarty error: unable to write to $compile_dir '....
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
- The [`$compile_dir`](../programmers/api-variables/variable-compile-dir.md) is not writable by the
|
||||||
|
web server. See the bottom of the [installing
|
||||||
|
smarty](../getting-started.md#installation) page for more about permissions.
|
||||||
|
|
||||||
|
```
|
||||||
|
Fatal error: Smarty error: the $cache_dir 'cache' does not exist,
|
||||||
|
or is not a directory. in /..
|
||||||
|
```
|
||||||
|
|
||||||
|
- This means that [`$caching`](../programmers/api-variables/variable-caching.md) is enabled and
|
||||||
|
either; the [`$cache_dir`](../programmers/api-variables/variable-cache-dir.md) is incorrectly set,
|
||||||
|
the directory does not exist, or `cache/` is a file and not a
|
||||||
|
directory.
|
||||||
|
|
||||||
|
```
|
||||||
|
Fatal error: Smarty error: unable to write to $cache_dir '/...
|
||||||
|
```
|
||||||
|
|
||||||
|
- This means that [`$caching`](../programmers/api-variables/variable-caching.md) is enabled and the
|
||||||
|
[`$cache_dir`](../programmers/api-variables/variable-cache-dir.md) is not writable by the web
|
||||||
|
server. See the bottom of the [installing
|
||||||
|
smarty](../getting-started.md#installation) page for permissions.
|
||||||
|
|
||||||
|
```
|
||||||
|
Warning: filemtime(): stat failed for /path/to/smarty/cache/3ab50a623e65185c49bf17c63c90cc56070ea85c.one.tpl.php
|
||||||
|
in /path/to/smarty/libs/sysplugins/smarty_resource.php
|
||||||
|
```
|
||||||
|
|
||||||
|
- This means that your application registered a custom error handler
|
||||||
|
(using [set_error_handler()](https://www.php.net/set_error_handler))
|
||||||
|
which is not respecting the given `$errno` as it should. If, for
|
||||||
|
whatever reason, this is the desired behaviour of your custom error
|
||||||
|
handler, please call
|
||||||
|
[`muteExpectedErrors()`](../programmers/api-functions/api-mute-expected-errors.md) after you've
|
||||||
|
registered your custom error handler.
|
||||||
|
|
||||||
|
See also [debugging](../designers/chapter-debugging-console.md).
|
|
@ -0,0 +1,40 @@
|
||||||
|
# Debugging Console
|
||||||
|
|
||||||
|
There is a debugging console included with Smarty. The console informs
|
||||||
|
you of all the [included](./language-builtin-functions/language-function-include.md) templates,
|
||||||
|
[assigned](../programmers/api-functions/api-assign.md) variables and
|
||||||
|
[config](./language-variables/language-config-variables.md) file variables for the current
|
||||||
|
invocation of the template. A template file named `debug.tpl` is
|
||||||
|
included with the distribution of Smarty which controls the formatting
|
||||||
|
of the console.
|
||||||
|
|
||||||
|
Set [`$debugging`](../programmers/api-variables/variable-debugging.md) to TRUE in Smarty, and if needed
|
||||||
|
set [`$debug_tpl`](../programmers/api-variables/variable-debug-template.md) to the template resource
|
||||||
|
path to `debug.tpl` (this is in [`SMARTY_DIR`](../programmers/smarty-constants.md) by
|
||||||
|
default). When you load the page, a Javascript console window will pop
|
||||||
|
up and give you the names of all the included templates and assigned
|
||||||
|
variables for the current page.
|
||||||
|
|
||||||
|
To see the available variables for a particular template, see the
|
||||||
|
[`{debug}`](./language-builtin-functions/language-function-debug.md) template function. To disable the
|
||||||
|
debugging console, set [`$debugging`](../programmers/api-variables/variable-debugging.md) to FALSE. You
|
||||||
|
can also temporarily turn on the debugging console by putting
|
||||||
|
`SMARTY_DEBUG` in the URL if you enable this option with
|
||||||
|
[`$debugging_ctrl`](../programmers/api-variables/variable-debugging-ctrl.md).
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> The debugging console does not work when you use the
|
||||||
|
> [`fetch()`](../programmers/api-functions/api-fetch.md) API, only when using
|
||||||
|
> [`display()`](../programmers/api-functions/api-display.md). It is a set of javascript statements
|
||||||
|
> added to the very bottom of the generated template. If you do not like
|
||||||
|
> javascript, you can edit the `debug.tpl` template to format the output
|
||||||
|
> however you like. Debug data is not cached and `debug.tpl` info is not
|
||||||
|
> included in the output of the debug console.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> The load times of each template and config file are in seconds, or
|
||||||
|
> fractions thereof.
|
||||||
|
|
||||||
|
See also [troubleshooting](../appendixes/troubleshooting.md).
|
|
@ -0,0 +1,74 @@
|
||||||
|
# Config Files
|
||||||
|
|
||||||
|
Config files are handy for designers to manage global template variables
|
||||||
|
from one file. One example is template colors. Normally if you wanted to
|
||||||
|
change the color scheme of an application, you would have to go through
|
||||||
|
each and every template file and change the colors. With a config file,
|
||||||
|
the colors can be kept in one place, and only one file needs to be
|
||||||
|
updated.
|
||||||
|
|
||||||
|
```ini
|
||||||
|
# global variables
|
||||||
|
pageTitle = "Main Menu"
|
||||||
|
bodyBgColor = #000000
|
||||||
|
tableBgColor = #000000
|
||||||
|
rowBgColor = #00ff00
|
||||||
|
|
||||||
|
[Customer]
|
||||||
|
pageTitle = "Customer Info"
|
||||||
|
|
||||||
|
[Login]
|
||||||
|
pageTitle = "Login"
|
||||||
|
focus = "username"
|
||||||
|
Intro = """This is a value that spans more
|
||||||
|
than one line. you must enclose
|
||||||
|
it in triple quotes."""
|
||||||
|
|
||||||
|
# hidden section
|
||||||
|
[.Database]
|
||||||
|
host=my.example.com
|
||||||
|
db=ADDRESSBOOK
|
||||||
|
user=php-user
|
||||||
|
pass=foobar
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Values of [config file variables](./language-variables/language-config-variables.md) can be in
|
||||||
|
quotes, but not necessary. You can use either single or double quotes.
|
||||||
|
If you have a value that spans more than one line, enclose the entire
|
||||||
|
value with triple quotes \("""\). You can put comments into config
|
||||||
|
files by any syntax that is not a valid config file syntax. We recommend
|
||||||
|
using a `#` (hash) at the beginning of the line.
|
||||||
|
|
||||||
|
The example config file above has two sections. Section names are
|
||||||
|
enclosed in \[brackets\]. Section names can be arbitrary strings not
|
||||||
|
containing `[` or `]` symbols. The four variables at the top are global
|
||||||
|
variables, or variables not within a section. These variables are always
|
||||||
|
loaded from the config file. If a particular section is loaded, then the
|
||||||
|
global variables and the variables from that section are also loaded. If
|
||||||
|
a variable exists both as a global and in a section, the section
|
||||||
|
variable is used. If you name two variables the same within a section,
|
||||||
|
the last one will be used unless
|
||||||
|
[`$config_overwrite`](../programmers/api-variables/variable-config-overwrite.md) is disabled.
|
||||||
|
|
||||||
|
Config files are loaded into templates with the built-in template
|
||||||
|
function [`{config_load}`](./language-builtin-functions/language-function-config-load.md) or the API
|
||||||
|
[`configLoad()`](../programmers/api-functions/api-config-load.md) function.
|
||||||
|
|
||||||
|
You can hide variables or entire sections by prepending the variable
|
||||||
|
name or section name with a period(.) eg `[.hidden]`. This is useful if
|
||||||
|
your application reads the config files and gets sensitive data from
|
||||||
|
them that the template engine does not need. If you have third parties
|
||||||
|
doing template editing, you can be certain that they cannot read
|
||||||
|
sensitive data from the config file by loading it into the template.
|
||||||
|
|
||||||
|
Config files (or resources) are loaded by the same resource facilities
|
||||||
|
as templates. That means that a config file can also be loaded from a db
|
||||||
|
`$smarty->configLoad("db:my.conf")`.
|
||||||
|
|
||||||
|
See also [`{config_load}`](./language-builtin-functions/language-function-config-load.md),
|
||||||
|
[`$config_overwrite`](../programmers/api-variables/variable-config-overwrite.md),
|
||||||
|
[`$default_config_handler_func`](../programmers/api-variables/variable-default-config-handler-func.md),
|
||||||
|
[`getConfigVars()`](../programmers/api-functions/api-get-config-vars.md),
|
||||||
|
[`clearConfig()`](../programmers/api-functions/api-clear-config.md) and
|
||||||
|
[`configLoad()`](../programmers/api-functions/api-config-load.md)
|
|
@ -0,0 +1,33 @@
|
||||||
|
# Basic Syntax
|
||||||
|
|
||||||
|
A simple Smarty template could look like this:
|
||||||
|
```smarty
|
||||||
|
<h1>{$title|escape}</h1>
|
||||||
|
<ul>
|
||||||
|
{foreach $cities as $city}
|
||||||
|
<li>{$city.name|escape} ({$city.population})</li>
|
||||||
|
{foreachelse}
|
||||||
|
<li>no cities found</li>
|
||||||
|
{/foreach}
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
All Smarty template tags are enclosed within delimiters. By default
|
||||||
|
these are `{` and `}`, but they can be
|
||||||
|
[changed](../../programmers/api-variables/variable-left-delimiter.md).
|
||||||
|
|
||||||
|
For the examples in this manual, we will assume that you are using the
|
||||||
|
default delimiters. In Smarty, all content outside of delimiters is
|
||||||
|
displayed as static content, or unchanged. When Smarty encounters
|
||||||
|
template tags, it attempts to interpret them, and displays the
|
||||||
|
appropriate output in their place.
|
||||||
|
|
||||||
|
The basis components of the Smarty syntax are:
|
||||||
|
|
||||||
|
- [Comments](language-syntax-comments.md)
|
||||||
|
- [Variables](language-syntax-variables.md)
|
||||||
|
- [Functions](language-syntax-functions.md)
|
||||||
|
- [Attributes](language-syntax-attributes.md)
|
||||||
|
- [Quotes](language-syntax-quotes.md)
|
||||||
|
- [Math](language-math.md)
|
||||||
|
- [Escaping](language-escaping.md)
|
|
@ -0,0 +1,79 @@
|
||||||
|
# Escaping Smarty parsing
|
||||||
|
|
||||||
|
It is sometimes desirable or even necessary to have Smarty ignore
|
||||||
|
sections it would otherwise parse. A classic example is embedding
|
||||||
|
Javascript or CSS code in a template. The problem arises as those
|
||||||
|
languages use the { and } characters which are also the default
|
||||||
|
[delimiters](../language-builtin-functions/language-function-ldelim.md) for Smarty.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> A good practice for avoiding escapement altogether is by separating
|
||||||
|
> your Javascript/CSS into their own files and use standard HTML methods
|
||||||
|
> to access them. This will also take advantage of browser script
|
||||||
|
> caching. When you need to embed Smarty variables/functions into your
|
||||||
|
> Javascript/CSS, then the following applies.
|
||||||
|
|
||||||
|
In Smarty templates, the { and } braces will be ignored so long as they
|
||||||
|
are surrounded by white space. This behavior can be disabled by setting
|
||||||
|
the Smarty class variable [`$auto_literal`](../../programmers/api-variables/variable-auto-literal.md) to
|
||||||
|
false.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<script>
|
||||||
|
// the following braces are ignored by Smarty
|
||||||
|
// since they are surrounded by whitespace
|
||||||
|
function foobar {
|
||||||
|
alert('foobar!');
|
||||||
|
}
|
||||||
|
// this one will need literal escapement
|
||||||
|
{literal}
|
||||||
|
function bazzy {alert('foobar!');}
|
||||||
|
{/literal}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
[`{literal}..{/literal}`](../language-builtin-functions/language-function-literal.md) blocks are used
|
||||||
|
for escaping blocks of template logic. You can also escape the braces
|
||||||
|
individually with
|
||||||
|
[`{ldelim}`, `{rdelim}`](../language-builtin-functions/language-function-ldelim.md) tags or
|
||||||
|
[`{$smarty.ldelim}`,`{$smarty.rdelim}`](../language-variables/language-variables-smarty.md#smartyldelim-smartyrdelim-languagevariablessmartyldelim)
|
||||||
|
variables.
|
||||||
|
|
||||||
|
Smarty's default delimiters { and } cleanly represent presentational
|
||||||
|
content. However, if another set of delimiters suit your needs better,
|
||||||
|
you can change them with Smarty's
|
||||||
|
[`$left_delimiter`](../../programmers/api-variables/variable-left-delimiter.md) and
|
||||||
|
[`$right_delimiter`](../../programmers/api-variables/variable-right-delimiter.md) values.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> Changing delimiters affects ALL template syntax and escapement. Be
|
||||||
|
> sure to clear out cache and compiled files if you decide to change
|
||||||
|
> them.
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$smarty->left_delimiter = '<!--{';
|
||||||
|
$smarty->right_delimiter = '}-->';
|
||||||
|
|
||||||
|
$smarty->assign('foo', 'bar');
|
||||||
|
$smarty->assign('name', 'Albert');
|
||||||
|
$smarty->display('example.tpl');
|
||||||
|
```
|
||||||
|
|
||||||
|
Where the template is:
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
Welcome <!--{$name}--> to Smarty
|
||||||
|
<script language="javascript">
|
||||||
|
var foo = <!--{$foo}-->;
|
||||||
|
function dosomething() {
|
||||||
|
alert("foo is " + foo);
|
||||||
|
}
|
||||||
|
dosomething();
|
||||||
|
</script>
|
||||||
|
```
|
|
@ -0,0 +1,28 @@
|
||||||
|
# Math
|
||||||
|
|
||||||
|
Math can be applied directly to variable values.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
```smarty
|
||||||
|
{$foo+1}
|
||||||
|
|
||||||
|
{$foo*$bar}
|
||||||
|
|
||||||
|
{* some more complicated examples *}
|
||||||
|
|
||||||
|
{$foo->bar-$bar[1]*$baz->foo->bar()-3*7}
|
||||||
|
|
||||||
|
{if ($foo+$bar.test%$baz*134232+10+$b+10)}
|
||||||
|
|
||||||
|
{$foo|truncate:"`$fooTruncCount/$barTruncFactor-1`"}
|
||||||
|
|
||||||
|
{assign var="foo" value="`$foo+$bar`"}
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> Although Smarty can handle some very complex expressions and syntax,
|
||||||
|
> it is a good rule of thumb to keep the template syntax minimal and
|
||||||
|
> focused on presentation. If you find your template syntax getting too
|
||||||
|
> complex, it may be a good idea to move the bits that do not deal
|
||||||
|
> explicitly with presentation to PHP by way of plugins or modifiers.
|
|
@ -0,0 +1,49 @@
|
||||||
|
# Attributes
|
||||||
|
|
||||||
|
Most of the [functions](./language-syntax-functions.md) take attributes that
|
||||||
|
specify or modify their behavior. Attributes to Smarty functions are
|
||||||
|
much like HTML attributes. Static values don't have to be enclosed in
|
||||||
|
quotes, but it is required for literal strings. Variables with or
|
||||||
|
without modifiers may also be used, and should not be in quotes. You can
|
||||||
|
even use PHP function results, plugin results and complex expressions.
|
||||||
|
|
||||||
|
Some attributes require boolean values (TRUE or FALSE). These can be
|
||||||
|
specified as `true` and `false`. If an attribute has no value assigned
|
||||||
|
it gets the default boolean value of true.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
```smarty
|
||||||
|
{include file="header.tpl"}
|
||||||
|
|
||||||
|
{include file="header.tpl" nocache} // is equivalent to nocache=true
|
||||||
|
|
||||||
|
{include file="header.tpl" attrib_name="attrib value"}
|
||||||
|
|
||||||
|
{include file=$includeFile}
|
||||||
|
|
||||||
|
{include file=#includeFile# title="My Title"}
|
||||||
|
|
||||||
|
{assign var=foo value={counter}} // plugin result
|
||||||
|
|
||||||
|
{assign var=foo value=substr($bar,2,5)} // PHP function result
|
||||||
|
|
||||||
|
{assign var=foo value=$bar|strlen} // using modifier
|
||||||
|
|
||||||
|
{assign var=foo value=$buh+$bar|strlen} // more complex expression
|
||||||
|
|
||||||
|
{html_select_date display_days=true}
|
||||||
|
|
||||||
|
{mailto address="smarty@example.com"}
|
||||||
|
|
||||||
|
<select name="company_id">
|
||||||
|
{html_options options=$companies selected=$company_id}
|
||||||
|
</select>
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> Although Smarty can handle some very complex expressions and syntax,
|
||||||
|
> it is a good rule of thumb to keep the template syntax minimal and
|
||||||
|
> focused on presentation. If you find your template syntax getting too
|
||||||
|
> complex, it may be a good idea to move the bits that do not deal
|
||||||
|
> explicitly with presentation to PHP by way of plugins or modifiers.
|
|
@ -0,0 +1,69 @@
|
||||||
|
# Comments
|
||||||
|
|
||||||
|
Template comments are surrounded by asterisks, and that is surrounded by
|
||||||
|
the [delimiter](../../programmers/api-variables/variable-left-delimiter.md) tags like so:
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* this is a comment *}
|
||||||
|
```
|
||||||
|
|
||||||
|
Smarty comments are NOT displayed in the final output of the template,
|
||||||
|
unlike `<!-- HTML comments -->`. These are useful for making internal
|
||||||
|
notes in the templates which no one will see ;-)
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* I am a Smarty comment, I don't exist in the compiled output *}
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{$title}</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
{* another single line smarty comment *}
|
||||||
|
<!-- HTML comment that is sent to the browser -->
|
||||||
|
|
||||||
|
{* this multiline smarty
|
||||||
|
comment is
|
||||||
|
not sent to browser
|
||||||
|
*}
|
||||||
|
|
||||||
|
{*********************************************************
|
||||||
|
Multi line comment block with credits block
|
||||||
|
@ author: bg@example.com
|
||||||
|
@ maintainer: support@example.com
|
||||||
|
@ para: var that sets block style
|
||||||
|
@ css: the style output
|
||||||
|
**********************************************************}
|
||||||
|
|
||||||
|
{* The header file with the main logo and stuff *}
|
||||||
|
{include file='header.tpl'}
|
||||||
|
|
||||||
|
|
||||||
|
{* Dev note: the $includeFile var is assigned in foo.php script *}
|
||||||
|
<!-- Displays main content block -->
|
||||||
|
{include file=$includeFile}
|
||||||
|
|
||||||
|
{* this <select> block is redundant *}
|
||||||
|
{*
|
||||||
|
<select name="company">
|
||||||
|
{html_options options=$vals selected=$selected_id}
|
||||||
|
</select>
|
||||||
|
*}
|
||||||
|
|
||||||
|
<!-- Show header from affiliate is disabled -->
|
||||||
|
{* $affiliate|upper *}
|
||||||
|
|
||||||
|
{* you cannot nest comments *}
|
||||||
|
{*
|
||||||
|
<select name="company">
|
||||||
|
{* <option value="0">-- none -- </option> *}
|
||||||
|
{html_options options=$vals selected=$selected_id}
|
||||||
|
</select>
|
||||||
|
*}
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
# Functions
|
||||||
|
|
||||||
|
Every Smarty tag either prints a [variable](./language-syntax-variables.md) or
|
||||||
|
invokes some sort of function. These are processed and displayed by
|
||||||
|
enclosing the function and its [attributes](./language-syntax-attributes.md)
|
||||||
|
within delimiters like so: `{funcname attr1="val1" attr2="val2"}`.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{config_load file="colors.conf"}
|
||||||
|
|
||||||
|
{include file="header.tpl"}
|
||||||
|
{insert file="banner_ads.tpl" title="My Site"}
|
||||||
|
|
||||||
|
{if $logged_in}
|
||||||
|
Welcome, <span style="color:{#fontColor#}">{$name}!</span>
|
||||||
|
{else}
|
||||||
|
hi, {$name}
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
{include file="footer.tpl"}
|
||||||
|
```
|
||||||
|
|
||||||
|
- Both [built-in functions](../language-builtin-functions/index.md) and [custom
|
||||||
|
functions](../language-custom-functions/index.md) have the same syntax within
|
||||||
|
templates.
|
||||||
|
|
||||||
|
- Built-in functions are the **inner** workings of Smarty, such as
|
||||||
|
[`{if}`](../language-builtin-functions/language-function-if.md),
|
||||||
|
[`{section}`](../language-builtin-functions/language-function-section.md) and
|
||||||
|
[`{strip}`](../language-builtin-functions/language-function-strip.md). There should be no need to
|
||||||
|
change or modify them.
|
||||||
|
|
||||||
|
- Custom functions are **additional** functions implemented via
|
||||||
|
[plugins](../../programmers/plugins.md). They can be modified to your liking, or you can
|
||||||
|
create new ones. [`{html_options}`](../language-custom-functions/language-function-html-options.md)
|
||||||
|
is an example of a custom function.
|
||||||
|
|
||||||
|
See also [`registerPlugin()`](../../programmers/api-functions/api-register-plugin.md)
|
|
@ -0,0 +1,54 @@
|
||||||
|
# Embedding Vars in Double Quotes
|
||||||
|
|
||||||
|
- Smarty will recognize [assigned](../../programmers/api-functions/api-assign.md)
|
||||||
|
[variables](./language-syntax-variables.md) embedded in "double
|
||||||
|
quotes" so long as the variable name contains only numbers, letters
|
||||||
|
and under_scores. See [naming](https://www.php.net/language.variables)
|
||||||
|
for more detail.
|
||||||
|
|
||||||
|
- With any other characters, for example a period(.) or
|
||||||
|
`$object->reference`, then the variable must be surrounded by `` `backticks` ``.
|
||||||
|
|
||||||
|
- In addition, Smarty does allow embedded Smarty tags in double-quoted
|
||||||
|
strings. This is useful if you want to include variables with
|
||||||
|
modifiers, plugin or PHP function results.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
```smarty
|
||||||
|
{func var="test $foo test"} // sees $foo
|
||||||
|
{func var="test $foo_bar test"} // sees $foo_bar
|
||||||
|
{func var="test `$foo[0]` test"} // sees $foo[0]
|
||||||
|
{func var="test `$foo[bar]` test"} // sees $foo[bar]
|
||||||
|
{func var="test $foo.bar test"} // sees $foo (not $foo.bar)
|
||||||
|
{func var="test `$foo.bar` test"} // sees $foo.bar
|
||||||
|
{func var="test `$foo.bar` test"|escape} // modifiers outside quotes!
|
||||||
|
{func var="test {$foo|escape} test"} // modifiers inside quotes!
|
||||||
|
{func var="test {time()} test"} // PHP function result
|
||||||
|
{func var="test {counter} test"} // plugin result
|
||||||
|
{func var="variable foo is {if !$foo}not {/if} defined"} // Smarty block function
|
||||||
|
|
||||||
|
{* will replace $tpl_name with value *}
|
||||||
|
{include file="subdir/$tpl_name.tpl"}
|
||||||
|
|
||||||
|
{* does NOT replace $tpl_name *}
|
||||||
|
{include file='subdir/$tpl_name.tpl'} // vars require double quotes!
|
||||||
|
|
||||||
|
{* must have backticks as it contains a dot "." *}
|
||||||
|
{cycle values="one,two,`$smarty.config.myval`"}
|
||||||
|
|
||||||
|
{* must have backticks as it contains a dot "." *}
|
||||||
|
{include file="`$module.contact`.tpl"}
|
||||||
|
|
||||||
|
{* can use variable with dot syntax *}
|
||||||
|
{include file="`$module.$view`.tpl"}
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> Although Smarty can handle some very complex expressions and syntax,
|
||||||
|
> it is a good rule of thumb to keep the template syntax minimal and
|
||||||
|
> focused on presentation. If you find your template syntax getting too
|
||||||
|
> complex, it may be a good idea to move the bits that do not deal
|
||||||
|
> explicitly with presentation to PHP by way of plugins or modifiers.
|
||||||
|
|
||||||
|
See also [`escape`](../language-modifiers/language-modifier-escape.md).
|
|
@ -0,0 +1,109 @@
|
||||||
|
# Variables
|
||||||
|
|
||||||
|
Template variables start with the $dollar sign. They can contain
|
||||||
|
numbers, letters and underscores, much like a [PHP
|
||||||
|
variable](https://www.php.net/language.variables). You can reference arrays
|
||||||
|
by index numerically or non-numerically. Also reference object
|
||||||
|
properties and methods.
|
||||||
|
|
||||||
|
[Config file variables](../language-variables/language-config-variables.md) are an exception to
|
||||||
|
the \$dollar syntax and are instead referenced with surrounding
|
||||||
|
\#hashmarks\#, or via the [`$smarty.config`](../language-variables/language-variables-smarty.md#smartyconfig-languagevariablessmartyconfig) variable.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{$foo} <-- displaying a simple variable (non array/object)
|
||||||
|
{$foo[4]} <-- display the 5th element of a zero-indexed array
|
||||||
|
{$foo.bar} <-- display the "bar" key value of an array, similar to PHP $foo['bar']
|
||||||
|
{$foo.$bar} <-- display variable key value of an array, similar to PHP $foo[$bar]
|
||||||
|
{$foo->bar} <-- display the object property "bar"
|
||||||
|
{$foo->bar()} <-- display the return value of object method "bar"
|
||||||
|
{#foo#} <-- display the config file variable "foo"
|
||||||
|
{$smarty.config.foo} <-- synonym for {#foo#}
|
||||||
|
{$foo[bar]} <-- syntax only valid in a section loop, see {section}
|
||||||
|
{assign var=foo value='baa'}{$foo} <-- displays "baa", see {assign}
|
||||||
|
|
||||||
|
Many other combinations are allowed
|
||||||
|
|
||||||
|
{$foo.bar.baz}
|
||||||
|
{$foo.$bar.$baz}
|
||||||
|
{$foo[4].baz}
|
||||||
|
{$foo[4].$baz}
|
||||||
|
{$foo.bar.baz[4]}
|
||||||
|
{$foo->bar($baz,2,$bar)} <-- passing parameters
|
||||||
|
{"foo"} <-- static values are allowed
|
||||||
|
|
||||||
|
{* display the server variable "SERVER_NAME" ($_SERVER['SERVER_NAME'])*}
|
||||||
|
{$smarty.server.SERVER_NAME}
|
||||||
|
|
||||||
|
Math and embedding tags:
|
||||||
|
|
||||||
|
{$x+$y} // will output the sum of x and y.
|
||||||
|
{assign var=foo value=$x+$y} // in attributes
|
||||||
|
{$foo[$x+3]} // as array index
|
||||||
|
{$foo={counter}+3} // tags within tags
|
||||||
|
{$foo="this is message {counter}"} // tags within double quoted strings
|
||||||
|
|
||||||
|
Defining Arrays:
|
||||||
|
|
||||||
|
{assign var=foo value=[1,2,3]}
|
||||||
|
{assign var=foo value=['y'=>'yellow','b'=>'blue']}
|
||||||
|
{assign var=foo value=[1,[9,8],3]} // can be nested
|
||||||
|
|
||||||
|
Short variable assignment:
|
||||||
|
|
||||||
|
{$foo=$bar+2}
|
||||||
|
{$foo = strlen($bar)} // function in assignment
|
||||||
|
{$foo = myfunct( ($x+$y)*3 )} // as function parameter
|
||||||
|
{$foo.bar=1} // assign to specific array element
|
||||||
|
{$foo.bar.baz=1}
|
||||||
|
{$foo[]=1} // appending to an array
|
||||||
|
|
||||||
|
Smarty "dot" syntax (note: embedded {} are used to address ambiguities):
|
||||||
|
|
||||||
|
{$foo.a.b.c} => $foo['a']['b']['c']
|
||||||
|
{$foo.a.$b.c} => $foo['a'][$b]['c'] // with variable index
|
||||||
|
{$foo.a.{$b+4}.c} => $foo['a'][$b+4]['c'] // with expression as index
|
||||||
|
{$foo.a.{$b.c}} => $foo['a'][$b['c']] // with nested index
|
||||||
|
|
||||||
|
PHP-like syntax, alternative to "dot" syntax:
|
||||||
|
|
||||||
|
{$foo[1]} // normal access
|
||||||
|
{$foo['bar']}
|
||||||
|
{$foo['bar'][1]}
|
||||||
|
{$foo[$x+$x]} // index may contain any expression
|
||||||
|
{$foo[$bar[1]]} // nested index
|
||||||
|
{$foo[section_name]} // smarty {section} access, not array access!
|
||||||
|
|
||||||
|
Variable variables:
|
||||||
|
|
||||||
|
$foo // normal variable
|
||||||
|
$foo_{$bar} // variable name containing other variable
|
||||||
|
$foo_{$x+$y} // variable name containing expressions
|
||||||
|
$foo_{$bar}_buh_{$blar} // variable name with multiple segments
|
||||||
|
{$foo_{$x}} // will output the variable $foo_1 if $x has a value of 1.
|
||||||
|
|
||||||
|
Object chaining:
|
||||||
|
|
||||||
|
{$object->method1($x)->method2($y)}
|
||||||
|
|
||||||
|
Direct PHP function access:
|
||||||
|
|
||||||
|
{time()}
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> Although Smarty can handle some very complex expressions and syntax,
|
||||||
|
> it is a good rule of thumb to keep the template syntax minimal and
|
||||||
|
> focused on presentation. If you find your template syntax getting too
|
||||||
|
> complex, it may be a good idea to move the bits that do not deal
|
||||||
|
> explicitly with presentation to PHP by way of plugins or modifiers.
|
||||||
|
|
||||||
|
Request variables such as `$_GET`, `$_SESSION`, etc are available via
|
||||||
|
the reserved [`$smarty`](../language-variables/language-variables-smarty.md) variable.
|
||||||
|
|
||||||
|
See also [`$smarty`](../language-variables/language-variables-smarty.md), [config
|
||||||
|
variables](../language-variables/language-config-variables.md)
|
||||||
|
[`{assign}`](../language-builtin-functions/language-function-assign.md) and [`assign()`](../../programmers/api-functions/api-assign.md).
|
|
@ -0,0 +1,35 @@
|
||||||
|
# Built-in Functions
|
||||||
|
|
||||||
|
Smarty comes with several built-in functions. These built-in functions
|
||||||
|
are the integral part of the smarty template engine. They are compiled
|
||||||
|
into corresponding inline PHP code for maximum performance.
|
||||||
|
|
||||||
|
You cannot create your own [custom functions](../language-custom-functions/index.md) with the same name; and you
|
||||||
|
should not need to modify the built-in functions.
|
||||||
|
|
||||||
|
A few of these functions have an `assign` attribute which collects the
|
||||||
|
result the function to a named template variable instead of being
|
||||||
|
output; much like the [`{assign}`](language-function-assign.md) function.
|
||||||
|
|
||||||
|
- [{append}](language-function-append.md)
|
||||||
|
- [{assign} or {$var=...}](language-function-assign.md)
|
||||||
|
- [{block}](language-function-block.md)
|
||||||
|
- [{call}](language-function-call.md)
|
||||||
|
- [{capture}](language-function-capture.md)
|
||||||
|
- [{config_load}](language-function-config-load.md)
|
||||||
|
- [{debug}](language-function-debug.md)
|
||||||
|
- [{extends}](language-function-extends.md)
|
||||||
|
- [{for}](language-function-for.md)
|
||||||
|
- [{foreach}, {foreachelse}](language-function-foreach.md)
|
||||||
|
- [{function}](language-function-function.md)
|
||||||
|
- [{if}, {elseif}, {else}](language-function-if.md)
|
||||||
|
- [{include}](language-function-include.md)
|
||||||
|
- [{insert}](language-function-insert.md)
|
||||||
|
- [{ldelim}, {rdelim}](language-function-ldelim.md)
|
||||||
|
- [{literal}](language-function-literal.md)
|
||||||
|
- [{nocache}](language-function-nocache.md)
|
||||||
|
- [{section}, {sectionelse}](language-function-section.md)
|
||||||
|
- [{setfilter}](language-function-setfilter.md)
|
||||||
|
- [{strip}](language-function-strip.md)
|
||||||
|
- [{while}](language-function-while.md)
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
# {append}
|
||||||
|
|
||||||
|
`{append}` is used for creating or appending template variable arrays
|
||||||
|
**during the execution of a template**.
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
|
||||||
|
| Attribute | Required | Description |
|
||||||
|
|-----------|------------|----------------------------------------------------------------------------------------------------|
|
||||||
|
| var | | The name of the variable being assigned |
|
||||||
|
| value | | The value being assigned |
|
||||||
|
| index | (optional) | The index for the new array element. If not specified the value is append to the end of the array. |
|
||||||
|
| scope | (optional) | The scope of the assigned variable: parent, root or global. Defaults to local if omitted. |
|
||||||
|
|
||||||
|
## Option Flags
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
|---------|-----------------------------------------------------|
|
||||||
|
| nocache | Assigns the variable with the 'nocache' attribute |
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> Assignment of variables in-template is essentially placing application
|
||||||
|
> logic into the presentation that may be better handled in PHP. Use at
|
||||||
|
> your own discretion.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{append var='name' value='Bob' index='first'}
|
||||||
|
{append var='name' value='Meyer' index='last'}
|
||||||
|
// or
|
||||||
|
{append 'name' 'Bob' index='first'} {* short-hand *}
|
||||||
|
{append 'name' 'Meyer' index='last'} {* short-hand *}
|
||||||
|
|
||||||
|
The first name is {$name.first}.<br>
|
||||||
|
The last name is {$name.last}.
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
|
||||||
|
The first name is Bob.
|
||||||
|
The last name is Meyer.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
See also [`append()`](#api.append) and
|
||||||
|
[`getTemplateVars()`](#api.get.template.vars).
|
|
@ -0,0 +1,147 @@
|
||||||
|
# {assign}, {$var=...}
|
||||||
|
|
||||||
|
`{assign}` or `{$var=...}` is used for assigning template variables **during the
|
||||||
|
execution of a template**.
|
||||||
|
|
||||||
|
## Attributes of the {assign} syntax
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|------------|-----------------------------------------------------------------------|
|
||||||
|
| var | | The name of the variable being assigned |
|
||||||
|
| value | | The value being assigned |
|
||||||
|
| scope | (optional) | The scope of the assigned variable: \'parent\',\'root\' or \'global\' |
|
||||||
|
|
||||||
|
## Attributes of the {$var=...} syntax
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|------------|-----------------------------------------------------------------------|
|
||||||
|
| scope | (optional) | The scope of the assigned variable: \'parent\',\'root\' or \'global\' |
|
||||||
|
|
||||||
|
## Option Flags
|
||||||
|
| Name | Description |
|
||||||
|
|---------|---------------------------------------------------|
|
||||||
|
| nocache | Assigns the variable with the 'nocache' attribute |
|
||||||
|
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> Assignment of variables in-template is essentially placing application
|
||||||
|
> logic into the presentation that may be better handled in PHP. Use at
|
||||||
|
> your own discretion.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{assign var="name" value="Bob"} {* or *}
|
||||||
|
{assign "name" "Bob"} {* short-hand, or *}
|
||||||
|
{$name='Bob'}
|
||||||
|
|
||||||
|
The value of $name is {$name}.
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```
|
||||||
|
The value of $name is Bob.
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{assign var="name" value="Bob" nocache} {* or *}
|
||||||
|
{assign "name" "Bob" nocache} {* short-hand, or *}
|
||||||
|
{$name='Bob' nocache}
|
||||||
|
|
||||||
|
The value of $name is {$name}.
|
||||||
|
```
|
||||||
|
The above example will output:
|
||||||
|
```
|
||||||
|
The value of $name is Bob.
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{assign var=running_total value=$running_total+$some_array[$row].some_value} {* or *}
|
||||||
|
{$running_total=$running_total+$some_array[row].some_value}
|
||||||
|
```
|
||||||
|
|
||||||
|
Variables assigned in the included template will be seen in the
|
||||||
|
including template.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{include file="sub_template.tpl"}
|
||||||
|
|
||||||
|
{* display variable assigned in sub_template *}
|
||||||
|
{$foo}<br>
|
||||||
|
```
|
||||||
|
|
||||||
|
The template above includes the example `sub_template.tpl` below:
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
|
||||||
|
{* foo will be known also in the including template *}
|
||||||
|
{assign var="foo" value="something" scope=parent}
|
||||||
|
{$foo="something" scope=parent}
|
||||||
|
|
||||||
|
{* bar is assigned only local in the including template *}
|
||||||
|
{assign var="bar" value="value"} {* or *}
|
||||||
|
{$var="value"}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
You can assign a variable to root of the current root tree. The variable
|
||||||
|
is seen by all templates using the same root tree.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{assign var=foo value="bar" scope="root"}
|
||||||
|
```
|
||||||
|
|
||||||
|
A global variable is seen by all templates.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{assign var=foo value="bar" scope="global"} {* or *}
|
||||||
|
{assign "foo" "bar" scope="global"} {* short-hand, or *}
|
||||||
|
{$foo="bar" scope="global"}
|
||||||
|
```
|
||||||
|
|
||||||
|
To access `{assign}` variables from a php script use
|
||||||
|
[`getTemplateVars()`](../../programmers/api-functions/api-get-template-vars.md).
|
||||||
|
Here's the template that creates the variable `$foo`.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{assign var="foo" value="Smarty"} {* or *}
|
||||||
|
{$foo="Smarty"}
|
||||||
|
```
|
||||||
|
|
||||||
|
The template variables are only available after/during template
|
||||||
|
execution as in the following script.
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// this will output nothing as the template has not been executed
|
||||||
|
echo $smarty->getTemplateVars('foo');
|
||||||
|
|
||||||
|
// fetch the template to a variable
|
||||||
|
$whole_page = $smarty->fetch('index.tpl');
|
||||||
|
|
||||||
|
// this will output 'smarty' as the template has been executed
|
||||||
|
echo $smarty->getTemplateVars('foo');
|
||||||
|
|
||||||
|
$smarty->assign('foo','Even smarter');
|
||||||
|
|
||||||
|
// this will output 'Even smarter'
|
||||||
|
echo $smarty->getTemplateVars('foo');
|
||||||
|
```
|
||||||
|
|
||||||
|
The following functions can also *optionally* assign template variables: [`{capture}`](#language.function.capture),
|
||||||
|
[`{include}`](#language.function.include),
|
||||||
|
[`{insert}`](#language.function.insert),
|
||||||
|
[`{counter}`](#language.function.counter),
|
||||||
|
[`{cycle}`](#language.function.cycle),
|
||||||
|
[`{eval}`](#language.function.eval),
|
||||||
|
[`{fetch}`](#language.function.fetch),
|
||||||
|
[`{math}`](#language.function.math) and
|
||||||
|
[`{textformat}`](#language.function.textformat).
|
||||||
|
|
||||||
|
See also [`{append}`](./language-function-append.md),
|
||||||
|
[`assign()`](#api.assign) and
|
||||||
|
[`getTemplateVars()`](#api.get.template.vars).
|
|
@ -0,0 +1,201 @@
|
||||||
|
# {block}
|
||||||
|
|
||||||
|
`{block}` is used to define a named area of template source for template
|
||||||
|
inheritance. For details see section of [Template
|
||||||
|
Inheritance](../../programmers/advanced-features/advanced-features-template-inheritance.md).
|
||||||
|
|
||||||
|
The `{block}` template source area of a child template will replace the
|
||||||
|
corresponding areas in the parent template(s).
|
||||||
|
|
||||||
|
Optionally `{block}` areas of child and parent templates can be merged
|
||||||
|
into each other. You can append or prepend the parent `{block}` content
|
||||||
|
by using the `append` or `prepend` option flag with the child's `{block}`
|
||||||
|
definition. With `{$smarty.block.parent}` the `{block}` content of
|
||||||
|
the parent template can be inserted at any location of the child
|
||||||
|
`{block}` content. `{$smarty.block.child}` inserts the `{block}` content
|
||||||
|
of the child template at any location of the parent `{block}`.
|
||||||
|
|
||||||
|
`{blocks}'s` can be nested.
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|----------|----------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| name | yes | The name of the template source block |
|
||||||
|
| assign | no | The name of variable to assign the output of the block to. |
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> The assign attribute only works on the block that actually gets executed, so you may need
|
||||||
|
> to add it to each child block as well.
|
||||||
|
|
||||||
|
|
||||||
|
## Option Flags (in child templates only):
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
|---------|-----------------------------------------------------------------------------------------|
|
||||||
|
| append | The `{block}` content will be appended to the content of the parent template `{block}` |
|
||||||
|
| prepend | The `{block}` content will be prepended to the content of the parent template `{block}` |
|
||||||
|
| hide | Ignore the block content if no child block of same name is existing. |
|
||||||
|
| nocache | Disables caching of the `{block}` content |
|
||||||
|
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
parent.tpl
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{block name="title"}Default Title{/block}</title>
|
||||||
|
<title>{block "title"}Default Title{/block}</title> {* short-hand *}
|
||||||
|
</head>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
child.tpl
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{extends file="parent.tpl"}
|
||||||
|
{block name="title"}
|
||||||
|
Page Title
|
||||||
|
{/block}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
The result would look like
|
||||||
|
|
||||||
|
```html
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Page Title</title>
|
||||||
|
</head>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
parent.tpl
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{block name="title"}Title - {/block}</title>
|
||||||
|
</head>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
child.tpl
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{extends file="parent.tpl"}
|
||||||
|
{block name="title" append}
|
||||||
|
Page Title
|
||||||
|
{/block}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
The result would look like
|
||||||
|
|
||||||
|
```html
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Title - Page Title</title>
|
||||||
|
</head>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
parent.tpl
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{block name="title"} is my title{/block}</title>
|
||||||
|
</head>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
child.tpl
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{extends file="parent.tpl"}
|
||||||
|
{block name="title" prepend}
|
||||||
|
Page Title
|
||||||
|
{/block}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
The result would look like
|
||||||
|
|
||||||
|
```html
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Page title is my titel</title>
|
||||||
|
</head>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
parent.tpl
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{block name="title"}The {$smarty.block.child} was inserted here{/block}</title>
|
||||||
|
</head>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
child.tpl
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{extends file="parent.tpl"}
|
||||||
|
{block name="title"}
|
||||||
|
Child Title
|
||||||
|
{/block}
|
||||||
|
```
|
||||||
|
|
||||||
|
The result would look like
|
||||||
|
|
||||||
|
```html
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>The Child Title was inserted here</title>
|
||||||
|
</head>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
parent.tpl
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{block name="title"}Parent Title{/block}</title>
|
||||||
|
</head>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
child.tpl
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{extends file="parent.tpl"}
|
||||||
|
{block name="title"}
|
||||||
|
You will see now - {$smarty.block.parent} - here
|
||||||
|
{/block}
|
||||||
|
```
|
||||||
|
|
||||||
|
The result would look like
|
||||||
|
|
||||||
|
```html
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>You will see now - Parent Title - here</title>
|
||||||
|
</head>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
See also [Template
|
||||||
|
Inheritance](../../programmers/advanced-features/advanced-features-template-inheritance.md),
|
||||||
|
[`$smarty.block.parent`](../language-variables/language-variables-smarty.md#smartyblockparent-languagevariablessmartyblockparent),
|
||||||
|
[`$smarty.block.child`](../language-variables/language-variables-smarty.md#smartyblockchild-languagevariablessmartyblockchild), and
|
||||||
|
[`{extends}`](./language-function-extends.md)
|
|
@ -0,0 +1,77 @@
|
||||||
|
# {call}
|
||||||
|
|
||||||
|
`{call}` is used to call a template function defined by the
|
||||||
|
[`{function}`](./language-function-function.md) tag just like a plugin
|
||||||
|
function.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> Template functions are defined global. Since the Smarty compiler is a
|
||||||
|
> single-pass compiler, The `{call}` tag must
|
||||||
|
> be used to call a template function defined externally from the given
|
||||||
|
> template. Otherwise you can directly use the function as
|
||||||
|
> `{funcname ...}` in the template.
|
||||||
|
|
||||||
|
- The `{call}` tag must have the `name` attribute which contains the
|
||||||
|
name of the template function.
|
||||||
|
|
||||||
|
- Values for variables can be passed to the template function as
|
||||||
|
[attributes](../language-basic-syntax/language-syntax-attributes.md).
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|----------|------------------------------------------------------------------------------------------|
|
||||||
|
| name | Yes | The name of the template function |
|
||||||
|
| assign | No | The name of the variable that the output of called template function will be assigned to |
|
||||||
|
| [var ...] | No | variable to pass local to template function |
|
||||||
|
|
||||||
|
## Option Flags
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
|---------|--------------------------------------------|
|
||||||
|
| nocache | Call the template function in nocache mode |
|
||||||
|
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* define the function *}
|
||||||
|
{function name=menu level=0}
|
||||||
|
<ul class="level{$level}">
|
||||||
|
{foreach $data as $entry}
|
||||||
|
{if is_array($entry)}
|
||||||
|
<li>{$entry@key}</li>
|
||||||
|
{call name=menu data=$entry level=$level+1}
|
||||||
|
{else}
|
||||||
|
<li>{$entry}</li>
|
||||||
|
{/if}
|
||||||
|
{/foreach}
|
||||||
|
</ul>
|
||||||
|
{/function}
|
||||||
|
|
||||||
|
{* create an array to demonstrate *}
|
||||||
|
{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
|
||||||
|
['item3-3-1','item3-3-2']],'item4']}
|
||||||
|
|
||||||
|
{* run the array through the function *}
|
||||||
|
{call name=menu data=$menu}
|
||||||
|
{call menu data=$menu} {* short-hand *}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Will generate the following output
|
||||||
|
|
||||||
|
```
|
||||||
|
* item1
|
||||||
|
* item2
|
||||||
|
* item3
|
||||||
|
o item3-1
|
||||||
|
o item3-2
|
||||||
|
o item3-3
|
||||||
|
+ item3-3-1
|
||||||
|
+ item3-3-2
|
||||||
|
* item4
|
||||||
|
```
|
||||||
|
|
||||||
|
See also [`{function}`](./language-function-function.md).
|
|
@ -0,0 +1,81 @@
|
||||||
|
# {capture}
|
||||||
|
|
||||||
|
`{capture}` is used to collect the output of the template between the
|
||||||
|
tags into a variable instead of displaying it. Any content between
|
||||||
|
`{capture name='foo'}` and `{/capture}` is collected into the variable
|
||||||
|
specified in the `name` attribute.
|
||||||
|
|
||||||
|
The captured content can be used in the template from the variable
|
||||||
|
[`$smarty.capture.foo`](../language-variables/language-variables-smarty.md#smartycapture-languagevariablessmartycapture) where "foo"
|
||||||
|
is the value passed in the `name` attribute. If you do not supply the
|
||||||
|
`name` attribute, then "default" will be used as the name ie
|
||||||
|
`$smarty.capture.default`.
|
||||||
|
|
||||||
|
`{capture}'s` can be nested.
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|----------|----------------------------------------------------------------------|
|
||||||
|
| name | Yes | The name of the captured block |
|
||||||
|
| assign | No | The variable name where to assign the captured output to |
|
||||||
|
| append | No | The name of an array variable where to append the captured output to |
|
||||||
|
|
||||||
|
## Option Flags
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
|---------|-----------------------------------------|
|
||||||
|
| nocache | Disables caching of this captured block |
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> Be careful when capturing [`{insert}`](#language.function.insert)
|
||||||
|
> output. If you have [`$caching`](#caching) enabled and you have
|
||||||
|
> [`{insert}`](#language.function.insert) commands that you expect to
|
||||||
|
> run within cached content, do not capture this content.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* we don't want to print a div tag unless content is displayed *}
|
||||||
|
{capture name="banner"}
|
||||||
|
{capture "banner"} {* short-hand *}
|
||||||
|
{include file="get_banner.tpl"}
|
||||||
|
{/capture}
|
||||||
|
|
||||||
|
{if $smarty.capture.banner ne ""}
|
||||||
|
<div id="banner">{$smarty.capture.banner}</div>
|
||||||
|
{/if}
|
||||||
|
```
|
||||||
|
|
||||||
|
This example demonstrates the capture function.
|
||||||
|
```smarty
|
||||||
|
|
||||||
|
{capture name=some_content assign=popText}
|
||||||
|
{capture some_content assign=popText} {* short-hand *}
|
||||||
|
The server is {$my_server_name|upper} at {$my_server_addr}<br>
|
||||||
|
Your ip is {$my_ip}.
|
||||||
|
{/capture}
|
||||||
|
<a href="#">{$popText}</a>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
This example also demonstrates how multiple calls of capture can be used
|
||||||
|
to create an array with captured content.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{capture append="foo"}hello{/capture}I say just {capture append="foo"}world{/capture}
|
||||||
|
{foreach $foo as $text}{$text} {/foreach}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```
|
||||||
|
I say just hello world
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
See also [`$smarty.capture`](../language-variables/language-variables-smarty.md#smartycapture-languagevariablessmartycapture),
|
||||||
|
[`{eval}`](../language-custom-functions/language-function-eval.md),
|
||||||
|
[`{fetch}`](../language-custom-functions/language-function-fetch.md), [`fetch()`](../../programmers/api-functions/api-fetch.md) and
|
||||||
|
[`{assign}`](./language-function-assign.md).
|
|
@ -0,0 +1,88 @@
|
||||||
|
# {config_load}
|
||||||
|
|
||||||
|
`{config_load}` is used for loading config
|
||||||
|
[`#variables#`](#language.config.variables) from a [configuration file](#config.files) into the template.
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| file | Yes | The name of the config file to include |
|
||||||
|
| section | No | The name of the section to load |
|
||||||
|
| scope | no | How the scope of the loaded variables are treated, which must be one of local, parent or global. local means variables are loaded into the local template context. parent means variables are loaded into both the local context and the parent template that called it. global means variables are available to all templates. |
|
||||||
|
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
The `example.conf` file.
|
||||||
|
|
||||||
|
```ini
|
||||||
|
#this is config file comment
|
||||||
|
|
||||||
|
# global variables
|
||||||
|
pageTitle = "Main Menu"
|
||||||
|
bodyBgColor = #000000
|
||||||
|
tableBgColor = #000000
|
||||||
|
rowBgColor = #00ff00
|
||||||
|
|
||||||
|
#customer variables section
|
||||||
|
[Customer]
|
||||||
|
pageTitle = "Customer Info"
|
||||||
|
```
|
||||||
|
|
||||||
|
and the template
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{config_load file="example.conf"}
|
||||||
|
{config_load "example.conf"} {* short-hand *}
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<title>{#pageTitle#|default:"No title"}</title>
|
||||||
|
<body bgcolor="{#bodyBgColor#}">
|
||||||
|
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
|
||||||
|
<tr bgcolor="{#rowBgColor#}">
|
||||||
|
<td>First</td>
|
||||||
|
<td>Last</td>
|
||||||
|
<td>Address</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
[Config Files](#config.files) may also contain sections. You can load
|
||||||
|
variables from within a section with the added attribute `section`. Note
|
||||||
|
that global config variables are always loaded along with section
|
||||||
|
variables, and same-named section variables overwrite the globals.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> Config file *sections* and the built-in template function called
|
||||||
|
> [`{section}`](../language-builtin-functions/language-function-section.md) have nothing to do with each
|
||||||
|
> other, they just happen to share a common naming convention.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{config_load file='example.conf' section='Customer'}
|
||||||
|
{config_load 'example.conf' 'Customer'} {* short-hand *}
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<title>{#pageTitle#}</title>
|
||||||
|
<body bgcolor="{#bodyBgColor#}">
|
||||||
|
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
|
||||||
|
<tr bgcolor="{#rowBgColor#}">
|
||||||
|
<td>First</td>
|
||||||
|
<td>Last</td>
|
||||||
|
<td>Address</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
See [`$config_overwrite`](../../programmers/api-variables/variable-config-overwrite.md) to create arrays
|
||||||
|
of config file variables.
|
||||||
|
|
||||||
|
See also the [config files](../config-files.md) page, [config variables](../language-variables/language-config-variables.md) page,
|
||||||
|
[`$config_dir`](../../programmers/api-variables/variable-config-dir.md),
|
||||||
|
[`getConfigVars()`](../../programmers/api-functions/api-get-config-vars.md) and
|
||||||
|
[`configLoad()`](../../programmers/api-functions/api-config-load.md).
|
|
@ -0,0 +1,17 @@
|
||||||
|
# {debug}
|
||||||
|
|
||||||
|
`{debug}` dumps the debug console to the page. This works regardless of
|
||||||
|
the [debug](../chapter-debugging-console.md) settings in the php script.
|
||||||
|
Since this gets executed at runtime, this is only able to show the
|
||||||
|
[assigned](../../programmers/api-functions/api-assign.md) variables; not the templates that are in use.
|
||||||
|
However, you can see all the currently available variables within the
|
||||||
|
scope of a template.
|
||||||
|
|
||||||
|
If caching is enabled and a page is loaded from cache `{debug}` does
|
||||||
|
show only the variables which assigned for the cached page.
|
||||||
|
|
||||||
|
In order to see also the variables which have been locally assigned
|
||||||
|
within the template it does make sense to place the `{debug}` tag at the
|
||||||
|
end of the template.
|
||||||
|
|
||||||
|
See also the [debugging console page](../chapter-debugging-console.md).
|
|
@ -0,0 +1,37 @@
|
||||||
|
# {extends}
|
||||||
|
|
||||||
|
`{extends}` tags are used in child templates in template inheritance for
|
||||||
|
extending parent templates. For details see section of [Template
|
||||||
|
Inheritance](../../programmers/advanced-features/advanced-features-template-inheritance.md).
|
||||||
|
|
||||||
|
- The `{extends}` tag must be on the first line of the template.
|
||||||
|
|
||||||
|
- If a child template extends a parent template with the `{extends}`
|
||||||
|
tag it may contain only `{block}` tags. Any other template content
|
||||||
|
is ignored.
|
||||||
|
|
||||||
|
- Use the syntax for [template resources](../../programmers/resources.md) to extend files
|
||||||
|
outside the [`$template_dir`](../../programmers/api-variables/variable-template-dir.md) directory.
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
|
||||||
|
| Attribute | Required | Description |
|
||||||
|
|-----------|----------|-------------------------------------------------|
|
||||||
|
| file | Yes | The name of the template file which is extended |
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> When extending a variable parent like `{extends file=$parent_file}`,
|
||||||
|
> make sure you include `$parent_file` in the
|
||||||
|
> [`$compile_id`](../../programmers/api-variables/variable-compile-id.md). Otherwise, Smarty cannot
|
||||||
|
> distinguish between different `$parent_file`s.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{extends file='parent.tpl'}
|
||||||
|
{extends 'parent.tpl'} {* short-hand *}
|
||||||
|
```
|
||||||
|
|
||||||
|
See also [Template Inheritance](../../programmers/advanced-features/advanced-features-template-inheritance.md)
|
||||||
|
and [`{block}`](./language-function-block.md).
|
|
@ -0,0 +1,91 @@
|
||||||
|
# {for}
|
||||||
|
|
||||||
|
The `{for}{forelse}` tag is used to create simple loops. The following different formats are supported:
|
||||||
|
|
||||||
|
- `{for $var=$start to $end}` simple loop with step size of 1.
|
||||||
|
|
||||||
|
- `{for $var=$start to $end step $step}` loop with individual step
|
||||||
|
size.
|
||||||
|
|
||||||
|
`{forelse}` is executed when the loop is not iterated.
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
|
||||||
|
| Attribute | Required | Description |
|
||||||
|
|-----------|----------|--------------------------------|
|
||||||
|
| max | No | Limit the number of iterations |
|
||||||
|
|
||||||
|
## Option Flags
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
|---------|--------------------------------------|
|
||||||
|
| nocache | Disables caching of the `{for}` loop |
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<ul>
|
||||||
|
{for $foo=1 to 3}
|
||||||
|
<li>{$foo}</li>
|
||||||
|
{/for}
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<ul>
|
||||||
|
<li>1</li>
|
||||||
|
<li>2</li>
|
||||||
|
<li>3</li>
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
$smarty->assign('to',10);
|
||||||
|
```
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<ul>
|
||||||
|
{for $foo=3 to $to max=3}
|
||||||
|
<li>{$foo}</li>
|
||||||
|
{/for}
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<ul>
|
||||||
|
<li>3</li>
|
||||||
|
<li>4</li>
|
||||||
|
<li>5</li>
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
$smarty->assign('start',10);
|
||||||
|
$smarty->assign('to',5);
|
||||||
|
```
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<ul>
|
||||||
|
{for $foo=$start to $to}
|
||||||
|
<li>{$foo}</li>
|
||||||
|
{forelse}
|
||||||
|
no iteration
|
||||||
|
{/for}
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```
|
||||||
|
no iteration
|
||||||
|
```
|
||||||
|
|
||||||
|
See also [`{foreach}`](./language-function-foreach.md),
|
||||||
|
[`{section}`](./language-function-section.md) and
|
||||||
|
[`{while}`](./language-function-while.md)
|
|
@ -0,0 +1,389 @@
|
||||||
|
# {foreach},{foreachelse}
|
||||||
|
|
||||||
|
`{foreach}` is used for looping over arrays of data. `{foreach}` has a
|
||||||
|
simpler and cleaner syntax than the
|
||||||
|
[`{section}`](./language-function-section.md) loop, and can also loop over
|
||||||
|
associative arrays.
|
||||||
|
|
||||||
|
## Option Flags
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
|---------|------------------------------------------|
|
||||||
|
| nocache | Disables caching of the `{foreach}` loop |
|
||||||
|
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
|
||||||
|
{foreach $arrayvar as $itemvar}
|
||||||
|
{$itemvar|escape}
|
||||||
|
{/foreach}
|
||||||
|
|
||||||
|
{foreach $arrayvar as $keyvar=>$itemvar}
|
||||||
|
{$keyvar}: {$itemvar|escape}
|
||||||
|
{/foreach}
|
||||||
|
|
||||||
|
```
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> This foreach syntax does not accept any named attributes. This syntax
|
||||||
|
> is new to Smarty 3, however the Smarty 2.x syntax
|
||||||
|
> `{foreach from=$myarray key="mykey" item="myitem"}` is still
|
||||||
|
> supported.
|
||||||
|
|
||||||
|
- `{foreach}` loops can be nested.
|
||||||
|
|
||||||
|
- The `array` variable, usually an array of values, determines the
|
||||||
|
number of times `{foreach}` will loop. You can also pass an integer
|
||||||
|
for arbitrary loops.
|
||||||
|
|
||||||
|
- `{foreachelse}` is executed when there are no values in the `array`
|
||||||
|
variable.
|
||||||
|
|
||||||
|
- `{foreach}` properties are [`@index`](#index),
|
||||||
|
[`@iteration`](#iteration),
|
||||||
|
[`@first`](#first),
|
||||||
|
[`@last`](#last),
|
||||||
|
[`@show`](#show),
|
||||||
|
[`@total`](#total).
|
||||||
|
|
||||||
|
- `{foreach}` constructs are [`{break}`](#break),
|
||||||
|
[`{continue}`](#continue).
|
||||||
|
|
||||||
|
- Instead of specifying the `key` variable you can access the current
|
||||||
|
key of the loop item by `{$item@key}` (see examples below).
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> The `$var@property` syntax is new to Smarty 3, however when using the
|
||||||
|
> Smarty 2 `{foreach from=$myarray key="mykey" item="myitem"}` style
|
||||||
|
> syntax, the `$smarty.foreach.name.property` syntax is still supported.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> Although you can retrieve the array key with the syntax
|
||||||
|
> `{foreach $myArray as $myKey => $myValue}`, the key is always
|
||||||
|
> available as `$myValue@key` within the foreach loop.
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
$arr = array('red', 'green', 'blue');
|
||||||
|
$smarty->assign('myColors', $arr);
|
||||||
|
```
|
||||||
|
|
||||||
|
Template to output `$myColors` in an un-ordered list
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<ul>
|
||||||
|
{foreach $myColors as $color}
|
||||||
|
<li>{$color}</li>
|
||||||
|
{/foreach}
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<ul>
|
||||||
|
<li>red</li>
|
||||||
|
<li>green</li>
|
||||||
|
<li>blue</li>
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
$people = array('fname' => 'John', 'lname' => 'Doe', 'email' => 'j.doe@example.com');
|
||||||
|
$smarty->assign('myPeople', $people);
|
||||||
|
```
|
||||||
|
|
||||||
|
Template to output `$myArray` as key/value pairs.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<ul>
|
||||||
|
{foreach $myPeople as $value}
|
||||||
|
<li>{$value@key}: {$value}</li>
|
||||||
|
{/foreach}
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<ul>
|
||||||
|
<li>fname: John</li>
|
||||||
|
<li>lname: Doe</li>
|
||||||
|
<li>email: j.doe@example.com</li>
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
Assign an array to Smarty, the key contains the key for each looped
|
||||||
|
value.
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
$smarty->assign(
|
||||||
|
'contacts',
|
||||||
|
[
|
||||||
|
['phone' => '555-555-1234', 'fax' => '555-555-5678', 'cell' => '555-555-0357'],
|
||||||
|
['phone' => '800-555-4444', 'fax' => '800-555-3333', 'cell' => '800-555-2222'],
|
||||||
|
]
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
The template to output `$contact`.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* key always available as a property *}
|
||||||
|
{foreach $contacts as $contact}
|
||||||
|
{foreach $contact as $value}
|
||||||
|
{$value@key}: {$value}
|
||||||
|
{/foreach}
|
||||||
|
{/foreach}
|
||||||
|
|
||||||
|
{* accessing key the PHP syntax alternate *}
|
||||||
|
{foreach $contacts as $contact}
|
||||||
|
{foreach $contact as $key => $value}
|
||||||
|
{$key}: {$value}
|
||||||
|
{/foreach}
|
||||||
|
{/foreach}
|
||||||
|
```
|
||||||
|
|
||||||
|
Either of the above examples will output:
|
||||||
|
|
||||||
|
```
|
||||||
|
phone: 555-555-1234
|
||||||
|
fax: 555-555-5678
|
||||||
|
cell: 555-555-0357
|
||||||
|
phone: 800-555-4444
|
||||||
|
fax: 800-555-3333
|
||||||
|
cell: 800-555-2222
|
||||||
|
```
|
||||||
|
|
||||||
|
A database (PDO) example of looping over search results. This example is
|
||||||
|
looping over a PHP iterator instead of an array().
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
include('Smarty.class.php');
|
||||||
|
|
||||||
|
$smarty = new Smarty;
|
||||||
|
|
||||||
|
$dsn = 'mysql:host=localhost;dbname=test';
|
||||||
|
$login = 'test';
|
||||||
|
$passwd = 'test';
|
||||||
|
|
||||||
|
// setting PDO to use buffered queries in mysql is
|
||||||
|
// important if you plan on using multiple result cursors
|
||||||
|
// in the template.
|
||||||
|
|
||||||
|
$db = new PDO($dsn, $login, $passwd, array(
|
||||||
|
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
|
||||||
|
|
||||||
|
$res = $db->prepare("select * from users");
|
||||||
|
$res->execute();
|
||||||
|
$res->setFetchMode(PDO::FETCH_LAZY);
|
||||||
|
|
||||||
|
// assign to smarty
|
||||||
|
$smarty->assign('res',$res);
|
||||||
|
|
||||||
|
$smarty->display('index.tpl');?>
|
||||||
|
```
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{foreach $res as $r}
|
||||||
|
{$r.id}
|
||||||
|
{$r.name}
|
||||||
|
{foreachelse}
|
||||||
|
.. no results ..
|
||||||
|
{/foreach}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above is assuming the results contain the columns named `id` and
|
||||||
|
`name`.
|
||||||
|
|
||||||
|
What is the advantage of an iterator vs. looping over a plain old array?
|
||||||
|
With an array, all the results are accumulated into memory before being
|
||||||
|
looped. With an iterator, each result is loaded/released within the
|
||||||
|
loop. This saves processing time and memory, especially for very large
|
||||||
|
result sets.
|
||||||
|
|
||||||
|
## @index
|
||||||
|
|
||||||
|
`index` contains the current array index, starting with zero.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* output empty row on the 4th iteration (when index is 3) *}
|
||||||
|
<table>
|
||||||
|
{foreach $items as $i}
|
||||||
|
{if $i@index eq 3}
|
||||||
|
{* put empty table row *}
|
||||||
|
<tr><td>nbsp;</td></tr>
|
||||||
|
{/if}
|
||||||
|
<tr><td>{$i.label}</td></tr>
|
||||||
|
{/foreach}
|
||||||
|
</table>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## @iteration
|
||||||
|
|
||||||
|
`iteration` contains the current loop iteration and always starts at
|
||||||
|
one, unlike [`index`](#index). It is incremented by one
|
||||||
|
on each iteration.
|
||||||
|
|
||||||
|
The *"is div by"* operator can be used to detect a specific iteration.
|
||||||
|
Here we bold-face the name every 4th iteration.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{foreach $myNames as $name}
|
||||||
|
{if $name@iteration is div by 4}
|
||||||
|
<b>{$name}</b>
|
||||||
|
{/if}
|
||||||
|
{$name}
|
||||||
|
{/foreach}
|
||||||
|
```
|
||||||
|
|
||||||
|
The *"is even by"* and *"is odd by"* operators can be used to
|
||||||
|
alternate something every so many iterations. Choosing between even or
|
||||||
|
odd rotates which one starts. Here we switch the font color every 3rd
|
||||||
|
iteration.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{foreach $myNames as $name}
|
||||||
|
{if $name@iteration is even by 3}
|
||||||
|
<span style="color: #000">{$name}</span>
|
||||||
|
{else}
|
||||||
|
<span style="color: #eee">{$name}</span>
|
||||||
|
{/if}
|
||||||
|
{/foreach}
|
||||||
|
```
|
||||||
|
|
||||||
|
This will output something similar to this:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<span style="color: #000">...</span>
|
||||||
|
<span style="color: #000">...</span>
|
||||||
|
<span style="color: #000">...</span>
|
||||||
|
<span style="color: #eee">...</span>
|
||||||
|
<span style="color: #eee">...</span>
|
||||||
|
<span style="color: #eee">...</span>
|
||||||
|
<span style="color: #000">...</span>
|
||||||
|
<span style="color: #000">...</span>
|
||||||
|
<span style="color: #000">...</span>
|
||||||
|
<span style="color: #eee">...</span>
|
||||||
|
<span style="color: #eee">...</span>
|
||||||
|
<span style="color: #eee">...</span>
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
## @first
|
||||||
|
|
||||||
|
`first` is TRUE if the current `{foreach}` iteration is the initial one.
|
||||||
|
Here we display a table header row on the first iteration.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* show table header at first iteration *}
|
||||||
|
<table>
|
||||||
|
{foreach $items as $i}
|
||||||
|
{if $i@first}
|
||||||
|
<tr>
|
||||||
|
<th>key</td>
|
||||||
|
<th>name</td>
|
||||||
|
</tr>
|
||||||
|
{/if}
|
||||||
|
<tr>
|
||||||
|
<td>{$i@key}</td>
|
||||||
|
<td>{$i.name}</td>
|
||||||
|
</tr>
|
||||||
|
{/foreach}
|
||||||
|
</table>
|
||||||
|
```
|
||||||
|
|
||||||
|
## @last
|
||||||
|
|
||||||
|
`last` is set to TRUE if the current `{foreach}` iteration is the final
|
||||||
|
one. Here we display a horizontal rule on the last iteration.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* Add horizontal rule at end of list *}
|
||||||
|
{foreach $items as $item}
|
||||||
|
<a href="#{$item.id}">{$item.name}</a>{if $item@last}<hr>{else},{/if}
|
||||||
|
{foreachelse}
|
||||||
|
... no items to loop ...
|
||||||
|
{/foreach}
|
||||||
|
```
|
||||||
|
|
||||||
|
## @show
|
||||||
|
|
||||||
|
The show `show` property can be used after the execution of a
|
||||||
|
`{foreach}` loop to detect if data has been displayed or not. `show` is
|
||||||
|
a boolean value.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<ul>
|
||||||
|
{foreach $myArray as $name}
|
||||||
|
<li>{$name}</li>
|
||||||
|
{/foreach}
|
||||||
|
</ul>
|
||||||
|
{if $name@show} do something here if the array contained data {/if}
|
||||||
|
```
|
||||||
|
|
||||||
|
## @total
|
||||||
|
|
||||||
|
`total` contains the number of iterations that this `{foreach}` will
|
||||||
|
loop. This can be used inside or after the `{foreach}`.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* show number of rows at end *}
|
||||||
|
{foreach $items as $item}
|
||||||
|
{$item.name}<hr/>
|
||||||
|
{if $item@last}
|
||||||
|
<div id="total">{$item@total} items</div>
|
||||||
|
{/if}
|
||||||
|
{foreachelse}
|
||||||
|
... no items to loop ...
|
||||||
|
{/foreach}
|
||||||
|
```
|
||||||
|
|
||||||
|
See also [`{section}`](./language-function-section.md),
|
||||||
|
[`{for}`](./language-function-for.md) and
|
||||||
|
[`{while}`](./language-function-while.md)
|
||||||
|
|
||||||
|
## {break}
|
||||||
|
|
||||||
|
`{break}` aborts the iteration of the array
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{$data = [1,2,3,4,5]}
|
||||||
|
{foreach $data as $value}
|
||||||
|
{if $value == 3}
|
||||||
|
{* abort iterating the array *}
|
||||||
|
{break}
|
||||||
|
{/if}
|
||||||
|
{$value}
|
||||||
|
{/foreach}
|
||||||
|
{*
|
||||||
|
prints: 1 2
|
||||||
|
*}
|
||||||
|
```
|
||||||
|
|
||||||
|
## {continue}
|
||||||
|
|
||||||
|
`{continue}` leaves the current iteration and begins with the next
|
||||||
|
iteration.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{$data = [1,2,3,4,5]}
|
||||||
|
{foreach $data as $value}
|
||||||
|
{if $value == 3}
|
||||||
|
{* skip this iteration *}
|
||||||
|
{continue}
|
||||||
|
{/if}
|
||||||
|
{$value}
|
||||||
|
{/foreach}
|
||||||
|
{*
|
||||||
|
prints: 1 2 4 5
|
||||||
|
*}
|
||||||
|
```
|
|
@ -0,0 +1,89 @@
|
||||||
|
# {function}
|
||||||
|
|
||||||
|
`{function}` is used to create functions within a template and call them
|
||||||
|
just like a plugin function. Instead of writing a plugin that generates
|
||||||
|
presentational content, keeping it in the template is often a more
|
||||||
|
manageable choice. It also simplifies data traversal, such as deeply
|
||||||
|
nested menus.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> Template functions are defined global. Since the Smarty compiler is a
|
||||||
|
> single-pass compiler, The [`{call}`](#language.function.call) tag must
|
||||||
|
> be used to call a template function defined externally from the given
|
||||||
|
> template. Otherwise, you can directly use the function as
|
||||||
|
> `{funcname ...}` in the template.
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|----------|---------------------------------------------------------------|
|
||||||
|
| name | Yes | The name of the template function |
|
||||||
|
| \[var \...\] | No | default variable value to pass local to the template function |
|
||||||
|
|
||||||
|
- The `{function}` tag must have the `name` attribute which contains
|
||||||
|
the name of the template function. A tag with this name can be
|
||||||
|
used to call the template function.
|
||||||
|
|
||||||
|
- Default values for variables can be passed to the template function
|
||||||
|
as [attributes](../language-basic-syntax/language-syntax-attributes.md). Like in PHP function
|
||||||
|
declarations you can only use scalar values as default. The default
|
||||||
|
values can be overwritten when the template function is being
|
||||||
|
called.
|
||||||
|
|
||||||
|
- You can use all variables from the calling template inside the
|
||||||
|
template function. Changes to variables or new created variables
|
||||||
|
inside the template function have local scope and are not visible
|
||||||
|
inside the calling template after the template function is executed.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> You can pass any number of parameter to the template function when it
|
||||||
|
> is called. The parameter variables must not be declared in the
|
||||||
|
> `{funcname ...}` tag unless you what to use default values. Default
|
||||||
|
> values must be scalar and can not be variable. Variables must be
|
||||||
|
> passed when the template is called.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* define the function *}
|
||||||
|
{function name=menu level=0}
|
||||||
|
{function menu level=0} {* short-hand *}
|
||||||
|
<ul class="level{$level}">
|
||||||
|
{foreach $data as $entry}
|
||||||
|
{if is_array($entry)}
|
||||||
|
<li>{$entry@key}</li>
|
||||||
|
{menu data=$entry level=$level+1}
|
||||||
|
{else}
|
||||||
|
<li>{$entry}</li>
|
||||||
|
{/if}
|
||||||
|
{/foreach}
|
||||||
|
</ul>
|
||||||
|
{/function}
|
||||||
|
|
||||||
|
{* create an array to demonstrate *}
|
||||||
|
{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
|
||||||
|
['item3-3-1','item3-3-2']],'item4']}
|
||||||
|
|
||||||
|
{* run the array through the function *}
|
||||||
|
{menu data=$menu}
|
||||||
|
```
|
||||||
|
|
||||||
|
Will generate the following output
|
||||||
|
|
||||||
|
```
|
||||||
|
* item1
|
||||||
|
* item2
|
||||||
|
* item3
|
||||||
|
o item3-1
|
||||||
|
o item3-2
|
||||||
|
o item3-3
|
||||||
|
+ item3-3-1
|
||||||
|
+ item3-3-2
|
||||||
|
* item4
|
||||||
|
```
|
||||||
|
|
||||||
|
See also [`{call}`](./language-function-call.md)
|
|
@ -0,0 +1,120 @@
|
||||||
|
# {if},{elseif},{else}
|
||||||
|
|
||||||
|
`{if}` statements in Smarty have much the same flexibility as PHP
|
||||||
|
[if](https://www.php.net/if) statements, with a few added features for the
|
||||||
|
template engine. Every `{if}` must be paired with a matching `{/if}`.
|
||||||
|
`{else}` and `{elseif}` are also permitted. All PHP conditionals and
|
||||||
|
functions are recognized, such as *\|\|*, *or*, *&&*, *and*,
|
||||||
|
*is_array()*, etc.
|
||||||
|
|
||||||
|
If security is enabled, only PHP functions from `$php_functions` property
|
||||||
|
of the security policy are allowed. See the
|
||||||
|
[Security](../../programmers/advanced-features/advanced-features-security.md) section for details.
|
||||||
|
|
||||||
|
The following is a list of recognized qualifiers, which must be
|
||||||
|
separated from surrounding elements by spaces. Note that items listed in
|
||||||
|
\[brackets\] are optional. PHP equivalents are shown where applicable.
|
||||||
|
|
||||||
|
## Qualifiers
|
||||||
|
|
||||||
|
| Qualifier | Alternates | Syntax Example | Meaning | PHP Equivalent |
|
||||||
|
|--------------------|------------|----------------------|--------------------------------|--------------------|
|
||||||
|
| == | eq | $a eq $b | equals | == |
|
||||||
|
| != | ne, neq | $a neq $b | not equals | != |
|
||||||
|
| > | gt | $a gt $b | greater than | > |
|
||||||
|
| < | lt | $a lt $b | less than | < |
|
||||||
|
| >= | gte, ge | $a ge $b | greater than or equal | >= |
|
||||||
|
| <= | lte, le | $a le $b | less than or equal | <= |
|
||||||
|
| === | | $a === 0 | check for identity | === |
|
||||||
|
| ! | not | not $a | negation (unary) | ! |
|
||||||
|
| % | mod | $a mod $b | modulo | % |
|
||||||
|
| is \[not\] div by | | $a is not div by 4 | divisible by | $a % $b == 0 |
|
||||||
|
| is \[not\] even | | $a is not even | \[not\] an even number (unary) | $a % 2 == 0 |
|
||||||
|
| is \[not\] even by | | $a is not even by $b | grouping level \[not\] even | ($a / $b) % 2 == 0 |
|
||||||
|
| is \[not\] odd | | $a is not odd | \[not\] an odd number (unary) | $a % 2 != 0 |
|
||||||
|
| is \[not\] odd by | | $a is not odd by $b | \[not\] an odd grouping | ($a / $b) % 2 != 0 |
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
```smarty
|
||||||
|
{if $name eq 'Fred'}
|
||||||
|
Welcome Sir.
|
||||||
|
{elseif $name eq 'Wilma'}
|
||||||
|
Welcome Ma'am.
|
||||||
|
{else}
|
||||||
|
Welcome, whatever you are.
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
{* an example with "or" logic *}
|
||||||
|
{if $name eq 'Fred' or $name eq 'Wilma'}
|
||||||
|
...
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
{* same as above *}
|
||||||
|
{if $name == 'Fred' || $name == 'Wilma'}
|
||||||
|
...
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
|
||||||
|
{* parenthesis are allowed *}
|
||||||
|
{if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}
|
||||||
|
...
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
|
||||||
|
{* you can also embed php function calls *}
|
||||||
|
{if count($var) gt 0}
|
||||||
|
...
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
{* check for array. *}
|
||||||
|
{if is_array($foo) }
|
||||||
|
.....
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
{* check for not null. *}
|
||||||
|
{if isset($foo) }
|
||||||
|
.....
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
|
||||||
|
{* test if values are even or odd *}
|
||||||
|
{if $var is even}
|
||||||
|
...
|
||||||
|
{/if}
|
||||||
|
{if $var is odd}
|
||||||
|
...
|
||||||
|
{/if}
|
||||||
|
{if $var is not odd}
|
||||||
|
...
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
|
||||||
|
{* test if var is divisible by 4 *}
|
||||||
|
{if $var is div by 4}
|
||||||
|
...
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
|
||||||
|
{*
|
||||||
|
test if var is even, grouped by two. i.e.,
|
||||||
|
0=even, 1=even, 2=odd, 3=odd, 4=even, 5=even, etc.
|
||||||
|
*}
|
||||||
|
{if $var is even by 2}
|
||||||
|
...
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
{* 0=even, 1=even, 2=even, 3=odd, 4=odd, 5=odd, etc. *}
|
||||||
|
{if $var is even by 3}
|
||||||
|
...
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
{if isset($name) && $name == 'Blog'}
|
||||||
|
{* do something *}
|
||||||
|
{elseif $name == $foo}
|
||||||
|
{* do something *}
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
{if is_array($foo) && count($foo) > 0}
|
||||||
|
{* do a foreach loop *}
|
||||||
|
{/if}
|
||||||
|
```
|
|
@ -0,0 +1,187 @@
|
||||||
|
# {include}
|
||||||
|
|
||||||
|
`{include}` tags are used for including other templates in the current
|
||||||
|
template. Any variables available in the current template are also
|
||||||
|
available within the included template.
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|----------|--------------------------------------------------------------------------------------------|
|
||||||
|
| file | Yes | The name of the template file to include |
|
||||||
|
| assign | No | The name of the variable that the output of include will be assigned to |
|
||||||
|
| cache_lifetime | No | Enable caching of this subtemplate with an individual cache lifetime |
|
||||||
|
| compile_id | No | Compile this subtemplate with an individual compile_id |
|
||||||
|
| cache_id | No | Enable caching of this subtemplate with an individual cache_id |
|
||||||
|
| scope | No | Define the scope of all in the subtemplate assigned variables: 'parent','root' or 'global' |
|
||||||
|
| \[var \...\] | No | variable to pass local to template |
|
||||||
|
|
||||||
|
|
||||||
|
- The `{include}` tag must have the `file` attribute which contains
|
||||||
|
the template resource path.
|
||||||
|
|
||||||
|
- Setting the optional `assign` attribute specifies the template
|
||||||
|
variable that the output of `{include}` is assigned to, instead of
|
||||||
|
being displayed. Similar to [`{assign}`](./language-function-assign.md).
|
||||||
|
|
||||||
|
- Variables can be passed to included templates as
|
||||||
|
[attributes](../language-basic-syntax/language-syntax-attributes.md). Any variables explicitly
|
||||||
|
passed to an included template are only available within the scope
|
||||||
|
of the included file. Attribute variables override current template
|
||||||
|
variables, in the case when they are named the same.
|
||||||
|
|
||||||
|
- You can use all variables from the including template inside the
|
||||||
|
included template. But changes to variables or new created variables
|
||||||
|
inside the included template have local scope and are not visible
|
||||||
|
inside the including template after the `{include}` statement. This
|
||||||
|
default behaviour can be changed for all variables assigned in the
|
||||||
|
included template by using the scope attribute at the `{include}`
|
||||||
|
statement or for individual variables by using the scope attribute
|
||||||
|
at the [`{assign}`](./language-function-assign.md) statement. The later
|
||||||
|
is useful to return values from the included template to the
|
||||||
|
including template.
|
||||||
|
|
||||||
|
- Use the syntax for [template resources](../../programmers/resources.md) to `{include}`
|
||||||
|
files outside of the [`$template_dir`](../../programmers/api-variables/variable-template-dir.md)
|
||||||
|
directory.
|
||||||
|
|
||||||
|
## Option Flags
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
|---------|--------------------------------------------------------------------------------------|
|
||||||
|
| nocache | Disables caching of this subtemplate |
|
||||||
|
| caching | Enable caching of this subtemplate |
|
||||||
|
| inline | If set, merge the compile-code of the subtemplate into the compiled calling template |
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
```smarty
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{$title}</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{include file='page_header.tpl'}
|
||||||
|
|
||||||
|
{* body of template goes here, the $tpl_name variable
|
||||||
|
is replaced with a value eg 'contact.tpl'
|
||||||
|
*}
|
||||||
|
{include file="$tpl_name.tpl"}
|
||||||
|
|
||||||
|
{* using shortform file attribute *}
|
||||||
|
{include 'page_footer.tpl'}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
|
||||||
|
{include 'links.tpl' title='Newest links' links=$link_array}
|
||||||
|
{* body of template goes here *}
|
||||||
|
{include 'footer.tpl' foo='bar'}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
The template above includes the example `links.tpl` below
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<div id="box">
|
||||||
|
<h3>{$title}{/h3>
|
||||||
|
<ul>
|
||||||
|
{foreach from=$links item=l}
|
||||||
|
.. do stuff ...
|
||||||
|
</foreach}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
```
|
||||||
|
Variables assigned in the included template will be seen in the
|
||||||
|
including template.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{include 'sub_template.tpl' scope=parent}
|
||||||
|
...
|
||||||
|
{* display variables assigned in sub_template *}
|
||||||
|
{$foo}<br>
|
||||||
|
{$bar}<br>
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
The template above includes the example `sub_template.tpl` below
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
...
|
||||||
|
{assign var=foo value='something'}
|
||||||
|
{assign var=bar value='value'}
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
The included template will not be cached.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{include 'sub_template.tpl' nocache}
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
In this example included template will be cached with an individual
|
||||||
|
cache lifetime of 500 seconds.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{include 'sub_template.tpl' cache_lifetime=500}
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
In this example included template will be cached independent of the
|
||||||
|
global caching setting.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{include 'sub_template.tpl' caching}
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
This example assigns the contents of `nav.tpl` to the `$navbar`
|
||||||
|
variable, which is then output at both the top and bottom of the page.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<body>
|
||||||
|
{include 'nav.tpl' assign=navbar}
|
||||||
|
{include 'header.tpl' title='Smarty is cool'}
|
||||||
|
{$navbar}
|
||||||
|
{* body of template goes here *}
|
||||||
|
{$navbar}
|
||||||
|
{include 'footer.tpl'}
|
||||||
|
</body>
|
||||||
|
```
|
||||||
|
|
||||||
|
This example includes another template relative to the directory of the
|
||||||
|
current template.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{include 'template-in-a-template_dir-directory.tpl'}
|
||||||
|
{include './template-in-same-directory.tpl'}
|
||||||
|
{include '../template-in-parent-directory.tpl'}
|
||||||
|
```
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* absolute filepath *}
|
||||||
|
{include file='/usr/local/include/templates/header.tpl'}
|
||||||
|
|
||||||
|
{* absolute filepath (same thing) *}
|
||||||
|
{include file='file:/usr/local/include/templates/header.tpl'}
|
||||||
|
|
||||||
|
{* windows absolute filepath (MUST use "file:" prefix) *}
|
||||||
|
{include file='file:C:/www/pub/templates/header.tpl'}
|
||||||
|
|
||||||
|
{* include from template resource named "db" *}
|
||||||
|
{include file='db:header.tpl'}
|
||||||
|
|
||||||
|
{* include a $variable template - eg $module = 'contacts' *}
|
||||||
|
{include file="$module.tpl"}
|
||||||
|
|
||||||
|
{* wont work as its single quotes ie no variable substitution *}
|
||||||
|
{include file='$module.tpl'}
|
||||||
|
|
||||||
|
{* include a multi $variable template - eg amber/links.view.tpl *}
|
||||||
|
{include file="$style_dir/$module.$view.tpl"}
|
||||||
|
```
|
||||||
|
|
||||||
|
See also [`{insert}`](./language-function-insert.md), [template resources](../../programmers/resources.md) and
|
||||||
|
[componentized templates](../../appendixes/tips.md#componentized-templates).
|
|
@ -0,0 +1,86 @@
|
||||||
|
# {insert}
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> `{insert}` tags are deprecated from Smarty, and should not be used.
|
||||||
|
> Put your PHP logic in PHP scripts or plugin functions instead.
|
||||||
|
> As of Smarty 3.1 the `{insert}` tags are only available from
|
||||||
|
> [SmartyBC](#bc).
|
||||||
|
|
||||||
|
`{insert}` tags work much like [`{include}`](./language-function-include.md)
|
||||||
|
tags, except that `{insert}` tags are NOT cached when template
|
||||||
|
[caching](../../programmers/caching.md) is enabled. They will be executed on every
|
||||||
|
invocation of the template.
|
||||||
|
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|----------|----------------------------------------------------------------------------------|
|
||||||
|
| name | Yes | The name of the insert function (insert_`name`) or insert plugin |
|
||||||
|
| assign | No | The name of the template variable the output will be assigned to |
|
||||||
|
| script | No | The name of the php script that is included before the insert function is called |
|
||||||
|
| \[var \...\] | No | variable to pass to insert function |
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
Let's say you have a template with a banner slot at the top of the
|
||||||
|
page. The banner can contain any mixture of HTML, images, flash, etc. so
|
||||||
|
we can't just use a static link here, and we don't want this contents
|
||||||
|
cached with the page. In comes the {insert} tag: the template knows
|
||||||
|
\#banner\_location\_id\# and \#site\_id\# values (gathered from a
|
||||||
|
[config file](../config-files.md)), and needs to call a function to get the
|
||||||
|
banner contents.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* example of fetching a banner *}
|
||||||
|
{insert name="getBanner" lid=#banner_location_id# sid=#site_id#}
|
||||||
|
{insert "getBanner" lid=#banner_location_id# sid=#site_id#} {* short-hand *}
|
||||||
|
```
|
||||||
|
|
||||||
|
In this example, we are using the name "getBanner" and passing the
|
||||||
|
parameters \#banner\_location\_id\# and \#site\_id\#. Smarty will look
|
||||||
|
for a function named insert\_getBanner() in your PHP application,
|
||||||
|
passing the values of \#banner\_location\_id\# and \#site\_id\# as the
|
||||||
|
first argument in an associative array. All {insert} function names in
|
||||||
|
your application must be prepended with "insert_" to remedy possible
|
||||||
|
function name-space conflicts. Your insert\_getBanner() function should
|
||||||
|
do something with the passed values and return the results. These
|
||||||
|
results are then displayed in the template in place of the {insert} tag.
|
||||||
|
In this example, Smarty would call this function:
|
||||||
|
insert_getBanner(array("lid" => "12345","sid" => "67890"));
|
||||||
|
and display the returned results in place of the {insert} tag.
|
||||||
|
|
||||||
|
- If you supply the `assign` attribute, the output of the `{insert}`
|
||||||
|
tag will be assigned to this template variable instead of being
|
||||||
|
output to the template.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> Assigning the output to a template variable isn't too useful with
|
||||||
|
> [caching](../../programmers/api-variables/variable-caching.md) enabled.
|
||||||
|
|
||||||
|
- If you supply the `script` attribute, this php script will be
|
||||||
|
included (only once) before the `{insert}` function is executed.
|
||||||
|
This is the case where the insert function may not exist yet, and a
|
||||||
|
php script must be included first to make it work.
|
||||||
|
|
||||||
|
The path can be either absolute, or relative to
|
||||||
|
[`$trusted_dir`](../../programmers/api-variables/variable-trusted-dir.md). If security is enabled,
|
||||||
|
then the script must be located in the `$trusted_dir` path of the
|
||||||
|
security policy. See the [Security](../../programmers/advanced-features/advanced-features-security.md)
|
||||||
|
section for details.
|
||||||
|
|
||||||
|
The Smarty object is passed as the second argument. This way you can
|
||||||
|
reference and modify information in the Smarty object from within the
|
||||||
|
`{insert}` function.
|
||||||
|
|
||||||
|
If no PHP script can be found Smarty is looking for a corresponding
|
||||||
|
insert plugin.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> It is possible to have portions of the template not cached. If you
|
||||||
|
> have [caching](../../programmers/api-variables/variable-caching.md) turned on, `{insert}` tags will not be
|
||||||
|
> cached. They will run dynamically every time the page is created, even
|
||||||
|
> within cached pages. This works good for things like banners, polls,
|
||||||
|
> live weather, search results, user feedback areas, etc.
|
||||||
|
|
||||||
|
See also [`{include}`](./language-function-include.md)
|
|
@ -0,0 +1,51 @@
|
||||||
|
# {ldelim}, {rdelim}
|
||||||
|
|
||||||
|
`{ldelim}` and `{rdelim}` are used for [escaping](../language-basic-syntax/language-escaping.md)
|
||||||
|
template delimiters, by default **{** and **}**. You can also use
|
||||||
|
[`{literal}{/literal}`](./language-function-literal.md) to escape blocks of
|
||||||
|
text eg Javascript or CSS. See also the complementary
|
||||||
|
[`{$smarty.ldelim}`](../../programmers/api-variables/variable-left-delimiter.md).
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* this will print literal delimiters out of the template *}
|
||||||
|
|
||||||
|
{ldelim}funcname{rdelim} is how functions look in Smarty!
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```
|
||||||
|
{funcname} is how functions look in Smarty!
|
||||||
|
```
|
||||||
|
|
||||||
|
Another example with some Javascript
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<script>
|
||||||
|
function foo() {ldelim}
|
||||||
|
... code ...
|
||||||
|
{rdelim}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
will output
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script>
|
||||||
|
function foo() {
|
||||||
|
.... code ...
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<script>
|
||||||
|
function myJsFunction(){ldelim}
|
||||||
|
alert("The server name\n{$smarty.server.SERVER_NAME|escape:javascript}\n{$smarty.server.SERVER_ADDR|escape:javascript}");
|
||||||
|
{rdelim}
|
||||||
|
</script>
|
||||||
|
<a href="javascript:myJsFunction()">Click here for Server Info</a>
|
||||||
|
```
|
||||||
|
|
||||||
|
See also [`{literal}`](./language-function-literal.md) and [escaping Smarty
|
||||||
|
parsing](../language-basic-syntax/language-escaping.md).
|
|
@ -0,0 +1,34 @@
|
||||||
|
# {literal}
|
||||||
|
|
||||||
|
`{literal}` tags allow a block of data to be taken literally. This is
|
||||||
|
typically used around Javascript or stylesheet blocks where {curly
|
||||||
|
braces} would interfere with the template
|
||||||
|
[delimiter](../../programmers/api-variables/variable-left-delimiter.md) syntax. Anything within
|
||||||
|
`{literal}{/literal}` tags is not interpreted, but displayed as-is. If
|
||||||
|
you need template tags embedded in a `{literal}` block, consider using
|
||||||
|
[`{ldelim}{rdelim}`](./language-function-ldelim.md) to escape the individual
|
||||||
|
delimiters instead.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> `{literal}{/literal}` tags are normally not necessary, as Smarty
|
||||||
|
> ignores delimiters that are surrounded by whitespace. Be sure your
|
||||||
|
> javascript and CSS curly braces are surrounded by whitespace. This is
|
||||||
|
> new behavior to Smarty 3.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<script>
|
||||||
|
// the following braces are ignored by Smarty
|
||||||
|
// since they are surrounded by whitespace
|
||||||
|
function myFoo {
|
||||||
|
alert('Foo!');
|
||||||
|
}
|
||||||
|
// this one will need literal escapement
|
||||||
|
{literal}
|
||||||
|
function myBar {alert('Bar!');}
|
||||||
|
{/literal}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
See also [`{ldelim} {rdelim}`](./language-function-ldelim.md) and the
|
||||||
|
[escaping Smarty parsing](../language-basic-syntax/language-escaping.md) page.
|
|
@ -0,0 +1,20 @@
|
||||||
|
# {nocache}
|
||||||
|
|
||||||
|
`{nocache}` is used to disable caching of a template section. Every
|
||||||
|
`{nocache}` must be paired with a matching `{/nocache}`.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> Be sure any variables used within a non-cached section are also
|
||||||
|
> assigned from PHP when the page is loaded from the cache.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
Today's date is
|
||||||
|
{nocache}
|
||||||
|
{$smarty.now|date_format}
|
||||||
|
{/nocache}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above code will output the current date on a cached page.
|
||||||
|
|
||||||
|
See also the [caching section](../../programmers/caching.md).
|
|
@ -0,0 +1,610 @@
|
||||||
|
# {section}, {sectionelse}
|
||||||
|
|
||||||
|
A `{section}` is for looping over **sequentially indexed arrays of
|
||||||
|
data**, unlike [`{foreach}`](./language-function-foreach.md) which is used
|
||||||
|
to loop over a **single associative array**. Every `{section}` tag must
|
||||||
|
be paired with a closing `{/section}` tag.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> The [`{foreach}`](./language-function-foreach.md) loop can do everything a
|
||||||
|
> {section} loop can do, and has a simpler and easier syntax. It is
|
||||||
|
> usually preferred over the {section} loop.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> {section} loops cannot loop over associative arrays, they must be
|
||||||
|
> numerically indexed, and sequential (0,1,2,\...). For associative
|
||||||
|
> arrays, use the [`{foreach}`](./language-function-foreach.md) loop.
|
||||||
|
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| name | Yes | The name of the section |
|
||||||
|
| loop | Yes | Value to determine the number of loop iterations |
|
||||||
|
| start | No | The index position that the section will begin looping. If the value is negative, the start position is calculated from the end of the array. For example, if there are seven values in the loop array and start is -2, the start index is 5. Invalid values (values outside of the length of the loop array) are automatically truncated to the closest valid value. Defaults to 0. |
|
||||||
|
| step | No | The step value that will be used to traverse the loop array. For example, step=2 will loop on index 0, 2, 4, etc. If step is negative, it will step through the array backwards. Defaults to 1. |
|
||||||
|
| max | No | Sets the maximum number of times the section will loop. |
|
||||||
|
| show | No | Determines whether to show this section (defaults to true) |
|
||||||
|
|
||||||
|
## Option Flags
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
|---------|------------------------------------------|
|
||||||
|
| nocache | Disables caching of the `{section}` loop |
|
||||||
|
|
||||||
|
- Required attributes are `name` and `loop`.
|
||||||
|
|
||||||
|
- The `name` of the `{section}` can be anything you like, made up of
|
||||||
|
letters, numbers and underscores, like [PHP
|
||||||
|
variables](https://www.php.net/language.variables).
|
||||||
|
|
||||||
|
- {section}'s can be nested, and the nested `{section}` names must be
|
||||||
|
unique from each other.
|
||||||
|
|
||||||
|
- The `loop` attribute, usually an array of values, determines the
|
||||||
|
number of times the `{section}` will loop. You can also pass an
|
||||||
|
integer as the loop value.
|
||||||
|
|
||||||
|
- When printing a variable within a `{section}`, the `{section}`
|
||||||
|
`name` must be given next to variable name within \[brackets\].
|
||||||
|
|
||||||
|
- `{sectionelse}` is executed when there are no values in the loop
|
||||||
|
variable.
|
||||||
|
|
||||||
|
- A `{section}` also has its own variables that handle `{section}`
|
||||||
|
properties. These properties are accessible as:
|
||||||
|
[`{$smarty.section.name.property}`](../language-variables/language-variables-smarty.md#smartysection-languagevariablessmartyloops)
|
||||||
|
where "name" is the attribute `name`.
|
||||||
|
|
||||||
|
- `{section}` properties are [`index`](#index),
|
||||||
|
[`index_prev`](#index_prev),
|
||||||
|
[`index_next`](#index_next),
|
||||||
|
[`iteration`](#iteration),
|
||||||
|
[`first`](#first),
|
||||||
|
[`last`](#last),
|
||||||
|
[`rownum`](#rownum),
|
||||||
|
[`loop`](#loop), [`show`](#show),
|
||||||
|
[`total`](#total).
|
||||||
|
|
||||||
|
[`assign()`](../../programmers/api-functions/api-assign.md) an array to Smarty
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
$data = [1000, 1001, 1002];
|
||||||
|
$smarty->assign('custid', $data);
|
||||||
|
```
|
||||||
|
|
||||||
|
The template that outputs the array
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* this example will print out all the values of the $custid array *}
|
||||||
|
{section name=customer loop=$custid}
|
||||||
|
{section customer $custid} {* short-hand *}
|
||||||
|
id: {$custid[customer]}<br />
|
||||||
|
{/section}
|
||||||
|
<hr />
|
||||||
|
{* print out all the values of the $custid array reversed *}
|
||||||
|
{section name=foo loop=$custid step=-1}
|
||||||
|
{section foo $custid step=-1} {* short-hand *}
|
||||||
|
{$custid[foo]}<br />
|
||||||
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
id: 1000<br />
|
||||||
|
id: 1001<br />
|
||||||
|
id: 1002<br />
|
||||||
|
<hr />
|
||||||
|
id: 1002<br />
|
||||||
|
id: 1001<br />
|
||||||
|
id: 1000<br />
|
||||||
|
```
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{section name=foo start=10 loop=20 step=2}
|
||||||
|
{$smarty.section.foo.index}
|
||||||
|
{/section}
|
||||||
|
<hr />
|
||||||
|
{section name=bar loop=21 max=6 step=-2}
|
||||||
|
{$smarty.section.bar.index}
|
||||||
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
10 12 14 16 18
|
||||||
|
<hr />
|
||||||
|
20 18 16 14 12 10
|
||||||
|
```
|
||||||
|
|
||||||
|
The `name` of the `{section}` can be anything you like, see [PHP
|
||||||
|
variables](https://www.php.net/language.variables). It is used to reference
|
||||||
|
the data within the `{section}`.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{section name=anything loop=$myArray}
|
||||||
|
{$myArray[anything].foo}
|
||||||
|
{$name[anything]}
|
||||||
|
{$address[anything].bar}
|
||||||
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
This is an example of printing an associative array of data with a
|
||||||
|
`{section}`. Following is the php script to assign the `$contacts` array
|
||||||
|
to Smarty.
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
$data = [
|
||||||
|
['name' => 'John Smith', 'home' => '555-555-5555',
|
||||||
|
'cell' => '666-555-5555', 'email' => 'john@myexample.com'],
|
||||||
|
['name' => 'Jack Jones', 'home' => '777-555-5555',
|
||||||
|
'cell' => '888-555-5555', 'email' => 'jack@myexample.com'],
|
||||||
|
['name' => 'Jane Munson', 'home' => '000-555-5555',
|
||||||
|
'cell' => '123456', 'email' => 'jane@myexample.com']
|
||||||
|
];
|
||||||
|
$smarty->assign('contacts',$data);
|
||||||
|
```
|
||||||
|
|
||||||
|
The template to output `$contacts`
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{section name=customer loop=$contacts}
|
||||||
|
<p>
|
||||||
|
name: {$contacts[customer].name}<br />
|
||||||
|
home: {$contacts[customer].home}<br />
|
||||||
|
cell: {$contacts[customer].cell}<br />
|
||||||
|
e-mail: {$contacts[customer].email}
|
||||||
|
</p>
|
||||||
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<p>
|
||||||
|
name: John Smith<br />
|
||||||
|
home: 555-555-5555<br />
|
||||||
|
cell: 666-555-5555<br />
|
||||||
|
e-mail: john@myexample.com
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
name: Jack Jones<br />
|
||||||
|
home phone: 777-555-5555<br />
|
||||||
|
cell phone: 888-555-5555<br />
|
||||||
|
e-mail: jack@myexample.com
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
name: Jane Munson<br />
|
||||||
|
home phone: 000-555-5555<br />
|
||||||
|
cell phone: 123456<br />
|
||||||
|
e-mail: jane@myexample.com
|
||||||
|
</p>
|
||||||
|
```
|
||||||
|
|
||||||
|
This example assumes that `$custid`, `$name` and `$address` are all
|
||||||
|
arrays containing the same number of values. First the php script that
|
||||||
|
assign's the arrays to Smarty.
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$id = [1001,1002,1003];
|
||||||
|
$smarty->assign('custid',$id);
|
||||||
|
|
||||||
|
$fullnames = ['John Smith','Jack Jones','Jane Munson'];
|
||||||
|
$smarty->assign('name',$fullnames);
|
||||||
|
|
||||||
|
$addr = ['253 Abbey road', '417 Mulberry ln', '5605 apple st'];
|
||||||
|
$smarty->assign('address',$addr);
|
||||||
|
```
|
||||||
|
|
||||||
|
The `loop` variable only determines the number of times to loop. You can
|
||||||
|
access ANY variable from the template within the `{section}`. This is
|
||||||
|
useful for looping multiple arrays. You can pass an array which will
|
||||||
|
determine the loop count by the array size, or you can pass an integer
|
||||||
|
to specify the number of loops.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{section name=customer loop=$custid}
|
||||||
|
<p>
|
||||||
|
id: {$custid[customer]}<br />
|
||||||
|
name: {$name[customer]}<br />
|
||||||
|
address: {$address[customer]}
|
||||||
|
</p>
|
||||||
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<p>
|
||||||
|
id: 1000<br />
|
||||||
|
name: John Smith<br />
|
||||||
|
address: 253 Abbey road
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
id: 1001<br />
|
||||||
|
name: Jack Jones<br />
|
||||||
|
address: 417 Mulberry ln
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
id: 1002<br />
|
||||||
|
name: Jane Munson<br />
|
||||||
|
address: 5605 apple st
|
||||||
|
</p>
|
||||||
|
```
|
||||||
|
|
||||||
|
{section}'s can be nested as deep as you like. With nested
|
||||||
|
{section}'s, you can access complex data structures, such as
|
||||||
|
multidimensional arrays. This is an example `.php` script that
|
||||||
|
assigns the arrays.
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$id = [1001,1002,1003];
|
||||||
|
$smarty->assign('custid',$id);
|
||||||
|
|
||||||
|
$fullnames = ['John Smith','Jack Jones','Jane Munson'];
|
||||||
|
$smarty->assign('name',$fullnames);
|
||||||
|
|
||||||
|
$addr = ['253 N 45th', '417 Mulberry ln', '5605 apple st'];
|
||||||
|
$smarty->assign('address',$addr);
|
||||||
|
|
||||||
|
$types = [
|
||||||
|
[ 'home phone', 'cell phone', 'e-mail'],
|
||||||
|
[ 'home phone', 'web'],
|
||||||
|
[ 'cell phone']
|
||||||
|
];
|
||||||
|
$smarty->assign('contact_type', $types);
|
||||||
|
|
||||||
|
$info = [
|
||||||
|
['555-555-5555', '666-555-5555', 'john@myexample.com'],
|
||||||
|
[ '123-456-4', 'www.example.com'],
|
||||||
|
[ '0457878']
|
||||||
|
];
|
||||||
|
$smarty->assign('contact_info', $info);
|
||||||
|
```
|
||||||
|
|
||||||
|
In this template, *$contact_type\[customer\]* is an array of contact
|
||||||
|
types for the current customer.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{section name=customer loop=$custid}
|
||||||
|
<hr>
|
||||||
|
id: {$custid[customer]}<br />
|
||||||
|
name: {$name[customer]}<br />
|
||||||
|
address: {$address[customer]}<br />
|
||||||
|
{section name=contact loop=$contact_type[customer]}
|
||||||
|
{$contact_type[customer][contact]}: {$contact_info[customer][contact]}<br />
|
||||||
|
{/section}
|
||||||
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<hr>
|
||||||
|
id: 1000<br />
|
||||||
|
name: John Smith<br />
|
||||||
|
address: 253 N 45th<br />
|
||||||
|
home phone: 555-555-5555<br />
|
||||||
|
cell phone: 666-555-5555<br />
|
||||||
|
e-mail: john@myexample.com<br />
|
||||||
|
<hr>
|
||||||
|
id: 1001<br />
|
||||||
|
name: Jack Jones<br />
|
||||||
|
address: 417 Mulberry ln<br />
|
||||||
|
home phone: 123-456-4<br />
|
||||||
|
web: www.example.com<br />
|
||||||
|
<hr>
|
||||||
|
id: 1002<br />
|
||||||
|
name: Jane Munson<br />
|
||||||
|
address: 5605 apple st<br />
|
||||||
|
cell phone: 0457878<br />
|
||||||
|
```
|
||||||
|
|
||||||
|
Results of a database search (eg ADODB or PEAR) are assigned to Smarty
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
$sql = 'select id, name, home, cell, email from contacts '
|
||||||
|
."where name like '$foo%' ";
|
||||||
|
$smarty->assign('contacts', $db->getAll($sql));
|
||||||
|
```
|
||||||
|
|
||||||
|
The template to output the database result in a HTML table
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<table>
|
||||||
|
<tr><th> </th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
|
||||||
|
{section name=co loop=$contacts}
|
||||||
|
<tr>
|
||||||
|
<td><a href="view.php?id={$contacts[co].id}">view<a></td>
|
||||||
|
<td>{$contacts[co].name}</td>
|
||||||
|
<td>{$contacts[co].home}</td>
|
||||||
|
<td>{$contacts[co].cell}</td>
|
||||||
|
<td>{$contacts[co].email}</td>
|
||||||
|
<tr>
|
||||||
|
{sectionelse}
|
||||||
|
<tr><td colspan="5">No items found</td></tr>
|
||||||
|
{/section}
|
||||||
|
</table>
|
||||||
|
```
|
||||||
|
|
||||||
|
## .index
|
||||||
|
`index` contains the current array index, starting with zero or the
|
||||||
|
`start` attribute if given. It increments by one or by the `step`
|
||||||
|
attribute if given.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> If the `step` and `start` properties are not modified, then this works
|
||||||
|
> the same as the [`iteration`](#iteration) property,
|
||||||
|
> except it starts at zero instead of one.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> `$custid[customer.index]` and `$custid[customer]` are identical.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{section name=customer loop=$custid}
|
||||||
|
{$smarty.section.customer.index} id: {$custid[customer]}<br />
|
||||||
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
0 id: 1000<br />
|
||||||
|
1 id: 1001<br />
|
||||||
|
2 id: 1002<br />
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## .index_prev
|
||||||
|
|
||||||
|
`index_prev` is the previous loop index. On the first loop, this is set to -1.
|
||||||
|
|
||||||
|
## .index_next
|
||||||
|
|
||||||
|
`index_next` is the next loop index. On the last loop, this is still one
|
||||||
|
more than the current index, respecting the setting of the `step`
|
||||||
|
attribute, if given.
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
$data = [1001,1002,1003,1004,1005];
|
||||||
|
$smarty->assign('rows',$data);
|
||||||
|
```
|
||||||
|
|
||||||
|
Template to output the above array in a table
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* $rows[row.index] and $rows[row] are identical in meaning *}
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>index</th><th>id</th>
|
||||||
|
<th>index_prev</th><th>prev_id</th>
|
||||||
|
<th>index_next</th><th>next_id</th>
|
||||||
|
</tr>
|
||||||
|
{section name=row loop=$rows}
|
||||||
|
<tr>
|
||||||
|
<td>{$smarty.section.row.index}</td><td>{$rows[row]}</td>
|
||||||
|
<td>{$smarty.section.row.index_prev}</td><td>{$rows[row.index_prev]}</td>
|
||||||
|
<td>{$smarty.section.row.index_next}</td><td>{$rows[row.index_next]}</td>
|
||||||
|
</tr>
|
||||||
|
{/section}
|
||||||
|
</table>
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output a table containing the following:
|
||||||
|
|
||||||
|
```
|
||||||
|
index id index_prev prev_id index_next next_id
|
||||||
|
0 1001 -1 1 1002
|
||||||
|
1 1002 0 1001 2 1003
|
||||||
|
2 1003 1 1002 3 1004
|
||||||
|
3 1004 2 1003 4 1005
|
||||||
|
4 1005 3 1004 5
|
||||||
|
```
|
||||||
|
|
||||||
|
## .iteration
|
||||||
|
|
||||||
|
`iteration` contains the current loop iteration and starts at one.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> This is not affected by the `{section}` properties `start`, `step` and
|
||||||
|
> `max`, unlike the [`index`](#index) property.
|
||||||
|
> `iteration` also starts with one instead of zero unlike `index`.
|
||||||
|
> [`rownum`](#rownum) is an alias to `iteration`, they
|
||||||
|
> are identical.
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
// array of 3000 to 3015
|
||||||
|
$id = range(3000,3015);
|
||||||
|
$smarty->assign('arr', $id);
|
||||||
|
```
|
||||||
|
|
||||||
|
Template to output every other element of the `$arr` array as `step=2`
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{section name=cu loop=$arr start=5 step=2}
|
||||||
|
iteration={$smarty.section.cu.iteration}
|
||||||
|
index={$smarty.section.cu.index}
|
||||||
|
id={$custid[cu]}<br />
|
||||||
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
iteration=1 index=5 id=3005<br />
|
||||||
|
iteration=2 index=7 id=3007<br />
|
||||||
|
iteration=3 index=9 id=3009<br />
|
||||||
|
iteration=4 index=11 id=3011<br />
|
||||||
|
iteration=5 index=13 id=3013<br />
|
||||||
|
iteration=6 index=15 id=3015<br />
|
||||||
|
```
|
||||||
|
|
||||||
|
Another example that uses the `iteration` property to output a table
|
||||||
|
header block every five rows.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<table>
|
||||||
|
{section name=co loop=$contacts}
|
||||||
|
{if $smarty.section.co.iteration is div by 5}
|
||||||
|
<tr><th> </th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
|
||||||
|
{/if}
|
||||||
|
<tr>
|
||||||
|
<td><a href="view.php?id={$contacts[co].id}">view<a></td>
|
||||||
|
<td>{$contacts[co].name}</td>
|
||||||
|
<td>{$contacts[co].home}</td>
|
||||||
|
<td>{$contacts[co].cell}</td>
|
||||||
|
<td>{$contacts[co].email}</td>
|
||||||
|
<tr>
|
||||||
|
{/section}
|
||||||
|
</table>
|
||||||
|
```
|
||||||
|
|
||||||
|
An example that uses the `iteration` property to alternate a text color every
|
||||||
|
third row.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<table>
|
||||||
|
{section name=co loop=$contacts}
|
||||||
|
{if $smarty.section.co.iteration is even by 3}
|
||||||
|
<span style="color: #ffffff">{$contacts[co].name}</span>
|
||||||
|
{else}
|
||||||
|
<span style="color: #dddddd">{$contacts[co].name}</span>
|
||||||
|
{/if}
|
||||||
|
{/section}
|
||||||
|
</table>
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> The *"is div by"* syntax is a simpler alternative to the PHP mod
|
||||||
|
> operator syntax. The mod operator is allowed:
|
||||||
|
> `{if $smarty.section.co.iteration % 5 == 1}` will work just the same.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> You can also use *"is odd by"* to reverse the alternating.
|
||||||
|
|
||||||
|
## .first
|
||||||
|
|
||||||
|
`first` is set to TRUE if the current `{section}` iteration is the initial one.
|
||||||
|
|
||||||
|
## .last
|
||||||
|
|
||||||
|
`last` is set to TRUE if the current section iteration is the final one.
|
||||||
|
|
||||||
|
This example loops the `$customers` array, outputs a header block on the
|
||||||
|
first iteration and on the last outputs the footer block. Also uses the
|
||||||
|
[`total`](#total) property.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{section name=customer loop=$customers}
|
||||||
|
{if $smarty.section.customer.first}
|
||||||
|
<table>
|
||||||
|
<tr><th>id</th><th>customer</th></tr>
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>{$customers[customer].id}}</td>
|
||||||
|
<td>{$customers[customer].name}</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
{if $smarty.section.customer.last}
|
||||||
|
<tr><td></td><td>{$smarty.section.customer.total} customers</td></tr>
|
||||||
|
</table>
|
||||||
|
{/if}
|
||||||
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
## .rownum
|
||||||
|
|
||||||
|
`rownum` contains the current loop iteration, starting with one. It is
|
||||||
|
an alias to [`iteration`](#iteration), they work
|
||||||
|
identically.
|
||||||
|
|
||||||
|
## .loop
|
||||||
|
|
||||||
|
`loop` contains the last index number that this {section} looped. This
|
||||||
|
can be used inside or after the `{section}`.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{section name=customer loop=$custid}
|
||||||
|
{$smarty.section.customer.index} id: {$custid[customer]}<br />
|
||||||
|
{/section}
|
||||||
|
There are {$smarty.section.customer.loop} customers shown above.
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
0 id: 1000<br />
|
||||||
|
1 id: 1001<br />
|
||||||
|
2 id: 1002<br />
|
||||||
|
There are 3 customers shown above.
|
||||||
|
```
|
||||||
|
|
||||||
|
## .show
|
||||||
|
|
||||||
|
`show` is used as a parameter to section and is a boolean value. If
|
||||||
|
FALSE, the section will not be displayed. If there is a `{sectionelse}`
|
||||||
|
present, that will be alternately displayed.
|
||||||
|
|
||||||
|
Boolean `$show_customer_info` has been passed from the PHP application,
|
||||||
|
to regulate whether this section shows.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{section name=customer loop=$customers show=$show_customer_info}
|
||||||
|
{$smarty.section.customer.rownum} id: {$customers[customer]}<br />
|
||||||
|
{/section}
|
||||||
|
|
||||||
|
{if $smarty.section.customer.show}
|
||||||
|
the section was shown.
|
||||||
|
{else}
|
||||||
|
the section was not shown.
|
||||||
|
{/if}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
1 id: 1000<br />
|
||||||
|
2 id: 1001<br />
|
||||||
|
3 id: 1002<br />
|
||||||
|
|
||||||
|
the section was shown.
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## .total
|
||||||
|
|
||||||
|
`total` contains the number of iterations that this `{section}` will
|
||||||
|
loop. This can be used inside or after a `{section}`.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{section name=customer loop=$custid step=2}
|
||||||
|
{$smarty.section.customer.index} id: {$custid[customer]}<br />
|
||||||
|
{/section}
|
||||||
|
There are {$smarty.section.customer.total} customers shown above.
|
||||||
|
```
|
||||||
|
|
||||||
|
See also [`{foreach}`](./language-function-foreach.md),
|
||||||
|
[`{for}`](./language-function-for.md), [`{while}`](./language-function-while.md)
|
||||||
|
and [`$smarty.section`](../language-variables/language-variables-smarty.md#smartysection-languagevariablessmartyloops).
|
|
@ -0,0 +1,43 @@
|
||||||
|
# {setfilter}
|
||||||
|
|
||||||
|
The `{setfilter}...{/setfilter}` block tag allows the definition of
|
||||||
|
template instance's variable filters.
|
||||||
|
|
||||||
|
SYNTAX: `{setfilter filter1\|filter2\|filter3\....}\...{/setfilter}`
|
||||||
|
|
||||||
|
The filter can be:
|
||||||
|
|
||||||
|
- A variable filter plugin specified by it's name.
|
||||||
|
|
||||||
|
- A modifier specified by it's name and optional additional
|
||||||
|
parameter.
|
||||||
|
|
||||||
|
`{setfilter}...{/setfilter}` blocks can be nested. The filter definition
|
||||||
|
of inner blocks does replace the definition of the outer block.
|
||||||
|
|
||||||
|
Template instance filters run in addition to other modifiers and
|
||||||
|
filters. They run in the following order: modifier, default_modifier,
|
||||||
|
$escape_html, registered variable filters, autoloaded variable
|
||||||
|
filters, template instance's variable filters. Everything after
|
||||||
|
default_modifier can be disabled with the `nofilter` flag.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> The setting of template instance filters does not affect the output of
|
||||||
|
> included subtemplates.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<script>
|
||||||
|
{setfilter filter1}
|
||||||
|
{$foo} {* filter1 runs on output of $foo *}
|
||||||
|
{setfilter filter2|mod:true}
|
||||||
|
{$bar} {* filter2 and modifier mod runs on output of $bar *}
|
||||||
|
{/setfilter}
|
||||||
|
{$buh} {* filter1 runs on output of $buh *}
|
||||||
|
{/setfilter}
|
||||||
|
{$blar} {* no template instance filter runs on output of $blar}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
# {strip}
|
||||||
|
|
||||||
|
Many times web designers run into the issue where white space and
|
||||||
|
carriage returns affect the output of the rendered HTML (browser
|
||||||
|
"features"), so you must run all your tags together in the template to
|
||||||
|
get the desired results. This usually ends up in unreadable or
|
||||||
|
unmanageable templates.
|
||||||
|
|
||||||
|
Anything within `{strip}{/strip}` tags are stripped of the extra spaces
|
||||||
|
or carriage returns at the beginnings and ends of the lines before they
|
||||||
|
are displayed. This way you can keep your templates readable, and not
|
||||||
|
worry about extra white space causing problems.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> `{strip}{/strip}` does not affect the contents of template variables,
|
||||||
|
> see the [strip modifier](../language-modifiers/language-modifier-strip.md) instead.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* the following will be all run into one line upon output *}
|
||||||
|
{strip}
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="#">
|
||||||
|
This is a test
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
{/strip}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<table><tr><td><a href="#">This is a test</a></td></tr></table>
|
||||||
|
```
|
||||||
|
|
||||||
|
Notice that in the above example, all the lines begin and end with HTML
|
||||||
|
tags. Be aware that all the lines are run together. If you have plain
|
||||||
|
text at the beginning or end of any line, they will be run together, and
|
||||||
|
may not be desired results.
|
||||||
|
|
||||||
|
See also the [`strip`](../language-modifiers/language-modifier-strip.md) modifier.
|
|
@ -0,0 +1,43 @@
|
||||||
|
# {while}
|
||||||
|
|
||||||
|
`{while}` loops in Smarty have much the same flexibility as PHP
|
||||||
|
[while](https://www.php.net/while) statements, with a few added features for
|
||||||
|
the template engine. Every `{while}` must be paired with a matching
|
||||||
|
`{/while}`. All PHP conditionals and functions are recognized, such as
|
||||||
|
*\|\|*, *or*, *&&*, *and*, *is_array()*, etc.
|
||||||
|
|
||||||
|
The following is a list of recognized qualifiers, which must be
|
||||||
|
separated from surrounding elements by spaces. Note that items listed in
|
||||||
|
\[brackets\] are optional. PHP equivalents are shown where applicable.
|
||||||
|
|
||||||
|
## Qualifiers
|
||||||
|
|
||||||
|
| Qualifier | Alternates | Syntax Example | Meaning | PHP Equivalent |
|
||||||
|
|--------------------|------------|----------------------|--------------------------------|--------------------|
|
||||||
|
| == | eq | $a eq $b | equals | == |
|
||||||
|
| != | ne, neq | $a neq $b | not equals | != |
|
||||||
|
| > | gt | $a gt $b | greater than | > |
|
||||||
|
| < | lt | $a lt $b | less than | < |
|
||||||
|
| >= | gte, ge | $a ge $b | greater than or equal | >= |
|
||||||
|
| <= | lte, le | $a le $b | less than or equal | <= |
|
||||||
|
| === | | $a === 0 | check for identity | === |
|
||||||
|
| ! | not | not $a | negation (unary) | ! |
|
||||||
|
| % | mod | $a mod $b | modulo | % |
|
||||||
|
| is \[not\] div by | | $a is not div by 4 | divisible by | $a % $b == 0 |
|
||||||
|
| is \[not\] even | | $a is not even | \[not\] an even number (unary) | $a % 2 == 0 |
|
||||||
|
| is \[not\] even by | | $a is not even by $b | grouping level \[not\] even | ($a / $b) % 2 == 0 |
|
||||||
|
| is \[not\] odd | | $a is not odd | \[not\] an odd number (unary) | $a % 2 != 0 |
|
||||||
|
| is \[not\] odd by | | $a is not odd by $b | \[not\] an odd grouping | ($a / $b) % 2 != 0 |
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
```smarty
|
||||||
|
{while $foo > 0}
|
||||||
|
{$foo--}
|
||||||
|
{/while}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above example will count down the value of $foo until 1 is reached.
|
||||||
|
|
||||||
|
See also [`{foreach}`](./language-function-foreach.md),
|
||||||
|
[`{for}`](./language-function-for.md) and
|
||||||
|
[`{section}`](./language-function-section.md).
|
|
@ -0,0 +1,32 @@
|
||||||
|
# Combining Modifiers
|
||||||
|
|
||||||
|
You can apply any number of modifiers to a variable. They will be
|
||||||
|
applied in the order they are combined, from left to right. They must be
|
||||||
|
separated with a `|` (pipe) character.
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$smarty->assign('articleTitle', 'Smokers are Productive, but Death Cuts Efficiency.');
|
||||||
|
```
|
||||||
|
|
||||||
|
where template is:
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{$articleTitle}
|
||||||
|
{$articleTitle|upper|spacify}
|
||||||
|
{$articleTitle|lower|spacify|truncate}
|
||||||
|
{$articleTitle|lower|truncate:30|spacify}
|
||||||
|
{$articleTitle|lower|spacify|truncate:30:". . ."}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
The above example will output:
|
||||||
|
|
||||||
|
```
|
||||||
|
Smokers are Productive, but Death Cuts Efficiency.
|
||||||
|
S M O K E R S A R ....snip.... H C U T S E F F I C I E N C Y .
|
||||||
|
s m o k e r s a r ....snip.... b u t d e a t h c u t s...
|
||||||
|
s m o k e r s a r e p r o d u c t i v e , b u t . . .
|
||||||
|
s m o k e r s a r e p. . .
|
||||||
|
```
|
|
@ -0,0 +1,19 @@
|
||||||
|
# Custom Functions
|
||||||
|
|
||||||
|
Smarty comes with several custom plugin functions that you can use in
|
||||||
|
the templates.
|
||||||
|
|
||||||
|
- [{counter}](language-function-counter.md)
|
||||||
|
- [{cycle}](language-function-cycle.md)
|
||||||
|
- [{eval}](language-function-eval.md)
|
||||||
|
- [{fetch}](language-function-fetch.md)
|
||||||
|
- [{html_checkboxes}](language-function-html-checkboxes.md)
|
||||||
|
- [{html_image}](language-function-html-image.md)
|
||||||
|
- [{html_options}](language-function-html-options.md)
|
||||||
|
- [{html_radios}](language-function-html-radios.md)
|
||||||
|
- [{html_select_date}](language-function-html-select-date.md)
|
||||||
|
- [{html_select_time}](language-function-html-select-time.md)
|
||||||
|
- [{html_table}](language-function-html-table.md)
|
||||||
|
- [{mailto}](language-function-mailto.md)
|
||||||
|
- [{math}](language-function-math.md)
|
||||||
|
- [{textformat}](language-function-textformat.md)
|
|
@ -0,0 +1,45 @@
|
||||||
|
# {counter}
|
||||||
|
|
||||||
|
`{counter}` is used to print out a count. `{counter}` will remember the
|
||||||
|
count on each iteration. You can adjust the number, the interval and the
|
||||||
|
direction of the count, as well as determine whether to print the
|
||||||
|
value. You can run multiple counters concurrently by supplying a unique
|
||||||
|
name for each one. If you do not supply a name, the name "default" will
|
||||||
|
be used.
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|----------|-----------------------------------------------------------|
|
||||||
|
| name | No | The name of the counter |
|
||||||
|
| start | No | The initial number to start counting from (defaults to 1) |
|
||||||
|
| skip | No | The interval to count by (defaults to 1) |
|
||||||
|
| direction | No | The direction to count (up/down) (defaults to 'up') |
|
||||||
|
| print | No | Whether or not to print the value (defaults to true) |
|
||||||
|
| assign | No | the template variable the output will be assigned to |
|
||||||
|
|
||||||
|
If you supply the `assign` attribute, the output of the `{counter}`
|
||||||
|
function will be assigned to this template variable instead of being
|
||||||
|
output to the template.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
|
||||||
|
{* initialize the count *}
|
||||||
|
{counter start=0 skip=2}<br />
|
||||||
|
{counter}<br />
|
||||||
|
{counter}<br />
|
||||||
|
{counter}<br />
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
this will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
0<br />
|
||||||
|
2<br />
|
||||||
|
4<br />
|
||||||
|
6<br />
|
||||||
|
```
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
# {cycle}
|
||||||
|
|
||||||
|
`{cycle}` is used to alternate a set of values. This makes it easy to
|
||||||
|
for example, alternate between two or more colors in a table, or cycle
|
||||||
|
through an array of values.
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|----------|-------------------------------------------------------------------------------------------------------------|
|
||||||
|
| name | No | The name of the cycle |
|
||||||
|
| values | Yes | The values to cycle through, either a comma delimited list (see delimiter attribute), or an array of values |
|
||||||
|
| print | No | Whether to print the value or not (defaults to true) |
|
||||||
|
| advance | No | Whether or not to advance to the next value (defaults to true) |
|
||||||
|
| delimiter | No | The delimiter to use in the values attribute (defaults to ',') |
|
||||||
|
| assign | No | The template variable the output will be assigned to |
|
||||||
|
| reset | No | The cycle will be set to the first value and not advanced (defaults to false) |
|
||||||
|
|
||||||
|
- You can `{cycle}` through more than one set of values in a template
|
||||||
|
by supplying a `name` attribute. Give each `{cycle}` a unique
|
||||||
|
`name`.
|
||||||
|
|
||||||
|
- You can force the current value not to print with the `print`
|
||||||
|
attribute set to FALSE. This would be useful for silently skipping a
|
||||||
|
value.
|
||||||
|
|
||||||
|
- The `advance` attribute is used to repeat a value. When set to
|
||||||
|
FALSE, the next call to `{cycle}` will print the same value.
|
||||||
|
|
||||||
|
- If you supply the `assign` attribute, the output of the `{cycle}`
|
||||||
|
function will be assigned to a template variable instead of being
|
||||||
|
output to the template.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
```smarty
|
||||||
|
{section name=rows loop=$data}
|
||||||
|
<tr class="{cycle values="odd,even"}">
|
||||||
|
<td>{$data[rows]}</td>
|
||||||
|
</tr>
|
||||||
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above template would output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<tr class="odd">
|
||||||
|
<td>1</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="even">
|
||||||
|
<td>2</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="odd">
|
||||||
|
<td>3</td>
|
||||||
|
</tr>
|
||||||
|
```
|
|
@ -0,0 +1,14 @@
|
||||||
|
# {debug}
|
||||||
|
|
||||||
|
`{debug}` dumps the debug console to the page. This works regardless of
|
||||||
|
the [debug](../chapter-debugging-console.md) settings in the php script.
|
||||||
|
Since this gets executed at runtime, this is only able to show the
|
||||||
|
[assigned](../../programmers/api-functions/api-assign.md) variables; not the templates that are in use.
|
||||||
|
However, you can see all the currently available variables within the
|
||||||
|
scope of a template.
|
||||||
|
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|----------|------------------------------------------------------------|
|
||||||
|
| output | No | output type, html or javascript (defaults to 'javascript') |
|
||||||
|
|
||||||
|
See also the [debugging console page](../chapter-debugging-console.md).
|
|
@ -0,0 +1,81 @@
|
||||||
|
# {eval}
|
||||||
|
|
||||||
|
`{eval}` is used to evaluate a variable as a template. This can be used
|
||||||
|
for things like embedding template tags/variables into variables or
|
||||||
|
tags/variables into config file variables.
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|----------|------------------------------------------------------|
|
||||||
|
| var | Yes | Variable (or string) to evaluate |
|
||||||
|
| assign | No | The template variable the output will be assigned to |
|
||||||
|
|
||||||
|
If you supply the `assign` attribute, the output of the `{eval}`
|
||||||
|
function will be assigned to this template variable instead of being
|
||||||
|
output to the template.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> - Evaluated variables are treated the same as templates. They follow
|
||||||
|
> the same escapement and security features just as if they were
|
||||||
|
> templates.
|
||||||
|
>
|
||||||
|
> - Evaluated variables are compiled on every invocation, the compiled
|
||||||
|
> versions are not saved! However, if you have [caching](../../programmers/caching.md)
|
||||||
|
> enabled, the output will be cached with the rest of the template.
|
||||||
|
>
|
||||||
|
> - If the content to evaluate doesn't change often, or is used
|
||||||
|
> repeatedly, consider using
|
||||||
|
> `{include file="string:{$template_code}"}` instead. This may cache
|
||||||
|
> the compiled state and thus doesn't have to run the (comparably
|
||||||
|
> slow) compiler on every invocation.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
The contents of the config file, `setup.conf`.
|
||||||
|
|
||||||
|
```ini
|
||||||
|
emphstart = <strong>
|
||||||
|
emphend = </strong>
|
||||||
|
title = Welcome to {$company}'s home page!
|
||||||
|
ErrorCity = You must supply a {#emphstart#}city{#emphend#}.
|
||||||
|
ErrorState = You must supply a {#emphstart#}state{#emphend#}.
|
||||||
|
```
|
||||||
|
|
||||||
|
Where the template is:
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{config_load file='setup.conf'}
|
||||||
|
|
||||||
|
{eval var=$foo}
|
||||||
|
{eval var=#title#}
|
||||||
|
{eval var=#ErrorCity#}
|
||||||
|
{eval var=#ErrorState# assign='state_error'}
|
||||||
|
{$state_error}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above template will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
This is the contents of foo.
|
||||||
|
Welcome to Foobar Pub & Grill's home page!
|
||||||
|
You must supply a <strong>city</strong>.
|
||||||
|
You must supply a <strong>state</strong>.
|
||||||
|
```
|
||||||
|
|
||||||
|
This outputs the server name (in uppercase) and IP. The assigned
|
||||||
|
variable `$str` could be from a database query.
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
$str = 'The server name is {$smarty.server.SERVER_NAME|upper} '
|
||||||
|
.'at {$smarty.server.SERVER_ADDR}';
|
||||||
|
$smarty->assign('foo',$str);
|
||||||
|
```
|
||||||
|
|
||||||
|
Where the template is:
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{eval var=$foo}
|
||||||
|
```
|
|
@ -0,0 +1,61 @@
|
||||||
|
# {fetch}
|
||||||
|
|
||||||
|
`{fetch}` is used to retrieve files from the local file system, http, or
|
||||||
|
ftp and display the contents.
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
| Attribute | Required | Description |
|
||||||
|
|-----------|----------|------------------------------------------------------|
|
||||||
|
| file | Yes | The file, http or ftp site to fetch |
|
||||||
|
| assign | No | The template variable the output will be assigned to |
|
||||||
|
|
||||||
|
- If the file name begins with `http://`, the website page will be
|
||||||
|
fetched and displayed.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> This will not support http redirects, be sure to include a
|
||||||
|
> trailing slash on your web page fetches where necessary.
|
||||||
|
|
||||||
|
- If the file name begins with `ftp://`, the file will be downloaded
|
||||||
|
from the ftp server and displayed.
|
||||||
|
|
||||||
|
- For local files, either a full system file path must be given, or a
|
||||||
|
path relative to the executed php script.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> If security is enabled, and you are fetching a file from the local
|
||||||
|
> file system, `{fetch}` will only allow files from within the
|
||||||
|
> `$secure_dir` path of the security policy. See the
|
||||||
|
> [Security](../../programmers/advanced-features/advanced-features-security.md) section for details.
|
||||||
|
|
||||||
|
- If the `assign` attribute is set, the output of the `{fetch}`
|
||||||
|
function will be assigned to this template variable instead of being
|
||||||
|
output to the template.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* include some javascript in your template *}
|
||||||
|
{fetch file='/export/httpd/www.example.com/docs/navbar.js'}
|
||||||
|
|
||||||
|
{* embed some weather text in your template from another web site *}
|
||||||
|
{fetch file='http://www.myweather.com/68502/'}
|
||||||
|
|
||||||
|
{* fetch a news headline file via ftp *}
|
||||||
|
{fetch file='ftp://user:password@ftp.example.com/path/to/currentheadlines.txt'}
|
||||||
|
{* as above but with variables *}
|
||||||
|
{fetch file="ftp://`$user`:`$password`@`$server`/`$path`"}
|
||||||
|
|
||||||
|
{* assign the fetched contents to a template variable *}
|
||||||
|
{fetch file='http://www.myweather.com/68502/' assign='weather'}
|
||||||
|
{if $weather ne ''}
|
||||||
|
<div id="weather">{$weather}</div>
|
||||||
|
{/if}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
See also [`{capture}`](../language-builtin-functions/language-function-capture.md),
|
||||||
|
[`{eval}`](language-function-eval.md),
|
||||||
|
[`{assign}`](../language-builtin-functions/language-function-assign.md) and [`fetch()`](../../programmers/api-functions/api-fetch.md).
|
|
@ -0,0 +1,102 @@
|
||||||
|
# {html_checkboxes}
|
||||||
|
|
||||||
|
`{html_checkboxes}` is a [custom function](index.md)
|
||||||
|
that creates an html checkbox group with provided data. It takes care of
|
||||||
|
which item(s) are selected by default as well.
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|-------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| name | No | Name of checkbox list (defaults to 'checkbox') |
|
||||||
|
| values | Yes, unless using options attribute | An array of values for checkbox buttons |
|
||||||
|
| output | Yes, unless using options attribute | An array of output for checkbox buttons |
|
||||||
|
| selected | No | The selected checkbox element(s) as a string or array |
|
||||||
|
| options | Yes, unless using values and output | An associative array of values and output |
|
||||||
|
| separator | No | String of text to separate each checkbox item |
|
||||||
|
| assign | No | Assign checkbox tags to an array instead of output |
|
||||||
|
| labels | No | Add <label\>-tags to the output (defaults to true) |
|
||||||
|
| label\_ids | No | Add id-attributes to <label\> and <input\> to the output (defaults to false) |
|
||||||
|
| escape | No | Escape the output / content (values are always escaped) (defaults to true) |
|
||||||
|
| strict | No | Will make the "extra" attributes *disabled* and *readonly* only be set, if they were supplied with either boolean *TRUE* or string *"disabled"* and *"readonly"* respectively (defaults to false) |
|
||||||
|
|
||||||
|
- Required attributes are `values` and `output`, unless you use `options` instead.
|
||||||
|
|
||||||
|
- All output is XHTML compliant.
|
||||||
|
|
||||||
|
- All parameters that are not in the list above are printed as
|
||||||
|
name/value-pairs inside each of the created <input\>-tags.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$smarty->assign('cust_ids', array(1000,1001,1002,1003));
|
||||||
|
$smarty->assign('cust_names', array(
|
||||||
|
'Joe Schmoe',
|
||||||
|
'Jack Smith',
|
||||||
|
'Jane Johnson',
|
||||||
|
'Charlie Brown')
|
||||||
|
);
|
||||||
|
$smarty->assign('customer_id', 1001);
|
||||||
|
```
|
||||||
|
|
||||||
|
where template is
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{html_checkboxes name='id' values=$cust_ids output=$cust_names selected=$customer_id separator='<br />'}
|
||||||
|
```
|
||||||
|
|
||||||
|
or where PHP code is:
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$smarty->assign(
|
||||||
|
'cust_checkboxes',
|
||||||
|
[
|
||||||
|
1000 => 'Joe Schmoe',
|
||||||
|
1001 => 'Jack Smith',
|
||||||
|
1002 => 'Jane Johnson',
|
||||||
|
1003 => 'Charlie Brown',
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$smarty->assign('customer_id', 1001);
|
||||||
|
```
|
||||||
|
|
||||||
|
and the template is
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{html_checkboxes name='id' options=$cust_checkboxes selected=$customer_id separator='<br />'}
|
||||||
|
```
|
||||||
|
|
||||||
|
both examples will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<label><input type="checkbox" name="id[]" value="1000" />Joe Schmoe</label><br />
|
||||||
|
<label><input type="checkbox" name="id[]" value="1001" checked="checked" />Jack Smith</label>
|
||||||
|
<br />
|
||||||
|
<label><input type="checkbox" name="id[]" value="1002" />Jane Johnson</label><br />
|
||||||
|
<label><input type="checkbox" name="id[]" value="1003" />Charlie Brown</label><br />
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$sql = 'select type_id, types from contact_types order by type';
|
||||||
|
$smarty->assign('contact_types',$db->getAssoc($sql));
|
||||||
|
|
||||||
|
$sql = 'select contact_id, contact_type_id, contact '
|
||||||
|
.'from contacts where contact_id=12';
|
||||||
|
$smarty->assign('contact',$db->getRow($sql));
|
||||||
|
```
|
||||||
|
|
||||||
|
The results of the database queries above would be output with.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{html_checkboxes name='contact_type_id' options=$contact_types selected=$contact.contact_type_id separator='<br />'}
|
||||||
|
```
|
||||||
|
|
||||||
|
See also [`{html_radios}`](./language-function-html-radios.md) and
|
||||||
|
[`{html_options}`](./language-function-html-options.md)
|
|
@ -0,0 +1,58 @@
|
||||||
|
# {html_image}
|
||||||
|
|
||||||
|
`{html_image}` is a [custom function](index.md) that
|
||||||
|
generates an HTML `<img>` tag. The `height` and `width` are
|
||||||
|
automatically calculated from the image file if they are not supplied.
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|----------|-------------------------------------------------------------------------|
|
||||||
|
| file | Yes | name/path to image |
|
||||||
|
| height | No | Height to display image (defaults to actual image height) |
|
||||||
|
| width | No | Width to display image (defaults to actual image width) |
|
||||||
|
| basedir | no | Directory to base relative paths from (defaults to web server doc root) |
|
||||||
|
| alt | no | Alternative description of the image |
|
||||||
|
| href | no | href value to link the image to |
|
||||||
|
| path\_prefix | no | Prefix for output path |
|
||||||
|
|
||||||
|
- `basedir` is the base directory that relative image paths are based
|
||||||
|
from. If not given, the web server's document root
|
||||||
|
`$_ENV['DOCUMENT_ROOT']` is used as the base. If security is
|
||||||
|
enabled, then the image must be located in the `$secure_dir` path of
|
||||||
|
the security policy. See the [Security](../../programmers/advanced-features/advanced-features-security.md)
|
||||||
|
section for details.
|
||||||
|
|
||||||
|
- `href` is the href value to link the image to. If link is supplied,
|
||||||
|
an `<a href="LINKVALUE"><a>` tag is placed around the image tag.
|
||||||
|
|
||||||
|
- `path_prefix` is an optional prefix string you can give the output
|
||||||
|
path. This is useful if you want to supply a different server name
|
||||||
|
for the image.
|
||||||
|
|
||||||
|
- All parameters that are not in the list above are printed as
|
||||||
|
name/value-pairs inside the created `<img>` tag.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> `{html_image}` requires a hit to the disk to read the image and
|
||||||
|
> calculate the height and width. If you don't use template
|
||||||
|
> [caching](../../programmers/caching.md), it is generally better to avoid `{html_image}`
|
||||||
|
> and leave image tags static for optimal performance.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{html_image file='pumpkin.jpg'}
|
||||||
|
{html_image file='/path/from/docroot/pumpkin.jpg'}
|
||||||
|
{html_image file='../path/relative/to/currdir/pumpkin.jpg'}
|
||||||
|
```
|
||||||
|
|
||||||
|
Example output of the above template would be:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<img src="pumpkin.jpg" alt="" width="44" height="68" />
|
||||||
|
<img src="/path/from/docroot/pumpkin.jpg" alt="" width="44" height="68" />
|
||||||
|
<img src="../path/relative/to/currdir/pumpkin.jpg" alt="" width="44" height="68" />
|
||||||
|
```
|
||||||
|
|