2010-10-26 21 views
6

Tôi đang sử dụng hàm afterFind để sửa đổi dữ liệu từ hàm tìm kiếm. Nó hoạt động tốt. Nếu tôi di chuyển hàm afterFind vào một hành vi (trong một plugin) nó vẫn hoạt động, nhưng chỉ khi mô hình quan tâm là mô hình chính, tức là nó không được gọi khi mô hình thuộc về một mô hình khác. co đuơng nao quanh đây không? Tôi đang sử dụng bánh 1.3.4. Đây là một phiên bản đơn giản hóa của hành vi:hành vi cakephp afterFind không được gọi trên các mô hình liên quan

class ChemicalStructureBehavior extends ModelBehavior { 
    function afterFind(&$model, $results, $primary) { 
     foreach ($results as &$unit) { 
      // format chemical formula (with subscripts) 
      $unit[$model->alias]['chemical_formula_formatted'] = preg_replace('/([0-9]+)/i', '<sub>$1</sub>', $unit[$model->alias]['chemical_formula']); 
     } 

     return $results; 
    } 
} 
+0

Từ PHP 5.4 trở lên, bạn có thể sử dụng Trait cho việc này - chỉ cần đặt mã 'afterFind()' vào một tệp mới chứa khai báo đặc điểm (thay đổi tham chiếu '$ model' thành' $ this') và bao gồm nó ở đầu lớp Mô hình của bạn với câu lệnh 'use'. Bạn sẽ cần sử dụng 'App :: import()' hoặc 'require()' để tải tệp chứa đặc điểm của bạn ở đầu tệp Mô hình của bạn. – BeesonBison

Trả lời

2

Tôi đoán tôi sẽ làm một trong 2 thứ tùy thuộc vào cách tổng quát khối mã được áp dụng:

  1. Phiên bản: không sử dụng một hành vi, nhưng bao gồm khối phương thức của bạn trong AppModel::afterFind
  2. Phiên bản phẫu thuật: sử dụng hành vi và đính kèm nó vào từng mô hình cần chia sẻ chức năng.
+0

(1) không hoạt động đối với tôi vì nó chỉ áp dụng cho một số, nhưng không phải tất cả, các kiểu máy. (2), về cơ bản là những gì tôi đang cố gắng làm, nhưng nó không hoạt động khi mô hình không phải là mô hình chính – Tomba

+0

Ý tôi là bạn muốn _literally_ đính kèm hành vi vào mọi mô hình mà bạn cần chức năng . Hành vi không có ý định hoạt động chống lại các mô hình liên quan. –

+0

Cảm ơn. Bạn có ý gì khi "gắn nghĩa đen cho hành vi của mọi mô hình"? – Tomba

2

Một hành vi không phải làm việc trên các mô hình có liên quan, ví dụ, nếu bạn có hai mô hình này:

app/models/product.php

<?php 

class Product extends AppModel{ 
    var $belongsTo = array('Category'); 
    var $actsAs = array('SomeBehavior'); 
} 

?> 

ứng dụng /models/category.php

<?php 

class Category extends AppModel { 
    var $hasMany = array('Product'); 
} 

?> 

SomeBehavior sẽ chỉ được thực hiện khi gọi phương pháp để sản phẩm, bởi vì hành vi không liên quan đến loại

+0

Tôi đã rephrased bình luận của tôi .. Tôi không muốn nó làm việc trên các mô hình liên quan, Tôi muốn nó làm việc trên một mô hình cho dù nó được gọi là mô hình chính hay không. Trong ví dụ của bạn, tôi sẽ kết hợp hành vi với Category thay vì Product, và tôi muốn các hàm gọi lại được gọi là Category là mô hình chính (/ categories/view/1) hay khi nó được gọi bởi sản phẩm (/ products/xem/1). Hiện tại, các chức năng gọi lại hành vi chỉ được gọi trong trường hợp trước đây. Nếu tôi đặt hàm gọi lại trong mô hình Danh mục thay vì trong một hành vi, nó được gọi trong cả hai trường hợp. – Tomba

2

http://github.com/m3nt0r/eventful-cakephp

Thiết lập một sự kiện mà không được định dạng - kích hoạt sự kiện tuy nhiên bạn cần. Dễ như bánh.

+0

Cảm ơn bạn đã đề xuất. Tôi sẽ xem xét nó. – Tomba

+1

Mỗi khi tôi đề nghị plugin Eventful ai đó vượt lên tôi trong vòng vài phút - phải tự hỏi nếu nó là m3nt0r (tác giả) –

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