/**
  * 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;
 }
Example #2
0
 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;
 }
Example #3
0
	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;
	}