2009-07-20 18 views

Trả lời

34

Thành thật mà nói, tôi muốn tạo mô hình chỉ để xác thực. Bạn có thể tạo một mô hình mà không sử dụng một bảng bằng cách thêm

var $useTable = false; 

Và sau đó tạo ra một mảng hợp lệ với quy tắc cho từng lĩnh vực bạn muốn xác nhận:

var $validate = array('login' => 'alphaNumeric','email' => 'email','born' => 'date'); 

Sau đó, trong điều khiển của bạn, làm điều gì đó như:

$this->MyModel->set($this->data); 
if($this->MyModel->validates()){ 
    // do stuff with valid data 
} 

Nếu bạn thực sự, thực sự không thể sử dụng một mô hình, sau đó bạn sẽ phải chỉ đơn giản lặp trên mỗi giá trị trong $this->data trong hành động điều khiển của bạn và xác nhận nó chống lại một biểu thức chính quy hoặc sử dụng các công cụ Validation::[rule](), như:

if(Validation::email($someThingThatMightBeAnEmailAddress)){ 
    // do stuff with valid email address. 
} 
+0

Tại sao if (Validation :: email ($ someThingThatMightBeAnEmailAddress)) không làm việc trên kết thúc của tôi? – PinoyStackOverflower

+0

@PinoyStackOverflower Nếu không hoạt động, bạn có nghĩa là "Xác thực Lớp" không tìm thấy "thì bạn có thể cần phải thêm Ứng dụng :: sử dụng ('Xác thực', 'Tiện ích') để bao gồm lớp Xác thực. –

-3

Tôi nghĩ rằng câu hỏi đầu tiên của tôi sẽ là: nếu bạn không có một mô hình ... bạn là gì xác nhận? Thông thường thu thập dữ liệu sẽ được thực hiện để điền một mô hình. Nếu bạn đang sử dụng kho lưu trữ dữ liệu thay thế (tệp, dịch vụ web, v.v.), một mô hình vẫn sẽ là cách thích hợp để truy cập và thao tác dữ liệu đó.

Tóm lại, để trả lời tốt hơn, tôi nghĩ rằng một chút ngữ cảnh sẽ hữu ích và thậm chí có thể cần thiết.

+1

Rất nhiều thứ không thu thập dữ liệu nhưng vẫn có thể hưởng lợi từ việc xác nhận: các trường tìm kiếm, biểu mẫu đăng nhập, lọc tìm kiếm ... –

+3

đây không phải là câu trả lời, đã làm việc như một câu hỏi cho câu hỏi – Costa

1

Đến với câu hỏi này vì tôi cũng gặp vấn đề tương tự. Tôi có một biểu mẫu cần thu thập dữ liệu và tạo một tệp PDF. Vì vậy, không có dữ liệu tiết kiệm liên quan cũng không có một lớp mô hình maching. PDF là hợp đồng người dùng và người dùng sẽ điền vào biểu mẫu trực tuyến và dữ liệu được điền sẽ được sử dụng để tạo PDF mà họ phải in và gửi lại. Nhưng tôi cần phải xác nhận xem các lĩnh vực không có sản phẩm nào, cho dù email thực sự là một định dạng email, và ngày đầu vào thực sự là ngày đầu vào.

Trước tiên tôi đã không có lớp mô hình sau đó thấy this quesion. Bây giờ tôi đang sử dụng một lớp mô hình giả để có xác nhận hợp lệ của tôi đặt trong đó vì mã trong hành động điều khiển trông gọn gàng hơn nhiều.

9

Bạn có thể thực hiện xác thực dữ liệu biểu mẫu trong CakePHP mà không phải tạo tệp model.php. Có rất nhiều lần tôi cần phải làm điều này, và lưu trữ các tập tin model.php mà không làm gì nhiều hơn sau đó xác nhận là một cách sử dụng kém của mô hình thiết kế mô hình.

Một vấn đề khác với CakePHP là đôi khi quy tắc xác thực phổ biến trên nhiều mô hình. Sẽ tốt hơn nếu di chuyển xác thực ra khỏi mô hình, nhiều trong cách hành vi là thư mục con của riêng họ. Bằng cách đó, chúng tôi có thể tái sử dụng chúng hoặc sử dụng chúng mà không cần mô hình.

Một vấn đề khác khi xác nhận là nó phụ thuộc vào bí danh mẫu. Nếu bạn có một mô hình được gọi là "Email" không có bảng để thực hiện xác thực, thì biểu mẫu đã đăng cũng phải sử dụng "Email". Nếu biểu mẫu sử dụng bí danh khác với bộ điều khiển thì bạn phải đặt hành động. Nhiều bước bổ sung chỉ để thực hiện xác thực. Bạn không thể sử dụng lại mô hình đó nếu biểu mẫu của bạn sử dụng một mô hình khác.

Vì vậy, đây là cách tiếp cận thay thế của tôi.

Trong hành động của bộ điều khiển nhận dữ liệu biểu mẫu đã đăng. Bạn có thể tạo mô hình CakePHP mặc định, thêm một số quy tắc xác thực và sau đó sử dụng mô hình đó để xác thực.

Hành động ví dụ có thể trông như thế này;

function edit() 
{ 
    $model = ClassRegistry::init(array('class'=>'Email','table'=>false,'type'=>'Model')); 
    if(!empty($this->data)) 
    { 
     $model->validate = array(
      'subject'=>array(
       'rule'=>'notEmpty', 
       'required'=>true 
      ), 
      'message'=>array(
       'rule'=>'notEmpty', 
       'required'=>true 
      ) 
     ); 
     if($model->save($this->data)) 
     { 
      // validation was successful, but no data was actually saved 
     } 
    } 
} 

Chìa khóa ở đây là tạo mô hình tự động bằng CakePHP.

 $model = ClassRegistry::init(array('class'=>'Email','table'=>false,'type'=>'Model')); 

Các nỗ lực trên để tìm mô hình bằng Email trong thư mục mô hình ứng dụng. Khi không tìm thấy CakePHP sẽ tự động tạo một mô hình bộ nhớ cho lớp đó. Vì chúng ta đặt giá trị của 'table' thành false, nên điều này sẽ cho CakePHP biết rằng mô hình này không sử dụng một bảng.

Điều này hoạt động miễn là thực sự không có tệp email.php trong thư mục mô hình ứng dụng. Một khi mô hình này được tạo ra trong bộ nhớ. Nó có thể truy cập từ sự trợ giúp của Form. Điều đó có nghĩa là lỗi xác thực sẽ được chuyển chính xác đến chế độ xem.

Đây là tệp xem mẫu.

<?php echo $this->Form->create('Email',array('action'=>array('controller'=>'mycontroller','action'=>'edit'))); ?> 
<?php echo $this->Form->input('subject'); ?> 
<?php echo $this->Form->input('message',array('type'=>'textarea')); ?> 
<?php echo $this->Form->submit(); ?> 

Chế độ xem giờ đây sẽ hiển thị lỗi xác thực từ mô hình Email bằng Trình trợ giúp biểu mẫu. Điều này là do lớp đăng ký CakePHP đã lưu một bản sao của mô hình tự động EMail trong bộ nhớ mà trình trợ giúp biểu mẫu sẽ truy cập.

Nếu bạn muốn sử dụng quy tắc xác thực tùy chỉnh, thì bạn sẽ phải đặt các phương thức gọi lại trong tệp app_model.php.

Những phương pháp thử nghiệm trong CakePHP 1.3

+1

Cũng được thử nghiệm trong CakePHP 2.4.4. Câu trả lời tuyệt vời! Nó thực sự hữu ích với tôi. – t3b4n

0

Lớp Validation mà là một lớp con của Object được sử dụng bởi lớp mô hình để thực hiện xác nhận chống lại quy tắc xác nhận theo quy định tại điều đó.

Người ta có thể trực tiếp khởi tạo lớp Xác thực trong bất kỳ bộ điều khiển hoặc mô hình nào và sử dụng các phương pháp để thực hiện xác thực trên bất kỳ dữ liệu nào, không chỉ đầu vào từ biểu mẫu.

0

@ ThinkingMedia's answer giúp tôi đi đúng hướng, nhưng $model->save($this-data) đã trả lại false cho tôi không may, ngay cả khi biểu mẫu hợp lệ. Tôi đang sử dụng CakePHP 2.3.9 để tham khảo.

Hóa ra là ngay cả với 'table'=>false tham số thiết lập, trở $success của save() được dựa trên một $count > 0 của các hàng đã được tạo/cập nhật/sửa đổi. Trong trường hợp ít bảng hơn của tôi có nghĩa là một số $count của 0$successfalse. Tôi đã kết thúc pha trộn câu trả lời tham chiếu với similar question's solution này để có công việc xác nhận đúng mà không có một mô hình tập tin:

function edit() 
{ 
    $model = ClassRegistry::init(array('class'=>'YourFormName','table'=>false,'type'=>'Model')); 
    if($this->request-is('post')) 
    { 
     $model->validate = array(
      'some_field'=>array(
       'rule'=>'notEmpty', 
       'required'=>true 
      ), 
      'another_field'=>array(
       'rule'=>'notEmpty', 
       'required'=>true 
      ) 
     ); 
     $model->set($this->request->data) 
     if($model->validate($this->request->data) && empty($model->validationErrors)) 
     { 
      // validation was successful, but no data was actually saved 
     } 
    } 
} 
Các vấn đề liên quan