fixed an error with implicit object creation that triggered an error in PHP 5.4 (most likely would pass E_ALL but not E_STRICT in earlier versions)
Allow access to a basic version of the command line from the browser.
Access from: http://127.0.0.1/wp-content/plugins/wp-mvc/core/wpmvc.php
Error won't display prettily because of the die() in the subfunctions.
Allow dereferencing associated objects (already queried in the model) directly from the $default_columns array using 'Venue.name' format.
Generated aliases for JOIN clauses where not escaped with might lead to SQL errors for some model names (eg Match).
Added __isset() method to check if property is an association (and therefor will be queried by __get if accessed)
Fixed bug on get_associated_objects in has_and_belongs_to_many case:

Join table was obtained using $this->process_table_name() which does not exist since MvcModelObject does not extend MvcModel. Removed since table name is already processed here (in my experience).
Added "Obsolete functionality: " in front of obsolete functionality error messages (not clear).
Better version of the Venue.name dereferencing for default columns with error handling. Requires __isset() patch (0c58e60f43).
Added handling of custom_actions attribute on MvcAdminController.
Will display a link to specified action (providing the object) before the usual view/edit/delete links.

Format:
var $custom_actions = array(
        array('action' => 'score', 'name' => 'Score', 'title' => 'Enter scores')
);
Alternative format:
var $custom_actions = array('score');
Give each admin column header a unique class based on the fieldname so that the widths of columns can be individually controlled
have html->textarea_input() initial value set in same way as html->input()
Make non-database models easier to implement by making it simpler to override MvcModel::init_schema and possible to call MvcModel::process_objects from a derived class...

Here's an example of how it can be used:

class FileSystemFingerprint extends MvcModel {

	var $display_field = 'subfilepath';

	protected function init_schema() {
		$this->schema_clear();

		$this->schema_add_column("subfilepath", "PRI", "string", 512, false);
		$this->schema_add_column("filename", "", "string", 512, false);
		$this->schema_add_column("subdir", "", "string", 512, false);
		$this->schema_add_column("fullpath", "", "string", 512, false);
		$this->schema_add_column("fulldir", "", "string", 512, false);
		$this->schema_add_column("md5", "", "string", 32, false);
		$this->schema_add_column("perms", "", "string", 512, false);
		$this->schema_add_column("modified", "", "timestamp");
	}

	public function find($options=array()) {
		$basedir = (empty($options['basedir'])) ? ABSPATH : $options['basedir'];
		$options['exclude'] = (empty($options['exclude'])) ? array('.git', '.svn') : $options['exclude'];
		$objects = $this->getFilesInDir($basedir, '', $options);
		$objects = $this->process_objects($objects, $options);
		return $objects;
	}
MvcInflectors handling for plural and singular conversion of 'status' being case insensitive and always forcing to status with lowercase first s
Same problem may stand for other cases with regex with /i such as Quiz and Mouse -> quizzes and mice (note case change)
MvcRouter::public_url can take 'extraparams' array option which adds query parameters to the url (so can add redirect parameter to url!)

MvcHtmlHelper::link() can take 'extraparams' array option which is passes to MvcRouter::public_url(), or uses it itself to add query parameters to a url if it builds the url

MvcHtmlHelper::admin_object_link() can take 'extraparams' (see above) and 'linkoptions' which enables parameters such as title to be passed via MvcHtmlHelper::admin_object_link() into MvcHtmlHelper::link()

MvcAdminController::delete() and ::create_or_save() look for a redirect parameter and use that as the redirect url if present, otherwise they redirect as they did before to index and edit respectively

MvcHtmlHelper::admin_object_url() bug fix - check is_object($object) before dereferencing it
Change enables control over the order that Admin Menu items appear in the admin menu.

Basically Anything mentioned in bootstrap's MvcConfiguration::append of AdminPages will appear in the order they appear in there.

Everything else will appear in whatever order it would have done anyway (based on the directory listing of the admin controller directory), except they will be after the MvcConfiguration ones.

Extra MvcConfiguration parameters supported for menus:

'hide_top_menu' prevents the top level menu for a controller being added - this is useful if you want several controllers to appear under a single admin menu, and hence don't want them to have their own top level menu items
'order' allows you to override the order rather than just going with the order they appear in the MvcConfiguration array

Here's an example of how this can be used:

in test_plugin.php

add_action('admin_menu', 'test_plugin_admin_menu_toplevel_add', 1);


function test_plugin_admin_menu_toplevel_add() {
	add_menu_page(
		'Test Plugin Dashboard',
		'Test Plugin',
		'edit_others_pages',
		'test_plugin_admin_mnu',
		'test_plugin_admin_admin_menu_toplevel_page',
		mvc_plugin_app_url('dw_bootcamp_mgmt_sys') . 'public/images/star1-18.png',
		55
	);
}

function test_plugin_admin_admin_menu_toplevel_page() {
	echo "<p>output the plugin top level menu page content here...</p>";
}



and in app/config/bootstrap.php

MvcConfiguration::append(array(
	'AdminPages' => array(
		'testdata1' => array(
			'hide_top_menu' => true,
			'index' => array(
			    'label' => 'TestData1',
			    'in_menu' => true,
			    'parent_slug' => 'test_plugin_admin_mnu'
		    ),
			'add' => array(
				'in_menu' => false,
			),
			'edit' => array(
				'in_menu' => false,
			),
			'delete' => array(
				'in_menu' => false,
			),
		),
		'testdata2' => array(
			'hide_top_menu' => true,
			'index' => array(
			    'label' => 'TestData2',
			    'in_menu' => true,
			    'parent_slug' => 'test_plugin_admin_mnu'
		    ),
			'add' => array(
				'in_menu' => false,
			),
			'edit' => array(
				'in_menu' => false,
			),
			'delete' => array(
				'in_menu' => false,
			),
		),
		'testdata3' => array(
			'hide_top_menu' => true,
			'index' => array(
			    'label' => 'TestData3',
			    'in_menu' => true,
			    'parent_slug' => 'test_plugin_admin_mnu'
		    ),
			'add' => array(
			    'label' => 'Add New TestData3',
			    'in_menu' => true,
			    'parent_slug' => 'test_plugin_admin_mnu'
			),
			'edit' => array(
				'in_menu' => false,
			),
			'delete' => array(
				'in_menu' => false,
			),
		),
	)
));
I needed my plugin directory to have underscores rather than hyphens (don't ask) - this tweak allows the wpmvc script to take a final parameter of --underscore which forces the plugin directory to hvae underscores
Merge remote-tracking branch 'bostil/master'
Merge remote-tracking branch 'dodmax/master'

Conflicts:
	core/helpers/mvc_helper.php - resolved
Added ShortCode functionality which is configured simply by adding a
'ShortCode' section to the MvcConfiguration::append in bootstrap.php

eg:

MvcConfiguration::append(array(
	'AdminPages' => array(

...

	),
	'ShortCodes' => array(
		'testscode' => array(
				'options' => array('controller' => 'speakers', 'action' => 'show'),
				'allow_actions' => array('show'),
				'deny_actions' => '',
		),
	),
));

then you can use the shortcode:

[testscode id=2]

which will be substitued with the results of the venues/show for venue id 2

Allow / Deny
============

if you specify action in the options, then this is the default action,
otherwise the default action is 'shortcode'.

if you specify allow_actions, then the action must match one of the allow_actions
otherwise it will fail with an error

if you specify deny_actions, then the action must not match one of the deny_actions
otherwise it will fail with an error

the allow and deny actions can be a single string or array of strings.
an attempt is made to match each string initially as a direct match, then
as a pcre regular expression.

the default allow_actions deny_actions configuration is that the action
shortcode, or any action begining with 'sc_' are allowed, and no
deny_actions is specified.
bug fixes for shortcode functionality (flagged by DODMax https://github.com/damphlett/wp-mvc/commit/7867af1b2ab9fcdfb73331341cda06ecf2130215#commitcomment-1656103)