Example #1
0
 /**
  * CFilterChain factory method.
  * This method creates a CFilterChain instance.
  * @param CController $controller the controller who executes the action.
  * @param CAction $action the action being filtered by this chain.
  * @param array $filters list of filters to be applied to the action.
  * @return CFilterChain
  */
 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);
             }
         } 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;
                 $filter = Yii::createComponent($filter);
             }
         }
         if (is_object($filter)) {
             $filter->init();
             $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;
 }