PDA

Zobacz pełną wersję : [PHPExcel w joomla]Problem z generowaniem pliku bez wyświetlenia śmieci z joomla!



seeb
17-06-2011, 00:17
Napisałem komponent którego zadaniem jest zbieranie danych a ostatnim etapem było generowanie pliku cvs okazało się jednak, że panie które mają analizować zebrane dane nie potrafią sobie tego zaimportować do Excela (mi wchodzi bez problemu).

Komponent oczywiście w modelu MVC po stronie administratora

Wymagane jest absolutnie czyste wywołanie żeby wygenerować plik xls do zapisania
Użyłem do tego celu biblioteki PHPExcel z której bez trudu generuję plik jednak nie bardzo mi wychodzi to z poziomu joomla



/**
* Położenie pliku components/com_ankiety/views/ankiety/view.xls.php
*/

error_reporting(E_ALL);

date_default_timezone_set('Europe/Warsaw');

require_once '../../excellib/Classes/PHPExcel.php';
// w odniesieniu do głównego katalogu komponentu

// Create new PHPExcel object
$objPHPExcel = new PHPExcel();

// Swłaściwości
$objPHPExcel->getProperties()->setCreator("@seeb.pl ISP")
->setLastModifiedBy("@seeb.pl ISP")
->setTitle("Plik z komponentu com_ankiety")
->setSubject("Dane z ankiet komponentu joomla!")
->setDescription("Dokument generowany z com_ankiety.")
->setKeywords("office 2007 openxml php")
->setCategory("Dane do analizy");
// formatujemy wygląd linii 1
$objPHPExcel->getActiveSheet(0)->getStyle('A1:BX1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED);
$objPHPExcel->getActiveSheet(0)->getStyle('A1:BX1')->getFont()->setName('Arial')->setSize(12);

//$objPHPExcel->getDefaultStyle(0)->getFont()->setName('Arial')->setSize(10);

$objPHPExcel->getActiveSheet(0)->setTitle('Ankiety absolwentów');

// dodajemy dane
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1','ID')
->setCellValue('B1','A1')
->setCellValue('C1','A2')
->setCellValue('D1','A3')
->setCellValue('BX1','E1_2');
// obcięte

$objPHPExcel->getActiveSheet(0)
->setCellValue('A'.$index,$dane->ID)
->setCellValue('B'.$index,$daneB)
->setCellValue('C'.$index,$dane->A2)
->setCellValue('BX'.$index,$dane->E1_2);



//--------------------------------------------------------------------------------------------------------------------------

$objPHPExcel->createSheet(1);
$objPHPExcel->getSheet(1)->setTitle('Ankiety pracodawców');

$objPHPExcel->setActiveSheetIndex(1);

$objPHPExcel->getActiveSheet(1)
->setCellValue('A1','id')
->setCellValue('B1','A1');

//pętla foreach

foreach ($Dane as $pracodawca){

$objPHPExcel->getActiveSheet(1)
->setCellValue('A'.$indexpr,$pracodawca->id)
->setCellValue('B'.$indexpr,$pracodawca->A1);
}
// celowo obciąłem bo to nikogo nie obchodzi


$objPHPExcel->setActiveSheetIndex(0);

header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="ankiety.xls"');
header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;



Jak wypluc z joomla MVC tylko widok z danymi bez całej tej otoczki?
chyba nie muszę mówić o co chodzi. Bez nagłówków menu etc. itp.

moje
18-06-2011, 13:44
A jakiej wersji softu od Billa używasz Ty, a jakiej Panie od analizy tych danych?

seeb
18-06-2011, 22:57
Ja używam openOffice'a ale problem w tym, że jak ja jadę do nich i na ich komputerze otwieram to nie mam problemu jak tylko stamtąd wyjadę do domu natychmiast jest problem. :) Dlatego to jest taka troszkę desperacka próba wygenerowania gotowca.

moje
19-06-2011, 00:29
Chodziło mi o to, czy nie używają 2010, jeśli tak to w php bez problemu wygenerujesz plik xlsx (skompresowaną paczkę XMLi).

A z tablicy nie możesz wybrać tego, co Ci potrzeba?

No chyba, że trzeba spojrzeć prawdzie w oczy i powiedzieć, że Panie należy skierować na dokształcenie.

seeb
19-06-2011, 00:36
Jakby problem już nie leży po ich stronie.

Obecnie pozostaje problem żeby wpisać to w mechanizm joomli!

Ten kod wyżej działa poprawnie i generuje plik xls jak pan bóg przykazał. Natomiast joomla wypluwa mi całą otoczkę + właściwy kod.

moje
19-06-2011, 00:39
A nie możesz tych danych pobrać prosto z bazy?

seeb
19-06-2011, 01:53
To bardzo nieładnie, nieelegancko. Mogę oczywiście ale nie o to chodzi. Chcę żeby to był spójny komponent a nie trochę w ciąży a trochę nie :) .

moje
19-06-2011, 12:55
To dalej może być spójny komponent, o JTable, getDBO?

seeb
19-06-2011, 14:08
Mam już gotowy cały model komponentu cały kontroler :) został tylko jeden widok ten pobierający dane wydaje się, że przetwarzanie tego manualnie to jednak chyba nadal niezbyt dobre rozwiązanie. Jedyne co znalazłem to musiałbym generować to jako dokument w formacie raw ale to jakoś mi nie wychodzi.

moje
19-06-2011, 14:24
A nie możesz przecedzić danych wyrażeniem regularnym?
Jakbyś podał przykłady, które dane Cie interesują, które masz w nadmiarze i jak to wszystko wygląda, było by łatwiej doradzić.
A nie próbowałeś użyć czegoś innego zamiast PHPExcel?

seeb
19-06-2011, 14:57
próbowałem inne rzeczy do generowania i bez skutku zamierzonego. Obecna forma jest najlepsza. plik generuje się poprawny a panie są zadowolone. Pozostaje właśnie tylko problem nieestetyczności rozwiązania.

Joomla generuje mi kod w otoczce HTML czyli conctent-header zupełnie nie ma zastosowania. Mam nadzieję, że rozumiesz o czym mowa.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl-pl" lang="pl-pl" dir="ltr" id="minwidth" >
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="robots" content="index, follow" />
<meta name="keywords" content="Biuro." />
<meta name="description" content="Biuro. Zapraszamy do wypełniania ankiet." />
<meta name="generator" content="Joomla! 1.5 - Open Source Content Management" />
<title>Biuro Karier AWF Poznań - Zaplecze</title>
<link href="/administrator/templates/khepri/favicon.ico" rel="shortcut icon" type="image/x-icon" />

-- cięcie ---
Content-Type: application/vnd.ms-excel
Content-Disposition: attachment;filename="ankiety.xls"
Cache-Control: max-age=0

moje
19-06-2011, 15:13
Rozumiem, że na extensions.joomla.org nie znalazłeś rozwiązanie, które by Cie zadowalało?

seeb
19-06-2011, 15:46
Oczywiście, że nie. Nie wyważam otwartych drzwi. Teraz jestem na ukończeniu komponentu który spełnia wszystkie założenia współpracuje z innym również autorskim komponentem. Wszystko działa po za wygenerowaniem tego jednego ostatniego elementu jakim jest 2 zakładkowy plik xls.

W załączeniu plik... (bez danych)

seeb
20-06-2011, 18:34
kolejny problem a już było blisko.

Fatal error: Class 'JResponse' not found in /var/www/html/libraries/joomla/document/document.php on line 776


O co chodzi z tym błędem zaznaczę że chodzi o plik view.xx.php


<?php



// No direct access
defined('_JEXEC') or die;

jimport('joomla.application.component.view');
//jimport('joomla.environment.response'); // tak też próbowałem



class BankietyViewBankiety extends JView
{
/**
* klasa display - inaczej być nie może
*/
public function display($tpl = null)
{

tu zródło znane z wcześniejszych postów.

}
}
?>

moje
20-06-2011, 21:26
Jeszcze tylko powiedz jaka to wersja Joomla?

seeb
20-06-2011, 21:27
1.5.23

moje
20-06-2011, 22:09
A co zmieniałeś, że Ci to wyskoczyło?

seeb
20-06-2011, 22:13
Prześledziłem pliki związane z wyświetlaniem raw format i tam nigdzie nie było jednej linijki

parent::display($tpl); w metodzie wyświetlania zatem i ja wywaliłem tą linijkę zaczeły działać rzeczy typu header

moje
20-06-2011, 22:32
A próbowałeś podejrzeć view.feed?
Zamiast public function display($tpl = null) użyć function display() ?

seeb
20-06-2011, 23:25
function display(){
}


Fatal error: Class 'JResponse' not found in /var/www/sites/*/www/html/libraries/joomla/document/document.php on line 776

moje
20-06-2011, 23:36
A wcześniej nie było tego błędu z JResponse?

seeb
20-06-2011, 23:50
nie bo wywalał błędy wcześniej albo kiedy był parent::display wywalał bez błędów ale z html'em

moje
21-06-2011, 11:00
Ja w Joomla nie bawiłem się z xls i nie znam tej biblioteki, a sam nie miałem podobnych problemów tworząc komponenty.

Spróbuj pobawić w odczyt prosto z bazy, wiem, że się przed tym wzbraniasz ale może okazać szybszym zażegnaniem Twojego problemu.

seeb
21-06-2011, 12:55
Już mówiłem nie jest problemem wybranie z bazy i stworzenie luźnego pliku wywołanego z komponentu. Zwyczajnie nie chcę tworzyć protezy, która potencjalnie może okazać się niebezpieczna - ktoś się będzie mógł dobrać do tego bez praw administratora.

moje
21-06-2011, 13:19
Nie tak, tworzysz komponent, który korzystając JTable/getDBO pobiera dane, a następnie z nich generuje plik xls.

Teraz mi się przypomniało, że za nagłówek można zmanipulować przy pomocy getHeader i setHeader.

seeb
21-06-2011, 13:44
Kompletnie nieprzydatna koncepcja. piszę tego posta po raz drugi i nie mam już sił przeklepywać tego jeszcze raz. Niestety forum "stwierdziło", że się nie znam i za długo pisałem posta więc mi go nie opublikowało.

Pewnie zrobienie komponentu po stronie admina zajmie ci mniej niż mi zajęło pisanie poprzedniego posta. Sprawdź czy twoje pomysły mają coś wspólnego z tym o co mi chodzi. Użyj stringu zamiast bazy a zamiast xls wygeneruj txt a do tego nie potrzebujesz biblioteki.

W podany przez Ciebie sposób spróbuj wygenerować plik ala.txt i z zawartością "Ala ma kota.". Jeśli wygenerujesz taki plik bez dodatkowych śmieci podaj kod źródłowy komponentu w tym temacie i to bedzie z pewnością rozwiązanie mojego i nie tylko mojego problemu.

moje
21-06-2011, 19:27
Jak chcesz string'ów, to pobierz je JTable, którzy przechowuje je w array'u.

seeb
21-06-2011, 23:59
Widzisz niestety nie zrozumiałeś o czym mowa. Twoje sugestie i proponowane rozwiązania nie są niestety na temat. Nie wiem czy piszesz to z potrzeby uzyskania dużej ilości postów czy też naprawdę chcesz pomóc ale coś ci nie wychodzi.

Do wyświetlenia stringu nie potrzeba JTable bo nie wiem jaki jest sens łączyć się z bazą danych żeby pobrać co? Nie istniejącą tabelę z nieistniejącym polem w którym jest nieistniejąca wartość czy po co?

Jeśli masz zadeklarowany string czyli wartość zmiennej jest znana to pobieranie jej za pomocą JTable jest bezzasadne. Co więcej jeśli tabela w bazie danych i pola w niej nie istnieją to połączenie z bazą jest wręcz zabronione. Tego powinni po prostu zabronić.

W związku z powyższym proponuję zakończyć dysputę. Dyskusja jest kompletnie nie na temat i rozwiązania nie mają związku z problemem. Kończę tym samym rozprawę w tym wątku.

moje
22-06-2011, 11:55
Skoro generujesz plik xls z danymi to musisz je skądś pobrać, najprawdopodoniej z bazy danych.
Ja Ci tylko wskazuje możliwość pobrania danych, bez dodatkowych naleciałości, a jak dobrze zrozumiałem, takiego sposobu właśnie szukasz.

seeb
04-07-2011, 18:34
Cel rozumiesz niby dobrze ale pozbawiając się rozumienia kontekstu oszpecasz całość idei.

Ideą jest wyświetlanie a nie pobieranie danych czyli nie obchodzi nas skąd mamy dane i jak je pozyskujemy nas interesuje jedynie ich wyplucie.

Zatem: nie ma znaczenia czy prosto z bazy czy z macierzy w dowolnej formie tylko jak wypluć to bez otoczki html, którą joomla nam standardowo funduje bez użycia typu dokumentu z joomla [joomla nie zna formatu excel natywnie].

krs
24-11-2011, 13:40
mi dziala bez problem takie rozwiazanie.. a generuje rozne pliki w tym xls...

1. link > index.php.....format=raw

2. w pliku view.raw.php

defined('_JEXEC') or die('Restricted access');

jimport( 'joomla.application.component.view' );

class xxxViewXXX extends Jview
{
function _display($tpl = null){
parent::display($tpl);
}
}

3. w pliku wynikowym np. default.php

$doc =& JFactory::getDocument();
$doc->setMimeEncoding("application/vnd.ms-excel");

i dziala to bez problemu, nie ma w tym ani jednego znacznika html z odpowiednim naglowkiem :)

seeb
26-11-2011, 19:32
Dzięki za podpowiedź sprawdzę jak wrócę do domu.