Skip to content

Raw interface ideas

petercv edited this page Aug 11, 2012 · 4 revisions
<?php
/**
 * Person controller.
 */
class PersonController extends Adapto\Controller\Base
{
    protected $_entityDefClass = 'Model\EntityDef\Person';
    protected $_formClass = 'Model\UIDef\Person';    
}


/**
 * Person controller.
 */
class PersonController extends Adapto\Controller\Base
{
    // basis configuratie van de controller, hier kun je acties registreren, overriden,
    // verwijderen, evt. de entityDef en/of form naam met een setter setten (ipv een property
    // zoals voorbeeld hierboven)
    protected function init() 
    {
        parent::init();
        $this->removeAction('view');
        $this->addAction('edit', 'Adapto\Controller\Action\Edit', array('param' => 'value'));
    }
    
    // je kunt optioneel deze methode overriden en zelfs de hele entitydef met de base class
    // hier opbouwen, maar je kunt ook $_entityDefClass zetten met de class name of op basis van
    // een standaard locatie wordt het automatisch ontdekt, daarnaast als er geen gedefinieerd is
    // kan hij ook zelf op basis van de controller naam een wild guess doen
    protected function createEntityDef()
    {
        $def = parent::createEntityDef();
        $def->remove('created_at');
        return $def;
    }
    
    // eventueel te overriden om action handlers last-minute te configuren
    protected function createAction($name) 
    {
        $action = parent::createAction($name);
        if ($name == 'edit') {
            $action->setX('y');
        }
        
        return $action;
    }
    
    // kun je in je controller overriden en implementeren, maar je kan het ook in een aparte class
    // doen, standaard implementatie doet het form instantieren op basis van de gespecificeerde
    // entity definition van de controller, of je kunt een expliciete benoemen in $_formClass, daarnaast
    // zouden we ook automatisch zoeken naar een form met een bepaalde naming scheme kunnen ondersteunen
    protected function createUIDef() 
    {
        // form kan door verschillende acties worden gebruikt en is opvraagbaar door de acties
        // door controller->getUIDef aan te roepen deze doet evt. een createUIDef of geeft de bestaande
        // instantie terug
        $form = new Adapto\Controller\UIDef\Base($this->getEntityDef());
        $form->get('category', 'parent')->setReadonlyEdit(true)
                                        ->setHideList(true);
        $form->add(new Adapto\UIDef\Widget\Dummy('test'))->insertAfter('name');
    }
    
    // $form->get geeft proxy terug die widget instanties bevat van de genoemde attributen
    // elke methode wordt op elk van de widget instanties aangeroepen, voor auto-completion zijn
    // de standaard methoden zoals readonly, hiden, tabs, sections etc. expliciet gedefinieerd in
    // proxy class maar door __call te implementeren kun je ook andere methoden aanroepen dus als
    // 2 attributen hebben van een bepaalde class met een methode die niet standaard is voor alle
    // widgets kun je ze toch voor die specifiek aanroepen, fluent interface om te chainen, indien
    // je get met een enkele widget of add doet krijg je direct de widget instantie terug en
    // roep je het daar op aan
}



class Adapto\Controller\Base
{
    protected function init();
    
    protected function setEntityDefClass($class);
    protected function createEntityDef();
    public function getEntityDef();
    
    protected function setUIDefClass($class);
    protected function createUIDef();
    public function getUIDef();
    
    protected function addAction($action, $class, $params=array());
    protected function removeAction($action, $class);
    protected function setActionParams($action, $params)
    public function createAction($name);
}


class Adapto\EntityDef\Base
{
    public function add($attributeDef);
    public function get($name);
    public function remove($name);
}

class Adapto\EntityDef\Meta extends Adapto\EntityDef\Base
{
    
}

class Adapto\EntityDef\AttributeDef\Abstract
{
    public function setEntityDef($def);
    
    public function isRequired($entity);
    public function validate($entity);
}

class Adapto\Controller\Action\Base
{
    public function setUIDefDef($formDef);
    public function setEntityDef($entityDef);
    public function defaultAction();
    
    public function dispatchAction($action, $request);
}

class Adapto\UIDef\Base
{
    public function __construct($entityDef);
    
    public function add($widget);
    public function get($name);
    public function remove($name);
    
    public function fetchValues($request, $entity);
    
    public function moveBefore($name, $beforeName);
    public function moveAfter($name, $afterName);    
    public function moveToTop($name);
    public function moveToBottom($name);
    
    public function dispatchAction($action, $request);
}


interface Adapto\WidgetDef\Interface
{
    public function isEditable(int $type);
    public function setEditable(int $types); // ADD, EDIT, LIST, true, false

    public function isVisible(int $type);
    public function setVisible(int $types); // ADD, EDIT, LIST, VIEW, true, false

    public function isSearchable(int $type);
    public function setSearchable(int $searchable); // LIST, SEARCH, true, false

    public function isSortable();
    public function setSortable(boolean $sortable);
   
    public function isLabelVisible();
    public function setLabelVisible(boolean $visible);
  
    public function getTotalCallback();
    public function setTotalCallback($callback); // function($prev, $current, $index) { return $prev - $current; }
    
    public function getDefaultValue();
    public function setDefaultValue($value); // override default in entity
    ...
    public function setSection($name);
    ...
    public function moveBefore($name); // convenience, calls UIDef
    public function moveAfter($name); // convenience, calls UIDef
    public function moveToTop(); // convenience, calls UIDef
    public function moveToBottom(); // convenience, calls UIDef
    ...
    public function serialize();    
}

interface Adapto\Widget\Interface extends Adapto\WidgetDef\Interface
{
    public function renderView(...);
    public function fetchEditValue($request);
    public function renderEdit(...);
    public function fetchSearchValue($request);
    public function renderSearch(...);
    public function dispatchAction($action, $request);
}

class Adapto\Widget\Abstract implements Adapto\Widget\Interface
{
}

class Adapto\Widget\Date extends Adapto\Widget\Abstract
{
}

class Adapto\WidgetDef\Proxy implements Adapto\WidgetDef\Interface
{
    public function __constructs($widgetDefs=array());
    public function __call();    
}
Clone this wiki locally