Yii Framework: Come customizzare gii per generare codice per la tua App
A partire dalla versione 1.1.2 , Yii Framework si è dotato di uno strumento: Yii Framework generatore codice basato sul Web generazione di codice chiamato Gii.
Essa sostituisce la precedente yiic strumento shell di generazione che girava su riga di comando.
In questa sezione, descriveremo come estendere Gii per aumentare la nostra produttività di sviluppo.
Mentre i generatori di codice di default che vengono con Gii in grado di generare codice molto potenti, spesso si ha l’esigenza di personalizzarli o crearne di nuovi per soddisfare i nostri gusti e le esigenze.
Ad esempio, potremmo volere che il codice generato sia basato su nostri stili di codifica preferiti, o potremmo voler rendere il codice utile a supportare più lingue.
Tutto questo può essere fatto facilmente con Gii.
Gii può essere esteso in due modi: personalizzando i template di codice dei generatori di codice esistenti, oppure utilizzando la scrittura di nuovi generatori di codice.
Un generatore di codice viene memorizzato in una directory il cui nome viene trattato come il nome del generatore.
La directory di solito consiste il seguente contenuto:
model/ La directory radice per il gen. model ModelCode.php Il Model Code usato per generare il code ModelGenerator.php Il Controller Generation views/ Contiene lo scripts view per il generator index.php Lo script di default per la view templates/ Contiene il codice per sets del template default/ Il 'default' code template setta model.php il code template per gernerare il model
PERCORSO DI RICERCA DEL GENERATOR
Gii cerca i Yii Framework generatore codice disponibili in una serie di directory specificata dalla proprietà GiiModule :: generatorPaths.
Quando è necessaria la personalizzazione, possiamo configurare questa struttura nella configurazione dell’applicazione come segue,
return array( 'modules'=>array( 'gii'=>array( 'class'=>'system.gii.GiiModule', 'generatorPaths'=>array( 'common.gii', // a path alias ), ), ), );
La configurazione di cui sopra indica Gii a cercare i Yii Framework generatore codice sotto la directory alias come common.gii, in aggiunta alle posizioni predefinite system.gii.generators e application.gii.
E ‘possibile avere due generatori con lo stesso nome, ma sotto diversi percorsi di ricerca.
In questo caso, il generatore nel percorso specificato in precedenza in GiiModule :: generatorPaths avrà la precedenza.
PERSONALIZZARE IL TEMPLATE CODE
Questo è il più semplice e il modo più comune di estendere Gii.
Usiamo un esempio per spiegare come personalizzare modelli di codice.
Supponiamo che vogliamo personalizzare il codice generato dal Yii Framework generatore codice model.
Si crea una directory chiamata protected/ gii / model / templates / compact.
Qui model significa che stiamo andando a sovrascrivere il generatore model predefinito.
E templates / compact aggiungeremo un nuovo set di template nome in codice compact.
Abbiamo poi modifichiamo la nostra configurazione dell’applicazione per aggiungere application.gii a GiiModule :: generatorPaths, come illustrato nel precedente comma.
Ora aprite la pagina di generatore di codice del model, fare clic sul campo codice del modello.
Dovremmo vedere un elenco a discesa che contiene la nostra directory template appena creato compatta.
Tuttavia, se si sceglie questo modello per generare il codice, vedremo un errore.
Questo perché dobbiamo ancora mettere qualsiasi file vero e proprio modello di codice in questo nuovo set di modelli compatti.
Copiare il file framework / GII / generator/ model / templates / default / model.php a protected / gii / modello / templates / compact.
Se cerchiamo la generazione di nuovo con il modello compatto, dovremmo riuscire.
Tuttavia, il codice generato non è diverso da quello generato dal set modello predefinito.
public function attributeLabels() { return array( <?php foreach($labels as $name=>$label): ?> <?php echo "'$name' => Yii::t('application', '$label'),\n"; ?> <?php endforeach; ?> ); }
CREAZIONE DI WidgetGenerator.php
Il file WidgetGenerator.php è estremamente semplice.
Esso contiene solo il codice seguente:
class WidgetGenerator extends CCodeGenerator { public $codeModel='application.gii.widget.WidgetCode'; }
Il nostro WidgetCode è simile al seguente:
class WidgetCode extends CCodeModel { public $className; public function rules() { return array_merge(parent::rules(), array( array('className', 'required'), array('className', 'match', 'pattern'=>'/^\w+$/'), )); } public function attributeLabels() { return array_merge(parent::attributeLabels(), array( 'className'=>'Widget Class Name', )); } public function prepare() { $path=Yii::getPathOfAlias('application.components.' . $this->className) . '.php'; $code=$this->render($this->templatepath.'/widget.php'); $this->files[]=new CCodeFile($path, $code); } }
Creating views/index.php
<h1>Widget Generator</h1> <?php $form=$this->beginWidget('CCodeForm', array('model'=>$model)); ?> <div class="row"> <?php echo $form->labelEx($model,'className'); ?> <?php echo $form->textField($model,'className',array('size'=>65)); ?> <div class="tooltip"> Widget class name must only contain word characters. </div> <?php echo $form->error($model,'className'); ?> </div> <?php $this->endWidget(); ?>
public function rules() { return array_merge(parent::rules(), array( ...... array('baseClass, actions', 'sticky'), )); }
In secondo luogo, abbiamo bisogno di aggiungere una classe CSS denominata sticky al div container del campo di input in vista, come la seguente:
<div class="row sticky"> ...input field here... </div>
Infine, creiamo il codice template templates / default / widget.php.
Come abbiamo descritto in precedenza, questo è usato come da copione vista che può contenere espressioni PHP e dichiarazioni.
In un modello di codice, possiamo sempre accedere al $this variabile che si riferisce all’oggetto modello di codice.
Nel nostro esempio, $this fa riferimento all’oggetto WidgetModel.
Possiamo così ottenere il nome della classe widget inserite dall’utente tramite $ this-> className.
<?php echo '<?php'; ?> class <?php echo $this->className; ?> extends CWidget { public function run() { } }
Questo conclude la creazione di un nuovo generatore di codice.
Siamo in grado di accedere immediatamente a questo generatore di codice tramite l’URL http://hostname/path/to/index.php?r=gii/widget.
Creating templates/default/widget.php
<?php echo '<?php'; ?> class <?php echo $this->className; ?> extends CWidget { public function run() { } }
Questo conclude la creazione di un nuovo generatore di codice. Siamo in grado di accedere immediatamente a questo generatore di codice tramite l’URL http://hostname/path/to/index.php?r=gii/widget.