Skip to content

Instantly share code, notes, and snippets.

@tessguefen
Last active June 22, 2022 14:55
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tessguefen/9f47df2f406995f4d049 to your computer and use it in GitHub Desktop.
Save tessguefen/9f47df2f406995f4d049 to your computer and use it in GitHub Desktop.
Transient Module

Transients

A Transient is a simple way of storing cached data in the database temporarily, by giving it a custom name and a timeframe after which it will expire and be deleted.

Transients are useful when pinging another API (i.e. Wordpress, Instagram, twitter), and saving data for a set period of time.

Once the module is installed, you will find a tab under Utilities. This batch list is only used for debugging. You can view transients here, and delete them.

Please Note

To use this, you must use mvt:do, and having experience with mvt:do is recommended.

Usage

There are two main functions you can use:

Setting a Transient

Set_Transient(key, value, expiration)

Key: This should be unique. If this key already exists, it will overwrite the value you had before. It is recommended you use this as a code (example: recent_posts, recent_tweets)

Value: The value you are saving/ storing. If you are wanting to save a miva array, serialize this before saving it.

Expiration: This is the amount of seconds to save the transient.

Example Syntax of Set_Transient

<mvt:do file="g.Module_Root $ '/modules/util/transients.mvc'" name="l.set_transient" value="Set_Transient( 'recent_posts', l.settings:my_value_here, 60*60*2)" />

Getting a Transient

Get_Transient(key)

This will retrieve your transient. If you have a transient that has not expired, it will return the value. If it has expired, or does not exsist it will return 0.

Example Syntax of Get_Transient

<mvt:do file="g.Module_Root $ '/modules/util/transients.mvc'" name="l.settings:recent_posts" value="Get_Transient( 'recent_posts' )" />
<mvt:if expr="l.settings:recent_posts">
	<mvt:eval expr="l.settings:recent_posts" />
</mvt:if>

Example

This is an example of pulling a Blog's most recent posts, and displaying them on SFNT. In this case, the URL we are calling to will display the most recent posts.

<mvt:do file="g.Module_Root $ '/modules/util/transients.mvc'" name="l.settings:recent_posts" value="Get_Transient( 'recent_posts' )" />
<mvt:if expr="l.settings:recent_posts">
	<mvt:eval expr="l.settings:recent_posts" />
<mvt:else>
	<mvt:assign name="l.settings:recent_posts" value="''" />
	<mvt:assign name="g.blog_url" value="'http://www.mydomainname.com/blog/recent-posts/'" />
	<mvt:call action="g.blog_url" method="'POST'">
		<mvt:assign name="l.settings:recent_posts" value="l.settings:recent_posts $ s.callvalue" />
	</mvt:call>
	<mvt:do file="g.Module_Root $ '/modules/util/transients.mvc'" name="l.set_transient" value="Set_Transient( 'recent_posts', l.settings:recent_posts, 60*60*2)" />
	&mvt:recent_posts;
</mvt:if>
function AllTransients_Batchlist() {
MMBatchList.call( this, 'AllTransients' );
this.Feature_SearchBar_SetPlaceholderText( 'Search Transients...' );
this.SetDefaultSort( 'tkey', '' );
this.Feature_Delete_Enable('Delete Transient(s)');
}
DeriveFrom( MMBatchList, AllTransients_Batchlist );
AllTransients_Batchlist.prototype.onLoad = AllTransients_List_Load_Query;
AllTransients_Batchlist.prototype.onCreateRootColumnList = function() {
var columnlist =
[
new MMBatchList_Column_Name( 'Key', 'tkey', 'tkey'),
new MMBatchList_Column_TextArea( 'Value', 'Value', 'tvalue', 'tvalue' ),
new MMBatchList_Column_Name( 'Expires', 'expires', 'expires'),
new MMBatchList_Column_Name( 'Formatted Expires', 'f_expires', 'f_expires')
.SetAdvancedSearchEnabled(false)
];
return columnlist;
}
// On Delete
AllTransients_Batchlist.prototype.onDelete = function( item, callback, delegator ) {
AllTransients_Batchlist_Delete( item.record.tkey, callback, delegator );
}
function AllTransients_List_Load_Query( filter, sort, offset, count, callback, delegator ) {
return AJAX_Call_Module( callback,
'admin',
'tg_transients',
'AllTransients_Load_Query',
'&Filter=' + EncodeArray( filter ) +
'&Sort=' + encodeURIComponent( sort ) +
'&Offset=' + encodeURIComponent( offset ) +
'&Count=' + encodeURIComponent( count ),
delegator );
}
// On Delete
function AllTransients_Batchlist_Delete( tkey, callback, delegator ) {
return AJAX_Call_Module( callback,
'admin',
'tg_transients',
'Delete_Transient',
'Transient_Key=' + encodeURIComponent( tkey ),
delegator );
}
<MvFUNCTION NAME = "Module_Description" PARAMETERS = "module var" STANDARDOUTPUTLEVEL = "compresswhitespace">
<MvASSIGN NAME = "l.module:code" VALUE = "tg_transients">
<MvASSIGN NAME = "l.module:name" VALUE = "Transients">
<MvASSIGN NAME = "l.module:provider" VALUE = "Tess Guefen">
<MvASSIGN NAME = "l.module:version" VALUE = "1.005">
<MvASSIGN NAME = "l.module:api_ver" VALUE = "9.00">
<MvASSIGN NAME = "l.module:description" VALUE = "Save Cached versions of data, set an expiration time, and be happy.">
<MvASSIGN NAME = "l.module:features" VALUE = "util, vis_util, data_store, json, clientside">
</MvFUNCTION>
<MvCOMMENT>
| ========================================================================================================================
| INSTALL
| ========================================================================================================================
</MvCOMMENT>
<MvFUNCTION NAME = "Module_Install_Store" PARAMETERS = "module var" STANDARDOUTPUTLEVEL = "text, html, compresswhitespace">
<MvCOMMENT>
===========================
Create Transients Table
===========================
</MvCOMMENT>
<MvQUERY NAME = "Merchant"
QUERY = "{ 'CREATE TABLE ' $ g.Store_Table_Prefix $ 'Transients
(
tkey ' $ [ g.Module_Library_Native_DBAPI ].DB_Type_CHAR( 255 ) $ ',
expires ' $ [ g.Module_Library_Native_DBAPI ].DB_Type_NUMBER( 0, 255 ) $ ',
tvalue ' $ [ g.Module_Library_Native_DBAPI ].DB_Type_MEMO() $ '
) ' }">
<MvIF EXPR = "{ g.MvQUERY_Error }">
<MvFUNCTIONRETURN VALUE = "{ [ g.Module_Library_Utilities ].Error( 'TRANSIENTS-INSTALL-1001:', 'An error occured while creating the table Transients. Please make sure this table was not already created.' ) }">
</MvIF>
<MvQUERY NAME = "Merchant"
QUERY = "{ 'CREATE UNIQUE INDEX ' $ g.Store_Table_Prefix $ 'Transients ON ' $ g.Store_Table_Prefix $ 'Transients ( tkey )' }">
<MvIF EXPR = "{ g.MvQUERY_Error }">
<MvQUERY NAME = "Merchant" QUERY = "{ 'DROP TABLE ' $ g.Store_Table_Prefix $ 'Transients' }">
<MvFUNCTIONRETURN VALUE = "{ [ g.Module_Library_Utilities ].Error( 'TRANSIENTS-INSTALL-1002:', g.MvQUERY_Error ) }">
</MvIF>
<MvFUNCTIONRETURN VALUE = 1 />
</MvFUNCTION>
<MvFUNCTION NAME = "Module_Upgrade_Store" PARAMETERS = "module var, version" STANDARDOUTPUTLEVEL = "" ERROROUTPUTLEVEL = "">
<MvFUNCTIONRETURN VALUE = 1 />
</MvFUNCTION>
<MvFUNCTION NAME = "Module_Uninstall_Store" PARAMETERS = "module var" STANDARDOUTPUTLEVEL = "" ERROROUTPUTLEVEL = "">
<MvQUERY NAME = "Merchant" QUERY = "{ 'DROP TABLE ' $ g.Store_Table_Prefix $ 'Transients' }">
<MvFUNCTIONRETURN VALUE = 1 />
</MvFUNCTION>
<MvCOMMENT>
| ========================================================================================================================
| VIS_UTIL
| ========================================================================================================================
</MvCOMMENT>
<MvFUNCTION NAME = "StoreUtilityModule_Action" PARAMETERS = "module var" STANDARDOUTPUTLEVEL = "text, html, compresswhitespace">
<MvFUNCTIONRETURN VALUE = 1 />
</MvFUNCTION>
<MvFUNCTION NAME = "StoreUtilityModule_LeftNavigation" PARAMETERS = "module var, ident" STANDARDOUTPUTLEVEL = "compresswhitespace">
<MvFUNCTIONRETURN VALUE = 1 />
</MvFUNCTION>
<MvFUNCTION NAME = "StoreUtilityModule_Screen" PARAMETERS = "module_var" STANDARDOUTPUTLEVEL = "compresswhitespace">
<MvFUNCTIONRETURN VALUE = 1 />
</MvFUNCTION>
<MvFUNCTION NAME = "StoreUtilityModule_Validate" PARAMETERS = "module_var" STANDARDOUTPUTLEVEL = "compresswhitespace">
<MvFUNCTIONRETURN VALUE = 1 />
</MvFUNCTION>
<MvCOMMENT>
| ========================================================================================================================
| VIS_UTIL
| ========================================================================================================================
</MvCOMMENT>
<MvFUNCTION NAME = "Module_Utility_Content" PARAMETERS = "module var, tab, load_fields" STANDARDOUTPUTLEVEL = "text, html, compresswhitespace">
<MvIF EXPR = "{ l.tab EQ 'TRANSIENTS' }">
<MvEVAL EXPR = "{ [ g.Module_Admin ].Element_MMBatchList_HTML() }">
<div id="AllTransients"></div>
</MvIF>
<MvFUNCTIONRETURN VALUE = 1 />
</MvFUNCTION>
<MvFUNCTION NAME = "Module_Utility_Head" PARAMETERS = "module var, tab" STANDARDOUTPUTLEVEL = "text, html, compresswhitespace">
<MvIF EXPR = "{ l.tab EQ 'TRANSIENTS' }">
<MvEVAL EXPR = "{ [ g.Module_Admin ].Element_MMBatchList_JavaScript() }">
<MvEVAL EXPR = "{ [ g.Module_Admin ].Element_MMBatchList_CSS() }">
<script language="JavaScript" src="{ g.clientside_url $ 'Module_Code=' $ encodeattribute( l.module:code ) $ '&Filename=AllTransients_functions.js' }"></script>
<script language="JavaScript" src="{ g.clientside_url $ 'Module_Code=' $ encodeattribute( l.module:code ) $ '&Filename=AllTransients.js' }"></script>
<script language="JavaScript">
MMScreen_LoadFinished( function() { new AllTransients_Batchlist(); } );
</script>
</MvIF>
<MvFUNCTIONRETURN VALUE = 1 />
</MvFUNCTION>
<MvFUNCTION NAME = "Module_Utility_Tabs" PARAMETERS = "module_var" STANDARDOUTPUTLEVEL = "compresswhitespace">
<MvFUNCTIONRETURN VALUE = "TRANSIENTS:Transients" />
</MvFUNCTION>
<MvFUNCTION NAME = "Module_Utility_Update" PARAMETERS = "module_var" STANDARDOUTPUTLEVEL = "compresswhitespace">
<MvFUNCTIONRETURN VALUE = 1 />
</MvFUNCTION>
<MvFUNCTION NAME = "Module_Utility_Validate" PARAMETERS = "module_var" STANDARDOUTPUTLEVEL = "compresswhitespace">
<MvFUNCTIONRETURN VALUE = 1 />
</MvFUNCTION>
<MvCOMMENT>
| ========================================================================================================================
| CLIENTSIDE
| ========================================================================================================================
</MvCOMMENT>
<MvFUNCTION NAME = "Module_Clientside" PARAMETERS = "module var" STANDARDOUTPUTLEVEL = "text, compresswhitespace">
<MvIF EXPR = "{ g.Filename EQ 'AllTransients_functions.js' }">
<MvINCLUDE FILE = "js/AllTransients_functions.js">
</MvIF>
<MvIF EXPR = "{ g.Filename EQ 'AllTransients.js' }">
<MvINCLUDE FILE = "js/AllTransients.js">
</MvIF>
</MvFUNCTION>
<MvCOMMENT>
| ========================================================================================================================
| JSON
| ========================================================================================================================
</MvCOMMENT>
<MvFUNCTION NAME = "Module_JSON" PARAMETERS = "module var" STANDARDOUTPUTLEVEL = "text, compresswhitespace">
<MvIF EXPR = "{ g.Module_Function EQ 'AllTransients_Load_Query' }">
<MvEVAL EXPR = "{ Batchlist_Transients( l.module) }">
</MvIF>
<MvIF EXPR = "{ g.Module_Function EQ 'Delete_Transient' }">
<MvIF EXPR = "{ Delete_Transient( trim( g.Transient_Key ) ) }">
{
"success": 1
}
<MvELSE>
{
"success": 0
}
</MvIF>
</MvIF>
</MvFUNCTION>
<MvCOMMENT>
| ========================================================================================================================
| MODULE FUNCTIONS
| 1. Get_Transient(key)
| 2. Set_Transient(key, value, expires)
| 3. Delete_Transient(key)
| 4. Batchlist_Transients
| ========================================================================================================================
</MvCOMMENT>
<MvFUNCTION NAME = "Get_Transient" PARAMETERS = "key" STANDARDOUTPUTLEVEL = "">
<MvIF EXPR = "{ ISNULL l.key }">
<MvFUNCTIONRETURN VALUE = "" />
</MvIF>
<MvIF EXPR = "{ NOT Get_Transient_LowLevel( l.key, l.output ) }">
<MvFUNCTIONRETURN VALUE = "" />
</MvIF>
<MvFUNCTIONRETURN VALUE = "{ l.output }">
</MvFUNCTION>
<MvFUNCTION NAME = "Get_Transient_LowLevel" PARAMETERS = "key, output var" STANDARDOUTPUTLEVEL = "" ERROROUTPUTLEVEL = "">
<MvOPENVIEW NAME = "Merchant"
VIEW = "GetTransients"
QUERY = "{ 'SELECT
*
FROM ' $
g.Store_Table_Prefix $ 'Transients
WHERE
tkey = ?'
}"
FIELDS = "l.key">
<MvIF EXPR = "{ g.MvOPENVIEW_Error }">
<MvFUNCTIONRETURN VALUE = "{ [ g.Module_Library_Utilities ].Error( 'TRANSIENTS-MOD-2000:', 'An error occurred while retrieving the requestest Transient.' ) }">
</MvIF>
<MvIF EXPR = "{ GetTransients.d.EOF }">
<MvFUNCTIONRETURN VALUE = "{ [ g.Module_Library_DB ].Error_Load_EOF( '#Error# Could Not Find KEY' ) }">
</MvIF>
<MvASSIGN NAME = "l.transient:key" VALUE = "{ GetTransients.d.tkey }">
<MvASSIGN NAME = "l.transient:expires" VALUE = "{ GetTransients.d.expires }">
<MvASSIGN NAME = "l.transient:value" VALUE = "{ GetTransients.d.tvalue }">
<MvCLOSEVIEW NAME = "Merchant" VIEW = "GetTransients">
<MvCOMMENT> === [ Check if Transient is expired ] === </MvCOMMENT>
<MvIF EXPR = "{ s.dyn_time_t GT l.transient:expires }">
<MvASSIGN NAME = "l.success" VALUE = "{ Delete_Transient( l.transient:key ) }">
</MvIF>
<MvASSIGN NAME = "l.output" VALUE = "{ l.transient:value }">
<MvFUNCTIONRETURN VALUE = 1 />
</MvFUNCTION>
<MvFUNCTION NAME = "Set_Transient" PARAMETERS = "key, value, expires" STANDARDOUTPUTLEVEL = "" ERROROUTPUTLEVEL = "">
<MvASSIGN NAME = "l.transient" VALUE = "{ Get_Transient( l.key ) }">
<MvIF EXPR = "{ NOT trim( l.value ) OR NOT trim( l.key ) }">
<MvFUNCTIONRETURN VALUE = 1 />
</MvIF>
<MvIF EXPR = "{ l.transient }">
<MvASSIGN NAME = "l.success" VALUE = "{ Delete_Transient( l.key ) }">
</MvIF>
<MvASSIGN NAME = "l.expires" VALUE = "{ l.expires + s.dyn_time_t }">
<MvQUERY NAME = "Merchant"
QUERY = "{ 'INSERT INTO ' $ g.Store_Table_Prefix $ 'Transients
( tkey, tvalue, expires )
VALUES
(?, ?, ?)'}"
FIELDS = "l.key, l.value, l.expires">
<MvIF EXPR = "{ g.MvQUERY_Error }">
<MvFUNCTIONRETURN VALUE = "{ [ g.Module_Library_Utilities ].Error( 'QNA-MOD-2017', g.MvQUERY_Error ) }">
</MvIF>
</MvFUNCTION>
<MvFUNCTION NAME = "Delete_Transient" PARAMETERS = "key" STANDARDOUTPUTLEVEL = "" ERROROUTPUTLEVEL = "">
<MvQUERY NAME = "Merchant"
QUERY = "{ 'DELETE FROM ' $ g.Store_Table_Prefix $ 'Transients WHERE tkey = ?' }"
FIELDS = "l.key">
<MvFUNCTIONRETURN VALUE = 1 />
</MvFUNCTION>
<MvFUNCTION NAME = "Batchlist_Transients" PARAMETERS = "module var" STANDARDOUTPUTLEVEL = "text, html, compresswhitespace">
<MvASSIGN NAME = "g.Filter" VALUE = "{ trim( g.Filter ) }">
<MvASSIGN NAME = "g.Sort" VALUE = "{ trim( g.Sort ) }">
<MvASSIGN NAME = "g.Offset" VALUE = "{ trim( g.Offset ) }">
<MvASSIGN NAME = "g.Count" VALUE = "{ trim( g.Count ) }">
<MvASSIGN NAME = "l.search_query" VALUE = "">
<MvEVAL EXPR = "{ [ g.Module_Library_DB ].SQL_Query_SELECT( l.search_query,'s.*' ) }">
<MvEVAL EXPR = "{ [ g.Module_Library_DB ].SQL_Query_FROM( l.search_query, g.Store_Table_Prefix $ 'Transients', 's' ) }">
<MvEVAL EXPR = "{ [ g.Module_JSON ].JSON_Filter( l.search_query, g.Filter,'tkey:s.tkey,tvalue:s.tvalue,expires:s.expires' ) }">
<MvEVAL EXPR = "{ [ g.Module_Library_DB ].SQL_Query_OrderBy_Fields(l.search_query, g.Sort, 'tkey:s.tkey,tvalue:s.tvalue,expires:s.expires', 's.tkey' ) }">
<MvASSIGN NAME = "l.search_sql" VALUE = "{ [ g.Module_Library_DB].SQL_Query_Build( l.search_query, l.search_fields ) }">
<MvIF EXPR = "{ NOT [ g.Module_Library_DB ].SQL_Query_Count( l.search_query, l.total_count ) }">
<MvFUNCTIONRETURN VALUE = "{ [ g.Module_JSON ].JSON_Response_Error(g.Error_Code, g.Error_Message ) }">
<MvELSEIF EXPR = "{ NOT [ g.Module_Library_Native_DBAPI ].DB_OPENVIEW_Range('Merchant', 'Transients', l.search_sql, l.search_fields, g.Offset, g.Count) }">
<MvFUNCTIONRETURN VALUE = "{ [ g.Module_JSON ].JSON_Response_Error( 'TRANSIENTS-MOD-2005',g.MvOPENVIEW_Error ) }">
</MvIF>
<MvASSIGN NAME = "l.count" VALUE = 0>
<MvEVAL EXPR = "{ [ g.Module_JSON ].JSON_Response_Start() }">
{
"data":
[
<MvWHILE EXPR = "{ ( NOT Transients.d.EOF ) AND ( ( g.Count EQ 0 ) OR (l.count LT g.Count ) ) }">
<MvEVAL EXPR = "{ [ g.Module_JSON ].JSON_ArrayElement_Start( l.count )}">
"tkey": "<MvEVAL EXPR = "{ [ g.Module_JSON ].JSON_Encode( Transients.d.tkey ) }">",
"tvalue": "<MvEVAL EXPR = "{ [ g.Module_JSON ].JSON_Encode( Transients.d.tvalue ) }">",
"expires": "<MvEVAL EXPR = "{ int( Transients.d.expires ) }">",
<MvASSIGN NAME = "l.fdt" VALUE = "{ [ g.Module_Library_Utilities].Format_Date( Transients.d.expires, s.miva_language ) }">
<MvDO FILE = "{ g.Module_Library_Utilities }" NAME = "l.fdt" VALUE = "{ l.fdt $ ' ' $ Format_Time( Transients.d.expires, s.miva_language ) }">
"f_expires": "<MvEVAL EXPR = "{ [ g.Module_JSON ].JSON_Encode( l.fdt ) }">"
<MvEVAL EXPR = "{ [ g.Module_JSON ].JSON_ArrayElement_End() }">
<MvSKIP NAME = "Merchant" VIEW = "Transients" ROWS = 1>
</MvWHILE>
],
"total_count": <MvEVAL EXPR = "{ int( l.total_count ) }">,
"start_offset": <MvEVAL EXPR = "{ int( g.Offset ) }">
}
<MvCLOSEVIEW NAME = "Merchant" VIEW = "Transients">
}
</MvFUNCTION>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment