Cakephp加载元素与BBcode /短代码

时间:2013-11-22 14:54:41

标签: cakephp element helper shortcode

我正在寻找有关如何执行此操作的输入/帮助。可能有些PHP /蛋糕开发者可以在这里提供一些好的解决方案。 Cakephp 2.3东西:)

问题; 如何在wysiwyg编辑器中放置短代码(例如: [幻灯片放映= 1]幻灯片放映[/ slideshow] )并渲染元素(在这种情况下,加载并显示ID = 1的幻灯片。

ShortcodeHelper.php

App::import('Helper', 'Html', 'Router');
class ShortcodeHelper extends AppHelper {
    public $shortcodes = array( 
        'slideshow' => '/(\[slideshow=)(.+?)(\])(.+?)(\[\/slideshow\])/'
    ); 
    public $returncodes = array( 
        //'slideshow' => $this->render('/elements/slideshow', array('id'=>'\\2'))
        'slideshow' => '<strong rel="\\2">\\4</strong>' 
    ); 

    public function render($content, $render=null) {
        $shortcodes = $this->shortcodes;
        $returncodes = $this->returncodes;
        if(isset($render)) {
                $temp_shortcodes = array(); 
                $temp_returncodes = array(); 
                foreach ($render as $key => $value) { 
                    $temp_shortcodes[$key] = $shortcodes[$value]; 
                    $temp_returncodes[$key] = $returncodes[$value]; 
                } 
                $returncodes = $temp_returncodes; 
                $shortcodes = $temp_shortcodes; 

        }
        $return = preg_replace($shortcodes, $returncodes,  $content); 
        return $this->output($return); 
    }
}

view.ctp(从帮助程序调用渲染函数,并通过它运行页面内容):

<?php echo $this->Shortcode->render($page['Page']['body']); ?>

感谢。你太棒了!! :) - 汤姆

1 个答案:

答案 0 :(得分:0)

您需要将短代码字符串转换为方法调用,然后解析它。

您的帮助者需要能够检测到它们然后将其分解。您的代码需要以某种方式映射到回调。

// [slideshow=1]slideshow here[/slideshow]
$this->requestAction(array('controller' => 'slideshows', 'action' => 'view', $id);

例如。

我认为这里最好的方法是始终将第一个arg,“函数调用”映射到一个元素,并将所有其他args传递给元素。通过这种方式,您可以随心所欲地执行任务并请求数据或仅显示HTML。

我会将短代码映射到Configure :: write('ShortCodes',$ shortCodeArray);这样插件甚至可以通过简单地将它们添加到该数组来注册它们的回调映射。

array(
    'slideshow' => array('controller' => 'slideshows', 'action' => 'view')
);

您必须将其与已解析的短代码中的args合并。

为什么是requestAction()?您不应该违反MVC模式,因此您必须通过requestAction()请求数据。