Как добавить activeDropDownList в форму с помощью jQuery? PHP-Yii2

вопрос говорит сам за себя, вчера я спросил Как добавить поля в активную форму с помощью js/jQuery в Yii2?

хорошо, теперь мне нужно добавить выпадающее меню, и это не одно и то же...

У меня есть это:

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\helpers\ArrayHelper;
use app\models\User;
use app\models\ContactType;

$cntcttp = new ContactType;

$this->registerJs('$("#btnadd").on("click",function(){'
  . '$("#dynamicInput").append(\''
  .  Html::textInput("contacto","",['placeholder'=>"contacto"])
  . '\');'
  . '})');

?>

<?php $form = ActiveForm::begin(); ?>

    <div id="dynamicInput"></div>

    <?= Html::activeDropDownList($cntcttp, 'ContactTypeID',
    ArrayHelper::map($ctypes, 'ContactTypeID', 'Name') , ['prompt'=>'--contacto--']) ?>


    <input type='button' id='btnadd' value="add contact">
    <div class="form-group">
        <?= Html::submitInput('Submit', ['class' => 'btn-primary']) ?>
    </div>
<?php  ActiveForm::end(); ?>

теперь мне нужно, чтобы dorpdown появлялся, когда пользователь нажимает #btnadd вместо того, что у меня есть сейчас: P

Заранее спасибо :)


person Fernando Andrade    schedule 18.12.2014    source источник


Ответы (1)


Это почти то же самое. Просто сделайте, как показано ниже:

$this->registerJs('$("#btnadd").on("click",function(){'
. '$("#dynamicInput").append(\''
.   Html::activeDropDownList($cntcttp, 'ContactTypeID',
    ArrayHelper::map($ctypes, 'ContactTypeID', 'Name') , ['prompt'=>'--contacto--'])
. '\');'
. '})');

Это все.


Вы, вероятно, получаете синтаксическую ошибку в javascript, так как Yii помещает \n в раскрывающийся список. Самый грязный способ избежать этой синтаксической ошибки — сделать так, как показано ниже:

$this->registerJs('$("#btnadd").on("click",function(){'
. '$("#dynamicInput").append(\''
.   str_replace("\n", "", Html::activeDropDownList($cntcttp, 'ContactTypeID',
    ArrayHelper::map($ctypes, 'ContactTypeID', 'Name') , ['prompt'=>'--contacto--']))
. '\');'
. '})');

Особая благодарность Соджу, которая упомянула в комментарии об использовании json_encode()

Однако я написал, что самым грязным способом будет использование str_replace(), но вместо этого вы можете использовать json_encode(), что является более элегантным решением:

$this->registerJs('$("#btnadd").on("click",function(){'
. '$("#dynamicInput").append('
.   json_encode(Html::activeDropDownList($cntcttp, 'ContactTypeID',
    ArrayHelper::map($ctypes, 'ContactTypeID', 'Name') , ['prompt'=>'--contacto--']))
. ');'
. '})');
person Ali MasudianPour    schedule 18.12.2014
comment
Я пробовал это, это дает мне синтаксическую ошибку: нетерминированный строковый литерал - person Fernando Andrade; 18.12.2014
comment
@FernandoAndrade Можете ли вы опубликовать HTML-код, который создает Html::activeDropDownList() (отредактируйте свой вопрос и добавьте его)? Это просто вопрос правильного экранирования... Возможно, вы сможете сделать это напрямую или вам может потребоваться перегрузить HTML пользовательской реализацией activeDropDownList, но в любом случае это должно быть выполнимо. - person prodigitalson; 18.12.2014
comment
Я собирался вставить код, когда вы отредактировали комментарий, он сработал :) еще раз, вы спасли день, большое спасибо :) - person Fernando Andrade; 18.12.2014
comment
Вы должны просто использовать кодировку json... stackoverflow.com/questions/168214/ - person soju; 18.12.2014
comment
@soju Эй, приятель, спасибо, что упомянул об этом. Я обновил ответ. Спасибо еще раз - person Ali MasudianPour; 18.12.2014