2014-09-26 15 views
6

Così sono al lavoro (lavorando con dati sensibili che potrei aggiungere a favore dei posteri) e le potenze che decidono di utilizzare il nuovo strumento più potente e meno documentato di Cakephp 3.0 (beta in questo momento).Formattori di schemi personalizzati multipli di Cakephp 3

Modifica: il mio obiettivo è creare diversi modelli per i moduli da chiamare tramite il modello formhelper oi metodi di input. Non c'è davvero molto di un buon esempio per questo. Personalizzazione dei modelli FormHelper usi: Come visto nel libro (e in nessun altro luogo su internet ovunque) brevissimo documentazione è così: http://book.cakephp.org/3.0/en/core-libraries/helpers/form.html#customizing-the-templates-formhelper-uses

Il sito dice che si può utilizzare il metodo modello e quindi dare un vago " utilizzare ":

$myTemplates = [ 
    'inputContainer' => '<div class="form-control">{{content}}</div>', 
]; 

$ questo-> Form-> modelli ($ myTemplates);

Quindi si dice che è possibile utilizzare il metodo input() per il quale non fornisce alcun esempio. E, ultimo ma non meno importante, il template personalizzato FormHelper dovrebbe consentire di "creare" o "creare" come molti di questi formhelpers personalizzati come desideri, ma non danno alcun esempio di come farlo !? lulwut?

Posso facilmente usarlo una volta come il loro esempio, ma dov'è la potenza in un singolo modello personalizzato? Questo non mi fa affatto bene.

Quindi con una nuova possibile soluzione provo a ottenere un nuovo errore.

ottengo questo errore (nel mio punto di vista) (dal seguente codice):

Errore irreversibile Errore: 'Configura' di classe non trovata

//within bootstrap.php 
Configure::write('templates', [ 
    'shortForm' => [ 
     'formstart' => '<form class="" {{attrs}}>', 
     'label' => '<label class="col-md-2 control-label" {{attrs}}>{{text}}</label>', 
     'input' => '<div class="col-md-4"><input type="{{type}}" name="{{name}}" {{attrs}} /></div>', 
     'select' => '<div class="col-md-4"><select name="{{name}}"{{attrs}}>{{content}}</select> </div>', 
     'inputContainer' => '<div class="form-group {{required}}" form-type="{{type}}">{{content}} </div>', 
     'checkContainer' => '',], 
    'longForm' => [ 
     'formstart' => '<form class="" {{attrs}}>', 
     'label' => '<label class="col-md-2 control-label" {{attrs}}>{{text}}</label>', 
     'input' => '<div class="col-md-6"><input type="{{type}}" name="{{name}}" {{attrs}} /></div>', 
     'select' => '<div class="col-md-6"><select name="{{name}}"{{attrs}}>{{content}}</select> </div>', 
     'inputContainer' => '<div class="form-group {{required}}" form-type="{{type}}">{{content}} </div>', 
     'checkContainer' => '',], 
    'fullForm' => [ 
     'formstart' => '<form class="" {{attrs}}>', 
     'label' => '<label class="col-md-2 control-label" {{attrs}}>{{text}}</label>', 
     'input' => '<div class="col-md-10"><input type="{{type}}" name="{{name}}" {{attrs}} /> </div>', 
     'select' => '<div class="col-md-10"><select name="{{name}}"{{attrs}}>{{content}}</select> </div>', 
     'inputContainer' => '<div class="form-group {{required}}" form-type="{{type}}">{{content}} </div>', 
     'checkContainer' => '',] 
]); 

//within my view 
<?php 
    $this->Form->templates(Configure::read('templates.shortForm')); 
?> 

Vecchio Aggiornamento: ho aggiunto

use "Cake\Core\Configure;" 

a mio avviso e tutto funziona alla grande, ma vorrei aggiungere questo al file appropriato nella gerarchia y in modo che non debba aggiungerlo a ogni vista,

, a meno che, naturalmente, non causi problemi di efficacia per l'intera app nel suo complesso. Qualcuno sa su quale file dovrebbe andare? Saluti e TIA!

Aggiornamento più recente: l'ho appena capito. Cosi 'semplice! controlla la mia risposta qui sotto!Spero che questo ha aiutato qualcuno

+0

Quindi cosa vuoi? Sembra solo una lunga lamentela, ma non ci dice nemmeno qual è il tuo obiettivo? Inoltre, se si legge attentamente la documentazione, non si tratta di un singolo modello ma è possibile personalizzare qualsiasi output utilizzando il metodo templates() passando un set di modelli. – burzum

+0

Come ho detto, sì, sono d'accordo che questo è ciò che la documentazione dice come è ovvio. Il mio problema è che ... come? come si creano questi modelli. Non creano nemmeno modelli nell'esempio che danno. Semplicemente danno un unico stock predefinito come esempio. Se voglio creare tre o quattro modelli personalizzati separati, come si fa? Ho trovato un sito: http://www.sanisoft.com/blog/2014/08/11/twitter-bootstrap-forms-cakephp-3/ Fa una cosa simile, ma spiega che a causa della mancanza di documentazione che sceglie creare widget personalizzati come moduli di input del modello personalizzato tramite FormHelper. – Urasquirrel

risposta

7

Ciò che questa correzione consente è di avere moduli modello personalizzati (da cakephp 3 !!!!) utilizzando bootstrap. Se vuoi impostare le dimensioni usando l'helper del modulo e tutto ciò che è buono (sicurezza e cosa no).

Jose Zap di CakePHP mi ha detto di provare i plugin e widget bootstrap e cosa no, ma il vero modo per fare questo avrebbe dovuto essere questo:

Passaggio 1: creare config/templatesConfig.php e aggiungere il modulo personalizzato cose.

<?php 
$config = [ 
    'Templates'=>[ 
     'shortForm' => [ 
      'formStart' => '<form class="" {{attrs}}>', 
      'label' => '<label class="col-md-2 control-label" {{attrs}}>{{text}}</label>', 
      'input' => '<div class="col-md-4"><input type="{{type}}" name="{{name}}" {{attrs}} /></div>', 
      'select' => '<div class="col-md-4"><select name="{{name}}"{{attrs}}>{{content}}</select></div>', 
      'inputContainer' => '<div class="form-group {{required}}" form-type="{{type}}">{{content}}</div>', 
      'checkContainer' => '',], 
     'longForm' => [ 
      'formStart' => '<form class="" {{attrs}}>', 
      'label' => '<label class="col-md-2 control-label" {{attrs}}>{{text}}</label>', 
      'input' => '<div class="col-md-6"><input type="{{type}}" name="{{name}}" {{attrs}} /></div>', 
      'select' => '<div class="col-md-6"><select name="{{name}}"{{attrs}}>{{content}}</select></div>', 
      'inputContainer' => '<div class="form-group {{required}}" form-type="{{type}}">{{content}}</div>', 
      'checkContainer' => '',], 
     'fullForm' => [ 
      'formStart' => '<form class="" {{attrs}}>', 
      'label' => '<label class="col-md-2 control-label" {{attrs}}>{{text}}</label>', 
      'input' => '<div class="col-md-10"><input type="{{type}}" name="{{name}}" {{attrs}} /></div>', 
      'select' => '<div class="col-md-10"><select name="{{name}}"{{attrs}}>{{content}}</select></div>', 
      'inputContainer' => '<div class="form-group {{required}}" form-type="{{type}}">{{content}}</div>', 
      'checkContainer' => '',] 
    ] 
]; 

Passaggio 2: dal controller all'interno del metodo per la vista corretta chiamare questa linea.

Non dimenticare aggiungere questo sulla parte superiore del controller

use Cake\Core\Configure; 

$this->set('form_templates', Configure::read('Templates')); 

Fase 3: Aggiungere questo all'interno del file bootstrap.php

// Load an environment local configuration file. 
// You can use this file to provide local overrides to your 
// shared configuration. 

Configure::load('templatesConfig','default'); //fixed 

Fase 4 (finalmente): Aggiungi questa riga con il nome del modello che vuoi Bam !.

<?php $this->Form->templates($form_templates['shortForm']); ?> 
0

Diciamo che è necessario tutti gli ingressi di usare un markup personalizzato in una forma per mostrare l'etichetta dopo che l'ingresso (di default è prima) e una classe diversa per l'hardcoded error-message per gli errori:

$this->Form->create($entity, ['templates' => [ 
    'formGroup' => '{{input}}{{label}}', 
    'error' => '<div class="error">{{content}}</div>' 
]]); 

Se si desidera personalizzare un solo ingresso, passare chiave gli stessi 'modelli' alle FormHelper::input() opzioni in questo modo:

$this->Form->input('fieldname', ['templates' => [ 
    'formGroup' => '{{input}}{{label}}', 
    'error' => '<div class="error">{{content}}</div>' 
]]); 

Se è necessario definire più modelli e riutilizzare ogni volta che vuoi, qui di qualcosa che c un tentativo (la mente sto scrivendo qui, mai usato prima):

// in bootstrap (as this is a config i believe 
Configure::write('templates', [ 
    'foo' => [....], 
    'bar' => [....] 
]); 

// in any view 
$this->Form->templates(Configure::read('templates.foo')); 
$this->Form->create(...); 
.... 

Si potrebbe anche creare il proprio aiuto e definire i modelli di lì, ecc

E 'davvero tutto dipende da ciò che si vuole per ottenere ciò, ma questo dovrebbe darvi una buona comprensione di come funzionano i template (non solo nelle forme, a proposito).

+0

Ho provato il tuo ultimo esempio, ma dà uno strano errore. Come tutti noi, sono piuttosto alle prime armi con Cake 3.0 beta. "Class Configure non è stato trovato" mi confonde. Aggiornamento – Urasquirrel

+0

: ho aggiunto l'uso di "Cake \ Core \ Configure;" a mio avviso e tutto funziona alla grande, ma vorrei aggiungere questo al file appropriato nella gerarchia in modo che non debba aggiungerlo a tutte le visualizzazioni, a meno che, naturalmente, non causi problemi di efficacia per l'intera app nel suo complesso . – Urasquirrel