0

我有这样的功能:

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

4 回答 4

1

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

如果您想将更改的数据持久存储到数据库中,请改为使用行为

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

您的变量命名不好。$a + $b = $c。嘿,你知道我的意思是用这个来计算日期吗?不,总是给变量起有意义的名字。检查编码约定并遵守它们。干净的代码也是一本好书。

还要注意范围关键字,不要将 var 与 public/protected/private 混用。如果您不知道它们的意思,请查看此页面

于 2013-08-27T09:25:42.783 回答
0

这个函数已经作为 Inflector::slug 存在

于 2013-08-27T21:13:14.003 回答
0

我不知道像这样使用你自己的函数的最佳实践是什么,但我实际上会将这些东西func_seo.php放入Behavior中,所以你所有的模型都可以像$this->seoTitle().

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

于 2013-08-27T06:17:02.227 回答
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']);
于 2013-08-27T05:26:16.800 回答