سؤال

أريد أن يكون زر الحذف نشطًا فقط في حالة معينة CGgridView CButtonColumn (أو قم بإنشاء زر حذف مخصص) على سبيل المثال إذا user=='admin' أو status=='draft'.أيه أفكار؟شكرًا!

هل كانت مفيدة؟

المحلول

استخدم المعلمة "المرئية" -

 'buttons'=>array
    (
        'delete' => array
        (
            'label'=>'Delete',
            //other params
            'visible'=>!Yii::app()->user->checkAccess('admin'),
        ),

نصائح أخرى

'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")'

يمكنك أيضًا استخدام وظيفة مجهولة إذا كان PHP >= 5.3

'visible'=>function($row, $data) {
    return Yii::app()->user->checkAccess('admin') || 'draft' == $data->status;
}

كما ذكر zuups في منشور Mukesh، عليك استخدام علامات الاقتباس المفردة!وuser1584901 على حق في الإجابة، في حالة أن الحالة هي خاصية لمثيل النموذج.لذا،

'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")',

صحيح.(الشرح في الأسفل)

أريد أن أضيف بعض الأشياء المثيرة للاهتمام التي يمكنك القيام بها أيضًا.على سبيل المثال، فكر في مستخدم لديه أصول.في هذه الحالة أرغب في إضافة زر الحذف فقط للمستخدمين الذين ليس لديهم أي أصول.

في هذه الحالة، يمكنك إنشاء علاقة في نموذج المستخدم مثل

'haveAssets' = array(self::STAT,'Asset', 'asset_id','select'=>'1')

والذي سيُرجع 1 إذا كان لدى المستخدم أصول، أو 0 بخلاف ذلك.وحدد المعلمة المرئية كـ

'visible' => '!$data->haveAssets',

السبب وراء نجاح كل هذا (كما طلب 0x7fffffff) هو أن Yii يستخدم السلسلة المحددة في الشكل المرئي لتطبيقها على وظيفة EvaExpression داخل الوظيفة التي تعرض الأزرار (renderButton).

من: https://github.com/yiisoft/yii/blob/1.1.14/framework/zii/widgets/grid/CButtonColumn.php السطر 337

protected function renderButton($id,$button,$row,$data)
    {
            if (isset($button['visible']) && !$this->evaluateExpression($button['visible'],array('row'=>$row,'data'=>$data)))
                      return;

والذي تم تعريفه في فئة CComponent:https://github.com/yiisoft/yii/blob/1.1.14/framework/base/CComponent.php السطر 607

public function evaluateExpression($_expression_,$_data_=array())
    {
            if(is_string($_expression_))
            {
                    extract($_data_);
                    return eval('return '.$_expression_.';');
            }
            else
            {
                    $_data_[]=$this;
                    return call_user_func_array($_expression_, $_data_);
            }
    }

لذا فإن ما يحدث أساسًا هو أن وظيفة تقييم التعبير ستوفر المتغيرات $data (وهو مثيل النموذج للصف المعني) و$row (كل هذا باستخدام وظيفة الاستخراج) وتقييم تعبير السلسلة الخاص بك كرمز php.لذا فإن أي إشارة إلى $data أو $row ستستخدم المتغير الذي تم تعيينه بالفعل بواسطة وظيفة evaluteExpression في هذا النطاق.ولهذا السبب يمكنك استخدام مثيل النموذج المعني للصف المعني (مثل $data->status، أو $data->haveAssets من الأمثلة).لاحظ أن السلسلة يجب أن تكون تعبيرًا يُرجع قيمة منطقية لتحديد رؤية الزر.

والسبب في أن السلاسل يجب أن تكون ضمن علامات اقتباس مفردة هو أنه أثناء استخدام علامات الاقتباس المزدوجة، سيفترض PHP أن أي سلسلة تبدأ بـ $ هي متغير وستحاول استبدالها بتلك القيمة المتغيرة.نظرًا لأن متغير $data في نطاقك لا معنى له (أو يمكن تعريفه)، فسوف يؤدي إلى حدوث خطأ أو استبداله بشكل مضلل.باستخدام علامات الاقتباس المفردة فإنك تمنع وجود هذا السلوك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top