在yii2 advanced中使用console

console 是命令行操作,对于frontend和backend是基于web的操作,最终的结果是一样的,都是传递数据给php,下面做一个例子:

1.安装frontend ,然后执行init,可以参看这里:

Yii2 – 安装高级模板 advanced project template

2.新建文件夹/console/controllers/script,然后新建文件TestController.php

3.编辑文件内容:

<?php

namespace console\controllers\script;
use Yii;
use yii\console\Controller;
use fec\helpers\CDate;
use fec\helpers\CConfig;
use appadmin\code\Website\models\WebsiteBaseInfo;
class TestController extends Controller
{
        public $_mongodbdb;


        public function actionGetbegindate(){
                echo '2015-05-20';

        }


        public function actionCreatecollindexer(){
                echo 'create Coll index success';

        }
        public function actionMy($param1,$param2=''){
                echo "param1:".$param1;
                echo "param2:".$param2;
        }


}

4.回到yii advanced的根目录执行:

[root@services datacenter_1000]# ./yii script/test/my  111  2222
param1:111param2:2222
[root@services datacenter_1000]#

解读:

script/test/my 这个和web一样,对应到上面创建的TestController的 actionMy()方法,111为传递的第一个参数,222给传递的第二个参数。

到这里,基本就一个helloworld就写好了,其他的和web没有什么两样。

5.在模块中使用console:(下面是一个在模块TA中使用console的例子)

'modules'=>[

'ta' => [
        'class' => 'appadmin\code\Ta\Module',
        'params'=> [
            'channel_type' => [
                'ppc'    => 'PPC类型',
            ],
        ],
    ],

]

在ta模块的Module中添加代码:

<?php
namespace appadmin\code\Ta;
use Yii;
class Module extends \fec\AdminModule
{
   
    public function init()
    {
    //echo 1;exit;
    # 以下代码必须指定
    # web controller
    if (Yii::$app instanceof \yii\web\Application) {
      $this->controllerNamespace 	= 	__NAMESPACE__ . '\\controllers';
    # console controller
    } elseif (Yii::$app instanceof \yii\console\Application) {
      $this->controllerNamespace 	= 	__NAMESPACE__ . '\\console';
    }
    
    parent::init();  
    
    }
}

通过上面判断是console的application还是web的application,取执行相应的controller

譬如我写的一个导入excel的脚本(在ta模块中):

<?php
namespace appadmin\code\Ta\console\import;
use Yii;
use appadmin\code\Ta\models\WebsiteChannel;
use yii\console\Controller;
use fec\helpers\CExcel;

class ExcelController extends Controller
{
  public function actionChannel(){
    $channel_excel_file = Yii::getAlias('@appta/var/import/channel.xlsx');
    $arr = CExcel::getExcelContent($channel_excel_file);
    //var_dump($arr);
    $i = 0;
    foreach($arr as $one){
      $i++;
      if($i == 1){
        continue;
      }
      $channel 		= trim($one['A']);
      $channel_child 	= trim($one['B']);
      $domain 		= trim($one['C']);
      
    
      $one = WebsiteChannel::find()->where([
        'channel' => $channel,
        'channel_child' => $channel_child,
        'domain' => $domain,
      ])->one();
      if(!$one['id']){
        $WebsiteChannel = new WebsiteChannel;
      }else{
        continue;
      }
      //SEO>SEM>KOL>SNS
      
      
      $WebsiteChannel->channel 		= $channel;
      $WebsiteChannel->channel_child  = $channel_child;
      $WebsiteChannel->domain 		= $domain;
      
      $WebsiteChannel->created_person = 'program_script';
      $WebsiteChannel->save();
      unset($WebsiteChannel);
      
    }
  }
  
  
  
  
}

我新建一个shell文件

appta/shell/import/channel.sh,内容为:

#!/bin/sh
DIR=$(cd `dirname $0`; pwd)
$DIR/../../../yii ta/import/excel/channel

然后执行这个shell就会执行上面的模块Ta里面的console部分。

 

Yii2 Mongodb ActiveRecord 添加索引

public static function create_index(){
  $indexs = [
    ['cid' => -1],
    ['market_person' => -1],
    ['created_at_date' => -1,'market_person' => -1],
  ];
  
  $options = ['background' => true, 'socketTimeoutMS' => 300000];
  foreach($indexs as $columns){
    self::getCollection()->createIndex($columns,$options);
  }
}

$indexs里面的每一个数组就是一个索引,

$options 里面的background代表后台执行的意思,因为添加索引,如果不加这个选项,如果表很大,要执行几十分钟,那么库会被加锁。

Yii2 Mongodb 生成递增id的方法

 

代码如下:

public static function increament($tablename){
    
    $coll = Yii::$app->mongodb->getCollection("ids");
    $update = array('?inc'=>array('id'=>1));
    $query = array('name'=>$tablename);
    $command = array(
      'findandmodify'=>'ids', 'update'=>$update,
      'query'=>$query, 'new'=>true, 'upsert'=>true
      );
    
    $result = $coll->mongoCollection->db->command($command);
    $id = $result['value']['id'];
    
    $current_id = (int)$id->value;
    Global $current_id;
    return $current_id;
  }

使用的时候直接 $dd = CID::increament(‘xxx’);即可获取到递增的id,

在一些场景,插入压力不是很多,但是很需要递增id的场景可以使用mongodb的这种递增id的方式,上面的写法是在yii2中使用的写法,如果不在yii2中使用mongodb的递增字段,则可以使用下面的代码:

function increament($m,$database_name,$collection_name){
  
  $ids = "ids";
  $db_name = "tracedb";
  $db = $m->selectDB($db_name);
  //$col = $m->selectDB($db_name)->$ids;
  
  $query = array('name'=>$collection_name);
  $update = array('$inc'=>array('id'=>1));
  $result = $db->command(
            array(
            "findandmodify" => $ids,
            "query" => $query,
            "update" => $update,
            'new'=>true,
            'upsert'=>true
            )
          );

  return $result['value']['id'];
  
  

}

 

Yii2 ElasticSearch aggregate (group) 的例子

直接上代码:

public function actionCountry(){
    $size = 5000;
    $name = 'country_code';
    $type = 'terms';
    $options = [
      'field' => 'country_code',
      'size'  => $size,
    ];
    
    $data = WholeCountryData::find()
        //->limit(5000)
        //->offset(0)
        ->asArray()  
        ->addAgg($name, $type, $options)
        ->createCommand()
        ->search();
    $agg_data = $data['aggregations'];
    $buckets  = $agg_data['country_code']['buckets'];
    //var_dump($agg_data);exit;
    $country_code_arr = \yii\helpers\BaseArrayHelper::getColumn($buckets,'key');
    var_dump($country_code_arr);
    
  }

我想要统计的是country_code 出现的次数,通过yii2的ElasticSearch扩展,上面的例子满足我的需要。

yii2 使用apidoc生成技术文档

yii2 的apidoc生成文档还是蛮好用的。
首先说一下这个玩意是干什么的,就是用来生成技术文档,效果可以查看:http://www.fecshop.com/doc/fecshop-guide/cn-1.0/guide-index.html#

1.需要安装yii2,参看文章:

Yii2 – 安装高级模板 advanced project template

2.然后安装doc 插件

2.1在安装的yii2根目录下面执行:

composer require --prefer-dist yiisoft/yii2-apidoc

2.2或者在composer.json中添加:

"yiisoft/yii2-apidoc": "~2.1.0"

然后执行:composer update

可能会报错,如果报错,将上面的改成:

yiisoft/yii2-apidoc": "~2.0.0"

安装成功就可以使用了

3.写md文件

可以看下面的第四部的路径,md文件存放的地址: /www/web/develop/fecshop/doc/fecshop-guide/cn-1.0,那么我们在这个路径下面新建2个比较重要的md文件

README.md 和 index.md

README.md 是左侧菜单部分

index.md 是guide-index.html页面,一般和README.md一样,用来做首页菜单索引,当然也可以添加自己想要的内容

生成的效果可以参看:

http://www.fecshop.com/doc/fecshop-guide/cn-1.0/guide-index.html#

展示一个demo:

README.md:

FecShop 文档说明
===============================

版权所有。

2016 (c) FecShop Software LLC。

目前进度
-----
*  [Fecshop 开发进度](fecshop-jindu.md)
*  [Fecshop 开发LOG](fecshop-jindu-log.md)

关于与安装
-----

*  [Fecshop 关于-架构特点](fecshop-about-fecshop.md)
*  [Fecshop 关于-功能介绍](fecshop-about-function.md)
*  [Fecshop 关于-系统结构](fecshop-about-system-contruct.md)
*  [Fecshop 安装与初始配置](fecshop-install.md)

Fecshop配置
-----------

*  [Fecshop 配置-配置结构](fecshop-init-config-construction.md)
*  [Fecshop 配置-Yii2配置](fecshop-init-config-yii2.md)
*  [Fecshop 配置-fecshop配置](fecshop-init-config-advanced.md)

index.md

FecShop 文档说明
===============================

版权所有。

2016 (c) FecShop Software LLC。


关于与安装
-----

*  [Fecshop 关于-架构特点](fecshop-about-fecshop.md)
*  [Fecshop 关于-功能介绍](fecshop-about-function.md)
*  [Fecshop 关于-系统结构](fecshop-about-system-contruct.md)
*  [Fecshop 安装-composer](fecshop-install.md)
*  [Fecshop 安装-初始配置](fecshop-init-config.md)



功能介绍
--------
*  [Fecshop 功能概叙](fecshop-feature-summary.md)
*  [Fecshop Url自定义](fecshop-feature-url-custom.md)
*  [Fecshop 多语言](fecshop-feature-mutil-languages.md)
*  [Fecshop 多store](fecshop-feature-mutil-stores.md)
*  [Fecshop 多货币](fecshop-feature-mutil-currency.md)
*  [Fecshop 多模板](fecshop-feature-mutil-themes.md)
*  [Fecshop 多入口](fecshop-feature-mutil-entrances.md)
*  [Fecshop 配置层](fecshop-feature-config.md)
*  [Fecshop 模块层](fecshop-feature-modules.md)
*  [Fecshop Block层](fecshop-feature-block.md)
*  [Fecshop 服务层](fecshop-feature-component-services.md)
*  [Fecshop 独立功能块](fecshop-feature-independent-block.md)
*  [Fecshop 权限管理](fecshop-feature-role.md)
*  [Fecshop 缓存管理](fecshop-feature-cache.md)
*  [Fecshop 脚本管理](fecshop-feature-script.md)
*  [Fecshop 后台日志](fecshop-feature-admin-log.md)
*  [Fecshop 重写功能](fecshop-feature-rewrite.md)
*  [Fecshop 升级](fecshop-feature-upgrade.md)

在README.md文件里面你可以看到,在括号里面的文件  ,譬如 fecshop-jindu.md

你需要在 /www/web/develop/fecshop/doc/fecshop-guide/cn-1.0下新建括号里面的md文件,然后在里面写内容就行了,譬如:

关于 Fecshop 的框架特点
=======================

Fecshop 全称为Fancy ECommerce Shop,是一款优秀的开源电商系统,遵循[OSL3.0协议](http://www.oschina.net/question/28_8527),
目的是为了方便yii2用户快速的
开发商城,Fecshop作为一款可以持续性发展的商城系统,
在框架层面有以下特性:

1. 由于商城系统的复杂性,原始的框架MVC结构,显的有点力不从心,Fecshop框架
加入了[Block层](fecshop-feature-block.md),
Controller层只负责调度, Model只负责数据库映射,中间的处理逻辑由block来完成,View层
负责显示,这样各司其职, 以免造成controller文件过于庞大。

2. 加入[独立功能块](fecshop-feature-independent-block.md),有点类似Yii2的Widget,目的是为了让一些侧栏公用块
可以通过配置的方式
添加,同时,还可以具有设置缓存的功能,譬如侧栏的产品浏览记录,
newsletter等独立显示块可能在很多
页面用到,通过独立功能块可以配置方便的载入。

 

 

4. 写个sh脚本用来生成文档,当然,您可以可以直接运行里面的代码,不过用sh运行比较方便:

#!/bin/sh

rm -rf /www/web/online-2/www.fecshop.com/appfront/web/doc/fecshop-guide/cn-1.0/*
/www/web/develop/fecshopdoc/vendor/bin/apidoc  guide   /www/web/develop/fecshop/doc/fecshop-guide/cn-1.0   /www/web/online-2/www.fecshop.com/appfront/web/doc/fecshop-guide/cn-1.0/  --interactive=0

md文件存放的地址为: /www/web/develop/fecshop/doc/fecshop-guide/cn-1.0

md生成的html的地址为:/www/web/online-2/www.fecshop.com/appfront/web/doc/fecshop-guide/cn-1.0/

 

然后nginx 指向/www/web/online-2/www.fecshop.com/appfront/web

然后访问http://127.0.0.1/doc/fecshop-guide/cn-1.0/guide-index.html

就可以看到效果了

效果演示:http://www.fecshop.com/doc/fecshop-guide/cn-1.0/guide-index.html#

 

最后,您可能感觉样式不好,想改一下,可以修改;

vendor/bower/bootstrap/dist/css/bootstrap.css

或者添加文件,覆盖这个文件里面的css内容即可。

如果您要大改,把页面底部彻底换掉,可以到

/www/web/tadoc/vendor/yiisoft/yii2-apidoc/templates

这里找对应的代码,然后改掉html内容,在添加css内容等等