• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kopiowanie rekordu w encji , __clone() ?? Symfony3

0 głosów
123 wizyt
pytanie zadane 13 grudnia 2016 w PHP, Symfony, Zend przez wanderer Gaduła (3,590 p.)
edycja 13 grudnia 2016 przez wanderer

Cześć , Mam takie ogólne pytanie ponieważ chce się niejako zorientować czy dobrze myślę,

Mam tabelę z listą lat,
Jest to relacyjna baza danych i gdy klikam na [przegladaj] to wchodze w /show i mam dużą tabele z danymi (ale do rzeczy)

 Chcę aby po kliknięciu [Kopiuj] skopiowało mi np. Rok2016 tak zeby utworzył się kolejny Rok2016 z tymi samymi danymi (po kliknieciu w [przegladaj] ) i wiadomo z nowym id.

czy zeby to zrealizowac należy użyć metody __clone() czy w inny sposob trzeba do tego podejsc ?  

Na razie mam pytanie dość ogólne, ale chce żeby z czasem nabrało więcej szczegółów

komentarz 13 grudnia 2016 przez xandros Nałogowiec (29,830 p.)

Creating a copy of an object with fully replicated properties is not always the wanted behavior.

http://php.net/manual/en/language.oop5.cloning.php 

3 odpowiedzi

0 głosów
odpowiedź 13 grudnia 2016 przez event15 Szeryf (94,730 p.)

Na razie mam pytanie dość ogólne, ale chce żeby z czasem nabrało więcej szczegółów 

To poczekamy na szczegóły 

komentarz 13 grudnia 2016 przez wanderer Gaduła (3,590 p.)

Ok, przeanalizowałem w miare swoich możliwości problem i doszedłem do takiego kodu, z tym że jest to cloneAction a nie metoda __clone(), na tym etapie mam pytanie :

jak podpiąć poniższą funkcje do przycisku np na stronie show.html.twig tak aby po naciśnięciu kopiowanie się wykonało bo chce , bo nawet jeśli kod nie działa poprawnie to chcę móc go testować za pomocą kliknięcia w [kopiuj] ,a na ten czas nie wiem po prostu jak go do tego przycisku przypisać 


 

private function cloneAction(Grid $grid){
 
           $oldGrid= ($grid);
 
           $newGrid= clone $oldGrid;
 
           return $this->render('grid/show.html.twig', array(

           'newGrid' => $newGrid
  
));
}

 

komentarz 13 grudnia 2016 przez efiku Szeryf (75,000 p.)
Kontroler do kopiowania powinien być tylko kontrolerem do kopiowania a nie jeszcze wyświetlania :) Po Co Ci to renderowanie, skoro to tylko prosta akcja. Aktualizacja to już nie w  tej warstwie.

Co więcej, co da Ci takie kopiowanie, jak identyfikator będzie ten sam. To nawet przez Doctrine nie przejdzie ;)

Nie wiemy też co kryje się pod rok2016 jakie dane, najwyżej stwórz sobie serwis który dostaje po prostu kolekcje encji kryjącą się pod nazwą rok2016 i stworzy sobie gotowe obiekty z wypełnionymi danymi a następnie zrobić persist i flush. Bo dane będą te same, ale identyfikatory nie.

Za mało szczegółów.
komentarz 13 grudnia 2016 przez wanderer Gaduła (3,590 p.)
edycja 13 grudnia 2016 przez wanderer

Właśnie o to mi chodzi żeby :

"stworzy sobie gotowe obiekty z wypełnionymi danymi"

tylko brakuje mi wiedzy, zeby nawet sprecyzowac pytanie , ciągle się tego ucze.

zależy mi na tym, żeby po kliknięciu w jakiś przycisk na stronie ta akcja się wykonała , czyli żeby stworzyło mi ponownie Rok2016 zeby bylo:

"Bo dane będą te same, ale identyfikatory nie."


bardziej sprezyzuje co kryje sie pod Rok2016 , w oryginale encja ta nazywa sie inaczej po prostu chce sie nauczyc sposobu i podaje poglądowe nazwy, jednak teraz podeślę pastebina z moim kontrolerem, odpowiednikiem przytaczanego ciągle Roku,
http://pastebin.com/yAvucj6c

w 62 linijce rozpoczyna sie moja akcja showAction, ponizej widac ze są wykorzystywane inne encje co w efekcie daje mi , ze na stronie wyswietlają się dane z innych tabel z bazy danych  - i to dziala poprawnie(w każdej tabeli są tylko te dane które jako klucz obcy mają id danej Plachty, to dość istotne).

W efekcie moja tabela (ktora wyswietla sie na stronie) ma sporo danych i przy tworzeniu nowej nie chcialbym wypelniac na nowo tej tabeli tylko sobie skopiowac  (z innym id) i ewentualnie tylko edytować już nowo powstałą. 

Czy teraz jest tych szczegółów wystarczająco? 


fot. przedstawiająca problem i pożądany efekt:
EDIT :

Dodatkowa informacja:
po kliknięciu w [przegladaj] wyswietlaja mi się tylko te dane  z bazy danych ktore jako klucz obcy mają okreslone idPlachta, np dla Rok2017 po kliknięciu na [przegladaj] będa w tabeli inne dane niż np po kliknięciu na Rok2016.

I teraz nasuwa mi się takie pytanie :  jeśli skopiuje np: Rok2016 i utworzy mi się  nowy rekord jak na rysunku to czy w bazie danych  utworzy się np drugi raz taka sama osoba tylko że z idPlachta (nowo utworzonej)  wprost gotowej do edytowania?


[ moje pozostale  pytania]:
jak zrobić taki serwis , ktory będzie mi to kopiował ??
jak załączyć go do przycisku  ??

komentarz 15 grudnia 2016 przez wanderer Gaduła (3,590 p.)

pisząc o kolekcji miałeś na myśli cos takiego?
http://mydevnote.com/symfony-clone-entity-relationship/


EDIT: więcej szczegolow 

0 głosów
odpowiedź 16 grudnia 2016 przez event15 Szeryf (94,730 p.)
komentarz 16 grudnia 2016 przez wanderer Gaduła (3,590 p.)

Dziękuje, z tego co podesłałeś też korzystałem, udało mi się napisać coś takiego ale mam świadomość, że to nie jest kompletne, jak to trzeba jeszcze uzupełnić bo przyznam, że nie mogę sobie z tym problemem poradzić nawet mając kilka tych linków


encja ktora ma byc kopiowana
http://pastebin.com/kYYhqXfe

encja ktora ma w sobie klucz obcy z powyzszej encji
http://pastebin.com/jTQtcBLn

kontroler
http://pastebin.com/g8EBeY1k


EDIT: to co zrobiłem teraz sam :

PlachtaController.php 
-dodalem akcje cloneAction(Plachta $plachtum) 
ponizej kod:

 

public function cloneAction(Plachta $plachtum){

        $em = $this->getDoctrine()->getManager();
        $plachtas = $em->getRepository('AppBundle:Plachta')->find($plachtum);
        $cloneY = clone $plachtas;

        //jak uzupelnić  zeby moc to odpalić na stronie ? ? ?

    }
public function __clone(){
        if ($this->idPlachta) {
            $this->setIdPlachta(null);
            $this->x = clone $this->x;              //co dac w miejsce x ???
        }
    }
public function __clone(){
        if ($this->id) {            //co dac w miejsce id ?
            $this->setId(null);        //co dac w miejsce setId ??
        }
    }

 

–1 głos
odpowiedź 13 grudnia 2016 przez pajos96 Obywatel (1,350 p.)

Hm, pierwsza moja myśl . Do encji odpowiedzialnej za rok (nazwę ją Year),dodaj funkcję    

public function setByYear(Year $year){
 $this = $year;
 return $this;
}

Teraz wystarczy zrobić tak : 

$oldYear = (ten twój który chcesz sklonować);
$newYear = new Year();
$newYear->setByYear($oldYear);

Jest tez opcja zrobić to przez konstruktor jeżeli jest pusty ,jako argument z domyślną wartością null, aby nie zablokowac możliwości tworzenia roku bez kopii.

komentarz 13 grudnia 2016 przez event15 Szeryf (94,730 p.)
Nie za bardzo wiem co ty mu proponujesz, ale mam obawy czytając to, co chcesz zrobić ;>
komentarz 13 grudnia 2016 przez xandros Nałogowiec (29,830 p.)
$this = $year;

Wat?

nie wystarczyło by?:

$oldYear = (ten twój który chcesz sklonować);
$newYear = clone $oldYear;
komentarz 13 grudnia 2016 przez wanderer Gaduła (3,590 p.)
Ok, popracuje nad tym i popróbuje tylko jak mam taką funkcje wywołać i np podpiąć do przycisku , że po naciśnięciu faktycznie się skopiuje ? Pytam bo chce już sam pokombinować z funckją kopiującą mając pewność, że dobrze to wywołuje , moge liczyć na taką pomoc ?

Podobne pytania

0 głosów
1 odpowiedź 93 wizyt
0 głosów
1 odpowiedź 50 wizyt
0 głosów
0 odpowiedzi 64 wizyt
pytanie zadane 8 grudnia 2016 w PHP, Symfony, Zend przez robb74 Początkujący (450 p.)
Porady nie od parady
Publikując kody źródłowe korzystaj ze specjalnego bloczku koloryzującego składnię (przycisk z napisem code w edytorze). Nie zapomnij o ustawieniu odpowiedniego języka z rozwijanego menu oraz czytelnym formatowaniu kodu.Przycisk code

63,340 zapytań

109,600 odpowiedzi

228,959 komentarzy

44,175 pasjonatów

Przeglądających: 194
Pasjonatów: 12 Gości: 182

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...