如何在CakePHP中创建UDF(用户定义函数)

时间:2013-08-27 05:22:36

标签: php cakephp cakephp-2.0 cakephp-1.3 user-defined-functions

我有这样的功能:

func_seo.php

<?php
function seo_title($s) {
    $c = array (' ');
    $d = array ('-','/','\\',',','.','#',':',';','\'','"','[',']','{','}',')','(','|','`','~','!','@','%','$','^','&','*','=','?','+');

    $s = str_replace($d, '', $s); 

    $s = strtolower(str_replace($c, '-', $s)); 
return $s;

}
?>

我想在App :: Model中使用该函数。

我是这样创建的,但它不起作用:

<?php
class MyModel extends AppModel{
    var $name = 'MyModel';
    public function beforeSave(){
        $this->element('func_seo'); //Function Element View/Elements/func_seo.php
        $this->data['MyModel']['name_seo'] = seo_title($this->data['MyModel']['tutorial_name']);
        return true; 
    }
}
?>

4 个答案:

答案 0 :(得分:1)

此代码应格式化输出Helper。这也将确保代码可以在项目之间轻松重用。最好将它放入类似于Utils插件的东西,并将其作为应用程序之间的git子模块共享。

如果要将已更改的数据存储到数据库中,请将其设为behaviour

您的示例代码是错误的,因为当您尝试在模型中呈现错误的元素时,它违反了MVC pattern

你的变量命名很糟糕。 $ a + $ b = $ c。嘿,你知道我打算用这个计算一个约会吗?不。总是给变量有意义的名字。 Check the coding conventions并关注他们。 Clean code也是一本很好的读物。

还要注意范围关键字,不要将var与public / protected / private混合使用。如果您不知道它们的含义,请检查this page

答案 1 :(得分:0)

你可以使用这样的功能。

<?php

class MyModel extends AppModel {

    var $name = 'MyModel';

    public function beforeSave() {
        $this->data['MyModel']['name_seo'] = $this->seo_title($this->data['MyModel']['tutorial_name']);
        return true;
    }

    public function seo_title($s) {
        $c = array(' ');
        $d = array('-', '/', '\\', ',', '.', '#', ':', ';', '\'', '"', '[', ']', '{', '}', ')', '(', '|', '`', '~', '!', '@', '%', '$', '^', '&', '*', '=', '?', '+');

        $s = str_replace($d, '', $s);

        $s = strtolower(str_replace($c, '-', $s));
        return $s;
    }

}

?>

或者您可以在App控制器

中实现此功能
public function seo_title($s) {
            $c = array(' ');
            $d = array('-', '/', '\\', ',', '.', '#', ':', ';', '\'', '"', '[', ']', '{', '}', ')', '(', '|', '`', '~', '!', '@', '%', '$', '^', '&', '*', '=', '?', '+');

            $s = str_replace($d, '', $s);

            $s = strtolower(str_replace($c, '-', $s));
            return $s;
        }

在您的控制器中,您可以像这样设置

$this->request->data['MyModel']['name_seo'] = 
     $this->seo_title($this->request->data['MyModel']['tutorial_name']);

答案 2 :(得分:0)

我不知道使用你自己的这类功能的最佳做法是什么,但实际上我会把func_seo.php中的东西放到Behavior中,所以你的所有模型都可以像$this->seoTitle()

将这样的通用函数包含在应用程序中也可能是设计错误。

答案 3 :(得分:0)

此功能已作为Inflector :: slug

存在