Использование JavaScript с Yii (диаграммы XWF / SWF) - PullRequest
3 голосов
/ 22 августа 2010

Я пытаюсь загрузить XML / SWF Charts с помощью Yii, но у меня возникли некоторые проблемы.Насколько я могу судить, проблема заключается в том, что Yii загружает теги скрипта в заголовок.

Вот как выглядит исходный код из заголовка, сгенерированного моим рабочим скриптом test.php (без Yii).

<HTML>
<script language="javascript">
/*<![CDATA[*/
AC_FL_RunContent = 0;
DetectFlashVer = 0;
var requiredMajorVersion = 10;
var requiredMinorVersion = 0;
var requiredRevision = 45;
/*]]>*/
</script>
<script src="AC_RunActiveContent.js" language="javascript"></script>
<BODY bgcolor="#FFFFFF">

Теперь я пытаюсь заставить Yii выполнитьто же самое, используя этот код.

<code><?php
Yii::app()->clientScript->registerScript('AC_FL_RunContent', 'AC_FL_RunContent = 0;', CClientScript::POS_HEAD);
Yii::app()->clientScript->registerScript('DetectFlashVer', 'DetectFlashVer = 0;', CClientScript::POS_HEAD);
Yii::app()->getClientScript()->registerScriptFile($chartUrl.'/AC_RunActiveContent.js'); 
Yii::app()->clientScript->registerScript('DetectFlashVer', 
'
var requiredMajorVersion = 10;
var requiredMinorVersion = 0;
var requiredRevision = 45;
', CClientScript::POS_HEAD);
?>

И вот что я получаю

<code><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="language" content="en" />
<link rel="stylesheet" type="text/css" href="/css/main.css" />
<link rel="stylesheet" type="text/css" href="/css/form.css" />
<link rel="stylesheet" type="text/css" href="/css/components.css" />
<link rel="stylesheet" type="text/css" href="/css/pages.css" />
<script type="text/javascript" src="/assets/e5f807c3/AC_RunActiveContent.js"></script>
<script type="text/javascript">
/<em><![CDATA[</em>/
AC_FL_RunContent = 0;
DetectFlashVer = 0;</p>

<p>var requiredMajorVersion = 10;
var requiredMinorVersion = 0;
var requiredRevision = 45;</p>

<p>/<em>]]></em>/
</script>
</head>
<body>

Кажется, проблема заключается в расположении строки, которая загружает AC_RunActiveContent.js.Когда я перемещаю его выше других переменных в моем тестовом скрипте, он ломает тестовый скрипт.Есть ли способ заставить Yii написать команды в том порядке, в котором я их хочу?

ОБНОВЛЕНИЕ 8/23/10 - РЕШЕНО !!!

С Grey Teardrop'sпредложения я смог получить это работает.Учитывая, что я боролся с этим уже несколько дней, я решил опубликовать полное решение для других.

Во-первых, у меня установлены диаграммы XML / SWF в protected/vendors/Maani

show.php(представление, содержащее диаграмму)

<code><?php
$chartPath=Yii::getPathOfAlias('application.vendors.Maani.*');
$chartUrl=Yii::app()->getAssetManager()->publish($chartPath);</p>

<p>Yii::app()->clientScript->registerScript('AC_FL_RunContent', 'AC_FL_RunContent = 0;', CClientScript::POS_HEAD);
Yii::app()->clientScript->registerScript('DetectFlashVer', 'DetectFlashVer = 0;', CClientScript::POS_HEAD);
Yii::app()->clientScript->registerScript('Morestuff', 
'
var requiredMajorVersion = 10;
var requiredMinorVersion = 0;
var requiredRevision = 45;
', CClientScript::POS_HEAD);
Yii::app()->getClientScript()->registerScriptFile($chartUrl.'/AC_RunActiveContent.js',CClientScript::POS_BEGIN); 
?></p>

<p><?php $chart = "<chart><chart_type>bar</chart_type><chart_border color='FF0000' /></chart>"; ?></p>

<p><script language="JavaScript" type="text/javascript">
/<em><![CDATA[</em>/
if (AC_FL_RunContent == 0 || DetectFlashVer == 0) {
    alert("This page requires AC_RunActiveContent.js.");
} else {
    var hasRightVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
    if(hasRightVersion) { 
        AC_FL_RunContent(
            'codebase', '<a href="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,45,2" rel="nofollow noreferrer">http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,45,2</a>',
            'width', '400',
            'height', '250',
            'scale', 'noscale',
            'salign', 'TL',
            'bgcolor', '#777788',
            'wmode', 'opaque',
            'movie', 'charts',
            'src', '<?php echo $chartUrl; ?>/charts',
            'FlashVars', "library_path=<?php echo $chartUrl; ?>/charts_library&xml_data=<?php echo $chart; ?>", 
            'id', 'my_chart',
            'name', 'my_chart',
            'menu', 'true',
            'allowFullScreen', 'true',
            'allowScriptAccess','sameDomain',
            'quality', 'high',
            'align', 'middle',
            'pluginspage', '<a href="http://www.macromedia.com/go/getflashplayer" rel="nofollow noreferrer">http://www.macromedia.com/go/getflashplayer</a>',
            'play', 'true',
            'devicefont', 'false'
            ); 
    } else { 
        var alternateContent = 'This content requires the Adobe Flash Player. '
        + '<u><a href=<a href="http://www.macromedia.com/go/getflash/" rel="nofollow noreferrer">http://www.macromedia.com/go/getflash/</a>>Get Flash</a></u>.';
        document.write(alternateContent); 
    }
}
/<em>]]></em>/

Обратите внимание, что требуется относительная информация о пути для src и FlashVars.

1 Ответ

2 голосов
/ 22 августа 2010

Насколько я могу судить, CClientScript поддерживает отдельный порядок блоков скриптов, зарегистрированных через registerScript(), и скриптов, зарегистрированных через registerScriptFile().Но он всегда будет отображать registerScript() после registerScriptFile().Есть 2 возможных способа выполнить вашу задачу:

  1. Поместите блоки скриптов в CClientScript::POS_HEAD и ссылки скриптов в CClientScript::POS_END.
  2. Унаследуйте свой собственный менеджер скриптов от CClientScript.
...