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.innerHtmlza$(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)