REALLY RAPID ADMIN
APPLICATION DEVELOPMENT
~WHOAMI

• Jose   Diaz-Gonzalez

• Resident   IRC Troll (savant)

• Rants   at http://josediazgonzalez.com




                                              ➘
• Harasses   as @savant
                                            me
• Codes    as josegonzalez on github

• Works    at @seatgeek
                                           not me
                                                    ➘
WHO IS THIS TALK FOR?


• Anyone   building CMS’ for a living

• Those   needing quick, extensible CRUD applications

• Anyone   looking for a boring challenge
WHAT THE HELL IS THIS?


• var    $scaffold = true;

• ../cake/console/cake    bake

• cake   bake skeletons

• admin   generation
SCAFFOLD
SCAFFOLDING


• Generic   application auto-generation

• InCakePHP, introspects the Model::schema() and
 relationships to pull in data

• Dumb, never   recommended for production, not easy to
 manipulate
var $scaffold
<?php
class
IssuesController
extends
AppController
{

   var
$scaffold;
}
EXTENDING THIS?

• Introspects   model; add callbacks/validation rules/behaviors

• _*Scaffold()        Callbacks

• Custom     app/controller/scaffold.php class

• Customize     app/views/scaffolds/* views

• 2.0   gets cooler scaffold
FIN
SCAFFOLD DRAWBACKS


• Little   to no usage documentation

• Hard     to customize

• Easier   to add generic methods in AppController
GENERIC METHODS
GENERIC METHODS


• Create
      index()/view()/add()/edit()/delete() methods in your
 AppController

• Have   callbacks to disable in specific Controllers

• Able   to override in child Controllers
/**
          
*
Handles
index
requests.
          
*
          
*
@return
void
          
*
@access
public
          
*/
          public
function
index()
{
          



//
Only
do
this
work
if
our
concrete
controller
has
not.
          



if
(!isset($this‐>viewVars[Inflector::pluralize($this‐>modelClass)]))
{
          







$this‐>set(array(
          











Inflector::pluralize($this‐>modelClass)
=>
$this‐>paginate(
          















$this‐>modelClass,

          















/**
          
















*
Here
we
toss
in
any
conditions
that
were
found
as
named
          
















*
parameters
and
which
match
up
to
a
column
in
the
model
          
















*
schema.
          
















*/
          















array_intersect_key(
          



















$this‐>params['named'],
          



















$this‐>{$this‐>modelClass}‐>schema()
          















)
          











)
          







));
          



}
          }




From https://github.com/joebeeson/crumbs/blob/develop/app_controller.php
class
PostsController
extends
AppController
{





protected
$disabledActions
=
array('index',
'add',
'edit',
'changelog');





public
function
beforeFilter()
{








if
(in_array($this‐>params['action'],
$this‐>disabledActions))
{












$this‐>cakeError('404');








}




}

}




                disabling mocked methods
CAVEATS


• Has   to be generic enough to use across controllers

• Only   portable if built as a plugin library (ie. LazyModel)

• Must   remember to build disabling code
BAKE
CAKE BAKE

• You   can now view the generated code and modify at will

• Have   to re-bake constantly

• Everyone   uses it; No one customizes it

• Same   issues as Scaffold

• NOT    === var $scaffold
BAD CAKE BAKE

• Lets   use Model::scaffold = ‐1 please

• Generated    view() can result in an empty page

• Generated    delete() lets crawlers potentially auto-delete
 site

• Model::read()       usage is evil

• Asks   too many questions; Can’t I just answer once and rebake?
EXTENDING THIS?


• Templates: app/vendors/shells/templates

• Models   are simple to access in templates

• Do   you follow “conventions” or allow configuration?

• May   need custom shell for extra configuration
CAKE SKELETONS


• ../cake/console/cake   bake project

• Multiple   skeletons available

• Application   Bootstrap

• More   or less portable
CAKE SKELETONS


• Can’t   use in existing applications

• Assume    you’ll always follow the same conventions

• Hard    to upgrade bootstrapped apps in automated fashion

• Good    for “chop-shops” and freelancers on new apps
EXTENDING THIS?

• Copy
     cake/console/templates/skel to app/
 vendors/templates/skeletor

• Add   plugins, create migrations/schema files

• Generate   generic models/controllers/views

• Customize   the HTML/CSS

• GITHUB
EXISTING CAKE BAKE
                 SKELETONS

• Andy    Dawson’s Skel

• Jon   Bradley’s cake-skel

• Dean    Soffer’s BakingPlate

• Jose   Gonzalez’s AppSkellington
IS THAT ALL?
RAILS GENERATORS
• Generators     generate generators

• Scaffolding   similar to bake

• Heavy   community use

• http://railswizard.org/
                                       ^ Someone make this for CakePHP ^




           ESSENTIALLY
       CAKE BAKE+SKELETONS
RAILS ADMIN
• Port   of MerbAdmin

• Ruby   DSL Configuration

• Similar   to var $scaffold

• Works  with existing
 applications

• Actively
         Developed,            https://github.com/sferik/rails_admin
 Unofficial
SYMFONY ADMIN
PROGRESSIVE ENHANCEMENT


• var   $scaffold on crack

• supports   custom fields

• weird   templating language

• Symfony    win?
                                http://chetzit.com/uploads/images/00/00/04/2010/09/10/4ef9840c2e.png
YAML YAML YAML
NO GENERATION STEP




      save and go
DJANGO ADMIN
DJANGO PONY


• Very   customizable

• Lots   of available plugins

• Lots   of “themes”

• Official   Support
CAKE ADMIN
WHY


• Need    custom admin interface on top of phpmyadmin

• Can’t   use Croogo/Infinitas/etc.

• Need    to replicate similar admin interfaces across projects

• Let   less technical developers create their own interfaces
THE GOOD
CLASS BASED

//
Access
via
/admin/posts
class
PostCakeAdmin
extends
CakeAdmin
{

}
PHP-BASED CONFIGURATION
    class
CategoryCakeAdmin
extends
CakeAdmin
{
    /**
    
*
Where
do
I
“scaffold”
this?
    
*
    
*
@var
string
    
*/
    



public
$plugin








=
'dashboard';

    }
LOOKS EFFIN AMAZING
BETTER BASE METHODS
public
function
delete($id
=
null)
{




if
(!empty($this‐>data['Category']['id']))
{








if
($this‐>Category‐>delete($this‐>data['Category']['id']))
{












$this‐>Session‐>setFlash(__d('admin',
'Category
deleted',
true),
'flash/success');












$this‐>redirect(array('action'
=>
'index'));








}








$this‐>Session‐>setFlash(__d('admin',
'Category
was
not
deleted',
true),
'flash/error');








$id
=
$this‐>data['Category']['id'];




}





$this‐>data
=
$this‐>Category‐>find('delete',
compact('id'));




if
(!$this‐>data)
{








$this‐>Session‐>setFlash(__d('admin',
'Category
unspecified',
true),
'flash/error');








$this‐>redirect(array('action'
=>
'index'));




}
}
THE BAD
NO TESTS
HIGH LEARNING CURVE
AND THE REST
CREATING NEW ACTIONS


• Needs     an *ActionConfig class

• Templates    for Controller/View - Model optional

• Similar   to Cake Bake Templates

• Access    to a model and the Admin class config
WHATS IN AN ACTION
       <?php
       class
CakeAdminIndexConfig
extends
CakeAdminActionConfig
{
       



//
Guess
       



var
$defaults
=
array(
/*
some
options
*/);
       



//
Should
we
enable
this
by
default
       



var
$enabled
=
true;
       



//
Plugin
where
the
templates
for
this
action
are
located
       



var
$plugin
=
'cake_admin';
       



//
Action
type
       



var
$type
=
'index';
       



//
How
do
we
"link"
to
this
method
       



var
$linkable
=
'List
{{modelname}}';
       



//
Custom
model
methods
(find,
related)
       



var
$methods
=
array('find');
       



//
How
do
we
merge
our
defaults
and
configuration?
       



function
mergeVars($admin,
$configuration
=
array())
{
       



}

       }
CAKE ADMIN GENERATE
TODO


• More   actions (galleries, TreeBehavior)

• Ajax   and other UI enhancements

• Web    interface for customization

• Scaffold-like   interface in 2.0
LINKS
•   CakeAdmin: http://github.com/josegonzalez/cake_admin

•   Baking Master Class: http://www.neilcrookes.com/2009/07/11/baking-master-class-cakefest-jul-09/

•   AppSkellington: http://github.com/josegonzalez/app_skellington

•   Skel: http://github.com/ad7six/skel

•   Cake-Skel: https://github.com/jonbradley/cake-skel

•   BakingPlate: http://github.com/proloser/bakingplate

•   RailsAdmin: http://github.com/sferik/rails_admin

•   DjangoAdmin: https://docs.djangoproject.com/en/1.3/ref/contrib/admin/

Really Rapid Admin Application Development