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; }
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; }
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; }