


Méthode d'implémentation d'enregistrement des modèles dans la base de données dans le framework TP3.0
Cet article présente principalement la méthode d'enregistrement des modèles dans la base de données dans le framework thinkPHP3.0. Il analyse les étapes de mise en œuvre spécifiques et les techniques d'exploitation associées pour l'enregistrement des modèles dans la base de données dans le processus de développement de systèmes CMS à l'aide de thinkPHP3.0. framework sous forme d'exemples. Les amis dans le besoin peuvent se référer à
Cet article décrit l'exemple de la façon d'enregistrer des modèles dans la base de données dans le framework thinkPHP3.0. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :
Lors du développement de cms, il est utilisé pour enregistrer le fichier modèle dans la base de données et l'afficher sur la page
Depuis thinkphp3. 0 vient directement de Si vous lisez puis analysez le fichier modèle, vous ne pouvez le développer que vous-même pour stocker le modèle dans la base de données. Il existe également une fonction de mode dans thinkphp3.0. Nous pouvons définir notre propre mode pour atteindre cet objectif. Alors, comment étendre notre propre mode ? Comme suit :
1. Entrez
define('MODE_NAME','Ey');
dans votre fichier d'entrée, où "Ey" est le nom de votre propre mode étendu, veuillez entrer Créez le dossier Ey
sous votre fichier thinkphp/Extend/Mode 2. Modifiez
dans le répertoire Ey et ajoutez le contenu du fichier tags.php comme suit :
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显示 ), );
Ajouté manuellement dans les commentaires en fin de fichier pour ma modification, je viens de modifier le comportement de recherche de modèles et d'analyse des modèles dans les balises par défaut dans thinkphp
Modification des classes d'action et de vue par défaut du système vers le répertoire d'Ey (en raison de l'analyse du contenu, les classes d'action et de vue doivent être modifiées), modifiez la méthode fetch dans action.class.php :
protected function fetch($templateFile='',$templateContent='' ){ return $this->view->fetch($templateFile,$templateContent); }
Les modifications apportées au fichier view.class.php sont :
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. Développez votre propre classe de modèle de recherche ( mettons le comportement tp de votre propre extension dans thinkphpExtendBehavior)
Ajoutez la classe ExtensionTemplateBehavior.class.php dans thinkphpExtendBehavior avec le contenu suivant :
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. Ajoutez une classe de comportement qui analyse votre propre modèle (ceci est similaire au ParseTemplateBehavior.class.php par défaut de thinkphp3.0)
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. Ajoutez votre propre classe TemplateEy .class.php pour analyser le contenu du modèle (il est placé dans le répertoire thinkphpExtendDriverTemplate)
Modifiez simplement la classe ThinkTemplate.class.php par défaut du système et modifiez le code de la méthode fetch comme suit :
// 加载模板 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. Appeler si modèle dans la base de données Le contenu n'existe pas, alors on lit quand même le contenu dans la base de données :
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"); }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

1. Ouvrez l'application Douyin, recherchez la vidéo que vous souhaitez télécharger et enregistrer, puis cliquez sur le bouton [Partager] dans le coin inférieur droit. 2. Dans la fenêtre contextuelle qui apparaît, faites glisser les boutons de fonction de la deuxième rangée vers la droite, recherchez et cliquez sur [Enregistrer localement]. 3. Une nouvelle fenêtre contextuelle apparaîtra à ce moment-là et l'utilisateur pourra voir la progression du téléchargement de la vidéo et attendre la fin du téléchargement. 4. Une fois le téléchargement terminé, le message [Enregistré, veuillez accéder à l'album pour le visualiser] s'affichera, afin que la vidéo qui vient d'être téléchargée soit enregistrée avec succès dans l'album du téléphone mobile de l'utilisateur.

Le langage Go est un langage de programmation efficace, concis et facile à apprendre. Il est privilégié par les développeurs en raison de ses avantages en programmation simultanée et en programmation réseau. Dans le développement réel, les opérations de base de données font partie intégrante. Cet article explique comment utiliser le langage Go pour implémenter les opérations d'ajout, de suppression, de modification et de requête de base de données. Dans le langage Go, nous utilisons généralement des bibliothèques tierces pour faire fonctionner les bases de données, telles que les packages SQL couramment utilisés, gorm, etc. Ici, nous prenons le package SQL comme exemple pour présenter comment implémenter les opérations d'ajout, de suppression, de modification et de requête de la base de données. Supposons que nous utilisons une base de données MySQL.

Les dernières versions d'Apple des systèmes iOS18, iPadOS18 et macOS Sequoia ont ajouté une fonctionnalité importante à l'application Photos, conçue pour aider les utilisateurs à récupérer facilement des photos et des vidéos perdues ou endommagées pour diverses raisons. La nouvelle fonctionnalité introduit un album appelé "Récupéré" dans la section Outils de l'application Photos qui apparaîtra automatiquement lorsqu'un utilisateur a des photos ou des vidéos sur son appareil qui ne font pas partie de sa photothèque. L'émergence de l'album « Récupéré » offre une solution aux photos et vidéos perdues en raison d'une corruption de la base de données, d'une application d'appareil photo qui n'enregistre pas correctement dans la photothèque ou d'une application tierce gérant la photothèque. Les utilisateurs n'ont besoin que de quelques étapes simples

Le mappage polymorphe Hibernate peut mapper les classes héritées à la base de données et fournit les types de mappage suivants : join-subclass : crée une table séparée pour la sous-classe, incluant toutes les colonnes de la classe parent. table par classe : créez une table distincte pour les sous-classes, contenant uniquement des colonnes spécifiques aux sous-classes. union-subclass : similaire à join-subclass, mais la table de classe parent réunit toutes les colonnes de la sous-classe.

Comment utiliser MySQLi pour établir une connexion à une base de données en PHP : Inclure l'extension MySQLi (require_once) Créer une fonction de connexion (functionconnect_to_db) Appeler la fonction de connexion ($conn=connect_to_db()) Exécuter une requête ($result=$conn->query()) Fermer connexion ( $conn->close())

HTML ne peut pas lire directement la base de données, mais cela peut être réalisé via JavaScript et AJAX. Les étapes comprennent l'établissement d'une connexion à la base de données, l'envoi d'une requête, le traitement de la réponse et la mise à jour de la page. Cet article fournit un exemple pratique d'utilisation de JavaScript, AJAX et PHP pour lire les données d'une base de données MySQL, montrant comment afficher dynamiquement les résultats d'une requête dans une page HTML. Cet exemple utilise XMLHttpRequest pour établir une connexion à la base de données, envoyer une requête et traiter la réponse, remplissant ainsi les données dans les éléments de la page et réalisant la fonction de lecture HTML de la base de données.

Pour gérer les erreurs de connexion à la base de données en PHP, vous pouvez utiliser les étapes suivantes : Utilisez mysqli_connect_errno() pour obtenir le code d'erreur. Utilisez mysqli_connect_error() pour obtenir le message d'erreur. En capturant et en enregistrant ces messages d'erreur, les problèmes de connexion à la base de données peuvent être facilement identifiés et résolus, garantissant ainsi le bon fonctionnement de votre application.

L'utilisation de la fonction de rappel de base de données dans Golang peut permettre : d'exécuter du code personnalisé une fois l'opération de base de données spécifiée terminée. Ajoutez un comportement personnalisé via des fonctions distinctes sans écrire de code supplémentaire. Des fonctions de rappel sont disponibles pour les opérations d'insertion, de mise à jour, de suppression et de requête. Vous devez utiliser la fonction sql.Exec, sql.QueryRow ou sql.Query pour utiliser la fonction de rappel.
