月度归档 2015年7月29日

通过清心醉

WordPress-SEO优化

今天给Wordpress修改了SEO的配置,顺便大改了文章等内容,让SEO更友好.

首先得自行去官网下载SEO插件,作者使用的是Yoast SEO.

但该插件的缺点就是,没有keywords.为此提供一个方法:

使用标签+文章名称做关键字

修改header.php文件:

$keywords = “”;  //定义关键字
$tags = wp_get_post_tags($post->ID); //根据文章提取标签
foreach ($tags as $tag )  //循环提取标签
{
$keywords = $keywords . $tag->name . “|”; //关键字为tag标签
}
$word=get_the_title($post->ID);  //提取文章名称
$keywords=$keywords.$word;  //连接成关键字 比如当前页面,会形成:

清心醉|清心程序员|Wordpress-SEO优化

只不过部分标签没写而已

然后找个header添加:

<meta name=”keywords” content=”<?php echo $keywords; ?>” />

通过清心醉

opencart模板开发之前台调用最新和畅销产品

我们知道,主页在common/home里,对应的控制器/模型/视图都一样

所以我们在赋值$data给视图前,获取产品的信息

我们先创建一个控制器

命名为:homeproduct

然后在home控制器里这么写:

$data[‘home_product’]=$this->load->controller(‘common/homeproduct’);

很明显,该值是获取common/homeproduct控制器的返回值. //注:返回值返回的是一个tpl视图

class ControllerCommonHomeproduct extends Controller
{
function index()
{
$this->load->model(‘catalog/product’); //引用产品的模型
$data[‘new’]=$this->model_catalog_product->getLatestProducts(4); //调用最新的产品4个
$data[‘popularity’]=$this->model_catalog_product->getPopularProducts(4); //调用最受欢迎的产品4个
return $this->load->view(‘default/template/common/homeproduct.tpl’, $data); //返回视图的方法 //赋值给视图并且是以返回的形式,这样在home里就获取到了返回的视图原型,这里需要特别强调的返回到home里是$data[‘home_product‘];所以要测试的话可以在home.tpl里写var_dump($home_product);

}
}

//如果要显示视图使用
$this->response->setOutput($this->load->view(‘default/template/common/homeproduct.tpl’, $data));

控制器写好了,因为模型是使用catalog/product.所以我们直接写个homeproduct.tpl视图

接着就是在视图里直接拿出数据了!

通过清心醉

opencart安装vqmod及插件

一开始以为和MAGENTO一样把插件上传就可以后台查看了

结果发现不行,原因是因为OPENCART没有使用配置文件的关系(MAGENTO只要查看到有配置文件就会追溯源代码,直到发现插件的存在)

所以我们先要安装VQMOD,该插件是为了防止修改到系统的核心的

opencart-vqmod

已经使用的是2.5版本,里面包含有zip/tag.gz格式

安装方式:https://github.com/vqmod/vqmod/wiki/Installing-vQmod-on-OpenCart

作者汉化下大概的安装步骤,以UNIX系统为前提:

上传vqmod文件夹到网站的根目录

然后chmod -R 777 vqmod

设置777的权限,好象755也可以,当然由于测试阶段,作者懒的改所以直接使用777

然后访问: http://127.0.0.1/vqmod/install

如果安装成功会显示:VQMOD HAS BEEN INSTALLED ON YOUR SYSTEM!

再次访问,显示:VQMOD ALREADY INSTALLED!

修改index.php文件

搜索DIR_SYSTEM . ‘startup.php’

看使用的是:

require_once(DIR_SYSTEM . ‘startup.php’);

还是:

require_once(VQMod::modCheck(DIR_SYSTEM . ‘startup.php’));

如果是后者

加入以下内容:

require_once(VQMod::modCheck(DIR_SYSTEM . ‘library/customer.php’));
require_once(VQMod::modCheck(DIR_SYSTEM . ‘library/currency.php’));
require_once(VQMod::modCheck(DIR_SYSTEM . ‘library/tax.php’));
require_once(VQMod::modCheck(DIR_SYSTEM . ‘library/weight.php’));
require_once(VQMod::modCheck(DIR_SYSTEM . ‘library/length.php’));
require_once(VQMod::modCheck(DIR_SYSTEM . ‘library/cart.php’));
require_once(VQMod::modCheck(DIR_SYSTEM . ‘library/affiliate.php’));

 

接着是admin/index.php

方法和上面的插不多,只是要加入的代码不同:

加入:

require_once(VQMod::modCheck(DIR_SYSTEM . ‘library/currency.php’));

require_once(VQMod::modCheck(DIR_SYSTEM . ‘library/user.php’));
require_once(VQMod::modCheck(DIR_SYSTEM . ‘library/weight.php’));
require_once(VQMod::modCheck(DIR_SYSTEM . ‘library/length.php’));

 

最后别忘记了在后台更新下管理员群组的权限哦

 

 

通过清心醉

DIV-CSS布局详解之布局

属性名:cleart

属性值:none(无)/left(左)/right(右)/both(两侧)

属性说明:设置对象左右不允许有浮动对象,该属性需要与float属性配合使用

#########################

属性名:float

属性值:none/left/right

属性说明:设置对象是否浮动及浮动方向,当被定义为浮动时,对象将被视坐块状显示,即display属性等于block时,此时浮动对象的display属性将被忽略

#########################

属性名:clip

属性值:auto/rect(number*4)(#裁剪区域)

设置对象的可视区域,可视区域外的部分是透明的。取值为rect(4个number)表示依据上一右一下一左的顺序提供自对象左上角为(0,0)坐标计算四个偏移数值,其中任一数值都可以auto替换,即此边不剪切,该属性仅在定位(position)属性值为absolute时才可使用

#########################

属性名:overflow

属性值:visible(可见)/auto/hidden/scroll(显示滚动条)

属性说明:设置对象内容超过指定高和宽时如何显示内容,所有元素默认为visible,除textarea元素和body元素的默认值是auto外,设置textarea元素的overflow属性值为hidden,将隐藏其滚动条

#########################

属性名:overflow-x

属性值:visible/auto/hidden/scroll

属性说明:设置对象内容超过指定高时如何显示

#########################

属性名:overflow-y

属性值:visible/auto/hidden/scroll

属性说明:设置对象内容超过指定宽时如何显示

#########################

属性名:display

属性值:block(块状)/none/inline(内联)/list-item(列表)

属性说明:设置对象显示类型/方式

#########################

属性名:visibility

属性值:lnherit(继承)/visible/hidden

属性说明:设置是否显示对象

#########################

通过清心醉

DIV-CSS布局详解之尺寸

尺寸的属性值都是auto(自动)/length(高度),所以只写属性名和说明

属性名:height

属性说明:定义对象的高度

####################################

属性名:width

属性说明:定义对象的宽度

####################################

属性名:min-height

属性说明:定义对象的最小高度

####################################

属性名:max-height

属性说明:定义对象的最大高度

####################################

属性名:min-width

属性说明:定义对象的最大宽度

####################################

属性名:max-width

属性说明:定义对象的最大宽度

通过清心醉

DIV-CSS布局详解之定位

属性名:position

属性值:static(默认)/absolute(绝对)/fixed(固定)/relative(相对)

属性说明:设置对象的定位方式,取值为absolute表示对象脱离文档流动,根据游览器、具有定位功能的父元素或特殊父元素的左上角的坐标原点来定位;取值为fixed表示不受任何网页影响,根据游览器左上角进行定位,定位之后在窗口中的显示位置就被固定,不随滚动条而滚动;取值为relative表示以文档流动中的当前对象自身位置为坐标原点进行定位。

 

#########################################

属性名:z-index

属性值:auto(自动)/number(数字)

属性说明:设置对象层叠顺序,取值越大,显示越靠上,此属性仅作用于position属性值设置为relative或absolute的元素有效

#########################################

属性名:top

属性值:auto(自动)/length(高度)

属性说明:设置对象与其最近一个具有定位属性的上级元素顶边框的距离,该属性仅在定位(position)属性被设置时可用,否则忽略

#########################################

属性名:right

属性值:auto(自动)/length(高度)

属性说明:设置对象与其最近一个具有定位属性的上级元素右边框的距离,该属性仅在定位(position)属性被设置时可用,否则忽略

#########################################

属性名:bottom

属性值:auto(自动)/length(高度)

属性说明:设置对象与其最近一个具有定位属性的上级元素底边框的距离,该属性仅在定位(position)属性被设置时可用,否则忽略

#########################################

属性名:left

属性值:auto(自动)/length(高度)

属性说明:设置对象与其最近一个具有定位属性的上级元素左边框的距离,该属性仅在定位(position)属性被设置时可用,否则忽略

 

通过清心醉

DIV+CSS属性类型

1:字体

定义字体属性,包括字体基本属性、行距、字距及文字修饰、大小写等。针对美化文本文字时使用;

2:文本

缩进、对齐、换行等段落形式。文本排版使用;

3:背景

如背景色、背景图的显示及位置。主要修饰某DIV层的使用,当然也包括body;

4:定位

布局网页,包括定位方式、定位坐标。针对DIV+CSS的网页UI开发是必须使用的一项;

5:尺寸

设置对象的大小,包括height、width及最大、最小值。针对自适应UI的开发,必须掌握尺寸的使用;

6:布局

如果定位好了网页的布局,那么布局里肯定就会包含有浮动、裁切、显示方式、是否可见、伸缩、滚动等基础特效,涉及UI开发的核心技巧比较多,因为是网站实际开发UI的原生态;

7:外边距

设置对象的外边距空隙,包含全部方向的外边距设置。如布局中一行两列,边距的使用,属于布局中核心的一种;

8:轮廓

类似阴影的样式属性,对游览器支付不太友好,同时对于实际UI开发中使用比较少;

9:边框

设置对象的边框,包括样式、颜色、宽度,属于布局的核心之一;

10:内容

包括插入内容、元素、自动化等,比较少使用;

11:内边距

类似于外边距,不同的是针对内部,也是布局的核心之一;

12:列表

(比如前端显示图片)包含样式列表、图像列表、显示位置等,布局核心之重;

13:表格

针对DIV+CSS使用的比较少,如果不需要给予搜索优化或者内容不多的才使用;

14:滚动条

比如滚动广告文字,修饰使用,进行UI开发不怎么需要;

15:打印

默认一般不设置;

16:声音

默认一般不设置;

17:其他

比如鼠标样式、行为、效果、对象缩小放大(类似幻灯)等特效,UI特效中配合JQ偶尔使用。

 

以上为作者根据DIV+CSS的学习而缩小学习开发的重点,具体的可以参考书籍上的说明

DIV+CSS属性类型

DIV+CSS属性类型

通过清心醉

OPENCART之引用模板视图做返回值进行输出

比如仪表盘里,我要修改$data[‘order’] = $this->load->controller(‘dashboard/order’);获取订单控制器输出的视图为获取询盘

$data[‘contact’]=$this->load->controller(‘contact/contacthome’); //获取询盘的返回值(即TPL模板输出的内容进行整合)

修改下为自己开发的控制器,因为这是=,那么控制器里就必须有返回值;

class ControllerContactContacthome extends Controller
{
//首页调用询盘页
public function index()
{
$this->load->language(‘dashboard/order’);
$data[‘heading_title’] = $this->language->get(‘heading_title’);
$data[‘text_view’] = $this->language->get(‘text_view’);
$data[‘token’] = $this->session->data[‘token’];
$this->load->model(‘contact/contact’);
$data[‘contact_number’]=count($this->model_contact_contact->count_data());
$data[‘url’]=$this->url->link(‘contact/contact’,’token=’.$this->session->data[‘token’],’SSL’ );
return $this->load->view(‘common/contact_home.tpl’, $data);
}
}

前面的部分是语言包,暂时还保留着使用,但是最后有这么一句

return $this->load->view(‘common/contact_home.tpl’, $data);

这是引用了一个视图模板,把视图模板的信息输出来

<div class=”tile”>
<div class=”tile-heading”>最新的询盘</div>
<div class=”tile-body”><i class=”fa fa-shopping-cart”></i>
<h2 class=”pull-right”><?php echo $contact_number; ?></h2>
</div>
<div class=”tile-footer”><a href=”<?php echo $url; ?>”><?php echo $text_view; ?></a></div>
</div>

重新回到仪表盘的控制器里的

$data[‘contact’]=$this->load->controller(‘contact/contacthome’);

这里其实就是一个完整的视图了.并且赋值给数组的contact元素

因为仪表盘默认调用的是common/dashboard.tpl视图里,在该视图里找到对应的DIV层直接<?php echo $contact; ?>

询盘的视图就出来了!

 

通过清心醉

opencart数据搬迁

由于OPENCART使用的是常量的方式来定义目录

而定义的目录又为绝对目录,为此修改起来会比较麻烦

可以新配置个常量来定义绝对目录的定位进行赋值引用

至于换域名等操作,直接修改两个config.php文件即可!

通过清心醉

最新版的mysql-utf8配置参数

该方法适用与Windows及Linux平台

[client]
default-character-set=utf8
[mysqld]
init_connect=’SET NAMES utf8′
character_set_server=utf8
character_set_client=utf8
[mysql]
default-character-set=utf8

在此建议还在使用GBK的赶紧换了吧,全世界已经开始走UTF-8的世界了!

通过清心醉

opencart二次开发之MVC的结构及模板使用规则3

本文节主要讲述OPENCART的数据库中的提取数这一项

今天郁闷的就是提取数据了,正常的PDO的方式都是使用$data->fetchAll()来获取,OC已经修改过了它的核心,所以要提取数据就需要一定的办法。

看了会OC的MPDO/DB文件,DB文件是调用链接数据库的各种操作。

因为作者习惯于PDO的方式,所以查看了下

public function __construct($hostname, $username, $password, $database, $port = ‘3306’) {
try {
$this->pdo = new \PDO(“mysql:host=” . $hostname . “;port=” . $port . “;dbname=” . $database, $username, $password, array(\PDO::ATTR_PERSISTENT => true));
} catch(\PDOException $e) {
trigger_error(‘Error: Could not make a database link ( ‘ . $e->getMessage() . ‘). Error Code : ‘ . $e->getCode() . ‘ <br />’);
exit();
}

$this->pdo->exec(“SET NAMES ‘utf8′”);
$this->pdo->exec(“SET CHARACTER SET utf8”);
$this->pdo->exec(“SET CHARACTER_SET_CONNECTION=utf8”);
$this->pdo->exec(“SET SQL_MODE = ””);

}

OC利用构造的方式创建连接并且设置编码(不过他这设置的编码作者在开发的时候,发现写入的中文是乱码,还得继续研究下)

我们来看看query查询的方法:

public function query($sql, $params = array()) {
$this->statement = $this->pdo->prepare($sql); //执行预处理
$result = false;

try {
if ($this->statement && $this->statement->execute($params)) {
$data = array();
//定义数组
while ($row = $this->statement->fetch(\PDO::FETCH_ASSOC)) {
//循环提取数组到
$data[] = $row;
}

$result = new \stdClass();
$result->row = (isset($data[0]) ? $data[0] : array());
$result->rows = $data;
$result->num_rows = $this->statement->rowCount();
#var_dump($result);die();
}
} catch (\PDOException $e) {
trigger_error(‘Error: ‘ . $e->getMessage() . ‘ Error Code : ‘ . $e->getCode() . ‘ <br />’ . $sql);
exit();
}

if ($result) {
return $result;
} else {
$result = new \stdClass();
$result->row = array();
$result->rows = array();
$result->num_rows = 0;
return $result;
}
}

OC已经重新修改了预处理的方式

今天最郁闷的就是无法提取数据和中文乱码

先来说第一个的解决方法:

假设我们有个模型需要提取数据库里的全部数据,或者指定行数的数据:

<?php
class ModelContactContact extends Model
{
public function datetable() //获取数据库中的信息
{
$sql=”SELECT *FROM contact”;
$data=$this->db->query($sql); //提取全部数据
return $data->rows; //返回的跟是必须是获取所有的 如果是单行可以使用$data->row;
}
}

至于写入中文乱码(因为和环境无关,因为其他的写入是正常的),明天测试后公布!

 

通过清心醉

opencart二次开发之MVC的结构及模板使用规则2

前文作者说了OPENCART的大概思路,今天入手修改了下OPENCART的核心

由于商业机密,只提供部分的代码并加以解释

<?php
date_default_timezone_set(‘Asia/Shanghai’); //设置时区
class ControllerContactContact extends Controller
{    public function index()
{
if(!isset($this->request->get[‘id’])||empty($this->request->get[‘id’]))
{
return false;
}
if (!is_numeric($this->request->get[‘id’]))
{
return false;
}
$id=(int)$this->request->get[‘id’]; //提取产品ID
#$this->load->model(‘contact/contact’); //引用模型文件
$this->load->model(‘catalog/product’); //引用系统模型文件
$this->load->language(‘contact/contact’);//引用语言包文件
$data=$this->model_catalog_product->getProduct($id);
$data[‘ckz1’]=$this->language->get(‘ckz_contact1’);
$data[‘ckz2’]=$this->language->get(‘ckz_contact2’);
$data[‘ckz3’]=$this->language->get(‘ckz_contact3’);
$data[‘ckz4’]=$this->language->get(‘ckz_contact4’);
$data[‘ckz5’]=$this->language->get(‘ckz_contact5’);
$data[‘ckz6’]=$this->language->get(‘ckz_contact6’);
$data[‘ckz7’]=$this->language->get(‘ckz_contact7’);
$data[‘ckz8’]=$this->language->get(‘ckz_contact8’);
$data[‘ckz9’]=$this->language->get(‘ckz_contact9’);
//由于该方法里已经存在了提取产品的信息,所以直接使用该方法就可以了!
//注,必须以数组的形式返回
$this->response->setOutput($this->load->view(‘default/template/contact/contact.tpl’, $data));
//给视图赋值
}

}

控制器的命名方式和ZEND的差不多,都是以目录来作为结构

当然,比如调用其他的控制器或者其他的模型,都是可以的

但使用前必须$this->load->model()来引用

然后直接通过$this->model_文件夹_文件名(文件名就是类名)->index(); //调用的方法