数据产品叶凌锋-数据产品经理成长笔记 - PHP
经过两个晚上的研究，终于能够对DouPHP复制一个模块有一些了解，模棱两可地实现了模块的复制。在此，做一些记录，以便日后使用。一、主要步骤1、复制一个模块2、将模块的关键词改成要复制的关键词（每个相关的文件都要修改，最主要的是后台admin的文件）3、修改数据库字段（将sql文件放到编辑器中，替换关键词）4、导入数据表5、上传模块文件到根目录6、写入模块信息（data/system.php）二、模块结构在复制模块之前，最好先对模块的结构有所了解，以方便后续修改相关文件。模块的类型有两种：column_module（通俗点说就是带有分类的模块，常用的产品，文章等），single_module（留言板，会员，订单都是这个模块）column_module的目录结构，以article模块（20181217版本）为例，按照以下规范进行开发即可！ single_module的目录结构，以guestbook模块为例，按照以下规范进行开发即可！ 最新的版本，结构有一定的出入，可下载最新的模块进行了解。三、复制DouPHP模块按照上面说到的步骤操作，下面以Download下载模块为例，复制模块改成Ebook电子书下载模块。主要介绍第3步和第6步。第1步，复制download模块第2步，从上到下，一个个文件查询download这个关键词，并替换成ebook的新关键词（最主要的是后台admin的文件）第3步，修改数据库字段，将SQL文件 ebook/data/backup/ebook.sql 拖到编辑器，查询download这个关键词，并替换成ebook的新关键词DROP TABLE IF EXISTS `dou_ebook`; CREATE TABLE `dou_ebook` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `cat_id` smallint(5) NOT NULL DEFAULT '0', `title` varchar(150) NOT NULL DEFAULT '', `defined` text NOT NULL, `content` longtext NOT NULL, `image` varchar(255) NOT NULL DEFAULT '', `ebook_link` varchar(255) NOT NULL DEFAULT '', `size` varchar(50) NOT NULL DEFAULT '', `click` smallint(6) unsigned NOT NULL DEFAULT '0', `keywords` varchar(255) NOT NULL DEFAULT '', `description` varchar(255) NOT NULL DEFAULT '', `add_time` int(10) unsigned NOT NULL DEFAULT '0', `sort` tinyint(1) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS `dou_ebook_category`; CREATE TABLE `dou_ebook_category` ( `cat_id` smallint(5) NOT NULL AUTO_INCREMENT, `unique_id` varchar(30) NOT NULL DEFAULT '', `cat_name` varchar(255) NOT NULL DEFAULT '', `keywords` varchar(255) NOT NULL DEFAULT '', `description` varchar(255) NOT NULL DEFAULT '', `parent_id` smallint(5) NOT NULL DEFAULT '0', `sort` tinyint(1) unsigned NOT NULL DEFAULT '50', PRIMARY KEY (`cat_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;第4步，导入数据库。方法1：通过phpmyadmin或者Navicat等数据库管理工具导入；方法2：通过后台的数据备份中的恢复备份导入（点击“数据备份”->“恢复备份”导入模块数据）第5步，上传模块文件到根目录。第6步，写入模块信息（data/system.php）。DouPHP v1.5 Release 20181217版本之前的版本，打开站点目录下“data/system.dou”并写入模块信息。DouPHP v1.5 Release 20181217版本，安全升级之后，将system.dou改为system.php防止被查看到安装过什么模块，并将系统安装标识改为install.lock。因此，打开站点目录“data/system.php”文件，并写入模块信息。<?php ' column_module:product,article,download,ebook single_module:link,fragment ' ?>column_module：同时具有分类和列表的模块，只需要填写模块名称即可在后台同事加上分类和列表；single_module：只有列表，没有分类的模块，填写模块名称，只显示模块列表。至此，模块的复制就完成了。
文/风笛主要用于产品展示的企业官网，往往需要产品图集的展示，也就是类似一些电商网站中的商品展示。然而，简洁的DouPHP并没有该功能，如果需要的话，还是得自己动手去开发。下面在前人的基础上，简单说说DouPHP产品图集展示的开发，适用于像我这样的DouPHP小白。先说说基本思路：①在数据库中增加图集的字段→②在后台的Html文件中增加上传图片的组件→③在后台对应的PHP文件中，将上传的图片数据储存到数据库→④在后台对应的PHP文件中，加入编辑文章时图集处理的代码→⑤在前台的对应PHP文件中加入调用数据的代码→⑥在前端页面对应的位置使用smarty的标签（语法）调用图集数据。一、增加gallery字段首先是在数据库的产品表（dou_product）中增加字段“gallery”，该字段的设置和image字段差不多。二、加入图集上传组件建好字段之后，到后台的后台产品页面（admin/templates/product.htm）中增加上传图片的组件。组件下载地址：https://gitee.com/cuihaifeng123456/douphp_multi_graph_component。1）解压组件文件夹，替换admin2）引入多图插件在引入多图插件的时候，注意路径，我的是当前路径的文件引用，所以直接是{include file="gallery_widget.htm"}3）在添加产品那里增加上传的代码： 图集上传 图集支持拖拽顺序调整，操作图集记得点击提交按钮保存操作。 {if $product.gallery} {foreach from=$product.gallery item=gallery} 删除图片 {/foreach} {/if} 我将代码加入到缩略图之后，效果如下：三、后台处理逻辑（admin/product.php）1、图集Ajax上传处理逻辑（我是在原来的“图片上传”下面增加的，第30行）//图集ajax上传处理逻辑 if ($rec == 'upload_gallery'){ if ($_FILES['img_url']) { $image_name = $img->upload_image('img_url'); $file_name = $images_dir . $image_name; echo $file_name; } else { echo ''; } }2、图集数据上传1）在“产品添加”里面增加图集上传的代码，将图集的数据上传到服务器。我在“产品添加-图片上传的下面增加，第150行”。 //图集上传 if (is_array($_POST['gallery'])) { $_POST['gallery'] = implode(',', $_POST['gallery']); }else{ $_POST['gallery']=""; }将数据插入数据库（我这里是第164行），增加 gallery 和 $_POST[gallery] ：$sql = "INSERT INTO " . $dou->table('product') . " (id, cat_id, name, price, defined, content, image ,gallery,keywords, description, add_time)" . " VALUES (NULL, '$_POST[cat_id]', '$_POST[name]', '$_POST[price]', '$_POST[defined]', '$_POST[content]', '$image','$_POST[gallery]', '$_POST[keywords]', '$_POST[description]', '$add_time')"; $dou->query($sql);2）在“产品编辑”里面增加图集上传的代码，为了在编辑产品的时候，也能够将新数据上传到数据库。 //图集上传 if (is_array($_POST['gallery'])) { $_POST['gallery'] = implode(',', $_POST['gallery']); }else{ $_POST['gallery']=""; }将更新后的数据插入到数据库（在原来的代码中增加gallery = '$_POST[gallery]' 我这里是第237行）：$sql = "update " . $dou->table('product') . " SET cat_id = '$_POST[cat_id]', name = '$_POST[name]', price = '$_POST[price]', defined = '$_POST[defined]' ,content = '$_POST[content]'" . $image . ", gallery = '$_POST[gallery]', keywords = '$_POST[keywords]', description = '$_POST[description]' WHERE id = '$_POST[id]'"; $dou->query($sql);到这里，数据的写入基本完成，我还遇到了一个问题，还不知道怎么解决，编辑的时候，没能读取到已有的数据。四、前端处理1、前端逻辑处理（在模板文件的product.php中增加，我再第38行增加）//产品图集调用$product['gallery'] = $product['gallery']?explode(',',$product['gallery']):false;2、前端模板调用（ product.dwt ） 最终效果如下：以上为一个伪技术的一些总结。
DouPHP如何在一个页面调用多个单页的内容
需求：在导航栏中点击“关于我们”（单页）中的下一级导航跳转到一个页面的对应位置。也就是需要在同一个页面调用多个单页的内容。首先想到的是通过锚链接，跳转到对应位置。但是如何才能够在同一个页面调用多个单页的内容呢？经过一番琢磨，我想到，既然这4个单页（4个块状）都是一样的样式，这就有点像文章或产品的列表的了。把这个页面当成一个列表页，通过foreach来循环，是否就能够达到想要的效果了？动手试了一下，果然可以。那如何做锚链接呢？锚链接需要通过标签设置name的值来完成，这时候，name的值应该就是动态的，如果直接调用单页的别名不就可以了？那么如何调用单页别名呢？在数据库中，我看到别名的字段是unique_id，于是我就尝试用{$page.unique_id}标签看是否可以调用，果不其然，确实能够动态调用到单页别名。代码如下： {$page.page_name} {$page.content} 那么剩下的就是怎么设置导航和跳转了。我用的是自定义导航的方式。经过测试，直接在“链接地址”里面增加“#单页别名”的方式并不能跳转，点击时的连接为“网站地址/#单页别名”。经过观察，我发现如果是单页的连接后面加上“#单页别名”的方式是可以跳转的，于是，我在后台添加自定义导航的时候，在“连接地址”填入“page.php?id=1#单页别名”，经过测试，基本上能够实现客户的需求。2018.06.21 00:25
DouPHP中文章和商品都没有添加链接的字段。有时候，文章或者链接需要添加一个链接，点击链接可以跳转到指定的地址。因此就需要添加一个链接的字段，下面以产品为例。只需要简单四步即可：1、先到数据库增加一个字段：link2、然后在后台 admin/templates/product.htm 添加一个输入表单： 购买链接 3、在产品的PHP文件 admin/product.php ，增加往数据库插入link值的代码，分别增加 link，$_POST[link] ：$sql = "INSERT INTO " . $dou->table('product') . " (id, cat_id, name, price, defined, content, image ,link,keywords, description, add_time)" . " VALUES (NULL, '$_POST[cat_id]', '$_POST[name]', '$_POST[price]', '$_POST[defined]', '$_POST[content]', '$image', '$_POST[link]','$_POST[keywords]', '$_POST[description]', '$add_time')";另外，为了重新编辑的时候可以更新数据，还需要找到以下内容，并增加 link='$_POST[link]' ：$sql = "update " . $dou->table('product') . " SET cat_id = '$_POST[cat_id]', name = '$_POST[name]', price = '$_POST[price]', defined = '$_POST[defined]' ,content = '$_POST[content]'" . $image . ",link='$_POST[link]', keywords = '$_POST[keywords]', description = '$_POST[description]' WHERE id = '$_POST[id]'";4、模板的调用，在模板文件中使用 {$product.link} 进行调用：文章以及其他的新字段增加同理。