Как использовать Zend ProgressBar в приложении Zend MVC - PullRequest
2 голосов
/ 16 января 2012

Я пытался использовать индикатор выполнения JsPush Zend в приложении Zend MVC, но безуспешно. Я использовал пример JsPush.php, найденный на github, для создания автономного тестового приложения индикатора выполнения, но в нем не используется инфраструктура Zend MVC. Когда я применяю код CSS, HTML, JavaScript и PHP из примера программы JsPush, я вижу, как появляется индикатор выполнения (работает 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 и в поисках в Интернете, чтобы найти примеры того, кто успешно использует Zend ProgressBar в приложении MVC Framework, но не могу найти никаких рабочих примеров. Заранее спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 09 марта 2012

У меня была такая же проблема.Для меня это сработало, так как я сделал следующие шаги.Перейдите в php.ini и проверьте, установлены ли следующие данные в вашем php.ini.

  • output_buffering = Off
  • ; output_handler =
  • zlib.output_compression= Off
  • ; 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();
0 голосов
/ 21 февраля 2012

Что ж, мне удалось заставить работать индикатор выполнения JsPush до некоторой степени , но не на 100% правильно для моего приложения.

Индикатор выполнения работает, но результаты формы оказываются в скрытом фрейме.Невозможно получить доступ к кнопкам отправки в этом iframe, поэтому мой пользователь должен использовать кнопку назад, чтобы выйти из формы.

Единственный способ заставить работать индикатор выполнения - это использовать целевой атрибут в форме и назначить его атрибуту имени в iframe.Если я не использую целевой атрибут, форма прокручивает для каждого вызова progressBar->update;.Таким образом, результаты моей формы оказываются на родительской странице с прокруткой вниз на несколько сотен строк, и полоса прокрутки никогда не работает.

Я пытался использовать пример из документации Zend, но он не работает.Это мое первое предприятие в рамках Zend, и оно было очень разочаровывающим и разочаровывающим.Ни одного ответа на мой оригинальный вопрос от 28 дней назад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...