SYMFONY3 I IMPORT PLIKÓW CSV

Poniżej zamieszczam kawałek kodu który pozwala na zaimportowanie pliku CSV i zapis poszczególnych wartości do bazy danych.

15-06-2017

Idea poniższego kodu jest następująca. W pliku CSV w pierwszej kolumnie mamy link, a w następnych słowa kluczowe. Informacje te posłużą do prostego rozszerzenia w TWIGU które będzie zamieniało wybrane słowa kluczowe na odpowiadające im linki, w poszczególnych artykułach w systemie CMS.


    /**
     * @Route("/keywords", 
     *    name="bagsiur_admin_settings_keywords", 
     * )
     * @Method({"GET", "POST"})
     * @Template
     */
    public function keywordsAction(Request $request)
    {
        
        $form = $this->createFormBuilder()
            ->add('submitFile', FileType::class, 
                array(
                    'label'    => 'Plik CSV:',
                    'label_attr' => ['data-original-title' => 'Format:', 'data-content' => 'Pierwsza kolumna to adres url, następne kolumny to słowa kluczowe'],
                    'constraints' => array(
                        new NotBlank()
                    )
                )
            )
            ->add('save', SubmitType::class,
                array(
                    'label' => 'Importuj',
                    'attr' => ['class' => 'btn-success']
                )
            )
            ->getForm();
        
        $form->handleRequest($request);
        
        if ($form->isSubmitted() && $form->isValid()) {
            
            $csv = $form['submitFile']->getData();
            $extension = $csv->getClientOriginalExtension() ;

            if ($extension == 'csv') {

                $rows = array();
                if (($handle = fopen($csv->getRealPath(), "r")) !== FALSE) {
                    while (($data = fgetcsv($handle, null, ";")) !== FALSE) {
                        $rows[] = $data;
                    }
                    fclose($handle);
                }
                
                foreach($rows as $item){

                    if (filter_var($item[0], FILTER_VALIDATE_URL)) { 
                        
                        $em = $this->getDoctrine()->getManager();
                        
                        $link = $item[0];
                        $i = 0;
                        foreach($item as $keyword){
                            if($i != 0 and !empty($keyword)){
                                    
                                $keywords = new Keywords();
                                
                                $keywords->setLink($link);
                                $keywords->setKeyword($keyword);
                                
                                $em->persist($keywords);
                                
                            }
                            $i++;
                        }
                    }
                    
                }
                
            } else {
                $this->get('session')->getFlashBag()->add('error', 'Wprowadź plik CSV');
                return $this->redirectToRoute('bagsiur_admin_settings_keywords');
            }
            
            $em->flush(); 
            $this->get('session')->getFlashBag()->add('success', 'Nowe słowa kluczowe zostały zaimportowane');
            return $this->redirectToRoute('bagsiur_admin_settings_keywords');
            
        } else if ($form->isSubmitted()){
            $this->get('session')->getFlashBag()->add('error', 'Błąd walidacji formularza. Popraw poniższe błędy.');
            return $this->redirectToRoute('bagsiur_admin_settings_keywords');
        }
        
        return array(
            'form' => $form->createView()
        );
    }
	

W skrócie powyższy kontroler tworzy formularz, sprawdza czy został on wysłany, importuje plik CSV dzieląc go na wiersze i kolumny po czym zapisuje te wartości do bazy.


  wstecz