この記事では、thinkPHP3.0 フレームワークでテンプレートをデータベースに保存する方法を主に紹介し、thinkPHP3.0 フレームワークを使用して CMS システムを開発するプロセスにおける、テンプレートをデータベースに保存する具体的な実装手順と関連する操作スキルを分析します。必要なもの 友人が参照できるようにします
この記事では、thinkPHP3.0 フレームワークがテンプレートをデータベースに保存する方法の例について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:
CMSを開発するとき、テンプレートファイルをデータベースに保存し、ページに表示するために使用されます
thinkphp3.0はテンプレートファイルを直接読み取って解析するため、したがって、データベースに保存するテンプレートは自分で開発するしかありません。thinkphp3.0 には独自のモードを定義して、目的を達成することができます。次のように:
1. エントリ ファイルに
define('MODE_NAME','Ey');
と入力します。ここで、「Ey」は独自の拡張モードの名前です。 thinkphp/Extend/Mode ファイルの下に Ey フォルダーを作成してください。 Ey ディレクトリの
を変更し、tags.php ファイルの内容を次のように追加します。
return array( 'app_init'=>array( ), 'app_begin'=>array( 'ReadHtmlCache', // 读取静态缓存 ), 'route_check'=>array( 'CheckRoute', // 路由检测 ), 'app_end'=>array(), 'path_info'=>array(), 'action_begin'=>array(), 'action_end'=>array(), 'view_begin'=>array(), 'view_template'=>array( 'ExtensionTemplate', // 自动定位模板文件(手动添加) ), 'view_content'=>array( 'ParseContent'//(手动添加) ), 'view_filter'=>array( 'ContentReplace', // 模板输出替换 'TokenBuild', // 表单令牌 'WriteHtmlCache', // 写入静态缓存 'ShowRuntime', // 运行时间显示 ), 'view_end'=>array( 'ShowPageTrace', // 页面Trace显示 ), );
変更のためにファイルの最後にコメントを手動で追加します。 thinkphp のデフォルトのタグ検索テンプレートを変更するだけです。そして、テンプレートを解析する動作
システムのデフォルトのアクションクラスとビュークラスをEyのディレクトリにコピーし(コンテンツを解析するため、アクションクラスとビュークラスを変更する必要があります)、action.class.phpのfetchメソッドを変更します:
protected function fetch($templateFile='',$templateContent='' ){ return $this->view->fetch($templateFile,$templateContent); }
view.class.php ファイルの変更は次のとおりです:
public function fetch($templateFile='',$templateContent = NULL) { $params['templateFile'] = $templateFile; $params['cacheFlag'] = true; if(isset($templateContent)) { $params['templateContent'] = $templateContent; } tag('view_template',$params); // 页面缓存 ob_start(); ob_implicit_flush(0); if('php' == strtolower(C('TMPL_ENGINE_TYPE'))) { // 使用PHP原生模板 // 模板阵列变量分解成为独立变量 extract($this->tVar, EXTR_OVERWRITE); // 直接载入PHP模板 include $templateFile; }else{ // 视图解析标签 $params = array('var'=>$this->tVar,'content'=>$params['templateContent'],'file'=>$params['templateFile'],'cacheFlag'=>$params['cacheFlag']); tag('view_content',$params); } // 获取并清空缓存 $content = ob_get_clean(); // 内容过滤标签 tag('view_filter',$content); // 输出模板文件 return $content; }
3. 独自の検索テンプレート クラスを拡張します (独自の拡張動作 tp を thinkphpExtendBehavior に組み込みます)
ExtensionTemplateBehavior を追加します。 thinkphpExtendBehavior.class.php クラスの内容は次のとおりです:class ExtensionTemplateBehavior extends Behavior { // 行为扩展的执行入口必须是run public function run(&$params){ if( is_array($params) ){ if( array_key_exists('templateFile', $params) ){ $params = $this->parseTemplateFile($params); }else{ //异常 throw_exception(L('_TEMPLATE_NOT_EXIST_AND_CONTENT_NULL_').'['.$params['templateFile'].']'); } }else{ // 自动定位模板文件 if(!file_exists_case($params)) $params = $this->parseTemplateFile($params); } } private function parseTemplateFile($params) { if( is_array($params) ) { $templateFile = $params['templateFile']; }else{ $templateFile = $params; } if(!isset($params['templateContent'])) { // 是否设置 templateContent 参数 //自动获取模板文件 if('' == $templateFile){ // 如果模板文件名为空 按照默认规则定位 $templateFile = C('TEMPLATE_NAME'); } elseif(false === strpos($templateFile,C('TMPL_TEMPLATE_SUFFIX'))) { $path = explode(':',$templateFile); //如果是插件 if($path[0] == 'Ext') { $templateFile = str_replace(array('Ext:',$path[1] . ':',$path[2] . ':'),'',$templateFile); $templateFile = SITE_ROOT . '/Ext/extensions/' . strtolower($path[1]) . '/' . $path[2] . '/Tpl/' . $templateFile . C('TMPL_TEMPLATE_SUFFIX'); } else { // 解析规则为 模板主题:模块:操作 不支持 跨项目和跨分组调用 $action = array_pop($path); $module = !empty($path)?array_pop($path):MODULE_NAME; if(!empty($path)) {// 设置模板主题 $path = dirname(THEME_PATH).'/'.array_pop($path).'/'; }else{ $path = THEME_PATH; } $depr = defined('GROUP_NAME')?C('TMPL_FILE_DEPR'):'/'; $templateFile = $path.$module.$depr.$action.C('TMPL_TEMPLATE_SUFFIX'); } } } else { if('' == $templateFile){ $depr = defined('GROUP_NAME')?C('TMPL_FILE_DEPR'):'/'; $params['cacheFlag'] = false; } else { $path = explode(':',$templateFile); //如果是插件 if($path[0] == 'Ext') { $templateFile = str_replace(array('Ext:',$path[1] . ':',$path[2] . ':'),'',$templateFile); $templateFile = SITE_ROOT . '/Ext/extensions/' . strtolower($path[1]) . '/' . $path[2] . '/Tpl/' . $templateFile . C('TMPL_TEMPLATE_SUFFIX'); } else { // 解析规则为 模板主题:模块:操作 不支持 跨项目和跨分组调用 $action = array_pop($path); $module = !empty($path)?array_pop($path):MODULE_NAME; if(!empty($path)) {// 设置模板主题 $path = dirname(THEME_PATH).'/'.array_pop($path).'/'; }else{ $path = THEME_PATH; } $depr = defined('GROUP_NAME')?C('TMPL_FILE_DEPR'):'/'; $templateFile = $path.$module.$depr.$action.C('TMPL_TEMPLATE_SUFFIX'); } } } if( is_array($params) ){ $params['templateFile'] = $templateFile; return $params; }else{ if(!file_exists_case($templateFile)) throw_exception(L('_TEMPLATE_NOT_EXIST_').'['.$templateFile.']'); return $templateFile; } } }
4. 独自のテンプレートを解析する動作クラスを追加します (thinkphp3.0 のデフォルトの ParseTemplateBehavior.class.php に似ています)
class ParseContentBehavior extends Behavior { protected $options = array( // 布局设置 'TMPL_ENGINE_TYPE' => 'Ey', // 默认模板引擎 以下设置仅对使用Ey模板引擎有效 'TMPL_CACHFILE_SUFFIX' => '.php', // 默认模板缓存后缀 'TMPL_DENY_FUNC_LIST' => 'echo,exit', // 模板引擎禁用函数 'TMPL_DENY_PHP' =>false, // 默认模板引擎是否禁用PHP原生代码 'TMPL_L_DELIM' => '{', // 模板引擎普通标签开始标记 'TMPL_R_DELIM' => '}', // 模板引擎普通标签结束标记 'TMPL_VAR_IDENTIFY' => 'array', // 模板变量识别。留空自动判断,参数为'obj'则表示对象 'TMPL_STRIP_SPACE' => true, // 是否去除模板文件里面的html空格与换行 'TMPL_CACHE_ON' => true, // 是否开启模板编译缓存,设为false则每次都会重新编译 'TMPL_CACHE_TIME' => 0, // 模板缓存有效期 0 为永久,(以数字为值,单位:秒) 'TMPL_LAYOUT_ITEM' => '{__CONTENT__}', // 布局模板的内容替换标识 'LAYOUT_ON' => false, // 是否启用布局 'LAYOUT_NAME' => 'layout', // 当前布局名称 默认为layout // Think模板引擎标签库相关设定 'TAGLIB_BEGIN' => '<', // 标签库标签开始标记 'TAGLIB_END' => '>', // 标签库标签结束标记 'TAGLIB_LOAD' => true, // 是否使用内置标签库之外的其它标签库,默认自动检测 'TAGLIB_BUILD_IN' => 'cx', // 内置标签库名称(标签使用不必指定标签库名称),以逗号分隔 注意解析顺序 'TAGLIB_PRE_LOAD' => '', // 需要额外加载的标签库(须指定标签库名称),多个以逗号分隔 ); public function run(&$_data){ $engine = strtolower(C('TMPL_ENGINE_TYPE')); //这个地方要判断是否存在文件 if('think'==$engine){ if($this->checkCache($_data['file'])) { // 缓存有效 // 分解变量并载入模板缓存 extract($_data['var'], EXTR_OVERWRITE); //载入模版缓存文件 include C('CACHE_PATH').md5($_data['file']).C('TMPL_CACHFILE_SUFFIX'); }else{ $tpl = Think::instance('ThinkTemplate'); // 编译并加载模板文件 $tpl->fetch($_data['file'],$_data['var']); } } else if('ey' == $engine) { if( !$_data['cacheFlag'] ){ $class = 'Template'.ucwords($engine); if(is_file(CORE_PATH.'Driver/Template/'.$class.'.class.php')) { // 内置驱动 $path = CORE_PATH; } else { // 扩展驱动 $path = EXTEND_PATH; } if(require_cache($path.'Driver/Template/'.$class.'.class.php')) { $tpl = new $class; $tpl->fetch('',$_data['content'],$_data['var']); } else { // 类没有定义 throw_exception(L('_NOT_SUPPERT_').': ' . $class); } }else{ //操作 $cache_flag = true; if(isset($_data['content'])){ //如果指定内容 if ($_data['file']){ //指定缓存KEY $_data['file'] = 'custom_' . $_data['file']; } else { //未指定缓存KEY,则不缓存 $cache_flag = false; } } else { if (is_file($_data['file'])){ //如果指定文件存在 $_data['content'] = file_get_contents($_data['file']); } else { throw_exception(L('_TEMPLATE_NOT_EXIST_').'['.$_data['file'].']'); } } //这里文件和内容一定有一个存在,否则在之前就会有异常了 if($cache_flag && $this->checkCache($_data['file'],$_data['content']) ) { // 缓存有效 // 分解变量并载入模板缓存 extract($_data['var'], EXTR_OVERWRITE); //载入模版缓存文件 include C('CACHE_PATH').md5($_data['file']).C('TMPL_CACHFILE_SUFFIX'); } else { $class = 'Template'.ucwords($engine); if(is_file(CORE_PATH.'Driver/Template/'.$class.'.class.php')) { // 内置驱动 $path = CORE_PATH; } else { // 扩展驱动 $path = EXTEND_PATH; } if(require_cache($path.'Driver/Template/'.$class.'.class.php')) { $tpl = new $class; $tpl->fetch($_data['file'],$_data['content'],$_data['var']); } else { // 类没有定义 throw_exception(L('_NOT_SUPPERT_').': ' . $class); } } } } else { //调用第三方模板引擎解析和输出 $class = 'Template'.ucwords($engine); if(is_file(CORE_PATH.'Driver/Template/'.$class.'.class.php')) { // 内置驱动 $path = CORE_PATH; }else{ // 扩展驱动 $path = EXTEND_PATH; } if(require_cache($path.'Driver/Template/'.$class.'.class.php')) { $tpl = new $class; $tpl->fetch($_data['file'],$_data['var']); }else { // 类没有定义 throw_exception(L('_NOT_SUPPERT_').': ' . $class); } } } protected function checkCache($tmplTemplateFile = '',$tmplTemplateContent='') { if (!C('TMPL_CACHE_ON'))// 优先对配置设定检测 return false; //缓存文件名 $tmplCacheFile = C('CACHE_PATH').md5($tmplTemplateFile).C('TMPL_CACHFILE_SUFFIX'); if(!is_file($tmplCacheFile)){ return false; }elseif (filemtime($tmplTemplateFile) > filemtime($tmplCacheFile)) { // 模板文件如果有更新则缓存需要更新 return false; }elseif (C('TMPL_CACHE_TIME') != 0 && time() > filemtime($tmplCacheFile)+C('TMPL_CACHE_TIME')) { // 缓存是否在有效期 return false; } // 开启布局模板 if(C('LAYOUT_ON')) { $layoutFile = THEME_PATH.C('LAYOUT_NAME').C('TMPL_TEMPLATE_SUFFIX'); if(filemtime($layoutFile) > filemtime($tmplCacheFile)) { return false; } } // 缓存有效 return true; } }
5. テンプレートの内容を自分で解析するクラス TemplateEy.class.php を追加します (これは thinkphpExtendDriverTemplate ディレクトリの下に配置されます)
システムのデフォルトの ThinkTemplate.class.php クラスを変更しただけです。次のように:// 加载模板 public function fetch($templateFile,$templateContent,$templateVar) { $this->tVar = $templateVar; if($templateContent && !$templateFile) { //不缓存 if(C('LAYOUT_ON')) { if(false !== strpos($templateContent,'{__NOLAYOUT__}')) { // 可以单独定义不使用布局 $templateContent = str_replace('{__NOLAYOUT__}','',$templateContent); }else{ // 替换布局的主体内容 $layoutFile = THEME_PATH.C('LAYOUT_NAME').$this->config['template_suffix']; $templateContent = str_replace($this->config['layout_item'],$templateContent,file_get_contents($layoutFile)); } } //编译模板内容 $templateContent = $this->compiler($templateContent); extract($templateVar, EXTR_OVERWRITE); echo $templateContent; } else { $templateCacheFile = $this->loadTemplate($templateFile,$templateContent); // 模板阵列变量分解成为独立变量 extract($templateVar, EXTR_OVERWRITE); //载入模版缓存文件 include $templateCacheFile; } }
6. データベース内のテンプレートのコンテンツが存在しない場合に呼び出します。したがって、データベース内のコンテンツを読み取ります:
if( array_key_exists( $display_mode, $params['tpl'] ) && strlen($params['tpl'][$display_mode]) > 0 ){ return $this->fetch("Ext:New:Frontend:show",$params['tpl'][$display_mode]); }else{ return $this->fetch("Ext:New:Frontend:show"); }
関連する推奨事項:
thinkphp3.2はコントローラーを越えて他のモジュールを呼び出す方法を実装thinkPHPテンプレート 四則演算関連関数の利用状況分析
以上がthinkPHP3.0 フレームワークは、テンプレートをデータベースに保存するメソッドを実装します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHPにより、インタラクティブなWebコンテンツを簡単に作成できます。 1)HTMLを埋め込んでコンテンツを動的に生成し、ユーザー入力またはデータベースデータに基づいてリアルタイムで表示します。 2)プロセスフォームの提出と動的出力を生成して、XSSを防ぐためにHTMLSPECIALCHARSを使用していることを確認します。 3)MySQLを使用してユーザー登録システムを作成し、Password_HashおよびPreprocessingステートメントを使用してセキュリティを強化します。これらの手法を習得すると、Web開発の効率が向上します。

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

Dreamweaver Mac版
ビジュアル Web 開発ツール

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター
