【问题标题】:How to use Zend ProgressBar in a Zend MVC application如何在 Zend MVC 应用程序中使用 Zend ProgressBar
【发布时间】:2012-01-16 17:42:28
【问题描述】:

我一直在尝试在 Zend MVC 应用程序中使用 JsPush Zend 进度条,但没有成功。我使用 github 上的 JsPush.php 示例创建了一个独立的进度条测试应用程序,但这不使用 Zend MVC 框架。当我应用 JsPush 示例程序中的 CSS、HTML、JavaScript 和 PHP 代码时,我看到我的进度条出现(CSS 工作),但在我的套接字写入过程中我没有得到任何结果。我已经在链接到我的应用程序的 css 文件中逐字使用了 JsPush CSS 代码,所以我不会在这里重复。以下是我的 MVC 应用程序的节选,控制器代码:

protected function _sendFile($job)
{
    $fp = fopen($job->source_file, "rb");
    if($fp == null || $fileData['size'] == 0) {
        $this->view->errorMessage = 'Error - file open failed for ' . $job->source_file;
        return false;
    }

    $this->totalXmitSize = $fileSize;
    $this->currentXmitSize = 0;
    $progressMessage = '';

    $adapter = new Zend_ProgressBar_Adapter_JsPush(array
        ('updateMethodName' => 'Zend_ProgressBar_Update',
         'finishMethodName' => 'Zend_ProgressBar_Finish'));
    $progressBar = new Zend_ProgressBar($adapter, 0, $this->totalXmitSize);

    while(!feof($fp)) {
        $blkSize = ($fileSize > 1024) ? 1024 : $fileSize;
        $xmitBuf = fread($fp, $blkSize);

        if($xmitBuf === false || !strlen($xmitBuf)) {
            $this->view->errorMessage = 'Error - file open failed for ' . $job->source_file;
            return false;
        }

        if($this->_writeData($xmitBuf, $blkSize) == false) {
            return false;
        }

        $fileSize -= $blkSize;
        $this->currentXmitSize += $blkSize;
        $progress = $this->_calculateXmitProgress();

        if($progress < 25) {
            $progressMessage = 'Just beginning';
        } elseif($progress < 50) {
            $progressMessage = 'less than half done';
        } elseif($progress < 75) {
            $progressMessage = 'more than half done';
        } else {
            $progressMessage = 'almost done';
        }

        $progressBar->update($this->currentXmitSize, $progressMessage);

        if($fileSize <= 0) {
            break;
        }
    }
    fclose($fp);
    $xmitBuf = '';
    $bufLen = 0;

    if($this->_readData($xmitBuf, $bufLen) === false) {
        return false;
    }

    $progressBar->finish();
    if(strncmp($xmitBuf, MSG_STATUS_OK, strlen(MSG_STATUS_OK)) != 0) {
        $this->view->errorMessage = 'Error - invalid response after file transfer complete';
        return false;
    }

    return true;
}

查看代码:

<?php
$this->title = "My Title";
$this->headTitle($this->title);
$this->layout()->bodyScripts = 'onload="startProgress();"';
?>
<p class="errors"> <?php echo $this->errorMessage ?> </p >
<?php echo $this->form->setAction($this->url());
?>

<div id="progressbar">
    <div class="pg-progressbar">
        <div class="pg-progress" id="pg-percent">
            <div class="pg-progressstyle"></div>
            <div class="pg-invertedtext" id="pg-text-1"></div>
        </div>
        <div class="pg-text" id="pg-text-2"></div>
    </div>
</div>
<div id="progressBar"><div id="progressDone"></div></div>

layout.phtml 代码:

function startProgress()
{
    var iFrame = document.createElement('iframe');
    document.getElementsByTagName('body')[0].appendChild(iFrame);
    iFrame.src = 'MyController.php';
}

function Zend_ProgressBar_Update(data)
{
    document.getElementById('pg-percent').style.width = data.percent + '%';
    document.getElementById('pg-text-1').innerHTML = data.text;
    document.getElementById('pg-text-2').innerHTML = data.text;
}

function Zend_ProgressBar_Finish()
{
    document.getElementById('pg-percent').style.width = '100%';
    document.getElementById('pg-text-1').innerHTML = 'done';
    document.getElementById('pg-text-2').innerHTML = 'done';
}
</script>

</head>
<body <?php echo $this->layout()->bodyScripts ?>>
<div>
    <h1><?php echo $this->escape($this->title); ?></h1>
    <?php echo $this->layout()->content; ?>
</div>

当它运行时,我在页面源代码中获得了大量 JavaScript,但没有任何进度结果:

<script type="text/javascript">parent.Zend_ProgressBar_Update({"current":0,"max":3397,"percent":0,"timeTaken":0,"timeRemaining":null,"text":null});</script><br />
<script type="text/javascript">parent.Zend_ProgressBar_Update({"current":1024,"max":3397,"percent":30.14424492199,"timeTaken":0,"timeRemaining":0,"text":"less than half done"});</script><br />                                                                              
<script type="text/javascript">parent.Zend_ProgressBar_Update({"current":2048,"max":3397,"percent":60.28848984398,"timeTaken":0,"timeRemaining":0,"text":"more than half done"});</script><br />
<script type="text/javascript">parent.Zend_ProgressBar_Update({"current":3072,"max":3397,"percent":90.43273476597,"timeTaken":0,"timeRemaining":0,"text":"almost done"});</script><br />
<script type="text/javascript">parent.Zend_ProgressBar_Update({"current":3397,"max":3397,"percent":100,"timeTaken":0,"timeRemaining":0,"text":"almost done"});</script><br />
<script type="text/javascript">parent.Zend_ProgressBar_Finish();</script><br />

所有这些 JavaScript 都会将我的表单推到视野之外。我在 Zend 文档站点上花费了几天时间并在网上搜索以找到有人在 MVC 框架应用程序中成功使用 Zend ProgressBar 的示例,但找不到任何工作示例。提前感谢您的帮助。

【问题讨论】:

    标签: zend-framework progress-bar


    【解决方案1】:

    我已经成功地让 JsPush 进度条在某种程度上工作,但对于我的应用程序来说并不是 100% 正确。

    进度条有效,但表单结果最终出现在隐藏的 iframe 中。无法访问该 iframe 上的提交按钮,因此我的用户必须使用后退按钮才能退出表单。

    让进度条工作的唯一方法是使用表单中的 target 属性并将其分配给 iframe 的 name 属性。如果我不使用目标属性,则每次调用progressBar-&gt;update; 时表单都会滚动。所以我的表单结果最终出现在父页面上,向下滚动了几百行,滚动条永远不会起作用。

    我尝试使用 Zend 文档中的示例,但它不起作用。这是我第一次尝试 Zend 框架,它非常令人沮丧和失望。对我 28 天前的原始问题没有任何回应。

    【讨论】:

      【解决方案2】:

      我有同样的问题。对我来说,因为我做了以下步骤,所以它很有效。 到 php.ini 看看你的 php.ini 中是否设置了以下数据。

      • output_buffering = 关闭
      • ;output_handler =
      • zlib.output_compression = 关闭
      • ;zlib.output_handler =

      然后转到 Zend_ProgressBar_Adapter_JsPush 类并找到方法 - 位于底部 - _outputData。删除此方法中的所有内容并输入

      // 1024 padding is required for Safari, while 256 padding is required
          // for Internet Explorer. The <br /> is required so Safari actually
          // executes the <script />
          echo str_pad($data . '', 1024, ' ', STR_PAD_RIGHT) . "\n";
      
          echo(str_repeat(' ',256));
          if (ob_get_length()){
              @ob_flush();
              @flush();
              @ob_end_flush();
          }
          @ob_start();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-29
        • 1970-01-01
        • 1970-01-01
        • 2012-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多