我好惶恐,今天我又开了个新的专题,那就是世界上最好的语言php,话不多说,我们今天来学习laravel框架的blade模版用法。
1 后台定位视图,传递变量
public function index()
{
$title = '文章标题1';
return view('articles.lists')->with('title',$title);
}
这是某个controller下面的方法,定位到articles目录下面的lists模版,携带title。
// two way to show
{{ $title }}
当我们想给页面传递一个html代码:
public function index()
{
$title = '文章标题1';
return view('articles.lists')->with('title',$title);
}
{!! $title !!}
使用compact传递
public function index()
{
$title = '文章标题1';
$intro = '文章一的简介';
return view('articles.lists',compact('title','intro'));
}
我们再来看一下模版的使用,这个才是重点。
{{date('Y-m-d', strtotime($oActivity->start_time))}} 00:00 至 {{date('Y-m-d', strtotime($oActivity->end_time))}} 23:59
strtotime是把时间字符串转为时间戳,这是一个在模版里用函数的栗子。
看一个条件判断:
我们可以看到居然能在class里面判断写类名。
如何写循环渲染页面:
@foreach($items as $item)
获得{{$item['reward']}}}元返现奖励
您已累计充值{{$charge}}/{{$item['amount']}}}元
@if($item->status == 'reach')
@elseif($item->status == 'finish')
@else
@endif
@endforeach
当你在使用@foreach的时候,可以结束循环或继续。
@foreach ($users as $user)
@if ($user->type == 1)
@continue
@endif
{{ $user->name }}
@if ($user->number == 5)
@break
@endif
@endforeach
当然你也可以换一种方式
@foreach ($users as $user)
@continue($user->type == 1)
{{ $user->name }}
@break($user->number == 5)
@endforeach
这样看起来是不是更简洁。。。
下面来一个复杂的栗子:
@if (count($datas))
@foreach ($datas as $data)
{{$data->username }}
{{ $aLotteries[$data->lottery_id] }}
{{ $data->serial_number_short }}
{{ $data->issue }}
{{ $data->title }}
@if ( strlen( $data->display_bet_number) > 5 )
详细号码
@else
{{ $data->display_bet_number }}
@endif
{{ $data->amount_formatted }}
{{ $data->prize_formatted ? $data->prize_formatted : 0.00}} @if($data->is_overprize) (奖金超限) @endif
{{ $data->prize_group_real.'-'.$data->commission_formatted.'%' }}
{{ $data->formatted_status }}
status != Project::STATUS_DROPED){$fTotalAmount += $data->amount;$fTotalPrize += $data->prize; $fTotalCommission += $data->commission;} ?>
@endforeach
@else
没有符合条件的记录,请更改查询条件
@endif
我们可以看到这一段:
// 同时生明3个变量 都为0
在每次渲染完一个tr的时候,有这一段:
status != Project::STATUS_DROPED){$fTotalAmount += $data->amount;$fTotalPrize += $data->prize; $fTotalCommission += $data->commission;} ?>
实际上是每次判断后做累加,而这个变量时做出了改变。
@if (isset($bHasSumRow) && $bHasSumRow)
本页小结
{{ number_format($fTotalAmount, 2) }}
{{ number_format($fTotalPrize,2)}}
@endif
在tr渲染完后,可以在tfoot那里拿到修改完的值。
用过jade模版的人都知道,我们在js中无法直接操作后台给的数据,而blade可以。
var global_game_config_ssc = {{ $sLotteryConfig }};
我们已经讲了后台怎么控制跳到什么页面,传递变量给前台,那么还有个问题,如何到达指定的controller从而去到指定的页面。。。
@foreach ($aLotteries as $key => $aLottery)
- {{ $aLottery['name'] }}
@endforeach
我们这里看到了每个li里面都有一个跳转,其实就是路由,控制页面的去向。
'user-trends'],function (){
$resource = 'user-trends';
$controller = 'UserTrendController@';
Route::get('trend-view/{lottery_id?}/{num_type?}', ['as' => $resource . '.trend-view', 'uses' => $controller . 'trendView']);
Route::match(['GET', 'POST'], 'trend-data', ['as' => $resource . '.trend-data', 'uses' => $controller . 'getTrendData']); //->before('ajax');
});
当我们点击a标签,他会走下面这个:
Route::get('trend-view/{lottery_id?}/{num_type?}', ['as' => $resource . '.trend-view', 'uses' => $controller . 'trendView']);
注意lottery_id和num_type其实都可以不传的。点击后会进入UserTrendController的trendView方法。
那我们来看下这个controller方法是怎么写的
public function trendView ($iLotteryId = null, $sTrendType = null)
{
// 没有彩种参数, 则取彩种表的第一个彩种
if ($iLotteryId) {
$oLottery = Lottery::find($iLotteryId);
} else {
$oLottery = Lottery::first();
$iLotteryId = $oLottery->id;
}
if (empty($oLottery)){
$this->halt(false,'lottery-missing',Lottery::ERRNO_LOTTERY_MISSING);
}
$oSeries = Series::find($oLottery->series_id);
$sSeriesName = strtolower($oSeries->name);
$sLotteryName = $oLottery->friendly_name;
$aViewTypes = [];
$aEnabledViewTypes = Config::get('trend.' . $oLottery->series_id);
foreach ($aEnabledViewTypes as $sViewType) {
$aViewTypes[$sViewType] = static::$aViewTypes[$sViewType];
}
// 没有走势图类型, 则取配置数组的第一个
$sTrendType or $sTrendType = $aEnabledViewTypes[0];
$sTrendTypeEnName = $aViewTypes[$sTrendType];
if($oSeries->id==21){
$this->view = $this->customViewPath . '.lhc.' . $sTrendTypeEnName;
}else{
$this->view = $this->customViewPath . '.' . $sSeriesName . '.' . $sTrendTypeEnName;
}
$sTrendTypeName = __('_trend.' . ($sTrendTypeEnName));
// pr($sTrendTypeName);exit;
$aConfigs = & $this->_getTrendConfig($iLotteryId, $sTrendType);
$sConfigs = json_encode($aConfigs);
$this->setVars(compact('sConfigs', 'oSeries', 'iLotteryId', 'sTrendType', 'sLotteryName', 'aViewTypes', 'sTrendTypeName'));
return $this->render();
}
当我们访问 '域名/user-trends/16' 时,会走这个方法。
我们讲了路由,控制去向,还能获取参数,然后模版,变量传递,还差什么呢?就是数据持久层model了,我们来看一个model
'desc'];
protected $fillable = [
'user_id',
'type',
'created_at',
'updated_at',
];
public static $resourceName = 'ActivityQixi';
public static $columnForList = [
'user_id',
'type',
'created_at',
'updated_at',
];
public static $titleColumn = 'id';
public static $rules = [
'user_id' => 'required',
'type' => 'required',
];
/*
* 添加记录
*/
public static function add($user_id,$type) {
$data = new ActivityQixi();
$data->user_id = $user_id;
$data->type = $type ;
$data->save();
}
}
这个实体类就对应一个数据库表,表有四个字段,$columnForList数组标出来了,$rules规定了字段规则,add方法是往数据库新增1条记录。
ActivityQixi::add(Session::get('user_id'), $type); //增加领奖记录
在controller里面调用就是如此简单。
我们来看一个比较符合正常的rule
public static $rules = [
'user_id' => 'required|integer',
'cellphone_number' => [
'required',
'regex:/^1(3[0-9]|4[57]|5[0-35-9]|7[0135678]|8[0-9])[0-9]{8}$/'
],
'post_code' => 'regex:/^[0-9]{6}$/',
'true_name' => 'required|min:2|max:10',
'address' => 'required|between:5,100',
'email' => 'email'
];
/**
* 写入用户数据
*/
public static function insertUserInfo(array $data)
{
if (! is_array($data)) {
return false;
}
$aInserData = [];
foreach ($data as $key => $value) {
if ($key == 'true_name' || $key == 'email' || $key == 'cellphone_number' || $key == 'address' || $key == 'post_code') {
$value = Encrypt::encode($value);
}
$aInserData[$key] = $value;
}
return self::insert($aInserData);
}
好了吧,下班了,今天就到这。。。