2012-01-16 2 views
2

J'ai essayé d'utiliser la barre de progression JsPush Zend dans une application Zend MVC, mais je n'ai pas réussi. J'ai utilisé l'exemple JsPush.php trouvé sur github pour créer une application de test de barre de progression autonome, mais cela n'utilise pas le framework Zend MVC. Lorsque j'applique le code CSS, HTML, JavaScript et PHP du programme exemple JsPush, je vois ma barre de progression apparaître (le CSS fonctionne) mais je n'obtiens aucun résultat lors de mon processus d'écriture de socket. J'ai utilisé le code CSS JsPush verbatim dans un fichier css qui est lié à mon application, donc je ne le répéterai pas ici. Voici exerpts de mon application MVC, le code du contrôleur:

Comment utiliser Zend ProgressBar dans une application Zend 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; 
} 

Le code de la vue:

<?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> 

Le code 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> 

Lorsque cela fonctionne, je reçois une tonne de JavaScript dans la source de la page, mais pas de progrès r ésultats:

<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 /> 

Tout cela JavaScript pousse ma forme hors de la vue. J'ai passé des jours sur le site de documentation Zend et parcouru le web pour trouver des exemples de quelqu'un qui utilise Zend ProgressBar avec succès dans une application de framework MVC, mais ne trouve aucun exemple de travail. Merci d'avance pour votre aide.

Répondre

0

Eh bien, j'ai réussi à obtenir une barre de progression JsPush pour fonctionner dans une certaine mesure, mais pas 100% correct pour mon application.

La barre de progression fonctionne, mais les résultats du formulaire se retrouvent dans le cadre iframe masqué. Il n'y a aucun moyen d'accéder aux boutons de soumission sur cette iframe, donc mon utilisateur doit utiliser le bouton de retour pour sortir du formulaire. La seule façon de faire fonctionner la barre de progression consiste à utiliser l'attribut target dans le formulaire et à l'affecter à l'attribut name de l'iframe. Si je n'utilise pas l'attribut target, le formulaire défile pour chaque appel à progressBar->update;. Ainsi, les résultats de mon formulaire se retrouvent sur la page parent plusieurs centaines de lignes défilent et la barre de défilement ne fonctionne jamais.

J'ai essayé d'utiliser l'exemple de la documentation de Zend, mais cela ne fonctionne pas. C'est ma première expérience dans le framework Zend et cela a été très frustrant et décevant. Pas une seule réponse à ma question initiale d'il y a 28 jours.

0

J'ai eu le même problème. Pour moi cela a fonctionné depuis que j'ai fait les étapes suivantes. Accédez à php.ini et vérifiez si les données suivantes sont définies dans votre fichier php.ini.

  • output_buffering = Off
  • ; output_handler =
  • zlib.output_compression = Off
  • ; zlib.output_handler =

Ensuite, allez à la classe Zend_ProgressBar_Adapter_JsPush et trouver la méthode - qui est à le fond - _outputData.Supprimer tout dans cette méthode et entrer

// 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();