【问题标题】:Yii2 Button onclick JsExpression which contains PHPYii2 Button onclick JsExpression 包含 PHP
【发布时间】:2017-03-08 16:20:24
【问题描述】:

我想提交一个表单,其字段是一个未知数量元素的数组。

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 中放入一个类似"&lt;p&gt;hello!&lt;/p&gt;" 的字符串,它就可以完美运行。另一个奇怪的是,如果我把'php echo'命令生成的HTML代码,

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

它仍然有效!

虽然我认为为Yii::ActiveForm 手动输入 HTML 代码并不是一个很好的做法,但这就是我希望 PHP 来完成这项工作的原因。

提前感谢您!

【问题讨论】:

标签: javascript php html yii2 yii2-advanced-app


【解决方案1】:

在视图中;

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

在文件.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;
    }
};

并在查看 PHP;

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

【讨论】:

  • 不幸的是,这不起作用。我在 $this-&gt;registerJs("addField(". $formField .")", 3); 中收到“意外令牌
【解决方案2】:

我终于设法解决了这个问题,这是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 . '")',
    ]
);

...完美运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多