Почему не рендерится activeTextInput

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Clasen01
Сообщения: 15
Зарегистрирован: 2018.04.17, 03:44

Почему не рендерится activeTextInput

Сообщение Clasen01 »

Создаю свой виджет с кастомным поведением через JavaScript

Вот код виджета:

Код: Выделить всё

 <?php

    namespace backend\components\widgets\characterDelimiter;

    use Yii;
    use yii\helpers\Html;
    use yii\widgets\InputWidget;

    class CharacterDelimiterWidget extends InputWidget {
    
        public $lenght,
               $needToDelimiterStr,
                $delimeterCssClass,
                $delimeterCssStyle,
                $name,
                //переменные для activeForm
                $options = [],
                $settings = [],
                $model,
                $value,
                $selector,
                $attribute;
    
        public function init() {
            
            $this->options = [
                'class' => $this->delimeterCssClass, 
                'style' => $this->delimeterCssStyle, 
                'id' => $this->name . '_' . $this->attribute . '_id', 
                'maxlength' => $this->lenght, 
                'name' => $this->attribute];
            
            $specialClass = '<div class="clearfix super-special-class"></div>';
            
            if (parent::hasModel()) {
                
                echo $specialClass, Html::activeTextInput(
                        $this->model, 
                        $this->attribute, 
                        $this->options);
                
            } else {
                
                echo $specialClass, Html::textInput(
                        $this->name, 
                        $this->value, 
                        $this->options);
            }
            parent::init();
        }
    
        public function run() {
            $view = $this->view;
    
            $view->registerJs(
                    <<< JS
                    var left = $this->lenght; //кол-во разрешенных символов
                    console.log();
                    $("#counter_$this->attribute").text("Символов осталось: " + left);
                    if ($this->needToDelimiterStr) {
                        $("#$this->attribute").keyup(function() {
                            left = $this->lenght - $(this).val().length;
                            if (left < 0) {
                                left = 0;
                            }
                            $("#counter_$this->attribute").text("Символов осталось: " + left);
                        });
                    } else {
                        $("#counter_$this->attribute").text("Неограниченный ввод");
                    }
    JS
                    , yii\web\View::POS_LOAD);
            return;
        }
    }

Если я вызываю его в представлении вот так:

     <?php
     echo CharacterDelimiterWidget::widget(['lenght' => 10,
        'name' => 'example',
        'needToDelimiterStr' => 'true',
        'delimeterCssClass' => 'text-center',
        'delimeterCssStyle' => 'margin: 0 auto']);
 

То, рендерится вот такой input

Код: Выделить всё

<input type="text" id="asdasd__id" class="text-center" name="asdasd" maxlength="10" style="margin: 0 auto">
А если вот так:

Код: Выделить всё

    <?php
    $model = ThisDay::findThisDayNews(614932);
    foreach ($model as $key => $value) {
    
            $form->field($model, "news_name")->widget(backend\components\widgets\
                    characterDelimiter\CharacterDelimiterWidget::className(), [
                'lenght' => 10,
                'needToDelimiterStr' => 'true',
                'delimeterCssClass' => 'text-center',
                'delimeterCssStyle' => 'margin: 0 auto'
            ]);
    }
То не рендерится ничего кроме js'a. При этом parent::hasModel() возвращает true, а

Код: Выделить всё

var_dump($specialClass, Html::activeTextInput(
                    $this->model, $this->attribute, $this->options));
возвращает вот такой инпут:

Код: Выделить всё

<input type="text" id="_news_name_id" class="text-center" name="news_name" value="Тестовое значение полученное из базы данных" maxlength="10" style="margin: 0 auto">
В чем может быть проблема?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему не рендерится activeTextInput

Сообщение Dominus »

Код: Выделить всё

echo $form->field($model, "news_name")->widget(backend\components\widgets\
                    characterDelimiter\CharacterDelimiterWidget::className(), [
                'lenght' => 10,
                'needToDelimiterStr' => 'true',
                'delimeterCssClass' => 'text-center',
                'delimeterCssStyle' => 'margin: 0 auto'
            ]);
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Clasen01
Сообщения: 15
Зарегистрирован: 2018.04.17, 03:44

Re: Почему не рендерится activeTextInput

Сообщение Clasen01 »

Dominus писал(а): 2018.07.26, 16:05

Код: Выделить всё

echo $form->field($model, "news_name")->widget(backend\components\widgets\
                    characterDelimiter\CharacterDelimiterWidget::className(), [
                'lenght' => 10,
                'needToDelimiterStr' => 'true',
                'delimeterCssClass' => 'text-center',
                'delimeterCssStyle' => 'margin: 0 auto'
            ]);
Ох... это ж надо было) Спасибо большое за ответ
Ответить