2013-11-21 17 views
6

tôi cần ngừng cập nhật giá trị nhất định ngay cả những thuộc tính được đặt thành mảng POST. để làm điều đó tôi đang sử dụng không an toàn trong các quy tắc yii.Khi cập nhật, bỏ qua các thuộc tính nhất định từ việc cập nhật yii

array('id', 'unsafe', 'on'=>'update'), 

vẫn còn với điều này, tôi không thể bỏ qua id khi cập nhật.

cách này có thể được thực hiện với yii?

dưới đây là quy tắc chức năng của tôi ..

public function rules() 
{ 
    // NOTE: you should only define rules for those attributes that 
    // will receive user inputs. 
    return array(
     array('name, body, created_date', 'required'), 
     array('name', 'length', 'max'=>128), 
     array('body', 'length', 'max'=>512), 
     array('id', 'unsafe', 'on'=>'update'), 
     // The following rule is used by search(). 
     // @todo Please remove those attributes that should not be searched. 
     array('id, name, body, created_date', 'safe', 'on'=>'search'), 
    ); 
} 

Cập nhật 1

$ model-> thuộc tính = $ _POST [ 'Người dùng'];

và tôi cần khi lưu, để bỏ qua các thuộc tính nhất định.

$ model-> save();

+1

Bạn có thể thêm chức năng cập nhật của mình không? – secretlm

+0

@secretlm không phải là hàm của nó. một kịch bản của nó. – dev1234

+0

"tôi cần dừng cập nhật giá trị nhất định ngay cả những giá trị được đặt thành mảng POST" => Tôi muốn xem mã mà bạn đặt giá trị cho thuộc tính của mô hình trong hành động "cập nhật". – secretlm

Trả lời

2

Khi bạn đang tạo các ví dụ mô hình mới trong bộ điều khiển của bạn, bạn sẽ cần phải tuyên bố kịch bản ví dụ nếu tuyên bố của bạn là một cái gì đó như thế này

$myModelInstance = new MyModel(); 

bạn sẽ cần phải thay đổi nó để

$myModelInstance = new MyModel('update'); 

Tuy nhiên, nếu bạn đang sử dụng một trong các phương pháp tìm hồ sơ hoạt động để lưu nó thì nó được đặt tự động thành "cập nhật" như sau: http://www.yiiframework.com/doc/api/1.1/CActiveRecord#save-detail

nếu bạn đang sử dụng một số logic khác để khai báo các mô hình bạn chỉ có thể sử dụng chức năng setScenario

$myModel->setScenario("update"); 
1

Như đã đề cập bởi Manquer, kịch bản của bạn có lẽ là không được đặt để cập nhật. Một chuỗi cập nhật chính xác sẽ liên quan đến việc nạp cá thể đối tượng hiện có, gán các biến và sau đó lưu chúng. Cá nhân tôi sẽ không bao giờ chỉ khởi tạo một đối tượng và cho nó một kịch bản khác, tôi nghĩ rằng đó là yêu cầu cho các vấn đề.

// Load the existing object first 
$user = User::model()->findByPk(..); 
// Assign everything that has either a validation rule or is added as "safe" 
$user->attributes = $_POST['User']; 
// Save the updated version 
$user->save(); 

Yii không biết cập nhật 'id' (nếu nó được định nghĩa chính xác làm khóa chính trong cơ sở dữ liệu của bạn). Không cần đánh dấu nó là không an toàn. Vì vậy: Đảm bảo rằng cá thể được tải từ db ($ user-> isNewRecord phải là FALSE) và bảng đó có PK. Và sau đó cập nhật các thuộc tính bạn muốn.

Bạn cũng chỉ có thể cập nhật các thuộc tính cụ thể bằng cách "làm sạch" $ _POST trước hoặc khi bạn gọi lưu, hãy gọi nó là $ user-> save (true, array ('name', 'body')) để chỉ cập nhật tên và cơ thể chẳng hạn.

+0

Vì vậy, không có cách nào khác như, có một mảng không an toàn không an toàn ('id', 'created_date') và các thuộc tính trong mảng không an toàn sẽ không được thêm hoặc cập nhật và sẽ vẫn còn cũ giá trị trong DB. bất cứ điều gì như thế này được thực hiện từ cấp Model? – dev1234

+1

Vì bạn đã thêm trình xác thực không an toàn trên kịch bản "cập nhật", bạn sẽ phải đảm bảo mô hình của mình nằm trong kịch bản đó, cách Manquer hiển thị cho bạn. Tôi thực sự không nhìn thấy điểm của bạn bằng cách sử dụng mẫu ActiveRecord như thế (như bạn đang phá vỡ mọi thứ :)). Bạn có thể chỉ muốn sử dụng truy cập DAO sau đó (Yii :: app() -> db-> createCommand vv) – Blizz

+0

Cảm ơn. bất cứ điều gì để nói về câu hỏi này? http://stackoverflow.com/questions/20142553/model-exist-or-not-in-yii-using-a-custom-function-performance – dev1234

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