mirror of
https://github.com/e107inc/e107.git
synced 2025-01-17 20:58:30 +01:00
393 lines
18 KiB
PHP
393 lines
18 KiB
PHP
<?php
|
|
/*
|
|
* e107 website system
|
|
*
|
|
* Copyright (C) 2008-2009 e107 Inc (e107.org)
|
|
* blankd under the terms and conditions of the
|
|
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt)
|
|
*
|
|
* e107 blank Plugin
|
|
*
|
|
*/
|
|
|
|
require_once(__DIR__."/../../class2.php");
|
|
if (!getperms("P"))
|
|
{
|
|
e107::redirect('admin');
|
|
exit;
|
|
}
|
|
|
|
|
|
class plugin_blank_admin extends e_admin_dispatcher
|
|
{
|
|
/**
|
|
* Format: 'MODE' => array('controller' =>'CONTROLLER_CLASS'[, 'index' => 'list', 'path' => 'CONTROLLER SCRIPT PATH', 'ui' => 'UI CLASS NAME child of e_admin_ui', 'uipath' => 'UI SCRIPT PATH']);
|
|
* Note - default mode/action is autodetected in this order:
|
|
* - $defaultMode/$defaultAction (owned by dispatcher - see below)
|
|
* - $adminMenu (first key if admin menu array is not empty)
|
|
* - $modes (first key == mode, corresponding 'index' key == action)
|
|
* @var array
|
|
*/
|
|
protected $modes = array(
|
|
'main' => array('controller' => 'plugin_blank_admin_ui',
|
|
'path' => null,
|
|
'ui' => 'plugin_blank_admin_form_ui', 'uipath' => null)
|
|
);
|
|
|
|
/* Both are optional
|
|
protected $defaultMode = null;
|
|
protected $defaultAction = null;
|
|
*/
|
|
|
|
/**
|
|
* Format: 'MODE/ACTION' => array('caption' => 'Menu link title'[, 'url' => '{e_PLUGIN}blank/admin_config.php', 'perm' => '0']);
|
|
* Additionally, any valid e107::getNav()->admin() key-value pair could be added to the above array
|
|
* @var array
|
|
*/
|
|
protected $adminMenu = array(
|
|
'main/list' => array('caption'=> 'Manage', 'perm' => '0'),
|
|
'main/create' => array('caption'=> LAN_CREATE, 'perm' => '0'),
|
|
'main/prefs' => array('caption'=> 'Settings', 'perm' => '0'),
|
|
'main/custom' => array('caption'=> 'Custom Page', 'perm' => '0')
|
|
);
|
|
|
|
/**
|
|
* Optional, mode/action aliases, related with 'selected' menu CSS class
|
|
* Format: 'MODE/ACTION' => 'MODE ALIAS/ACTION ALIAS';
|
|
* This will mark active main/list menu item, when current page is main/edit
|
|
* @var array
|
|
*/
|
|
protected $adminMenuAliases = array(
|
|
'main/edit' => 'main/list'
|
|
);
|
|
|
|
/**
|
|
* Navigation menu title
|
|
* @var string
|
|
*/
|
|
protected $menuTitle = 'blank Menu';
|
|
}
|
|
|
|
|
|
|
|
class plugin_blank_admin_ui extends e_admin_ui
|
|
{
|
|
// required
|
|
protected $pluginTitle = "e107 blank";
|
|
|
|
/**
|
|
* plugin name or 'core'
|
|
* IMPORTANT: should be 'core' for non-plugin areas because this
|
|
* value defines what CONFIG will be used. However, I think this should be changed
|
|
* very soon (awaiting discussion with Cam)
|
|
* Maybe we need something like $prefs['core'], $prefs['blank'] ... multiple getConfig support?
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $pluginName = '_blank';
|
|
|
|
/**
|
|
* DB Table, table alias is supported
|
|
* Example: 'r.blank'
|
|
* @var string
|
|
*/
|
|
protected $table = "blank"; // must match _blank_sql.php
|
|
|
|
/**
|
|
* This is only needed if you need to JOIN tables AND don't wanna use $tableJoin
|
|
* Write your list query without any Group, Order or Limit.
|
|
*
|
|
* @var string [optional]
|
|
*/
|
|
protected $listQry = "";
|
|
|
|
protected $listOrder = 'blank_id DESC';
|
|
|
|
// protected $listGroup = 'somefield'; // (optional: when needing control over JOINs)
|
|
|
|
// protected $editQry = "SELECT * FROM #blank WHERE blank_id = {ID}";
|
|
|
|
// required - if no custom model is set in init() (primary id)
|
|
protected $pid = "blank_id";
|
|
|
|
// optional
|
|
protected $perPage = 20;
|
|
|
|
protected $batchDelete = true;
|
|
|
|
|
|
// protected \$sortField = 'somefield_order';
|
|
|
|
|
|
// protected \$sortParent = 'somefield_parent';
|
|
|
|
|
|
// protected \$treePrefix = 'somefield_title';
|
|
|
|
|
|
|
|
//TODO change the blank_url type back to URL before blank.
|
|
// required
|
|
/**
|
|
* (use this as starting point for wiki documentation)
|
|
* $fields format (string) $field_name => (array) $attributes
|
|
*
|
|
* $field_name format:
|
|
* 'table_alias_or_name.field_name.field_alias' (if JOIN support is needed) OR just 'field_name'
|
|
* NOTE: Keep in mind the count of exploded data can be 1 or 3!!! This means if you wanna give alias
|
|
* on main table field you can't omit the table (first key), alternative is just '.' e.g. '.field_name.field_alias'
|
|
*
|
|
* $attributes format:
|
|
* - title (string) Human readable field title, constant name will be accpeted as well (multi-language support
|
|
*
|
|
* - type (string) null (means system), number, text, dropdown, url, image, icon, datestamp, userclass, userclasses, user[_name|_loginname|_login|_customtitle|_email],
|
|
* boolean, method, ip
|
|
* full/most recent reference list - e_form::renderTableRow(), e_form::renderElement(), e_admin_form_ui::renderBatchFilter()
|
|
* for list of possible read/writeParms per type see below
|
|
*
|
|
* - data (string) Data type, one of the following: int, integer, string, str, float, bool, boolean, model, null
|
|
* Default is 'str'
|
|
* Used only if $dataFields is not set
|
|
* full/most recent reference list - e_admin_model::sanitize(), db::_getFieldValue()
|
|
* - dataPath (string) - xpath like path to the model/posted value. Example: 'dataPath' => 'prefix/mykey' will result in $_POST['prefix']['mykey']
|
|
* - primary (boolean) primary field (obsolete, $pid is now used)
|
|
*
|
|
* - help (string) edit/create table - inline help, constant name will be accpeted as well, optional
|
|
* - note (string) edit/create table - text shown below the field title (left column), constant name will be accpeted as well, optional
|
|
*
|
|
* - validate (boolean|string) any of accepted validation types (see e_validator::$_required_rules), true == 'required'
|
|
* - rule (string) condition for chosen above validation type (see e_validator::$_required_rules), not required for all types
|
|
* - error (string) Human readable error message (validation failure), constant name will be accepted as well, optional
|
|
*
|
|
* - batch (boolean) list table - add current field to batch actions, in use only for boolean, dropdown, datestamp, userclass, method field types
|
|
* NOTE: batch may accept string values in the future...
|
|
* full/most recent reference type list - e_admin_form_ui::renderBatchFilter()
|
|
*
|
|
* - filter (boolean) list table - add current field to filter actions, rest is same as batch
|
|
*
|
|
* - forced (boolean) list table - forced fields are always shown in list table
|
|
* - nolist (boolean) list table - don't show in column choice list
|
|
* - noedit (boolean) edit table - don't show in edit mode
|
|
*
|
|
* - width (string) list table - width e.g '10%', 'auto'
|
|
* - thclass (string) list table header - th element class
|
|
* - class (string) list table body - td element additional class
|
|
*
|
|
* - readParms (mixed) parameters used by core routine for showing values of current field. Structure on this attribute
|
|
* depends on the current field type (see below). readParams are used mainly by list page
|
|
*
|
|
* - writeParms (mixed) parameters used by core routine for showing control element(s) of current field.
|
|
* Structure on this attribute depends on the current field type (see below).
|
|
* writeParams are used mainly by edit page, filter (list page), batch (list page)
|
|
*
|
|
* $attributes['type']->$attributes['read/writeParams'] pairs:
|
|
*
|
|
* - null -> read: n/a
|
|
* -> write: n/a
|
|
*
|
|
* - dropdown -> read: 'pre', 'post', array in format posted_html_name => value
|
|
* -> write: 'pre', 'post', array in format as required by e_form::selectbox()
|
|
*
|
|
* - user -> read: [optional] 'link' => true - create link to user profile, 'idField' => 'author_id' - tells to renderValue() where to search for user id (used when 'link' is true and current field is NOT ID field)
|
|
* 'nameField' => 'comment_author_name' - tells to renderValue() where to search for user name (used when 'link' is true and current field is ID field)
|
|
* -> write: [optional] 'nameField' => 'comment_author_name' the name of a 'user_name' field; 'currentInit' - use currrent user if no data provided; 'current' - use always current user(editor); '__options' e_form::userpickup() options
|
|
*
|
|
* - number -> read: (array) [optional] 'point' => '.', [optional] 'sep' => ' ', [optional] 'decimals' => 2, [optional] 'pre' => '€ ', [optional] 'post' => 'LAN_CURRENCY'
|
|
* -> write: (array) [optional] 'pre' => '€ ', [optional] 'post' => 'LAN_CURRENCY', [optional] 'maxlength' => 50, [optional] '__options' => array(...) see e_form class description for __options format
|
|
*
|
|
* - ip -> read: n/a
|
|
* -> write: [optional] element options array (see e_form class description for __options format)
|
|
*
|
|
* - text -> read: (array) [optional] 'htmltruncate' => 100, [optional] 'truncate' => 100, [optional] 'pre' => '', [optional] 'post' => ' px'
|
|
* -> write: (array) [optional] 'pre' => '', [optional] 'post' => ' px', [optional] 'maxlength' => 50 (default - 255), [optional] '__options' => array(...) see e_form class description for __options format
|
|
*
|
|
* - textarea -> read: (array) 'noparse' => '1' default 0 (disable toHTML text parsing), [optional] 'bb' => '1' (parse bbcode) default 0,
|
|
* [optional] 'parse' => '' modifiers passed to e_parse::toHTML() e.g. 'BODY', [optional] 'htmltruncate' => 100,
|
|
* [optional] 'truncate' => 100, [optional] 'expand' => '[more]' title for expand link, empty - no expand
|
|
* -> write: (array) [optional] 'rows' => '' default 15, [optional] 'cols' => '' default 40, [optional] '__options' => array(...) see e_form class description for __options format
|
|
* [optional] 'counter' => 0 number of max characters - has only visual effect, doesn't truncate the value (default - false)
|
|
*
|
|
* - bbarea -> read: same as textarea type
|
|
* -> write: (array) [optional] 'pre' => '', [optional] 'post' => ' px', [optional] 'maxlength' => 50 (default - 0),
|
|
* [optional] 'size' => [optional] - medium, small, large - default is medium,
|
|
* [optional] 'counter' => 0 number of max characters - has only visual effect, doesn't truncate the value (default - false)
|
|
*
|
|
* - image -> read: [optional] 'title' => 'SOME_LAN' (default - LAN_PREVIEW), [optional] 'pre' => '{e_PLUGIN}myplug/images/',
|
|
* 'thumb' => 1 (true) or number width in pixels, 'thumb_urlraw' => 1|0 if true, it's a 'raw' url (no sc path constants),
|
|
* 'thumb_aw' => if 'thumb' is 1|true, this is used for Adaptive thumb width
|
|
* -> write: (array) [optional] 'label' => '', [optional] '__options' => array(...) see e_form::imagepicker() for allowed options
|
|
*
|
|
* - icon -> read: [optional] 'class' => 'S16', [optional] 'pre' => '{e_PLUGIN}myplug/images/'
|
|
* -> write: (array) [optional] 'label' => '', [optional] 'ajax' => true/false , [optional] '__options' => array(...) see e_form::iconpicker() for allowed options
|
|
*
|
|
* - datestamp -> read: [optional] 'mask' => 'long'|'short'|strftime() string, default is 'short'
|
|
* -> write: (array) [optional] 'label' => '', [optional] 'ajax' => true/false , [optional] '__options' => array(...) see e_form::iconpicker() for allowed options
|
|
*
|
|
* - url -> read: [optional] 'pre' => '{ePLUGIN}myplug/'|'http://somedomain.com/', 'truncate' => 50 default - no truncate, NOTE:
|
|
* -> write:
|
|
*
|
|
* - method -> read: optional, passed to given method (the field name)
|
|
* -> write: optional, passed to given method (the field name)
|
|
*
|
|
* - hidden -> read: 'show' => 1|0 - show hidden value, 'empty' => 'something' - what to be shown if value is empty (only id 'show' is 1)
|
|
* -> write: same as readParms
|
|
*
|
|
* - upload -> read: n/a
|
|
* -> write: Under construction
|
|
*
|
|
* Special attribute types:
|
|
* - method (string) field name should be method from the current e_admin_form_ui class (or its extension).
|
|
* Example call: field_name($value, $render_action, $parms) where $value is current value,
|
|
* $render_action is on of the following: read|write|batch|filter, parms are currently used paramateres ( value of read/writeParms attribute).
|
|
* Return type expected (by render action):
|
|
* - read: list table - formatted value only
|
|
* - write: edit table - form element (control)
|
|
* - batch: either array('title1' => 'value1', 'title2' => 'value2', ..) or array('singleOption' => '<option value="somethig">Title</option>') or rendered option group (string '<optgroup><option>...</option></optgroup>'
|
|
* - filter: same as batch
|
|
* @var array
|
|
*/
|
|
protected $fields = array(
|
|
'checkboxes' => array('title'=> '', 'type' => null, 'data' => null, 'width'=>'5%', 'thclass' =>'center', 'forced'=> TRUE, 'class'=>'center', 'toggle' => 'e-multiselect'),
|
|
'blank_id' => array('title'=> LAN_ID, 'type' => 'number', 'data' => 'int', 'width'=>'5%', 'thclass' => '', 'class'=>'center', 'forced'=> TRUE, 'primary'=>TRUE/*, 'noedit'=>TRUE*/), //Primary ID is not editable
|
|
'blank_icon' => array('title'=> LAN_ICON, 'type' => 'icon', 'data' => 'str', 'width'=>'5%', 'thclass' => '', 'forced'=> TRUE, 'primary'=>TRUE/*, 'noedit'=>TRUE*/), //Primary ID is not editable
|
|
'blank_type' => array('title'=> LAN_TYPE, 'type' => 'method', 'data' => 'str', 'width'=>'auto', 'thclass' => '', 'batch' => TRUE, 'filter'=>TRUE),
|
|
'blank_folder' => array('title'=> 'Folder', 'type' => 'dropdown', 'data' => 'str', 'width' => 'auto', 'thclass' => '', 'writeParms'=>array('optArray'=>array('_NULL_'=>'Empty', 'opt1'=>'Option 1', 'opt2'=>'Option 2'))),
|
|
'blank_name' => array('title'=> 'Name', 'type' => 'text', 'data' => 'str', 'width' => 'auto', 'thclass' => ''),
|
|
'blank_version' => array('title'=> 'Version', 'type' => 'number', 'data' => 'str', 'width' => 'auto', 'thclass' => ''),
|
|
'blank_author' => array('title'=> LAN_AUTHOR, 'type' => 'user', 'data' => 'str', 'width' => 'auto', 'thclass' => 'left'),
|
|
'blank_authorURL' => array('title'=> LAN_URL, 'type' => 'url', 'data' => 'str', 'width' => 'auto', 'thclass' => 'left'),
|
|
'blank_date' => array('title'=> LAN_DATE, 'type' => 'datestamp', 'data' => 'int', 'width' => 'auto', 'thclass' => '', 'readParms' => 'long', 'writeParms' => array('type' => 'datetime')),
|
|
'blank_compatibility' => array('title'=> 'Compatible', 'type' => 'text', 'data' => 'str', 'width' => '10%', 'thclass' => 'center' ),
|
|
'blank_url' => array('title'=> LAN_FILE, 'type' => 'file', 'data' => 'str', 'width' => '20%', 'thclass' => 'center', 'batch' => TRUE, 'filter'=>TRUE, 'readParms' => array('truncate' => 30), 'validate' => false, 'help' => 'Enter blank URL here', 'error' => 'please, enter valid URL'),
|
|
'blank_media' => array('title'=> "Media", 'type' => 'media', 'data' => 'json', 'width' => '20%', 'thclass' => 'center', 'batch' => TRUE, 'filter'=>TRUE, 'readParms' => array('truncate' => 30), 'writeParms'=>array(/*'w'=>200, 'h'=>150,*/ 'image'=>1, 'video'=>1, 'youtube'=>1, 'audio'=>1, 'glyph'=>1), 'validate' => false),
|
|
|
|
'test_list_1' => array('title'=> 'test 1', 'type' => 'boolean', 'data' => false, 'width' => '5%', 'thclass' => 'center', 'batch' => TRUE, 'filter'=>TRUE, 'noedit' => true),
|
|
'blank_class' => array('title'=> LAN_VISIBILITY, 'type' => 'userclass', 'data'=>'int', 'inline'=>true, 'filter'=>true, 'batch'=>true, 'width'=>'auto'),
|
|
|
|
'options' => array('title'=> LAN_OPTIONS, 'type' => null, 'data' => null, 'width' => '10%', 'thclass' => 'center last', 'class' => 'center last', 'forced'=>TRUE)
|
|
);
|
|
|
|
//required - default column user prefs
|
|
protected $fieldpref = array('checkboxes', 'blank_id', 'blank_date', 'blank_type', 'blank_url', 'blank_compatibility', 'blank_class', 'options');
|
|
|
|
// FORMAT field_name=>type - optional if fields 'data' attribute is set or if custom model is set in init()
|
|
/*protected $dataFields = array();*/
|
|
|
|
// optional, could be also set directly from $fields array with attributes 'validate' => true|'rule_name', 'rule' => 'condition_name', 'error' => 'Validation Error message'
|
|
/*protected $validationRules = array(
|
|
'blank_url' => array('required', '', 'blank URL', 'Help text', 'not valid error message')
|
|
);*/
|
|
|
|
// optional, if $pluginName == 'core', core prefs will be used, else e107::getPluginConfig($pluginName);
|
|
protected $prefs = array(
|
|
'pref_type' => array('title'=> 'type', 'type'=>'text', 'data' => 'string', 'validate' => true),
|
|
'pref_folder' => array('title'=> 'folder', 'type' => 'boolean', 'data' => 'integer'),
|
|
'pref_name' => array('title'=> 'name', 'type' => 'text', 'data' => 'string', 'validate' => 'regex', 'rule' => '#^[\w]+$#i', 'help' => 'allowed characters are a-zA-Z and underscore'),
|
|
'pref_classes' => array('title'=> 'classes', 'type' => 'userclasses', 'inline'=>true,)
|
|
|
|
);
|
|
|
|
// optional
|
|
public function init()
|
|
{
|
|
$pref = e107::pref('_blank');
|
|
e107::getDebug()->log($pref);
|
|
|
|
}
|
|
|
|
|
|
public function customPage()
|
|
{
|
|
$ns = e107::getRender();
|
|
$text = "Hello World!";
|
|
$ns->tablerender("Hello",$text);
|
|
|
|
}
|
|
|
|
// left-panel help menu area. (replaces e_help.php used in old plugins)
|
|
public function renderHelp()
|
|
{
|
|
$caption = LAN_HELP;
|
|
$text = 'Some help text';
|
|
|
|
return array('caption'=> $caption,'text'=> $text);
|
|
|
|
}
|
|
|
|
public function beforePrefsSave($new_data, $old_data)
|
|
{
|
|
// return $new_data;
|
|
}
|
|
}
|
|
|
|
class plugin_blank_admin_form_ui extends e_admin_form_ui
|
|
{
|
|
|
|
function blank_type($curVal,$mode) // not really necessary since we can use 'dropdown' - but just an example of a custom function.
|
|
{
|
|
$frm = e107::getForm();
|
|
|
|
$types = array('type_1'=>"Type 1", 'type_2' => 'Type 2');
|
|
|
|
if($mode == 'read')
|
|
{
|
|
return vartrue($types[$curVal]).' (custom!)';
|
|
}
|
|
|
|
if($mode == 'batch') // Custom Batch List for blank_type
|
|
{
|
|
return $types;
|
|
}
|
|
|
|
if($mode == 'filter') // Custom Filter List for blank_type
|
|
{
|
|
return $types;
|
|
}
|
|
|
|
return $frm->select('blank_type', $types, $curVal);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
* After initialization we'll be able to call dispatcher via e107::getAdminUI()
|
|
* so this is the first we should do on admin page.
|
|
* Global instance variable is not needed.
|
|
* NOTE: class is auto-loaded - see class2.php __autoload()
|
|
*/
|
|
/* $dispatcher = */
|
|
|
|
new plugin_blank_admin();
|
|
|
|
/*
|
|
* Uncomment the below only if you disable the auto observing above
|
|
* Example: $dispatcher = new plugin_blank_admin(null, null, false);
|
|
*/
|
|
//$dispatcher->runObservers(true);
|
|
|
|
require_once(e_ADMIN."auth.php");
|
|
|
|
/*
|
|
* Send page content
|
|
*/
|
|
e107::getAdminUI()->runPage();
|
|
|
|
require_once(e_ADMIN."footer.php");
|
|
|
|
/* OBSOLETE - see admin_shortcodes::sc_admin_menu()
|
|
function admin_config_adminmenu()
|
|
{
|
|
//global $rp;
|
|
//$rp->show_options();
|
|
e107::getRegistry('admin/blank_dispatcher')->renderMenu();
|
|
}
|
|
*/
|
|
|
|
/* OBSOLETE - done within header.php
|
|
function headerjs() // needed for the checkboxes - how can we remove the need to duplicate this code?
|
|
{
|
|
return e107::getAdminUI()->getHeader();
|
|
}
|
|
*/
|