最近上班了。没去写Magento二次开发的实例了。
接收了Ecshop的开发,首先就是mobile端的开发。
默认的ECTouch使用的是首页显示所有的产品,没有分类处理、没有产品数量处理,一页循环加载所有产品。
如果有看作者开始写的首次接触Ecshop,我想你能猜到个大概的流程了。
不过这个就有点不一样哦,ECTouch运用了自己的MVC模式,如果没有任何的MVC基础,是难以理解的哦!
正文开始:
由于需要的是修改正文,我们看看URL:
127.0.0.1/mobile/index.php?m=default&c=index&a=index
有3个参数admin/default/install
在mobile/include/apps里可以看到,里面就有了MVC的目录架构,至于admin的话就有V层,因为要编辑嘛
第一个应该是主题的名称/themes/default/
c=index&a=index 控制器和方法了
控制器文件:mobile/include/apps/controller/IndexController.class.php
class IndexController extends CommonController {
public function index()
比如作者要修改index首页的信息,显示一级分类3的最新8个产品:
$this->assign(‘fenlei3’,model(‘Index’)->get_fenlei_id_num(3,8)); #加入这句在
$this->display(‘index.dwt’); #之前
看,这有个model,系统会自动实例化,model(‘index’),这里面的index参数,就是我们要实例化调用的model模型数据
模型文件:mobile/include/apps/model/IndexModel.class.php
我们在来看我们这的第二个参数,第二个参数是一个方法的返回值:
get_fenlei_id_num(3,8) ,所以IndexModel.class.php文件里加入该方法:
*
* 调用指定分类产品的方法 http://www.qingxinzui.com/
*
*/
function get_fenlei_id_num($cat_id = ”, $num = ”) #提取指定分类的产品 ,需要分类id和提取的数量(默认提取最前面的)
{
/*SQL语句开始*/
$sql =
‘Select g.goods_id, g.cat_id,c.parent_id, g.goods_name, g.goods_name_style,
g.market_price, g.shop_price AS org_price, g.promote_price, ‘ .
“IFNULL(mp.user_price, g.shop_price * ‘$_SESSION[discount]’) AS shop_price, ” .
“promote_start_date, promote_end_date, g.goods_brief, g.goods_thumb, goods_img, ” .
“g.is_best, g.is_new, g.is_hot, g.is_promote ” .
‘FROM ‘ . ‘ecs_goods’ . ‘ AS g ‘ .
‘LEFT JOIN ‘ . ‘ecs_category’ . ‘ AS c ON c.cat_id = g.cat_id ‘ .
“LEFT JOIN ” . ‘ecs_member_price’. ” AS mp ” .
“ON mp.goods_id = g.goods_id AND mp.user_rank = ‘$_SESSION[user_rank]’ ” .
“Where g.is_on_sale = 1 AND g.is_alone_sale = 1 AND g.is_delete = 0 ” .
$sql .= ” AND (c.parent_id =” . $cat_id . ” OR g.cat_id = ” . $cat_id . ” OR g.cat_id ” . db_create_in ( array_unique ( array_merge ( array (
$cat_id
), array_keys ( cat_list ( $cat_id, 0, false ) ) ) ) ) . “)”;
$sql .= ” LIMIT $num”;
/*SQL语句结尾*/
/*
* 由于该手机模板没有使用电脑端的部分函数,所以上面的表名是自己添加的如果表前缀有问题则要修改下
*
* */
$res = $this->query($sql); #提取指定分类的所有数据所有SQL产品数据
$goods = array (); #定义数组接收提取所有的到数组
$o=1; #用于模板后面的判断
foreach ( $res as $idx => $row )
{
$goods [$idx] [‘id’] = $row [‘article_id’];
$goods [$idx] [‘id’] = $row [‘goods_id’];
$goods [$idx] [‘name’] = $row [‘goods_name’];
$goods [$idx] [‘brief’] = $row [‘goods_brief’];
$goods [$idx] [‘brand_name’] = $row [‘brand_name’];
$goods [$idx] [‘goods_style_name’] = add_style ( $row [‘goods_name’], $row [‘goods_name_style’] );
$goods [$idx][‘short_name’] = C(‘goods_name_length’) > 0 ? sub_str($row[‘goods_name’], C(‘goods_name_length’)) : $row[‘goods_name’];
$goods [$idx] [‘short_style_name’] = add_style ( $goods [$idx] [‘short_name’] );
$goods [$idx] [‘market_price’] = price_format ( $row [‘market_price’] );
$goods [$idx] [‘shop_price’] = price_format ( $row [‘shop_price’] );
$goods [$idx][‘thumb’] = get_image_path($row[‘goods_id’], $row[‘goods_thumb’], true);
$goods [$idx][‘goods_img’] = get_image_path($row[‘goods_id’], $row[‘goods_img’]);
$goods [$idx] [‘url’] = build_uri(‘goods/index’, array(‘id’ => $row[‘goods_id’]));
if(!($o&1)) #判断是否为偶数
{
$goods[$idx][‘_number’]=2; #如果是偶数 每一行的都为2
}
else
{
$goods[$idx][‘_number’]=1; #否则为1
}
$o++;
}
return $goods; #返回数组
}
作者在这里加了_number,后面有用,继续吧
这里会以数组的方式把提取的8个最新的产品数据返回给控制器。
$this->assign(‘fenlei3’,…) 这里因为有了命名了。
好了,我们修改index.dwt 把系统默认显示所有产品的
<!– #BeginLibraryItem “/library/recommend_hot.lbi” –><!– #EndLibraryItem –>
这文件做修改吧
<table width=’100%’ align=’center’ border=”0″ cellspacing=”0″ cellpadding=”0″>
<!–{foreach from=$fenlei3 item=goods}–>
<!–{if $goods._number eq 1}–>
<tr>
<td width=’50%’ align=’center’>
<p><b><a href=”{$goods.url}” title=”{$goods.name|escape:html}” target=”_blank”>{$goods.name}</a></b></p>
<p><a href=”{$goods.url}” target=”_blank”>
<p><img src=”{$goods.goods_img}” alt=”{$goods.name|escape:html}” width=”150px” height=”150px”/></a></p>
<p><div style=”text-indent: 5px;”>市场价<span>{$goods.market_price}</span></p>
<p><div style=”text-indent: 7px;”><span>售 价{$goods.shop_price}</span></div></p>
</td>
<!–{else $goods._number eq 2}–>
<td width=’50%’ align=’center’>
<p><b><a href=”{$goods.url}” title=”{$goods.name|escape:html}” target=”_blank”>{$goods.name}</a></b></p>
<p><a href=”{$goods.url}” target=”_blank”>
<p><img src=”{$goods.goods_img}” alt=”{$goods.name|escape:html}” width=”150px” height=”150px”/></a></p>
<p><div style=”text-indent: 5px;”>市场价<span>{$goods.market_price}</span></p>
<p><div style=”text-indent: 7px;”><span>售 价{$goods.shop_price}</span></div></p>
</td>
</tr>
<tr><td colspan=”2″ height=”10px”></td></tr>
<!–{/if}–>
<!–{/foreach}–>
</table>
前面提到了_number,这是一个判断奇偶的,因为模板里不能很好的用PHP,除非修改核心的过滤代码,可是修改过后就不安全了。
这里作者是要输出table,两列,因为_number是1和2 所以只做两个判断,如果1输出第一个并且带<tr>开始,如果2输出第二个并且带<tr>结束
这里不用怕会出错,因为模型model的方法里,$o是自增长的,然后整除2来判断。
视图效果可能不太友好,毕竟作者主要还是针对PHP后端及服务器。
关于作者