CakePHP 2.2.4:使用Component / Helper帮助简单链接

时间:2012-12-06 17:46:07

标签: php cakephp components helper

我做了一个帮助器,返回给定页面的URL。

帮助文件:

  public function PageURL($link = null, $category = null, $page = null){

            if($link){
                $link = strtolower(str_replace(' ', '-', $link));
                $page_url = "http://www.domain.com/$link";
            }
            else{
                $page_url = "http://www.domain.com/$category/$page";
            }
                return $page_url;
        }

(顺便说一句,是否有一个变量我可以代替http://www.domain.com使用,例如full_site_url,base_url等?)

当我将参数传递给帮助程序时,这就是我的视图:

<?php echo $this->Html->link($page['Page']['title'], $this->Custom->PageuRL($page['Page']['link'], $page['Category']['directory'], $page['Page']['id'])); ?>

每次都要写很多东西。

我创建了一个组件,用于获取我想要访问的页面的URL。它目前在AppController上实现,所以我能够很好地显示当前页面的URL,但我想在视图内或帮助器内部使用它来显示另一个页面的URL。

public function TestPageURL($page = null) {


App::uses('ClassRegistry', 'Utility');
$pagesModel = ClassRegistry::init('Page');
$matchedpage = $pagesModel->find('first', array(
    'conditions' => array('Page.id' => $page), 'recursive' => '0'
));


        if($matchedpage['Page']['link']){
            $pagelink = strtolower(str_replace(' ', '-', $matchedpage['Page']['link']));
            $page_url = "http://www.domain.com/" . $pagelink;
        }
        else{
            $page_url = "http://www.domain.com/" . $matchedpage['Page']['Category']['directory'] . $matchedpage['Page']['id'];

        }

        return $page_url;

} // end page url

通过这种方式,我只需要将一个参数传递给组件。

我知道在帮助程序中使用组件是不好的,我不确定在这个版本的CakePHP中是否允许它,但它会使创建链接更加简单。有没有人知道如何在帮助器中使用此组件或以与我只需传递页面变量相同的方式执行帮助操作?

编辑:确定这对我有用,并且每个人都不赞同,因为它涉及在帮助程序中进行查询,但它确实简化了事情。我会看看它是否会减慢我的网站速度。

我仍然愿意接受有关如何改善这一点的建议。

  public function TestPageURL($page = null) {


    $pagesModel = ClassRegistry::init('Page');
    $matchedPage = $pagesModel ->find('first', array(
        'conditions' => array('Page.id' => $page), 'recursive' => '1'
    ));

           if($matchedPage ['Page']['link']){
                $link = strtolower(str_replace(' ', '-', $matchedPage['Page']['link']));
                $page_url = "http://www.domain.com/$link";
            }
            else{
                $page_url = "http://www.domain.com/" . $matchedPage['Page']['Category']['directory'] . '/' .$matchedPage['Page']['id'];
            }


            return $page_url;

    }

1 个答案:

答案 0 :(得分:0)

我建议在控制器中获取数据时在模型中创建URL。顺便说一句,您可以使用Router::url检索完整的基本网址。

示例(未经测试)......型号:

public function findPagesIncludingURLs()
{
    $pages = $this->find('all'); // or whatever you want to retreive

    $base = Router::url('/', true);
    foreach($pages as &$page)
    {
        $url = null;
        if($page['Page']['link'])
        {
            $url = strtolower(str_replace(' ', '-', $page['Page']['link']));
        }
        else
        {
            $url = $page['Page']['Category']['directory'] . '/' . $page['Page']['id'];
        }

        $page['Page']['url'] = $base . $url;
    }

    return $pages;
}

控制器:

$this->set('pages', $this->Page->findPagesIncludingURLs());

查看:

echo $this->Html->link($page['Page']['title'], $page['Page']['url']);