Uploadify Custom Widget

Salve a tutti, sono nuovo nel forum e soprattutto nell’ambiente Yii che trovo fantastico.

Il mio problema è il seguente:

Devo permettere all’utente di caricare più immagini relative ad un prodotto, ho creato sia la tabella prodotto,

che la tabella ImmagineProdotto.

Ovviamente ho dovuto utilizzare i tabular input come indicato in questo articolo (http://www.yiiframew…1/en/form.table).

Inoltre, avendo utilizzando uploadify, ho seguito quasi alla lettera il seguente post (http://www.yiiframew…r-a-js-library/) che indica come creare un widget, per mia fortuna prendendo come esempio uploadify.

Il tutto funziona correttamente, i file vengono caricati sul server, l’array post contiene tutto ciò che deve contenere.

C’è solo un problema, quando seleziono un file, l’attributo path(che contiene percorso del file) è totalmente vuoto. Non viene riempito nemmeno con il solo nome del file.

Questo è il codice del widget:




<?php


/*

 * To change this template, choose Tools | Templates

 * and open the template in the editor.

 */


/**

 * Description of MyUploadify

 *

 * @author boss

 */

class MyUploadify extends CInputWidget {


    

    public $options = array();

    

    public function run() {

        

        $assetsFolder = Yii::app()->assetManager->publish(

                Yii::getPathOfAlias('application.components.assets.uploadify')

        );

        Yii::app()->clientScript->registerCssFile($assetsFolder . '/uploadify.css');

        //Yii::app()->clientScript->registerScriptFile($assetsFolder . '/swfobject.js');

        Yii::app()->clientScript->registerScriptFile(

                $assetsFolder . '/jquery.uploadify-3.1.min.js'

        );

        Yii::app()->clientScript->registerCoreScript('jquery');

        

        

        $options= CJavaScript::encode(array_merge(

            array(

                            "swf"      => $assetsFolder . "/uploadify.swf",

                            "uploader" => $assetsFolder . "/uploadify.php",                            

                            "removeCompleted" => false,

                            "multi"=>false,

                            "auto" => false,

                            "uploadLimit" => 1,

                            "maxQueueSize"=>  1, 

                            "buttonCursor" => "hand",

                            "method"  => "post",

                            "fileObjName" => "productImg",

                            "buttonText"=> "Seleziona",

                            "checkExisting"=> $assetsFolder . "/check-exists.php", 

            ),

            $this->options

        ));

        

        

        if (isset ($this->htmlOptions['id']))

            $id = $this->htmlOptions['id'];

        else

            $id= CHtml::activeId($this->model, $this->attribute);

   	

 

        Yii::app()->clientScript->registerScript($id,   "$('#$id').uploadify({$options});");

        


        echo CHtml::activeFileField($this->model, $this->attribute, $this->htmlOptions);

        

        

    }


}


?>



E questo è invece il frammento di codice nella view:




<?php

            for ($i=1; $i<=count($immaginiProdotto);$i++) {

                ?>        

                <div class="row">                                            

                    <?php 

                        $this->widget('MyUploadify', array(                          

                          'model' => $immaginiProdotto["$i"],

                          'attribute'=>"[$i]path",                          

                          "htmlOptions"=>array(

                                'id' => 'Prodotto_immagine_' . $i,

                        )

                    ));                

                    ?>



Questo è invece quello che vedo a video se faccio un vardump dell’array post, anche dopo aver fatto l’upload di tutti e 4 le immagini (per il momento ne sono previste 4, ma potrebbero variare nel tempo)




'ImmagineProdotto' => 

    array

      1 => 

        array

          'path' => string '' (length=0)

      2 => 

        array

          'path' => string '' (length=0)

      3 => 

        array

          'path' => string '' (length=0)

      4 => 

        array

          'path' => string '' (length=0)



Infine e scusate davvero tanto la lunghezza del post, questo è quello che viene generato da yii per quello che riguarda il codice html:




<div class="row">                                         	

  <input id="ytProdotto_immagine_1" type="hidden" value="" name="ImmagineProdotto[1][path]" />

  <input id="Prodotto_immagine_1" name="ImmagineProdotto[1][path]" type="file" />                                                          

  <div class="errorMessage" id="ImmagineProdotto_path_em_" style="display:none"></div> 

  <a style='color:red;'  href='javascript:jQuery("#Prodotto_immagine_1").uploadify("upload")'>Avvia il   Caricamento</a>

</div>



Qualcuno sa spiegarmi perchè l’attributo path non viene riempito?? Inoltre perchè in automatico viene inserito il prefisso yt nell’html?

Grazie mille in anticipo e rinnovo le mie scuse per la lunghezza del post.

Così dando una lettura veloce al codice quel :


'model' => $immaginiProdotto["$i"],

'attribute'=>"[$i]path",



prova a scriverlo così:


'model' => $immaginiProdotto[$i],

'attribute'=>[$i]path, //cosa sarebbe stò [$i]path ??!?!



i caratteri ‘yt’ li mette Yii ai dom generati in automatico. Posta qui il


var_dump($immaginiProdotto);

che iniziamo da lì … :)

Devi sapere che se inserisci in una stringa delimitata da doppi apici una variabile, questa viene resa:




$i = 33;

echo "$i"; // stamperà 33



In sostanza scrivere


$variabile["$i"];

è equivalente a scrivere


$variabile[$i];

Pero nel primo caso ("$i") il codice risulta meno leggibile.

Che versione hai di PHP?