2014-09-26 14 views
6

Vì vậy, tôi đang làm việc (làm việc với dữ liệu nhạy cảm mà tôi có thể thêm vào vì lợi ích), và quyền hạn quyết định chúng ta cần sử dụng công cụ mới mạnh mẽ và ít tài liệu nhất của Cakephp 3.0 (beta tại thời điểm này).Cakephp 3 nhiều formhelpers mẫu tùy chỉnh

Chỉnh sửa: Mục tiêu của tôi là tạo nhiều mẫu khác nhau cho biểu mẫu để gọi qua mẫu formhelper hoặc phương thức nhập. Có thực sự không phải là một ví dụ tốt cho việc này. Tùy chỉnh Templates FormHelper Sử dụng: Như đã thấy trong cuốn sách (và nơi nào khác trên internet bất cứ nơi nào) các tài liệu hướng dẫn rất ngắn gọn là như sau: trang web http://book.cakephp.org/3.0/en/core-libraries/helpers/form.html#customizing-the-templates-formhelper-uses

cho biết bạn có thể sử dụng mẫu phương pháp và sau đó cung cấp cho một mơ hồ " sử dụng ":

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

$ this-> Form-> templates ($ myTemplates);

Sau đó, nó cho biết bạn có thể sử dụng phương thức input() mà nó không đưa ra ví dụ. Và cuối cùng nhưng không kém phần mẫu tùy chỉnh FormHelper sẽ cho phép bạn "tạo" hoặc "tạo" như nhiều trình tạo biểu mẫu tùy chỉnh như bạn muốn, nhưng họ không đưa ra ví dụ về cách làm điều đó !? lulwut?

Tôi có thể dễ dàng sử dụng nó một lần như ví dụ của họ, nhưng sức mạnh của một mẫu tùy chỉnh ở đâu? Điều đó không làm tôi bất kỳ điều gì.

Vì vậy, bằng một giải pháp mới có thể, tôi thử và gặp lỗi mới.

tôi nhận được lỗi này (trong quan điểm của tôi) (từ đoạn mã sau):

Fatal Error Lỗi: Class 'Cấu hình' không tìm thấy

//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')); 
?> 

Cũ Cập nhật: Tôi thêm

use "Cake\Core\Configure;" 

theo quan điểm của tôi và mọi thứ hoạt động tốt, nhưng tôi muốn thêm tệp này vào tệp thích hợp trong phân cấp y để tôi không phải thêm điều đó vào mỗi chế độ xem,

đó là trừ khi tất nhiên nó gây ra các vấn đề về hiệu quả cho toàn bộ ứng dụng. Có ai biết nó nên đi vào đâu không? Trân trọng và TIA!

Cập nhật mới nhất: Tôi đã tìm ra. Quá dễ! kiểm tra câu trả lời của tôi dưới đây!Hy vọng điều này giúp một ai đó

+0

Vậy bạn muốn gì? Điều này nghe có vẻ giống như một đơn khiếu nại khá dài nhưng thậm chí không cho chúng tôi biết mục tiêu của bạn là gì? Ngoài ra, nếu bạn đọc kỹ tài liệu, đây không phải là về một khuôn mẫu duy nhất nhưng bạn có thể tùy chỉnh bất kỳ đầu ra nào bằng cách sử dụng phương thức templates() bằng cách truyền một tập các mẫu. – burzum

+0

Như tôi đã nói, có, tôi đồng ý rằng đây là những gì tài liệu nói như nó là hiển nhiên. Vấn đề của tôi là ... làm thế nào? làm thế nào để bạn tạo ra các mẫu này. Họ thậm chí không tạo ra bất kỳ mẫu nào trong ví dụ mà họ đưa ra. Họ chỉ đơn giản là đưa ra một mặc định cổ phiếu đơn lẻ làm ví dụ. Nếu tôi muốn tạo ba hoặc bốn mẫu tùy chỉnh riêng biệt, cách thực hiện điều này? Tôi tìm thấy một trang web: http://www.sanisoft.com/blog/2014/08/11/twitter-bootstrap-forms-cakephp-3/ Anh ấy làm một điều tương tự, nhưng giải thích rằng vì thiếu tài liệu anh ấy chọn để tạo các tiện ích tùy chỉnh làm biểu mẫu nhập mẫu tùy chỉnh thông qua FormHelper. – Urasquirrel

Trả lời

7

Sửa lỗi này cho phép bạn có các biểu mẫu mẫu tùy chỉnh (từ cakephp 3 !!!!) bằng cách sử dụng bootstrap. Nếu bạn muốn thiết lập kích thước bằng cách sử dụng helper biểu mẫu và tất cả sự tốt lành của nó (bảo mật và những gì không).

Jose Zap của CakePHP bảo tôi thử plugin bootstrap và widget và những gì không, nhưng cách thực sự để làm được điều này cần phải có được điều này:

Bước 1: Tạo config/templatesConfig.php và thêm hình thức tùy chỉnh của bạn đồ đạc.

<?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' => '',] 
    ] 
]; 

Bước 2: Từ bộ điều khiển bên trong phương thức cho chế độ xem chính xác, hãy gọi dòng này.

Đừng quên thêm này trên đỉnh của điều khiển của bạn

use Cake\Core\Configure; 

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

Bước 3: Thêm này bên trong 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 

Bước 4 (cuối cùng): Thêm dòng này với tên mẫu bạn muốn Bam !.

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

Hãy nói rằng bạn cần tất cả nguyên liệu đầu vào để sử dụng một đánh dấu tùy chỉnh trong một hình thức để hiển thị các nhãn sau khi đầu vào (mặc định là trước đó) và một lớp khác nhau cho các hardcoded error-message cho các lỗi:

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

Nếu bạn chỉ muốn tùy chỉnh một đầu vào duy nhất, vượt qua chính cùng 'mẫu' cho các tùy chọn FormHelper::input() như vậy:

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

Nếu bạn cần phải xác định nhiều mẫu và tái sử dụng chúng bất cứ khi nào bạn muốn, đây là một cái gì đó bạn c một thử (tâm trí Tôi viết nó ở đây, không bao giờ sử dụng nó trước đó):

// 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(...); 
.... 

Bạn cũng có thể tạo helper của riêng bạn và xác định các mẫu có vv

Nó thực sự tất cả phụ thuộc vào những gì bạn muốn để đạt được nhưng điều đó sẽ cung cấp cho bạn một sự hiểu biết tốt về cách các mẫu hoạt động (không chỉ trong các biểu mẫu bằng cách này).

+0

Tôi đã thử ví dụ cuối cùng của bạn, nhưng nó đưa ra một lỗi lạ. Như tất cả chúng ta, tôi khá mới làm quen với Cake 3.0 beta. "Không tìm thấy cấu hình lớp" gây nhầm lẫn cho tôi. – Urasquirrel

+0

Cập nhật: Tôi đã thêm sử dụng "Cake \ Core \ Configure;" theo quan điểm của tôi và mọi thứ hoạt động tốt, nhưng tôi muốn thêm tệp này vào tệp thích hợp trong cấu trúc phân cấp để tôi không phải thêm vào mỗi chế độ xem, trừ khi tất nhiên nó gây ra các vấn đề hiệu quả cho toàn bộ ứng dụng nói chung . – Urasquirrel

Các vấn đề liên quan