2017 © Pedro PelΓ‘ez
 

yii2-extension yii2-bitmask

Bit mask behavior and validators for models

image

ancor/yii2-bitmask

Bit mask behavior and validators for models

  • Thursday, March 17, 2016
  • by ancor.dev
  • Repository
  • 1 Watchers
  • 5 Stars
  • 790 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 0 Forks
  • 0 Open issues
  • 1 Versions
  • 7 % Grown

The README.md

Bitmask Behavior and Validators for Yii 2

ОписаниС

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ масками., (*1)

На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ значСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Π΅ΠΉ Π² ΠΏΠΎΠ»Π΅ Ρ‚ΠΈΠΏΠ° int., (*2)

Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ряд вопросов:, (*3)

  • Как Π² соотвСтствии со сцСнариями Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ\ΡΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹, Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ
  • Как ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ input[type=checkbox] Ρ‚Π΅Π³ΠΈ ΠΊ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π±ΠΈΡ‚Π°ΠΌ
  • Π“Π΄Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ подписи для ΠΏΠΎΠ»Π΅ΠΉ Π²Π²ΠΎΠ΄Π°
  • Как Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹
  • Как ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π±ΠΈΡ‚Π° Π² ΠΏΠΎΠ»Π΅ Ρƒ ΠΌΠΎΠ΄Π΅Π»ΠΈ
  • Ну ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ† ΠΊΠ°ΠΊ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ\ΡΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π±ΠΈΡ‚

yii2-bitmask Π΄Π°Π΅Ρ‚ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ всС эти вопросы, (*4)

Feel free to let me know what else you want added via:, (*5)

Installation

The preferred way to install this extension is through composer., (*6)

Either run, (*7)

$ php composer.phar require ancor/yii2-bitmask

or add, (*8)

"ancor/yii2-bitmask": "dev-master"

to the require section of your composer.json file., (*9)

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ содСрТит Ρ‚Ρ€ΠΈ класса

  • BitmaskBehavior - созданиС ΠΏΠΎΠ»Π΅ΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π° основС Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ маски
  • BitmaskValidator - валидация основанная Π½Π° Π±ΠΈΡ‚Π°Ρ…
  • BitmaskFieldsValidator - валидация основанная Π½Π° названиях ΠΏΠΎΠ»Π΅ΠΉ

BitmaskBehavior

Настройка ΠΌΠΎΠ΄Π΅Π»ΠΈ

use ancor\bitmask\BitmaskBehavior;

/**
 * @property integer $options
 * ...
 * @property string $spamOption
 * @property string $deletedOption
 * ...
 */
class User extends \yii\db\ActiveRecord
{
    const OPT_SPAM    = 1<<0;
    const OPT_DELETED = 1<<1;

    public function behaviors()
    {
        return [
            'bitmask' => [
                'options' => [
                    'spamOption'    => static::OPT_SPAM,
                    'deletedOption' => static::OPT_DELETED,
                ],
                // 'bitmaskAttribute' => 'options', // an attribute which is the mask itself
            ],
        ];
    }

    public function rules()
    {
        return [
            [['spamOption', 'deletedOption'], 'safe'],
        ];
    }

    public function attributeLabels()
    {
        return [
            ...
            'spamOption'       => 'This user is spammer',
            'emailNotVerified' => 'User is deleted',
            ...
        ];
    }
}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования

$model = new User();

echo $model->options; // 0

// ΠΠ°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ Π±ΠΈΡ‚
$model->spamOption = true; // $model->options == User::OPT_SPAM == 1<<0 == 1
// Π­Ρ‚ΠΎ эквивалСнтно ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС
$model->options = $model->options | User::OPT_SPAM;
// Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅! ΠŸΡ€ΠΈ присваивании значСния - любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ прСобразуСтся Π² boolean

// Π‘Π½ΡΡ‚ΡŒ Π±ΠΈΡ‚
$model->spamOption = false; // $model->options == 0
// Π­Ρ‚ΠΎ эквивалСнтно ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС
$model->options = $model->options & ~User::OPT_SPAM;

// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π±ΠΈΡ‚Π°
if ($model->spamOption) ...
// Π­Ρ‚ΠΎ эквивалСнтно ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС
if ($model->options & User::OPT_SPAM) ...

Π“Ρ€ΡƒΠΏΠΏΠΎΠ²ΠΎΠ΅ присвоСниС

// ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ ΠΏΡ€ΠΈΡˆΠ»Π° Ρ„ΠΎΡ€ΠΌΠ°
$post = [
    'User' => [
        ...
        'spamOption'    => false,
        'deletedOption' => true,
        ...
    ],
];

/**
 * Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠΌΠ°Π½Π΄ΠΎΠΉ
 */
echo $model->options; // 0
$model->load($post); 

echo $model->options; // $model->options == 1<<1 == 2
var_dump($model->spamOption);    // false
var_dump($model->deletedOption); // true


/**
 * ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π‘Π•Π— BitmaskBehavior, ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ Ρ‚ΠΎΠΉ ΠΆΠ΅ самой Ρ„ΠΎΡ€ΠΌΡ‹
 * ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Ρ‡Ρ‚ΠΎ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ 2 свойства
 *   public $spamOption;
 *   public $deletedOption;
 */

echo $model->options; // 0
$model->load($post);

// Бвойство options, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
echo $model->options; // 0

if ($post['User']['spamOption']) {
    $model->options |= User::OPT_SPAM;
} else {
    $model->options &= ~User::OPT_SPAM;
}
if ($post['User']['deletedOption']) {
    $model->options |= User::OPT_DELETED;
} else {
    $model->options &= ~User::OPT_DELETED;
}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ шаблона с использованиСм ActiveForm

$form->field($model, 'spamOption')->checkbox();
$form->field($model, 'deletedOption')->checkbox();

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹ - Ρ‚ΠΎ просто Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΈΡ… Π² Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€Π΅ safe, (*10)

НовыС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ свойства ΠΌΠΎΠ΄Π΅Π»ΠΈ

php public integer[] getBitmaskFields(void), (*11)

ΠœΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив с наимСнованиями ΠΏΠΎΠ»Π΅ΠΉ ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΈΠΌ Π±ΠΈΡ‚Π°ΠΌΠΈ. Π‘Π΅Π· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, (*12)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‚Π°(Π² нашСм случаС):, (*13)

[
    'spamOption'    => 1, // 1<<0
    'deletedOption' => 2, // 1<<1
]

php public boolean[] getBitmaskValues(void) ΠœΠ΅Ρ‚ΠΎΠ² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ наимСнования ΠΏΠΎΠ»Π΅ΠΉ с ΠΈΡ… значСниями true\false., (*14)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‚Π°(Π² нашСм случаС):, (*15)

[
    'spamOption'    => false,
    'deletedOption' => true,
]

php public boolean getOldBit(string $field) Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ "старого" Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°. (Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π·ΠΎΠ² ->getOldAttribute()), (*16)

БобствСнныС статичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ повСдСния

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΈΡ‚ Π² маску\Π£Π±Ρ€Π°Ρ‚ΡŒ Π±ΠΈΠ· ΠΈΠ· маски

public static integer modifyBitmask(int $mask, int $bit, boolean $exists)

```php $mask = 0b00100001; $bit = 0b00000100;, (*17)

// Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΈΡ‚ $options = BitmaskBehavior::modifyBitmask($mask, $bit, true); // 0b00100101 // Π£Π±Ρ€Π°Ρ‚ΡŒ Π±ΠΈΡ‚ $options = BitmaskBehavior::modifyBitmask($mask, $bit, false); // 0b00100001, (*18)

#### ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ массив Π±ΠΈΡ‚ΠΎΠ² Π½Π° основС Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ маски
```php
public static boolean[] parseBitmask(int $mask, int[] $fields)

```php $mask = 0b00100000; $fields = [ 'firstOption' => 0b00000001, 'secondOption' => 0b00100000, ];, (*19)

$values = BitmaskBehavior::parseBitmask($mask, $fields); print_r($values); // ['firstOption' => false, 'secondOption' => true], (*20)


#### Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ маску Π½Π° основС массива Π±ΠΈΡ‚ΠΎΠ² ```php public static int makeBitmask(boolean[] $values, int[] $fields) ``` ```php $fields = [ 'firstOption' => 0b00000001, 'secondOption' => 0b00100000, ]; $values = [ 'firstOption' => false, 'secondOption' => true ]; $mask = BitmaskBehavior::makeBitmask($values, $fields); echo $mask; // 0b00100000

BitmaskValidator

ОписаниС: ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ Π±ΠΈΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π² маскС, Π° ΠΊΠ°ΠΊΠΈΠ΅ нСльзя., (*21)

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π­Ρ‚ΠΎΡ‚ Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π· BitmaskBehavior., (*22)

public function rules()
{
    return [
        ['options', BitmaskValidator::className(), 'mask' => 1<<3 | 1<<4 | 1<<6],
        // Или с ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠΌ сообщСния
        ['options', BitmaskValidator::className(), 'mask' => 1<<3 | 1<<4 | 1<<6, 'message' => ...],
        // МоТно Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ константы
        ['options', BitmaskValidator::className(), 'mask' => static::OPT_SPAM],
    ];
}

BitmaskFieldsValidator

ОписаниС:, (*23)

  • Π­Ρ‚ΠΎΡ‚ Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ ΠΏΠΎΡ…ΠΎΠ΄ Π½Π° BitmaskValidator.
  • ΠŸΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для использования Π² ΠΏΠ°Ρ€Π΅ с BitmaskBehavior.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ вмСсто safe Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€Π°. Но это Π½Π΅ всС.
  • Π’Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ BitmaskValidator Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ всСх Π±ΠΈΡ‚ΠΎΠ² ΠΊ ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚Π΅Ρ… ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования, (*24)

return [
    [
        ['spamOption', 'deletedOption'],
        BitmaskFieldsValidator::className(),
        // 'maskAttribute' => 'options', // По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
    ],
];

The Versions

17/03 2016

dev-master

9999999-dev

Bit mask behavior and validators for models

  Sources   Download

GPLv3

The Requires

 

by Anton Korniychuk