Nette a Texyla?
- Honza Marek
- Člen | 1664
Jde ti předpokládám o to, jak zprovoznit nějaký nette náhled. Pokud bys potřeboval víc informací, tak ještě napiš.
- Je dobré stáhnout aktuální verzi Texyly. To má například tu výhodu, že je kompatibilní s mým ajaxovacím pluginem do nette :-D
- Veškeré cesty k php skriptům jsou v Texyle nastavitelné. Změníme tedy cestu k náhledu. Náhled nyní povede na TexylaPresenter, action preview.
V šabloně (například @layout.phtml):
<html>
<head>
<!-- vložení texyly -->
...
<!-- nastavení výchozích hodnot -->
<script type="text/javascript">
$.texyla("setDefaults", {
previewPath: {plink Texyla:preview}
});
</script>
</head>
<body>
<textarea rows="10" cols="50"></textarea>
...
</body>
</html>
- Vytvoříme TexylaPresenter.
<?php
class TexylaPresenter extends Presenter {
public function actionPreview($texy) {
$texyInstance = new Texy;
echo $texyInstance->process($texy);
$this->terminate();
}
}
?>
Editoval Honza M. (4. 6. 2009 0:07)
- Honza Marek
- Člen | 1664
To jsem přesně ukazoval na Poslední sobotě. Ale bastlil jsem to tam na poslední chvíli, tak to zveřejním až budu mít nějaký reprezentativní zdroják :)
- Patrik Votoček
- Člen | 2221
Honza M. napsal(a):
Tohle je takový základ. Určitě je zajímavé třeba rozběhat v nette správce souborů, ale to sepíšu někdy jindy – až na to budu mít vzorně udělané skripty :-D
A to bude asi tak kdy? A nejenom soubory ale i obrázky… Možná by se u souborů a obrazků hodilo upload chybějícího souboru (AJAXově).
- Honza Marek
- Člen | 1664
Jelikož to potřebuju taky, tak brzo. Co si mám představit pod pojmem upload chybějícího souboru?
- Honza Marek
- Člen | 1664
Prezenter pro správce souborů Texyly. Neřeší oprávnění, ale nějakou jednu podmínku není problém přidat.
<?php
class TexylaFilesPresenter extends BasePresenter {
protected $baseFolderPath;
protected $baseFolderUri;
public function startup() {
$this->baseFolderPath = realpath(WWW_DIR . "/files");
$this->baseFolderUri = Environment::getVariable("baseUri") . "files";
}
public function actionListFiles($folder = "") {
$folderPath = realpath($this->baseFolderPath . ($folder ? "/" . $folder : ""));
$folderUri = $this->baseFolderUri . ($folder ? "/" . $folder : "");
// check if dir exists and is base folder or subdir of base folder
if (!is_dir($folderPath) || !String::startsWith($folderPath, $this->baseFolderPath)) {
$this->payload->error = "Folder does not exist.";
$this->terminate();
}
// list of files
$folders = array();
$files = array();
// up
if ($folder !== "") {
$lastPos = strrpos($folder, "/");
$key = $lastPos === false ? "" : substr($folder, 0, $lastPos);
$folders[] = array(
"type" => "up",
"name" => "..",
"key" => $key,
);
}
foreach (new DirectoryIterator($folderPath) as $fileInfo) {
$fileName = $fileInfo->getFileName();
// skip hidden files, . and ..
if (String::startsWith($fileName, ".")) continue;
// directory
if ($fileInfo->isDir()) {
$folders[] = array(
"type" => "folder",
"name" => $fileName,
"key" => ($folder ? $folder . "/" : "") . $fileName,
);
// file
} elseif ($fileInfo->isFile()) {
// image
if (@getImageSize($fileInfo->getPathName())) {
$key = ($folder ? $folder . "/" : "") . $fileName;
$thumbailKey = $this->link("thumbail", $key);
$files[] = array(
"type" => "image",
"name" => $fileName,
"insertUrl" => $folderUri . "/" . $fileName,
"description" => "Image $fileName",
"thumbailKey" => $thumbailKey,
);
// other file
} else {
$files[] = array(
"type" => "file",
"name" => $fileName,
"insertUrl" => $folderUri . "/" . $fileName,
"description" => "File $fileName",
);
}
}
}
$this->payload->list = array_merge($folders, $files);
$this->terminate();
}
public function actionThumbail($key) {
Image::fromFile($this->baseFolderPath . "/" . $key)->resize(60, 40)->send();
$this->terminate();
}
public function isAjax() {
// nutné kvůli uploadu
// v texyle upload se tváří ajaxově, ale ve skutečnosti se formulář submituje do iframu
// $this->getAction() == "upload" || parent::isAjax() nefunguje
return true;
}
public function actionUpload($folder) {
// RoutingDebugger::disable();
// initialize payload
// když trochu předělám Texylu, tak to nebude nutné
$this->payload->error = "";
$this->payload->filename = "";
$this->payload->type = "";
// paths
$folderPath = realpath($this->baseFolderPath . ($folder ? "/" . $folder : ""));
$folderUri = $this->baseFolderUri . ($folder ? "/" . $folder : "");
// check if dir exists and is base folder or subdir of base folder
if (!is_dir($folderPath) || !String::startsWith($folderPath, $this->baseFolderPath)) {
$this->payload->error = "Folder does not exist.";
$this->terminate();
}
// file
$file = Environment::getHttpRequest()->getFile("file");
// check upload
if ($file === null || !$file->isOk()) {
$this->payload->error = "Upload error.";
$this->terminate();
}
// move
$fileName = String::webalize($file->getName(), ".");
if (@$file->move($folderPath . "/" . $fileName)) {
$this->payload->filename = $folderUri . "/" . $fileName;
$this->payload->type = @$file->getImageSize() ? "image" : "file";
} else {
$this->payload->error = "Move failed.";
}
$this->terminate();
}
}
?>
Nastavení cest v Texyle:
<script type="text/javascript">
$.texyla("setDefaults", {
// soubory
filesPath: {plink TexylaFiles:listFiles},
filesThumbPath: "%var%",
filesUploadPath: {plink TexylaFiles:upload}
});
</script>
Nechce se mi to celé podrobně vysvětlovat, tak se kdyžtak ptejte.
Editoval Honza M. (3. 6. 2009 23:16)
- Patrik Votoček
- Člen | 2221
Honza M. napsal(a):
Jelikož to potřebuju taky, tak brzo. Co si mám představit pod pojmem upload chybějícího souboru?
Řekněme že vkládání obrázků bude probíhat pomocí procházení nějáké složky s obrázky a tak by se hodilo kdyby to umělo i uploadnout obrázek který v této složce ještě není ale chci ho použít.
Už chápeme?
- Tomik
- Nette Evangelist | 485
vrtak-cz napsal(a):
Řekněme že vkládání obrázků bude probíhat pomocí procházení nějáké složky s obrázky a tak by se hodilo kdyby to umělo i uploadnout obrázek který v této složce ještě není ale chci ho použít.
Už chápeme?
To to, pokud jsem na Poslední sobotě dobře koukal, umí. :)
- Honza Marek
- Člen | 1664
Tak to je základ, ne? :) Adresu obrázku si člověk zapamatuje, ale přece nebude kvůli nahrání nového obrázku lézt na FTP.
- romansklenar
- Člen | 655
Nestudoval jsem Texylu do podrobna, ale myslím, že by neměl být problém ji přepsat pro lepší použití s Nette do Controlu. Napadá tě Honzo něco, kvůli čemu by to nebylo možné?
- Patrik Votoček
- Člen | 2221
Na PS jsem bohužel nebyl. Ležel jsem doma s horečkou… A to že je to samozdřejmost z vlastní zkušenosti vím že moc ne… Ještě jsem na to nekoukal ale nechceš to hodit do Extras?
- Ola
- Člen | 385
Ještě k Texyle a náhledu – po kliknutí na náhled mi firefox ve firebugu vyhodí exception:
uncaught exception: [Exception... "Could not convert JavaScript argument arg 0 [nsIDOMDocumentFragment.appendChild]" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" location: "JS frame :: http://localhost/texyla-test/document_root/js/jquery/jquery.js :: anonymous :: line 12" data: no]"
Ve Chrome mi to funguje dobře…
Editoval Ola (4. 6. 2009 10:55)
- paranoiq
- Člen | 392
Oggy napsal(a):
při prochazení robotloaderem mi to hlásí:
Cannot redeclare class ArgumentOutOfRangeException
v distribuci texyly je soubor php/libs/loader.php. ten obsahuje kompletni nette framework. aby se nenačital framework dvakrát, je třeba soubor smazat nebo zabránit jeho indexaci pomoci netterobots.txt (viz: https://forum.nette.org/…-robotloader)
- Oggy
- Člen | 306
paranoiq napsal(a):
Oggy napsal(a):
při prochazení robotloaderem mi to hlásí:
Cannot redeclare class ArgumentOutOfRangeExceptionv distribuci texyly je soubor php/libs/loader.php. ten obsahuje kompletni nette framework. aby se nenačital framework dvakrát, je třeba soubor smazat nebo zabránit jeho indexaci pomoci netterobots.txt (viz: https://forum.nette.org/…-robotloader)
díky..
- Honza Marek
- Člen | 1664
V nette zavěšujeme Texylu takhle:
$form->addTextarea("text", "Text:", 50, 10)->getControlPrototype()->class("texyla");
a v javascriptu pomocí jQuery
$(function () {
$("textarea.texyla").texyla({
...
});
});
- Ondřej Mirtes
- Člen | 1536
Oggy napsal(a):
jak zavěšujete texylu na určitou textareu v nette? .. na stránkách textyly z toho nejsem moc moudrý..
ono jde zase spíše o komplet zavedení do nette ..
Pro zavěšení na určitou textareu to chce spíš znalost jQuery, než Nette, a dělá se to takto:
$("CSS selektor textarey").texyla();
A kompletní zavedení do Nette máš popsané výše v tomto threadu, i když si to můžeš udělat jakkoli po svém :)
EDIT: Pozdě, Honza Marek byl rychlejší :o))
Editoval LastHunter (12. 7. 2009 21:51)
- Z0MBie
- Člen | 19
Pokoušel jsem se do Nette a Texyly implementovat tento presenter. Vše mi
v něm už funguje až na jednu výjimku. V momentě, kdy uploaduji soubor mi
po dokončí uploadu nabídne prohlížeč ke stažení soubor, ve kterém jsou
serializovaná javascriptová data s informacemi od (pravděpodobně) payloadu.
Problém je v tom, že místo aby si je Texyla nějakým způsobem sežvejkala,
tak dobublají až k prohlížeči, kde je musím odmítnout a pak zavřít a
otevřít okno od filesuploaderu.
Můžu se zeptat, kde mám chybu, popřípadě jak ji opravit?
Zajímavé je to, že všechno funguje, jen při uploadu to takto selhá.
Prohlížeče Firefox a Opera
Edit: po hledání na foru jsem zjistil, že budu muset manualne změnit
content-type. Takže jsem si
za public function actionUpload($folder) {
připsal ještě
header('Content-type: text/plain');
.
V ten moment narážím na další chybu: http://zombik.net/…49257355.png. V praxi má asi Firefox
v texyla.js problém s tím, že je tam
eval("var data = "+content+";");
, jenže nevím, co přesně a jak
upravit.
Editoval Z0MBie (3. 8. 2009 2:00)
- Honza Marek
- Člen | 1664
sodae napsal(a):
Honzo (Marek): co takhle udělat komponentu pro Form jako AddTexyla která by dědila textareu v parametrech se nastaví informace a pak to automaticky na konci rendrovani to přidá další javascript s texylou. Co myslíš ?
Já Texylu přidávám takhle:
$form->addTextarea("text", "Text", 50, 20)->getControlPrototype()->class = "texyla";
O zbytek se postará Javascript. Řekl bych, že je to tak nejlepší, protože v metodě addTexyla bych ještě musel vymyslet způsob, jak Texylu konfigurovat a podobně.
- Honza Kuchař
- Člen | 1662
Počkejte ještě pár dní s tím uploadováním souborů. Hned co dodělám do nějakého použitelného stavu ten MultipleFileUploader (viz extras), tak se bude moci začít používat pravý AJAX na odesílání souborů. A ještě jich můžeš vybrat více současně.
- Honza Kuchař
- Člen | 1662
Saska napsal(a):
Také bych se přikláněl k této variantě. I když úplně nejideálnější by bylo texy distribuovat rovnou s Texylou.
To nejde z licenčních důvodů
- cuga
- Člen | 210
<script type="text/javascript" src="{$baseUri}js/jquery/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="{$baseUri}js/jquery/jquery.ui.js"></script>
<script type="text/javascript" src="{!$baseUri}js/texyla/texyla.js"></script>
<link rel="stylesheet" type="text/css" href="{!$baseUri}js/texyla/css/style.css" />
<script type="text/javascript">
$.texyla("setDefaults", {
previewPath: {plink Texyla:preview},
// soubory
filesPath: {plink TexylaFiles:listFiles},
filesThumbPath: "%var%",
filesUploadPath: {plink TexylaFiles:upload}
});
</script>
co delam zle??? kdyz nedam to setDefaults, tak se to rozbehne, ale jinak ani prd…
- Honza Marek
- Člen | 1664
Jestli máš aktuální Texylu, tak se změnila syntax na $.texyla.setDefaults(…).
- cuga
- Člen | 210
jj, stahnul sem si ji dneska, ale ani
$.texyla.setDefaults({
previewPath: {plink Texyla:preview},
// soubory
filesPath: {plink TexylaFiles:listFiles},
filesThumbPath: "%var%",
filesUploadPath: {plink TexylaFiles:upload}
});
nezabralo… pritom kdyz dam jenom $(function(){ $.texyla() }); tak to fakci
- Honza Marek
- Člen | 1664
Co třeba takhle?
$.texyla.setDefaults({
previewPath: {plink Texyla:preview},
// soubory
filesPath: {plink TexylaFiles:listFiles},
filesThumbPath: "%var%",
filesUploadPath: {plink TexylaFiles:upload}
});
$.texyla();
Metoda setDefaults fakt jen nastavuje výchozí nastavení.
- Ondřej Mirtes
- Člen | 1536
A mrkni do Firebugu, možná tam bude, kde je chyba.
BTW: Není tenhle zápis nastavení ekvivalentní?
$.texyla({
width: 700,
previewPath: {plink :Admin:Texyla:preview},
toolbar: [ 'h3', 'h4', null, 'bold', 'italic', null, 'ul', 'ol', 'blockquote', 'table', 'symbol', null, 'link', 'img', null, 'files' ],
});
Editoval LastHunter (13. 9. 2009 21:23)
- cuga
- Člen | 210
tak nakonec takhle :)
$(function(){
$.texyla.setDefaults({
previewPath: {plink Texyla:preview},
// soubory
filesPath: {plink TexylaFiles:listFiles},
filesThumbPath: "%var%",
filesUploadPath: {plink TexylaFiles:upload}
});
$.texyla();
});
a jeste otazka, cim muze byt ze se mi na ni neaplikovaly styly? i kdyz css mam nalinkovane dobre???
Editoval cuga (13. 9. 2009 21:28)
- Honza Marek
- Člen | 1664
Jsou potřeba dvě csska. Jedno je se základnim stylem a druhý jakoby se skinem.
- Honza Marek
- Člen | 1664
No teď jsem taky koumal nad zprovozňováním a došel jsem k tomuto:
- Po uploadu je potřeba odezvu posílat s typem text/plain.
- Je potřeba upravit „ajaxově uploadovací“ část Texyly. Ve
stáhnutém souboru texyla.js zkus nahradit
body.innerHtml
za$(body).text()
.
- Honza Marek
- Člen | 1664
Má to fungovat tak, že po nahrání ti to nabídne vložení obrázku nebo odkazu (podle typu souboru). Spadne znamená, že to rozbije prohlížeč? Jaký?
- tom
- Člen | 171
Honza M. napsal(a):
Jde ti předpokládám o to, jak zprovoznit nějaký nette náhled. Pokud bys potřeboval víc informací, tak ještě napiš.
Muzu mit jeden uplne zacatecnicky dotaz? Stahnul jsem si Texylu a ted premyslim kam nejlip ty jednotlive zdrojaky umistit. Zatim jsem ji celou hodil do adresare tools (je jedno jak je nazvany, mam tam jeste Requirements-Checker a RoutingDebugger). Do libs, kam by to asi pasovalo lip jsem ji nedaval kvuli .htaccess! Do app/controls taky ne, tam mi to moc logicky nepasuje … Ale ono ani tak nejde o to kam Texylu umistit jak spis o to jak ji zprovoznit tak aby sla pouzit odkudkoliv … Nejak se mi nedari aby byla plne funkcni v ruznych castech me aplikace. Pomoci tovarnicky v presenteru jsem ji zprovoznil napr. na strance /komentare ale kdyz jsem ji dal i do stranky /fotky/reakce tak vcelku fungovala az na to ze treba v nabidce smajliku se nezobrazuji obrazky tech smajlu a to proto ze je tam jine „baseUri“ … Jde mi o to, ze se mi nedari nastavit vse na jednom miste a univerzalne … Existuje na to nejaka rada, co a kde musim spravne nastavit aby pak cela taxyla fungovala kdekoli v me aplikaci? Diky moc :)
- Honza Marek
- Člen | 1664
No já to mám rozházené porůznu v document_root/css, document_root/js, TexylaPresenter samozřejmě mezi presenterama.
- regiss
- Člen | 61
Honza Marek napsal(a):
No já to mám rozházené porůznu v document_root/css, document_root/js, TexylaPresenter samozřejmě mezi presenterama.
Nedal by se dat funkci priklad na Github. Nejdou mi nastavit cesty k texyle. Puvodni link na Integraci texyly s Nette neni funkcni. Na gitu by to bylo nejlepsi, clovek pak hned pochopi jak to funguje.
Edit:
Nevsiml jsem si, ze texyla je na Githabu. V examples je ukazka jak integrovat
texylu s Nette. Pro funcknost je nutne vytvorit par adresaru a dat jim pravo
zapisu:
- app ⇒ temp
- document_root ⇒ webtemp, files
Dekuji za tuto verzi, ve ktere je vsechno super ukazano.
Ondra
Editoval regiss (16. 7. 2010 5:18)
- zoltinho
- Člen | 24
Stáhl jsem si z Githubu poslední verzi
Texyly, a při prvním spuštění parse error.. v TexylaPresenter.php na
řádku 202, chybí za příkazem $this->terminate()
středník.
S touhle opravou to spustím, ale nějak to celé nefunguje jak má.. kliknu na náhled/HTML a sekne se to na „prosím čekejte“..
Doufám že tahle verze funguje bez problémů a chyby jsou jen v example..
Nemohli byste to v něm prosím opravit? Je to asi jediný aktuální zdroj,
jak to použít v Nette
Díky
Editoval zoltinho (20. 5. 2011 3:10)
- Morfeo21
- Člen | 35
Dneska jsem aplikoval Texylu, ale nepodařilo se mi ji rozběhat pro více
než jednu textareu na stránce.
Zkoušel jsem
<script type="text/javascript">
//<![CDATA[
$.texyla.setDefaults({
texyCfg: "admin",
baseDir: '/texyla',
previewPath: {link Texyla:preview},
buttonType: "span"
});
$(function () {
$(".texyla").texyla({
buttonType: "span"
});
});
//]]>
</script>
(s tím, že všechny textarei mají nastavenou classu)
i pouze
<script>
$.texyla();
</script>
ale pokaždé se Texyla aplikuje jen na první textareu na stránce. Nevíte, prosím, co s tím?
- Lábus
- Bronze Partner | 19
pomohla úprava v souboru texyla.js – přidána podmínka
<script>
if (text != null) { ... }
</script>
takže…
<script>
Texyla.prototype.expand = function (text, variable) {
if (text != null) { // přidána podmínka
text = text.replace("%texyla_base%", this.baseDir);
if (variable) {
text = text.replace("%var%", variable);
}
}
return text;
};
</script>
Editoval Lábus (20. 3. 2012 14:12)