BorisMor
(Borismor)
1
Добрый день!
Есть 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>
andy_s
(Arekandrei)
4
Меня не напрягает вставлять в небольшие куски js значение php переменной, я делаю примерно так:
$url = $this->createUrl(...);
$js = <<<JS
$.get('$url', {...}, function(data) { ... });
JS;
registerScript('my-script', $js);
Если код побольше, то удобно сделать в виде jquery плагина, например. По желанию можно сделать к нему ещё и класс, подобный CJuiDialog и т.п.
BorisMor
(Borismor)
5
Да все правильно угадали.
Были уже казусы: При натягивание дизайна на функционал человек не разобрался и перенес js функцию в файл.
BorisMor
(Borismor)
6
Читабельность кода теряется т.к. подсветки js нету.
Говорю так потому что сам подобное применял)
andy_s
(Arekandrei)
7
В PhpStorm внутри таких конструкций подсветка замечательно работает, только поэтому я и “не парюсь”
А я просто хелпер для себя сделал, теперь так пишу, например:
<? JS::begin() ?>
<script>
var a = ...;
function b() { ... }
</script>
<? JS::end() ?>
В самом хелпере куски теги script откусываются, остальное отправляется в POS_READY.
И подсветка есть, и код работает, и вообще всё круто.
ineersa
(Ineersa)
9
Я не парюсь и передаю параметром. Если для прелоада на страницах, пишу прямо в 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.