Skip to content
This repository has been archived by the owner on Jun 4, 2021. It is now read-only.

Core_Controller_Action_Scaffold

Nikolay Galkin edited this page Jun 7, 2013 · 2 revisions

Model

В модели должны быть описаны следующие методы (если используете Core_Model_Table?, то они уже будут в вашей моделе):

<?php
/**
 * create
 *
 * create entity
 *
 * @param   array     $data
 * @return  Core_Model_Abstract
 */
public function create($data = array());

/**
 * find
 *
 * @param  integer $id
 * @return Core_Db_Table_Row_Abstract
 */
public function find($id);

/**
 * setFromArray
 * 
 * @param   array    $data
 * @return  Core_Model_Abstract
 */
public function setFromArray($data = array());

/**
 * save
 *
 * call save method
 *
 * @return  Core_Model_Abstract
 */
public function save();


/**
 * deleteById
 *
 * delete item by id
 *
 * @param  int $id  primary key
 * @return int The number of rows deleted.
 */
public function deleteById($id);

Controller

Приведу пример реализации Page контроллера:

<?php
// мы должны наследовать абстрактный класс Core_Controller_Action_Scaffold 
class Admin_PagesController extends Core_Controller_Action_Scaffold
{
    public function indexAction()
    {
        // see view script
        // use dojox.grid.DataGrid
    }

    /**
     * _getModel
     *
     * return model for scaffolding
     *
     * @return  Core_Model_Abstract
     */
    public function _getModel()
    {
        return new Model_Page();
    }
    
    /**
     * _getDbTable
     *
     * return DBTable for scaffolding
     *
     * @return  Core_Db_Table_Abstract
     */
    public function _getDbTable()
    {
        return new Model_DbTable_Page();
    }
    
    /**
     * _getCreateForm
     *
     * return create form for scaffolding
     *
     * @return  Zend_Dojo_Form
     */
    public function _getCreateForm()
    {
        return new Model_Form_Page_Edit();
    }
    
    /**
     * _getEditForm
     *
     * return edit form for scaffolding
     *
     * @return  Zend_Dojo_Form
     */
    public function _getEditForm()
    {
        $form =  new Model_Form_Page_Edit();
        $form->addElement(new Zend_Form_Element_Hidden('id'));
        
        return $form;
    }
}

View

Scaffold имеет два встроенных шаблона:

  • /views/scripts/scaffold/create.phtml
  • /views/scripts/scaffold/edit.phtml

Если вы не собираетесь их использовать переопределите соответствующие методы в контроллере:

<?php
public function createAction() 
{
    parent::createAction();
    $this->_setDefaultScriptPath();
}

Шаблон для index надо будет создавать по образу и подобию:

<?php
// подключаем dojo
$this->dojo()->enable();

// добавляем функцию, которая будет вызвана по окончанию загрузки DOM'а
$this->dojo()->addOnLoad('onLoad');

// шкурка для дадагрида
$this->headLink()->appendStylesheet('/scripts/dojox/grid/resources/tundraGrid.css');

// тут пишем javascript
$this->headScript()->captureStart();
?>
    // описываем поля датагрида
    var cells = [
    {
        name: "Title",
        field: "title",
        width:'100px'
    },
    {
        name: "Alias",
        field: "alias",
        width:'120px',
    },
    {
        name: "Description",
        field: "description",
        width:'226px'
    },
    {
        name: "Date create",
        field: "date_create",
        width:'124px'
    },
    {
        name: "Date update",
        field: "date_update",
        width:'124px'
    }
    ];
    
    // инициализируем датагрид
    function onLoad() {
        dojo.require('core.scaffold');
        /**
         * @param Array cells
         * @param String id of container
         * @param String url of controller
         */
        var datagrid = new core.scaffold(cells, 'gridContainer', '/admin/pages');
    }
<?php
$this->headScript()->captureEnd();
?>
<div class="gridControl">
<?php
    // добавляем фильтры для грида
    echo $this->comboBox('grid-field', 
                         'title',
                         array('jsid'=>'grid-field','autocomplete' => false),
                         array(), 
                         // описываем поля
                         array('title'=>'Title',
                               'alias'=>'Alias',
                               'description'=>'Description')
                        );
    // текстовое поле фильтра
    echo $this->validationTextBox('grid-filter',
                                  '*',
                                  array('jsid'=>'grid-filter',
                                        'regExp'=> '\S{1,}',
                                        'required'=> 'true'),
                                  array('style'=>'padding:2px 1px 1px')
                                  );
    
    // кнопки фильтрации и отмены                                             
    echo $this->button('grid-search', 'Filter', array('jsid'=>'grid-search','baseClass'=>'gridButton'));
    echo $this->button('grid-undo', 'Undo', array('jsid'=>'grid-undo','baseClass'=>'gridButton'));
?>
</div>

<!-- контейнер датагрида -->
<div class="gridContainer" id="gridContainer" style="height:300px"></div>

<div class="gridControl">
<?php
    // кнопка создания новых элементов
    echo $this->button('grid-new', 'Create New Page', array('jsid'=>'grid-new','baseClass'=>'gridButton'));
    // кнопка удаления выделенных строк
    echo $this->button('grid-del', 'Delete Selected Pages', array('jsid'=>'grid-del','baseClass'=>'gridButton'));
?>
</div>
Clone this wiki locally