2013-08-07 27 views
10

Tôi đang sử dụng Bootstrap 3.0RC1 với CakePHP 2.3.6. Cố gắng tận dụng những lớp học đẹp như has-errorhas-warning cho validation states, tôi cần phải thay đổi lớp phần tử mặc định FormHelper thêm vào div gói.Cách sửa đổi lớp lỗi div bao bọc khi sử dụng CakePHP với Bootstrap

Cho đến nay tôi đang sử dụng mã này:

echo $this->Form->create('User', array(
    'inputDefaults' => array(
     'class' => 'form-control', 
     'div' => array('class' => 'form-group'), 
     'label' => array('class' => 'control-label'), 
     'error' => array('attributes' => array('wrap' => 'span', 'class' => 'help-block')) 
    ) 
)); 

echo $this->Form->input('email')); 

nào sẽ ra này về lỗi:

<div class="form-group error"> 
    <label for="UserEmail" class="control-label">Email</label> 
    <input name="data[User][email]" class="form-control form-error" type="email" value="[email protected]"> 
    <span class="help-block">Email already in use.</span> 
</div> 

Mọi thứ đều tốt, ngoại trừ việc tôi cần phải thay đổi lớp error trong div gói thành has-error, do đó, kiểu mới được áp dụng cho label, inputspan. Không thể tìm thấy một giải pháp sạch cho đến nay.

Giải pháp xấu xí mà tôi nghĩ là sao chép has-error kiểu từ Bootstrap vào lớp error trong ứng dụng của tôi.

+1

Một chút ít xấu xí giải pháp là thêm chọn của bạn cho loại cụ thể của div lỗi vào tập tin CSS của bootstrap của bạn. Bằng cách đó bạn không sao chép tất cả các giá trị kiểu, bạn chỉ cần thêm div lỗi của bạn vào các định nghĩa kiểu hiện có. – Derek

+1

Một tùy chọn khác sẽ là sử dụng javascript để thay đổi các lớp từ 'lỗi' thành 'có lỗi' khi DOMREADY, mặc dù trang của bạn sẽ trông lạ cho đến thời điểm đó. Không thực sự là một giải pháp sạch. – Derek

+1

Vâng derek, cảm ơn, tôi thực sự không thể nghĩ ra cái tốt nhất để chọn. –

Trả lời

10

Nếu bạn quan sát FormHelper, bạn sẽ find in this line mã "xấu xí" làm sai lỗi.

Vì tác giả gốc không để lại bất kỳ cơ hội nào để thực hiện điều này theo cấu hình, tôi đề nghị bạn viết riêng BootstrapFormHelper và ghi đè chức năng nhập bằng cách thay đổi dòng đơn đó.

Dưới đây là đoạn mã:

//inside public function input($fieldName, $options = array()) 

$out['error'] = null; 
if ($type !== 'hidden' && $error !== false) { 
    $errMsg = $this->error($fieldName, $error); 
    if ($errMsg) { 
     $divOptions = $this->addClass($divOptions, 'has-error'); //old string value was 'error' 
     if ($errorMessage) { 
      $out['error'] = $errMsg; 
     } 
    } 
} 

Kể từ khi tôi đã sử dụng tùy chỉnh BootstrapFormHelper, here is link to full gist.

Chỉ cần sao chép tập tin vào app\View\Helper, và thêm vào ALL điều khiển của bạn dòng này:

public $helpers = array(
    'Form' => array('className' => 'BootstrapForm') 
); 

giả định rằng bạn đã lưu ý chính như BootstrapFormHelper.php.

1

Một giải pháp ít xấu xí hơn là thêm bộ chọn của bạn cho loại div lỗi cụ thể đó vào tệp CSS của bootstrap của bạn. Bằng cách đó bạn không sao chép tất cả các giá trị kiểu, bạn chỉ cần thêm div lỗi của bạn vào các định nghĩa kiểu hiện có.

Một tùy chọn khác sẽ là sử dụng javascript để thay đổi các lớp từ 'lỗi' thành 'có lỗi' khi DOMREADY, mặc dù trang của bạn sẽ trông lạ cho đến thời điểm đó. Không thực sự là một giải pháp sạch.

0

Tôi chưa bao giờ sử dụng CakePHP, nhưng tôi dám đăng câu trả lời ở đây. Tôi nghĩ rằng phần tử tin nhắn sẽ có thể mang nhiều lớp giống như bất kỳ phần tử nào khác.

Vì vậy, chỉnh sửa đơn giản là:

'error' => array('attributes' => array('wrap' => 'span', 'class' => 'help-block has-error')) 

Tôi thấy không có lý do gì để sao chép và dán đoạn mã css.

+0

Điều đó giải quyết vấn đề thêm lớp 'has-error' vào' help-block'. Nhưng để lại cả kiểu dáng nhãn và kiểu nhập như thể không có lỗi. –

+0

Điều đó chỉ thêm lớp 'has-error' vào khoảng gói có chứa thông báo; nó không chạm vào gói 'div' chứa toàn bộ bộ phần tử đầu vào. Với CSS phù hợp, bạn thậm chí không cần điều đó. – Derek

+0

"'error' =>" là lỗi kích hoạt để bao bọc phần tử thông báo lỗi trong lớp biểu mẫu. Theo lý thuyết, nó sẽ hoạt động, nếu không cần thêm một số mã để chăm sóc vấn đề. Như tôi đã nói, tôi chưa bao giờ sử dụng CakePHP. Tôi có thể thử chạy một bài kiểm tra nhanh với bản thân khung này sau. Cám ơn. – web2kx

1

Tôi đồng ý với Dereks câu trả lời đầu tiên, thêm phong cách của bạn vào tệp CSS Bootstrap.

dòng 1590-1611

 

    .has-error .help-block, 
    .has-error .control-label { 
     color: #b94a48; 
    } 

    .has-error .form-control { 
     border-color: #b94a48; 
     -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 
       box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 
    } 

    .has-error .form-control:focus { 
     border-color: #953b39; 
     -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; 
       box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; 
    } 

    .has-error .input-group-addon { 
     color: #b94a48; 
     background-color: #f2dede; 
     border-color: #b94a48; 
    } 

Bạn nên thay đổi này để:

 

    .error .help-bloc, .has-error .help-block, 
    .error .control-label, .has-error .control-label { 
     color: #b94a48; 
    } 

    .error .form-control, .has-error .form-control { 
     border-color: #b94a48; 
     -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 
       box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 
    } 

    .error .form-control:focus, .has-error .form-control:focus { 
     border-color: #953b39; 
     -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; 
       box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; 
    } 

    .error .input-group-addon, .has-error .input-group-addon { 
     color: #b94a48; 
     background-color: #f2dede; 
     border-color: #b94a48; 
    } 

+0

Tôi nghĩ rằng tôi có thể sử dụng phương pháp này, cách dễ dàng. –

0

tôi đã sử dụng jQuery.

<script> 
$(document).ready(function() { 
    $('.form-control').parent('.error').each(function() { 
     $(this).addClass('has-error'); 
    }); 
}); 
</script> 
10

SOLUTION tôi SỬ DỤNG:

Mỗi lần bạn tạo một đầu vào mới, kiểm tra xem có bất kỳ lỗi cho lĩnh vực mà sử dụng CakePHP chức năng isFieldError() và chỉ cần thêm "đã lỗi" class để div giống như tôi đã làm dưới đây:

Chỉ div thiết lập:

'div' => array('class' => "form-group ".($this->Form->isFieldError('username') ? 'has-error' : '')), 

Full mã cho một lĩnh vực:

<?php echo $this->Form->input(
    'username', 
    array(
     'label' => array('text' => 'Username', 'class' => 'strong'), 'placeholder' => "Your Username", 'class' => 'form-control', 
     'div' => array('class' => "form-group ".($this->Form->isFieldError('username') ? 'has-error' : '')), 
     'error' => array('attributes' => array('wrap' => 'p', 'class' => 'help-block has-error')) 
     ) 
); ?> 
+0

Điều này thật xấu và tôi không thích. Nhưng nó cũng là cách lành mạnh duy nhất mà tôi đã nhìn thấy để thêm các lớp học thích hợp trong bánh mà không cần đến Javascript, vì vậy cho rằng tôi chào bạn :) –

0

Tôi sử dụng Trình trợ giúp tùy chỉnh phù hợp với bất kỳ khung CSS nào. Trong trường hợp này là Bootstrap.

<?php 

App::uses('AppHelper', 'View/Helper'); 

class UIHelper extends AppHelper 
{ 
    public $helpers = array('Html', 'Form'); 

    public function textBox($fieldName, $options = array()) { 
     $options += array('class' => 'form-control', 'div'=>false, 'error' => array('attributes' => array('wrap' => 'span', 'class' => 'help-block'))); 

     if (isset($options['label'])) { 
      if (is_array($options['label'])) { 
       $options['label'] += array('class' => 'control-label'); 
      } else { 
       $options['label'] = array('text' => $options['label'], 'class' => 'control-label'); 
      } 
     } else { 
      $options['label'] = array('class' => 'control-label'); 
     } 

     $divOptions = array('class' => "form-group has-feedback"); 
     if (isset($options['div'])) { 
      if (is_array($options['div'])) { 
       $divOptions += $options['div']; 
      } 
     } 
     $options['div'] = false;     

     $divText = $this->Form->input($fieldName, $options); 

     if ($this->Form->isFieldError($fieldName)) { 
      $divOptions['class'] = "form-group has-error has-feedback"; 
      $divText .= $this->Html->tag('span', null, array('class' => "glyphicon glyphicon-remove form-control-feedback")); 
     } 

     return $this->Html->tag('div', $divText, $divOptions); 
    } 

} 

?> 

Sau đó sử dụng này thay vì tiêu chuẩn Form helper

echo $this->UI->textBox('email')); 
Các vấn đề liên quan