Путь До Ajax Запроса

Добрый день!

Есть JS функция в которую передается значение.

С этим значение надо произвести ajax запрос.


<?php $url_full_post = CHtml::normalizeUrl(array('/article/frontend/ajax_full', 'id'=>'_id_')); ?>


<script type="text/javascript">

    function getFullPost(id_post){

        str_url = "<?php echo $url_full_post; ?>";

        str_url = str_url.replace('_id_', id_post);


        jQuery.ajax({

            type: 'POST',

            url: str_url,

            success: function(data) {

                jQuery('#article-'+id_post).replaceWith(data);

            },

            error: function(XHR){

                console.log(XHR);

                data = "Ошибка при запросе!" +

                    "\n Код " + XHR.status +

                    "\n Запрос вернул: \n" + XHR.responseText;


                errorWin = window.open("data:text/html; charset=utf-8," + encodeURIComponent(data),"_blank", "width=1000,height=600");

                errorWin.focus();

            }

        });

    }

</script> 

В общем в js скрипте имеется инъекция php кода для получения URL до ajax.

Мне это не нравиться, но придумать как избежать этого не могу.

2 варианта

[list=1]

[*]Передавать URL в виде параметра - будет тоже некрасиво.

[*]Обернуть полностью ajax в yii - будет тоже некрасиво т.к. вызваться это не на одном элементе и yii нагенерит кучу однотипного js кода

[/list]

Как быть ?

А чем это плохо? Вы ж сами генерите строку урла, вряд ли понапихаете туда вредоносного )

Из php в js в любом случае передать можно только через echo.

Можно отказаться от нормализации урлов и использовать тупо /index.php?r=controller/action?id=…

Такие урлы меняются только с переименованием или перемещением контроллеров, так что проблем особо быть не должно.

Ну или свой js-роутер.

Кстати, я вроде понял, почему Вас это напрягает.

Такую конструкцию сложновато вынести в отдельный js-файл.

В этом случае достаточно просто обернуть всю js-движуху в класс, и при создании объекта передавать параметры.

Ну, типа,


<script type="text/javascript">

var o = new YourObject({url: "<?= CHtml::normalizeUrl(...) ?>"});

o.getFullPost(1);

</script>

Меня не напрягает вставлять в небольшие куски js значение php переменной, я делаю примерно так:




$url = $this->createUrl(...);

$js = <<<JS

$.get('$url', {...}, function(data) { ... });

JS;

registerScript('my-script', $js);



Если код побольше, то удобно сделать в виде jquery плагина, например. По желанию можно сделать к нему ещё и класс, подобный CJuiDialog и т.п. :)

Да все правильно угадали.

Были уже казусы: При натягивание дизайна на функционал человек не разобрался и перенес js функцию в файл.

Читабельность кода теряется т.к. подсветки js нету.

Говорю так потому что сам подобное применял)

В PhpStorm внутри таких конструкций подсветка замечательно работает, только поэтому я и “не парюсь” :D

А я просто хелпер для себя сделал, теперь так пишу, например:


<? JS::begin() ?>

<script>

var a = ...;

function b() { ... }

</script>

<? JS::end() ?>

В самом хелпере куски теги script откусываются, остальное отправляется в POS_READY.

И подсветка есть, и код работает, и вообще всё круто.

Я не парюсь и передаю параметром. Если для прелоада на страницах, пишу прямо в document.ready echo из php.

Сам себе верстальщик, так что проблем с непониманием нет.

P.S. товарищ ORey можно ли будет глянуть и утянуть хелпер? Вдруг кто то возьмет на фронтенд человека.

Ну, я вообще тупо сделал (и кстати это для второй версии), но суть такая:


<?php

/**

 * @link http://www.yiiframework.com/

 * @copyright Copyright (c) 2008 Yii Software LLC

 * @license http://www.yiiframework.com/license/

 */


namespace app\components;


use yii\base\Widget;

use yii\web\JqueryAsset;


class JS extends Widget

{

    /**

     * Starts recording a block.

     */

    public function init()

    {

        ob_start();

        ob_implicit_flush(false);

    }


    /**

     * Ends recording a code block.

     * This method stops output buffering and saves the result to js[].

     */

    public function run()

    {

        $code = ob_get_clean();

        $code = preg_replace('/<\/?script[^>]*>/', '', $code);

        $this->view->registerJs($code);

    }

}

Собственно, единственная смысловая строчка здесь - $this->view->registerJs($code). В нее же можно передавать параметры при желании.

В версии 1 для таких целей можно доработать CClipWidget.