[
'actions' => ['create', 'update', 'show',....],
'roles' => ['manager'],
'matchCallback' => function($rule, $action){
return Yii::$app->user->can('roleA') && Yii::$app->user->can('roleB');
}
]
[
'actions' => ['create'],
'roles' => ['admin'],
'matchCallback' => function($rule, $action){
return Yii::$app->user->can('roleA');
}
],
[
'actions' => ['create'],
'roles' => ['manager'],
'matchCallback' => function($rule, $action){
return Yii::$app->user->can('roleA') && Yii::$app->user->can('roleB');
}
]
Yii::$app->user->can('roleA') && Yii::$app->user->can('roleB');
и связывать их в таблице AuthItemChild using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApplication2
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
///
public class ReportParameter
{
public string ParameterName { get; set; }
public string ParameterValue { get; set; }
}
public partial class MainWindow : Window
{
/*
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler == null) return;
handler(this, new PropertyChangedEventArgs(propertyName));
}
private string _parameterValue;
public string ParameterValue
{
get
{
return _parameterValue;
}
set
{
_parameterValue = value;
OnPropertyChanged("ParameterValue");
}
}
*/
public List<ReportParameter> lst { get; set; }
public MainWindow()
{
InitializeComponent();
initData();
DataContext = this;
}
public void initData()
{
lst = new List<ReportParameter>();
lst.Add(new ReportParameter { ParameterName = "Param1", ParameterValue = "Value1" });
lst.Add(new ReportParameter { ParameterName = "anotherParameter", ParameterValue = "" });
}
private void button_Click(object sender, RoutedEventArgs e)
{
// получить список параметров и их новых значений
// foreach (var param in newParamList)
// GetAnotherFunction(param.ParameterName, param.ParameterValue);
}
}
}
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication2"
xmlns:col="clr-namespace:System.Collections;assembly=mscorlib"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListView ItemsSource="{Binding lst}" >
<ListView.Resources>
<DataTemplate DataType="{x:Type local:ReportParameter}">
<StackPanel>
<Label Content="{Binding Path=ParameterName}" />
<TextBox Text="{Binding Path=ParameterValue}" />
</StackPanel>
</DataTemplate>
</ListView.Resources>
</ListView> <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="110,92,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>
</Grid>
</Window>
Report.SetParameterValue(string Name, object value)
<DataTemplate DataType="{x:Type generic:ReportParameter}">
<StackPanel>
<Label Content="{Binding Path=ParameterDescription}" />
<TextBox Text="{Binding Path=ParameterValue}" "где то тут надо привязать ParameterName" />
</StackPanel>
</DataTemplate>
foreach (param in всепараметры)
Report.SetParameterValue(param.name, новое значение из textbox)
admin - roleA
manager - roleA
manager - roleB
И фильтры
Громозко, зато есть возможность проверять по определенной цепочке, т.е. мне важно чтобы для manager сначала была проверка правила из roleA, а затем уже проверка правила из roleB