Dołączanie pliku problem

Witam

Mam problem

W widoku po dodaniu danych do bazy wyświetlam te dane i dodaje kontrolkę formularza do załączenia pliku pdf lub obrazu (skanu).

Ładnie wyświetla i niby działa, jednak coś skaszaniłem w kontrolerze i nic mi nie zapisuje na serwerze oraz w bazie.

Założenie jest takie że w bazie ma zapisać Id równe wyświetlanym danym klienta oraz ścieżkę do pliku. Nie wiem czy skopałem coś z plikiem czy z bazą (AR)

oto kodzik:

Kontroler


public function actionView($id) {

		$klient = new Clients;

		$Model=$klient::model()->findByPK($id);

		$Faktura = new Faktura;

		$upload=false;

		if (isset($_POST['Faktura']))

		{

			$dir=Yii::getPathOfAlias('application.faktury');

			$Faktura->attributes=$_POST['Faktura'];

            $Faktura->file=CUploadedFile::getInstance($Faktura,'faktura');

			if($Faktura->validate())

			{

				$mInvoce = new Invoice;

				foreach($files as $file)

				{

				$patch=$dir.'/'.$faktura->getName();

				$mInvoce->clients_id_clients=$id;

				$mInvoce->ipath=$patch;

				if($mInvoce->save())

				$upload=$Faktura->file->saveAs($patch);

				}

			}

		}

		$this->render('view', array(

			'model' => $Model,

		));

	}



Zmienna $files nie jest zainicjowana.

Coś więcej naknociłem bo nawet echo nie działa ( z tego co pamietam powinno mi wywalic cokolwiek ponad strona ?)


if (isset($_POST['Faktura']))

		{

			echo "przesłałem dane";

			$dir=Yii::getPathOfAlias('application.faktury'); //Ścieżka do katalogu

			

			$Faktura->attributes=$_POST['Faktura'];

			

            $Faktura->file=CUploadedFile::getInstance($Faktura,'faktura');

			if($Faktura->validate())

			{

				echo "weszłem w walidacje";

				$mInvoce = new Invoice;

				//foreach($files as $file)

				//{

				$patch=$dir.'/'.$faktura->getName();

				$mInvoce->clients_id_clients=$id;

				$mInvoce->ipath=$patch;

				//if($mInvoce->save())

				$upload=$Faktura->file->saveAs($patch);

				//}

			}

		}

[b]

Model[/b]


<?php


class Faktura extends CFormModel

{

	public $faktura;

	

	public function model($className=__CLASS__)

	{

		return parent::model($className);

	}

	/*

	public function tableName()

	{return 'clients';	

	}

	*/

	public function attributeLabels()

	{

		return array('faktura' => 'Faktura do załączenia' , );

	}

	

	public function rules()

	{

		return array(

		array('faktura', 'file', 'types'=>'jpg, gif, png, pdf'),

		);

	}	

}

?>

Nawet validacja nie idzie?

Pewnie w którymś momencie nie przechodzi walidacja - nigdzie nie wyświetlasz błędów, więc nawet o tym nie wiesz. Spróbuj wyświetlić błędy z $Faktura i $mInvoice, to zobaczysz co jest nie tak.

Poza tym kod-spaghetti - nie wiadomo co się dzieje, nie wiadomo skąd się biorą niektóre wartości ($files), nie wiadomo po co są inne ($upload), a formatowanie kodu niemal nie istnieje.

Takie są początki jak “Kucharz” umie gotować tylko makaron ;D ale dzięki radom kolegów zrobię kiedyś Capressi:D

Mam podejrzanego ;D

Kontroler


if (isset($_POST['Clients_faktura']))

Widok po generowaniu


<form enctype="multipart/form-data" id="faktura-form" action="/EnergyVer1/pracownik/11" method="post"><label for="Clients_faktura">Faktura</label><input id="ytClients_faktura" type="hidden" value="" name="Clients[faktura]"><input name="Clients[faktura]" id="Clients_faktura" type="file"><input type="submit" name="yt0" value="Submit"></form>

Teraz to jest mielonka:D

Kontroler


public function actionView($id) {

		$klient = new Clients;

		$Model=$klient::model()->findByPK($id);

		$Faktura = new Faktura;

		$mInvoce = new Invoice;

		$mInvoce->clients_id_clients=$id;

		$upload=false;

		$walidacja=false;

		

		if (isset($_POST['Clients']))

		{

			

			$dir=Yii::getPathOfAlias('application.faktury'); //Ścieżka do katalogu

			

			$Faktura->attributes=$_POST['Clients'];

			

            $Faktura->faktura=CUploadedFile::getInstance($Faktura,'faktura');

			//if($Faktura->validate())

			//{

				echo "weszłem w walidacje";

				echo "Dir =".$dir;

				$patch=$dir.'/'.$Faktura->faktura->getName();

				echo 'Stworzyłem scieżkę'.$patch;

				$mInvoce->ipath=$patch;

				if($mInvoce->save())

				$upload=$Faktura->file->saveAs($patch);

				echo 'Upload='.$upload;

			//}else{$walidacja=true;}


		}

		$this->render('view', array(

			'model' => $Model,

			'upload'=> $upload,

			'walidacja'=> $walidacja

		));

	}

Model


<?php


class Faktura extends CFormModel

{

	public $faktura;

	

	public function model($className=__CLASS__)

	{

		return parent::model($className);

	}

	

	public function rules()

	{

		return array(

		array('faktura', 'file', 'types'=>'jpg, gif, png, pdf'),

		);

	}	

}

?>

I tak:

wyłączyłem walidację bo nawet jak wysyłam jpg, czy pdf to nie przechodzi walidacji :( ??

A po wyłączeniu dochodzi do wyświetlenia ścieżki komenda echo


 echo "Dir =".$dir;

i koniec…

Macie pomysł na Bolones?

W index.php ustaw YII_DEBUG na true, a w ustawieniach PHP zmień raportowanie błędów na E_ALL. Prawdopodobnie skrypt ci się wykłada w którymś momencie, ale masz ukryte wszystkie błędy.

Po drugie przestań mieszać modele. Jak to możliwe że w formularzu używasz modelu Clients, a w walidacji Faktura? Najlepiej zacznij od stworzenia 2 osobnych widoków rozdzielających te funkcjonalności, i dopiero jak to zacznie działać spróbuj je skleić, bo mieszasz jedno z drugim.

Hmm

Mam 3 modele:

Clients - > żeby wyświetlić widok z danymi klienta

Faktura -> żeby pracować nad ładowaniem pliku

Invoice -> żeby dodać ścieżkę i numer klienta do tabeli invoice

Co do raportowania w Yii mam włączone i nic tym razem nie krzyczy, po prostu staje. Jak się dowiem jak włączyć raport na serwerze (ze względów technicznych nie robię tego lokalnie tylko na serwerze na hostingu)

A staje na $Faktura->faktura->getName(); wiec cos z tym jest nie halo tylko co?

Ścieżka jest prosta dodaje klienta, wyrzuca mi widok z danymi klienta i wtedy na dole mam przycisk do załadowania pliku.


<h1>Dodano klienta o numerze <?php echo $model->id_clients; ?></h1>


<?php $this->widget('zii.widgets.CDetailView', array(

	'data'=>$model,

	'attributes'=>array(

		'id_clients',

		'cName',

		'cFirstName',

		'cPhone',

		'cEmail',

		'cNIP',

		//'status_id_status',

		array(

			'name' => 'statusIdStatus',

			'type' => 'raw',

			'value' => $model->statusIdStatus !== null ? GxHtml::link(GxHtml::encode(GxHtml::valueEx($model->statusIdStatus)), array('status/view', 'id' => GxActiveRecord::extractPkValue($model->statusIdStatus, true))) : null,

			),

		'create_date',

		

	),

)); ?>

<br>

<div class="form">

<h1>Dodaj pliki z fakturami, przynajmniej jeden</h1>

<?php if($upload):?>

	<p>Dodano Fakturę</p>

<?php endif ?>

<?php if($walidacja):?>

	<p>Dodany plik nie jest w prawidłowym formacie</p>

<?php endif ?>




<?php $form = $this->beginWidget('GxActiveForm', array(

	'id' => 'faktura-form',

	'enableAjaxValidation' => false,

	'htmlOptions' => array('enctype' => 'multipart/form-data'),

));


	echo $form->labelEx($model, 'faktura');

	echo $form->fileField($model, 'faktura');

	echo $form->error($model, 'faktura');

	

	echo CHtml::submitButton('Submit');

	$this->endWidget();

?>



A dla czego formularze mi się pomieszały? Nie wiem. Yii miał być "Yes it is" i tak go traktuje;)

I tak bardziej Mi się podoba od CI


Fatal error: Call to a member function getName() on a non-object in .../protected/controllers/PracownikController.php on line 87

Czyli to co wiedziałem wcześniej tylko czemu nie tworzy obiektu?


$Faktura->attributes=$_POST['Clients'];

			var_dump($Faktura->attributes);

			echo "<br><br>";

            $Faktura->faktura=CUploadedFile::getInstance($Faktura,'faktura');

			var_dump($Faktura->faktura);

			echo "<br><br>";

Daje:


array(1) { ["faktura"]=> NULL } 


NULL 

Powtórzę się: formularz utwórz na podstawie modelu Faktura, waliduj go tym modelem i wtedy sprawdzaj czy ci działa. Obecnie masz pomieszanie z poplątaniem, zdziwiłbym się, gdyby coś zadziałało ;)

A może Cię zdziwię;)

błąd który był od początku:

Zamiast


 $this->render('view', array(

                        'model' => $Model,

                        'upload'=> $upload,

                        'walidacja'=> $walidacja

                ));

w kontrolerze, oraz


 echo $form->labelEx($model, 'faktura');

        echo $form->fileField($model, 'faktura');

        echo $form->error($model, 'faktura');

w widoku

Miałem użyć:

w kontrolerze


$this->render('view', array(

			'Client' => $Model,

			'Faktura' => $Faktura,

			'upload'=> $upload,

			'walidacja'=> $walidacja

		));

a w widoku:


echo $form->labelEx($Faktura, 'faktura');

	echo $form->fileField($Faktura, 'faktura');

	echo $form->error($Faktura, 'faktura');

Dzięki za naprowadzenie, co dwie głowy (lub więcej) to nie jedna. Jeszcze nie raz rzucę na forum spageti:D bo kiedy widze na forum to nawet jak ktoś nie znajdzie mojego błędu (lub znajdzie inne) to jakoś Mi się lepiej myśli:D i znajduje robaczka:D

A że lubię skakać na Banji:D (Yii używam od daty rejestracji na forum) to na pewno tu jeszcze trochę powsadzam:D