簡體   English   中英

Yii2 Button onclick JsExpression包含PHP

[英]Yii2 Button onclick JsExpression which contains PHP

我想提交一個表單,該表單的字段是一個未知數目的元素的數組。

class DynamicForm extends Model
{
    /** var string[] */
    public elements[];
}

在存在表單提交的視圖內部,我想添加一個具有“ onclick” Javascript函數的按鈕,該按鈕將在表單innerHtml中添加一個新字段。 不幸的是,我找不到在JavaScript表達式中嵌入一些PHP代碼的方法。 這是我現在的位置:

<?php
$form = ActiveForm::begin([
    'id' => 'test-form',
    'layout' => 'horizontal',
    'fieldConfig' => [
        'errorOptions' => [
            'role' => 'alert',
        ],
        'horizontalCssClasses' => [
            'label' => 'col-sm-3',
            'offset' => 'col-sm-offset-3',
            'wrapper' => 'col-sm-9',
            'error' => '',
            'hint' => '',
        ],
    ],
]); 
$formField = $form->field($model, 'elements[]', []);

$JsFunction = new \yii\web\JsExpression(
    "function addField() {
        document.getElementById(\"test-form\").innerHTML += \"<?php echo $formField; ?>\";
    }; 
    addField();"
);

echo Html::button(
    'Add element',
    [
        'class' => 'btn btn-primary',
        'onclick' => $JsFunction,
    ]
);
?>

奇怪的是,如果我在innerHTML中放入一個像"<p>hello!</p>"這樣的字符串,它就可以完美地工作。 另一個奇怪的事情是,如果我輸入“ php echo”命令生成的HTML代碼,

'<input type=\"text\" id=\"dynamicform-elements\" class=\"form-control\" name=\"DynamicForm[elements][]\">'

它仍然有效!

盡管我認為輸入Yii::ActiveForm手動HTML代碼並不是一個很好的習慣,但這就是為什么我希望PHP能夠做到這一點。

先感謝您!

鑒於

$this->registerJs("addField(". $formField  .")", 3);
$this->registerJsFile('/js/file.js', ['position' => 3]);

在file.js中

"function addField(variable) {
    document.getElementById("test-form").innerHTML += variable;
}; 

在JavaScript文件中,您可以使用構造函數的參數創建類,以更好地自定義類。 例如

var class = function (config) {
        this.var1= config;

function addField() {
        document.getElementById("test-form").innerHTML += this.var1;
    }
};

以及在View PHP中;

$this->registerJs("var addField = new Class(".\yii\helpers\Json::encode($same_array).")", 3); 

我終於設法解決了這個問題,這是PHP的html生成代碼的某些字符存在的問題。 如果我做:

$formField = $form->field($model, 'elements[]', []);
$formField = str_replace(["\r\n", "\n", "\r"], ' ', $formField);
$formField = str_replace(["\""], '\'', $formField);
$this->registerJs('var addField = function(field) {
    form = document.getElementById(\'my-form\');
    form.innerHTML += field;
};', View::POS_HEAD);

echo Html::button(
    'Add keyword',
    [
        'id' => 'myButton',
        'class' => 'btn btn-primary',
        'onclick' => 'addField("' . $formField . '")',
    ]
);

...完美地工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM