Exemple #1
0
 protected function modelAsArray(Model $model)
 {
     $result = array('pk' => $model->getPk(), 'has_log' => (bool) $model->getBehaviour('log'), 'is_link' => (bool) $model->getBehaviour('link'), 'properties' => array(), 'references' => array());
     foreach ($model->getProperties() as $property) {
         $result['properties'][$property->getName()] = $this->propertyAsArray($property);
     }
     foreach ($model->getOutReferences() as $reference) {
         $result['references'][] = $this->referenceAsArray($reference);
     }
     return $result;
 }
Exemple #2
0
    public function getGeneratedCode()
    {
        $class = $this->model->getClassName();
        $name = $this->model->getName();
        $pk = $this->model->getPk();
        $idProperty = json_encode(count($pk) == 1 ? $pk[0] : $pk);
        $items = array();
        // @todo References only by 1 field
        /**
         * @var \Cti\Storage\Component\Reference[] $referenceByField
         */
        $referenceByField = array();
        foreach ($this->model->getOutReferences() as $reference) {
            if (count($reference->getProperties()) == 1) {
                $properties = $reference->getProperties();
                $property = array_shift($properties);
                $referenceByField[$property->getName()] = $reference;
            }
        }
        $item_list = $behaviours = array();
        foreach ($this->model->getProperties() as $property) {
            $reference = isset($referenceByField[$property->getName()]) ? $referenceByField[$property->getName()] : null;
            $item = array('name' => $property->getName(), 'allowBlank' => !!$property->getRequired(), 'fieldLabel' => $property->getComment());
            if ($reference) {
                $item['xtype'] = 'ctipicker';
                $item['model'] = $reference->getDestination();
                $item['displayField'] = 'name';
                $item['valueField'] = 'id_' . $reference->getDestination();
            } else {
                switch ($property->getJavascriptType()) {
                    case 'date':
                        $item['xtype'] = 'datefield';
                        break;
                    case 'numeric':
                        $item['xtype'] = 'numberfield';
                        break;
                    default:
                        $item['xtype'] = 'textfield';
                        break;
                }
            }
            if ($property->getBehaviour()) {
                $item['readOnly'] = true;
                $item['disabled'] = true;
                if (!in_array($property->getName(), $pk)) {
                    $behaviours[] = $property->getName();
                }
            } else {
                $item_list[] = $property->getName();
            }
            if ($property->getJavascriptType() == 'numeric') {
                $item['xtype'] = 'numberfield';
            }
            $items[$property->getName()] = $item;
        }
        $item_list = json_encode(array_merge($item_list, $pk, $behaviours));
        $items = json_encode($items);
        $pk_getter = array();
        foreach ($pk as $key) {
            $pk_getter[] = $key . ": @" . $key;
        }
        $pk_getter = implode(', ', $pk_getter);
        return <<<COFFEE
Ext.define 'Generated.Form.{$class}',

  requires: ['Cti.Picker'],
  extend: 'Ext.form.Panel'
  bodyPadding: 10
  monitorValid: true
  border: false

  getPk: -> {$pk_getter}

  getItemsConfig: -> {$items}
  getItemsList: -> {$item_list}

  modelExists: -> !Ext.Array.contains(Ext.Object.getValues(@getPk()), undefined)

  initComponent: ->
    @items = []
    config = @getItemsConfig()
    for item in @getItemsList()
      @items.push config[item]

    @callParent arguments

    if @modelExists()
      Storage.getModel '{$name}', @getPk(), (response) =>
        model = Ext.create 'Model.{$class}', response.data
        @getForm().loadRecord model
        @fireEvent 'recordloaded', model
COFFEE;
    }
Exemple #3
0
    public function getGeneratedCode()
    {
        $class = $this->model->getClassName();
        $name = $this->model->getName();
        $title = $this->model->getComment();
        $pk = $this->model->getPk();
        $idProperty = json_encode(count($pk) == 1 ? $pk[0] : $pk);
        $columns = array();
        $fields = array();
        foreach ($this->model->getProperties() as $property) {
            $fields[] = array('name' => $property->getName(), 'type' => $property->getJavascriptType());
            $item = array('dataIndex' => $property->getName(), 'header' => $property->getComment());
            $columns[] = $item;
            if (!$property->getBehaviour()) {
                $width = 80;
                if ($property->getJavascriptType() == 'string') {
                    $width = 120;
                }
            }
        }
        $fields = json_encode($fields);
        $columns = json_encode($columns);
        $configuration = $this->getColumnConfiguration();
        $additionalStoresPreConstructor = $this->getAdditionalStoresPreConstructor();
        $additionalStoresAfterConstructor = $this->getAdditionalStoresAfterConstructor();
        return <<<COFFEE
Ext.define 'Generated.Grid.{$class}',

  extend: 'Ext.grid.Panel'

  title: '{$title}'

  token: '/{$name}/'

  store: model: 'Model.{$class}'
  getAvailableColumns: -> {$columns}
  getColumnConfiguration: -> {$configuration}

  requires: ['Model.{$class}', 'Form.{$class}']

  getTopToolbar: -> [
    xtype:'textfield'
    emptyText:'Фильтр'
    width:220
    enableKeyEvents: true
    listeners: keyup: 
      buffer: 50
      fn: => @applyFilter()
  ,
    text:'Add'
    handler: => @onAddClick()
    '-'
    text:'Edit'
    disabled: true
    handler: => @onEditClick()
    '-'
    text:'Remove'
    disabled: true
    handler: => @onRemoveClick()
  ]

  applyFilter: -> 
    value = Ext.util.Format.lowercase @down('[xtype=textfield]').getValue()
    @store.clearFilter()
    if value
      @store.filterBy (r) -> 
        found = false
        for k, v of r.data
          found = found || Ext.util.Format.lowercase(v).indexOf(value) != -1
        found

  getSelected: -> @getSelectionModel().getSelection()[0]

  onSelectionChange: ->
    disabled = !@getSelectionModel().getSelection().length
    @down('[text=Edit]').setDisabled disabled
    @down('[text=Remove]').setDisabled disabled

  onAddClick: -> Ext.create 'Window.{$class}', grid: @
  onRemoveClick: -> Storage.remove '{$name}', @getSelected().getPk(), => @getSelected().store.remove @getSelected()
  onItemClick: ->
  onItemDblClick: -> @onEditClick()
  onEditClick: -> Ext.create 'Window.{$class}', Ext.apply @getSelected().getPk(), grid: @

  loadData: -> Storage.getList '{$name}', (response) => @store.loadData response.data
  
  initComponent: ->
{$additionalStoresPreConstructor}
    configuration = @getColumnConfiguration()
    @columns = []
    Ext.Array.each @getAvailableColumns(), (column) =>
      if configuration[column.dataIndex]
        @columns.push Ext.apply column, configuration[column.dataIndex]

    @tbar = @getTopToolbar()
    @callParent arguments
{$additionalStoresAfterConstructor}

    @on 'selectionchange', => @onSelectionChange()
    @on 'itemclick', => @onItemClick()
    @on 'itemdblclick', => @onItemDblClick()
    @on 'afterrender', =>
        @loadData()
    , single: true

COFFEE;
    }