dodawanie zdjec w cakePHP

0

Witam serdecznie,

mam jedno pytanko, nie wiem jak zrobić dodawanie zdjęć . Działa mi wyświetlanie i edycja. Jednak stoje na dodawaniu :(

components przestawia się następująco:

<?php class PhotosController extends AppController    {  
  var $name = 'Photos';
  var $uses = array('Photo', 'Person');

   function admin_index()  {
        $photos = $this->Photo->find('all');
	$this->set(compact('photos'));
    }

    function index() {
	$photos = $this->Photo->find('all');
    
	if (isset ($this->params['requested'])) {
		return $photos;
    }
    
    $this->Photo->recursive = 0;
    $this->set('photos', $this->paginate());    
    
  }
    
    function admin_add(){
	if (!empty($this->data)) {
		
        $this->Photo->create();
	   if ($this->Photo->save($this->data))    {
		 
            $this->Session->setFlash('zdjecie zostalo dodane !', 'adflash', array('class' => 'success'));
	    $this->redirect(array('action' => 'index'));
		 
	   }  else   {
	      $this->Session->setFlash('zdjecie nie zostalo dodane !', 'adflash', array('class' => 'error'));
	   }
	}
         $people = $this->Person->find('list');
         $this->set(compact('people'));		
    }    
}
?>

model:

  • w tabeli Photos jest relacja do tabeli people
<?php
class Photo extends AppModel {

 var $belongsTo = array(
    'Person' => array(
    'className' => 'Person',
    'foreignKey' => 'person_id',
    'conditions' => '',
    'fields' => '',
    'order' => ''
  ));
 }
?>

view:

<h5> dodaj zdjecie </h5>
<label> nazwa ogloszenia: </label>

    <?php
         echo $this->Form->input('person_id', array('options' => $people, 'label' => false));
    ?>
   
<label> zdjecie: </label>
    <?php
         echo $this->Form->input('link', array('type' => 'file', 'div' => false, 'label' => false, 'id' => 'uploading', 'class' => 'validate[required]'));
    ?>
 
<input type="submit" value="dodaj" class="redBtn submitForm" />

po użyciu przycisku, powinna sie wyświetlić lista zdjęć:

        
<h5> zdjecia </h5>
<table>
     <thead>
        <tr>
            <th> id </th>
            <th> person_id </th>
            <th> link </th>
            <th> opcje </th>    
        </tr>
     </thead>
 <tbody>
                    
<?php
    foreach($photos as $photo)    {
?>
        <tr>
             <td> <?php echo $photo['Photo']['id']; ?> </td>
             <td> <?php echo $photo['Photo']['person_id']; ?> </td>
             <td> <?php echo $html->image($photo['Photo']['link'], array('alt' => 'Gallery Image')); ?> </td>
             <td>
                  <a href="<?php echo $this->Html->url(array('action' => 'edit', $photo['Photo']['id'])) ?>" title="" >
                     <span> edycja </span>
                  </a>
                            
                  <a href="<?php echo $this->Html->url(array('action' => 'delete', $photo['Photo']['id'])) ?>" title="" >
                     <span> usun </span>
                   </a> 
            </td>
        </tr>
    
<?php
    }
?>                                      
      </tbody>
 </table>

proszę uprzejmie o wskazówkę , wydaje mi sie ze jest cos tu nie tak:

    
echo $this->Form->input('link', array('type' => 'file', 'div' => false, 'label' => false, 'id' => 'uploading', 'class' => 'validate[required]'));
1

W mojej opinii najlepszym sposobem na upload zdjec jest wykorzystanie jakiegos "behaviora" - ma to te zalete, ze "behavior" zadba o wiele roznych czynnosci takich jak:

  • skalowanie obrazkow
  • tworzenie miniaturek
  • automatyczne usuwanie plikow w momencie usuniecia rekordu w bazie danych (za posrednictwem Twojej aplikacji oczywiscie)

CakePHP posiada pewna spolecznosc - ludzie pracujacy w tym frameworku tworza czasem jakies rozszerzenia i dziela sie tym z innymi programistami. Wiele przydatnych rzeczy znajdziesz pod adresem: http://bakery.cakephp.org/

Kiedys przejrzalem powyzsza strone i natrafilem na "behavior" o nazwie "Image" - dzialal, ale nie do konca wspolpracowal z niektorymi wersjami Cake'a. Mimo wszystko mysle, ze warto sprobowac z niego skorzystac - wystarczy, ze podepniesz go pod swoj model i skonfigurujesz (tj. okreslisz rozmiary zdjec i miniaturek). Pozniej wszystko powinno dzialac niemal automatycznie.

Link do "behaviora": http://bakery.cakephp.org/articles/skiedr/2007/08/28/actas-image-column-behavior
Link do przykladowego kodu: http://cakeexplorersamples.googlecode.com/files/image_bahavior_example.rar

0

Serdecznie dziękuje :) :) :)

Tylko mam jeden problem , do kolumny link nie wczytuje się ścieżka z pliku . Pozostałe wartości rekordu są uzupełnione.

view:

 dodaj zdjecie       
        
<?php echo $form->create('Photo', array('enctype'=>"multipart/form-data"));?>
nazwa osoby:
<?php
     echo $this->Form->input('person_id', array('options' => $people, 'label' => false));
 ?>
  
zdjęcie: 
<?php
     echo $this->Form->input('Photos.link', array('type' => 'file', 'div' => false, 'label' => false, 'id' => 'uploading', 'class' => 'validate[required]'));                 
?>
          
<input type="submit" value="dodaj" class="redBtn submitForm" />

model został bez zmian:

<?php
class Photo extends AppModel {

 var $belongsTo = array(
    'Person' => array(
    'className' => 'Person',
    'foreignKey' => 'person_id',
    'conditions' => '',
    'fields' => '',
    'order' => ''
  ));
?>

controllers

<?php class PhotosController extends AppController    {  
  var $name = 'Photos';
  var $uses = array('Photo', 'Person');

   function admin_index()  {	
	$this->Photo->recursive = 0;
	$this->set('photos', $this->paginate());
    }

    function index() {
	$photos = $this->Photo->find('all');
    
	if (isset ($this->params['requested'])) {
	  return $photos;
    }
    
    $this->Photo->recursive = 0;
    $this->set('photos', $this->paginate());    
    
  }
  
    
  function admin_add(){
    if (!empty($this->data)) {
       $this->Photo->create();
	  if ($this->Photo->save($this->data))    {		 
             $this->Session->setFlash('zdjecie zostalo dodane !', 'adflash', array('class' => 'success'));
	     $this->redirect(array('action' => 'index'), null, true);
          } else   {
	    $this->Session->setFlash('zdjecie nie zostalo dodane !', 'adflash', array('class' => 'error'));
          }
  
     $people = $this->Person->find('list');
     $this->set(compact('people'));   
   }
 }
}
?>
       
0

Tak sie sklada, ze to wlasnie model powinien sie zmienic :) Aby to dzialalo musisz podpiac "behavior" pod model - robi sie to poprzez definicje tablicy "actsAs". Rekomendowalbym zerknac na model "profil", ktory znajdziesz w przykladowym kodzie zrodlowym (link w moim pierwszym poscie). Nie zapomnij tez skopiowac "behavior'a" do swojego projektu (jest w folderze model\behaviors).

Najlepiej zrobisz, jak zmienisz swoj model do nastepujacej postaci:

 
 <?php

class Photo extends AppModel {

    var $actsAs = array(
        'Image' => array(
            'fields' => array(                
                'image' => array(  /*nazwa kolumny, jezeli nie masz kolumny "image" to ja dodaj lub uzyj innej, ktora masz */
                    'thumbnail' => array('create' => true),
                    'resize' => array(
                        'width' => '800',
                        'height' => '800',
                    ),
                    'versions' => array(
                        array('prefix' => 's',
                            'width' => '400',
                            'height' => '300',
                        ),
                        array('prefix' => 'l',
                            'width' => '700',
                            'height' => '500',
                        )
                    )
                )
            )
        )
    );
    var $belongsTo = array(
        'Person' => array(
            'className' => 'Person',
            'foreignKey' => 'person_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
            ));

?>

Taka definicja modelu spowoduje, ze fotografie generowane beda w kilku wersjach: miniaturka, zdjecie w wersji malej i zdjecie w wersji duzej. Nie wiem czy takiej funkcjonalnosci potrzebujesz, ale z uwagi na to iz opieralem sie na kodzie wzorcowym (tym z przykladu) to bedzie to dobra baza do przetestowania czy wszystko dziala jak nalezy (pozniej najwyzej dostostujesz sobie konfiguracje do swoich potrzeb).

Aby sprawdzic czy wszystko dziala proponuje prosty test w dwoch krokach. Pierwszy krok jest dosc oczywisty - nalezy po prostu dodac zdjecie poprzez formularz Twojej aplikacji i sprawdzic czy zostaly zapisane 3 nowe grafiki na dysku twardym. Drugi krok polegac bedzie na tym, abys sprawdzila jakie dane sa generowane po uzyciu metody "find". W kontrolerze napisz sobie akcje (lub wykorzystaj do tego akcje juz zdefiniowana), ktora bedzie zawierac nastepujacy kod:

 
$photos = $this->Photo->find('all');
pr($photos); 
die;

Pozniej te akcje wywolaj i napisz co dostalas na wyjsciu - wtedy bedziemy wiedziec na jakim etapie jestemy i przejdziemy dalej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1