/** * CFilterChain factory method. * This method creates a CFilterChain instance. * @param CController the controller who executes the action. * @param CAction the action being filtered by this chain. * @param array list of filters to be applied to the action. */ public static function create($controller, $action, $filters) { $chain = new CFilterChain($controller, $action); $actionID = $action->getId(); foreach ($filters as $filter) { if (is_string($filter)) { if (($pos = strpos($filter, '+')) !== false || ($pos = strpos($filter, '-')) !== false) { $matched = preg_match("/\\b{$actionID}\\b/i", substr($filter, $pos + 1)) > 0; if (($filter[$pos] === '+') === $matched) { $chain->add(CInlineFilter::create($controller, trim(substr($filter, 0, $pos)))); } } else { $chain->add(CInlineFilter::create($controller, $filter)); } } else { if (is_array($filter)) { if (!isset($filter[0])) { throw new CException(Yii::t('yii', 'The first element in a filter configuration must be the filter class.')); } $filterClass = $filter[0]; unset($filter[0]); if (($pos = strpos($filterClass, '+')) !== false || ($pos = strpos($filterClass, '-')) !== false) { $matched = preg_match("/\\b{$actionID}\\b/i", substr($filterClass, $pos + 1)) > 0; if (($filterClass[$pos] === '+') === $matched) { $filterClass = trim(substr($filterClass, 0, $pos)); } else { continue; } } $filter['class'] = $filterClass; $chain->add(Yii::createComponent($filter)); } else { $chain->add($filter); } } } return $chain; }
public static function create($controller, $action, $filters) { $chain = new CFilterChain($controller, $action); $actionID = $action->getId(); foreach ($filters as $filter) { if (is_string($filter)) { if (($pos = strpos($filter, '+')) !== false || ($pos = strpos($filter, '-')) !== false) { $matched = preg_match("/\\b{$actionID}\\b/i", substr($filter, $pos + 1)) > 0; if (($filter[$pos] === '+') === $matched) { $filter = CInlineFilter::create($controller, trim(substr($filter, 0, $pos))); } } else { $filter = CInlineFilter::create($controller, $filter); } } elseif (is_array($filter)) { $filterClass = $filter[0]; unset($filter[0]); //开始解析过滤器配置 if (($pos = strpos($filterClass, '+')) !== false || ($pos = strpos($filterClass, '-')) !== false) { preg_match("/\\b{$actionID}\\b/i", substr($filterClass, $pos + 1), $a); $matched = preg_match("/\\b{$actionID}\\b/i", substr($filterClass, $pos + 1)) > 0; //如果是filterName+action,创建一个过滤器,否则忽略 if (($filterClass[$pos] === '+') === $matched) { //解析出过滤器的类名 $filterClass = trim(substr($filterClass, 0, $pos)); } else { continue; } } $filter['class'] = $filterClass; $filter = Yii::createComponent($filter); } if (is_object($filter)) { $filter->init(); $chain->add($filter); //list添加过滤器 } } return $chain; }
public static function create($controller,$action,$filters) { $chain=new CFilterChain($controller,$action); $actionID=$action->getId(); foreach($filters as $filter) { if(is_string($filter)) // filterName [+|- action1 action2] { if(($pos=strpos($filter,'+'))!==false || ($pos=strpos($filter,'-'))!==false) { $matched=preg_match("/\b{$actionID}\b/i",substr($filter,$pos+1))>0; if(($filter[$pos]==='+')===$matched) $filter=CInlineFilter::create($controller,trim(substr($filter,0,$pos))); } else $filter=CInlineFilter::create($controller,$filter); } else if(is_array($filter)) // array('path.to.class [+|- action1, action2]','param1'=>'value1',...) { if(!isset($filter[0])) throw new CException(Yii::t('yii','The first element in a filter configuration must be the filter class.')); $filterClass=$filter[0]; unset($filter[0]); if(($pos=strpos($filterClass,'+'))!==false || ($pos=strpos($filterClass,'-'))!==false) { $matched=preg_match("/\b{$actionID}\b/i",substr($filterClass,$pos+1))>0; if(($filterClass[$pos]==='+')===$matched) $filterClass=trim(substr($filterClass,0,$pos)); else continue; } $filter['class']=$filterClass; $filter=Yii::createComponent($filter); } if(is_object($filter)) { $filter->init(); $chain->add($filter); } } return $chain; }