TinyMCE-an invalid form control

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
inzacz
Člen | 17
+
0
-

Vím, že TinyMCE již tu bylo probírané několikrát, ale nesetkal jsem se tu s řešením chyby která trápí mne.

Podařilo se mi bez problému navázat TinyMCE na textareau a zprovoznil validování. Problém je, že formulář se při nevyplněném textu sice neodešle, ale nezobrazí hlášku o nutnosti vyplnění a konzole vyhodí chybu
An invalid form control with name=‚text_p‘ is not focusable., kde text_p je název textového pole při vytváření formuláře. Zkoušel jsem více způsobu odstranění chyby, ale žádný z návodu na tinyMCE mi nepomohl.

Přikládám dvě různé verze, obě fungují stejně..

public function createComponentFirmyNote() {

        $form = new AppForm;
        $form->addTextArea('text_n', 'Poznámka')->addRule(Form::FILLED, 'Musí být zadán text');
        $form->getComponent('text_n')->getControlPrototype()->class('mceEditor');

        $form->addSubmit('newnote', 'Přidat');
        $form->onSuccess[] = callback($this, 'executeFirmyNote');
        $form->getElementPrototype()->onSubmit('tinyMCE.triggerSave()');
        return $form;
    }

    public function createComponentFirmyCall() {

        $form = new AppForm;
        $form->addTextArea('text_p', '')->addRule(Form::FILLED, 'Musí být zadán text')->getControlPrototype()->class('mceEditor');

        $form->addSubmit('newcall', 'Přidat')->getControlPrototype()->onclick('tinyMCE.triggerSave()');

        $form->onSuccess[] = callback($this, 'executeFirmyCall');

        return $form;
    }

Přikládám dvě různé verze, obě fungují stejně..

llsm
Člen | 121
+
0
-

Zkus takto (onClick se vyuzije misto onSucces):

<?php
$form->addSubmit('add','přidat')->onClick[] = array($this, 'executeFirmyNote');
$form->getElementPrototype()->onSubmit('tinyMCE.triggerSave()');
?>

Editoval llsm (8. 3. 2012 20:51)

inzacz
Člen | 17
+
0
-

výsledek nezměněn, je potřeba abych se postnul ještě jinou část kódu?

llsm
Člen | 121
+
0
-

A co se stane, kdyz das pryc addRule()?

inzacz
Člen | 17
+
0
-

Internal server error

llsm
Člen | 121
+
0
-

Tak jsem to u sebe trochu vyzkousel a poslu ti, jak mam kod ja. Pokud mam navazane pravidlo (libovolne addRule) na element, ktery je tinyMCE, tak mi to nefunguje.

<?php
public function createComponentProblemForm() {
        $form = new AppForm();
        $form->addText('name', 'název', 45)->addRule(Form::FILLED, 'Musí být zadán text');
        $form->addTextArea('symptoms', 'projevy problému')->getControlPrototype()->class('mceEditor');
        $form->addCheckBox('visible', 'veřejné');
        $form->addSubmit('add','přidat')->onClick[] = array($this, 'processAddProblemForm');
        $form->getElementPrototype()->onsubmit('tinyMCE.triggerSave()');
        return $form;
    }
?>

a v sablone:

<script>
tinyMCE.init({
		mode: "specific_textareas",
    editor_selector: "mceEditor",
		theme : "advanced",
                plugins : "xhtmlxtras",


                theme_advanced_buttons1 : "bold,italic,cite,|,link,unlink,image,|,bullist,numlist,|,undo,redo,|,formatselect",
                theme_advanced_buttons2 : "",
                theme_advanced_buttons3 : "",
                theme_advanced_buttons4 : "",
                theme_advanced_toolbar_location : "top",
                theme_advanced_toolbar_align : "center",
                theme_advanced_statusbar_location : "bottom",
                theme_advanced_resizing : true,

                content_css : "/css/screen.css"


	});
</script>

Jestli ti to pomuze, nezapomen napsat, v cem jsi mel chybu… ;)

Editoval llsm (8. 3. 2012 21:22)

llsm
Člen | 121
+
0
-

A jeste me napadlo, nemas nahodou TinyMCE jquery package? Co nejaky dalsi javascript?

Editoval llsm (8. 3. 2012 21:35)

inzacz
Člen | 17
+
0
-

Právě, že potřebuji kontrolu na textovém poli, jinde mi to funguje bez problémů

inzacz
Člen | 17
+
0
-

llsm napsal(a):

A jeste me napadlo, nemas nahodou TinyMCE jquery package? Co nejaky dalsi javascript?

asi ne protože vůbec netuším co to je

llsm
Člen | 121
+
0
-

At to zkousim jak to zkousim, pokud mam na tinyMCE textarea pridane validacni pravidlo (addRule(blabla)), tak mi prestane fungovat odeslani formulare. A reseni se mi nedari najit. Pokud chces za kazdou cenu kotrolovat, jestli v tom poli neco je, tak se asi jako berlicka da udelat to, ze si tu kontrolu udelas az v metode, ktera zpracovava data z odeslaneho formulare. Neni to tak elegantni a musi se kvuli tomu znovu nacist stranka, ale muze to byt lepsi nez nic…

inzacz
Člen | 17
+
0
-

asi mi nic jiného nezbude, odeslání mi funguje ale kontrola hlásí chybu ikdyž kontrola proběhne

mno kdyby někoho něco napadlo budu jedině rád

inzacz
Člen | 17
+
0
-

Chybu se nepodařilo odstranit, ani nalézt její příčinu.

nahrazeno vlastní kontrolou…

Editoval inzacz (9. 3. 2012 1:43)

Rellik
Člen | 104
+
0
-

Já TinMCE používám v administraci a funguje i addRule. Taky sem s tím měl ze začátku problém, ale pak to šlo celkem jednoduše.
presenter s formem, kde mám tinyMce:
https://github.com/…resenter.php#L43
Jediný rozdíl v šabloně je ten, že sem si dal ten JS do externího souboru..
https://github.com/…layout.latte#L20
https://github.com/…ter/js/js.js

llsm
Člen | 121
+
0
-

Tak jsem to pozlobil a pro budouci generace:
TinyMCE funguje tak, ze puvodni element, vetsinou textarea, udela display: hidden; a misto toho si vytvori svuj novy se vsema zuzo featurama apod. Proto bezna validace se na prvku nezobrazi narozdil od ostatnich prvku, ktere jsou puvodni a validace je na ne navazana.
Pokud clovek pouzije Live form validator, je situace uz trochu lepsi. Tam je akorat potreba dostylovat chybovou hlasku, aby se zobrazila, protoze defaultne ji TinyMCE take nastavi inline display: hidden;. Je tedy potreba do css souboru prihodit .form-error-message {display: block !important;} a zprava se uz vypise. Pak uz si ji muze clovek dostylovat jak chce.
Dekuji Rellikovi za jeho kod, bez nej bych to asi nevyresil.

mav
Člen | 12
+
0
-

Vše výše uvedené mi funguje, jen např. při neplatné kontrole reCaptcha se jen pole s MCE Editorem smaže, ostatní pole zůstanou naplněna. Nefunguje mi ani ->setDefaultValue(‚…‘);

<?php
       protected function createComponentContactForm()
        {
		...

                $form->addTextArea('vzkaz', 'Vzkaz:', 50)
                    ->addRule(Form::FILLED, 'Nevyplnili jste vzkaz.')
                    ->addRule(Form::MAX_LENGTH, 'Text je příliš dlouhý', 500)
                    ->getControlPrototype()->class('mceEditor');
                $form->addText('recaptcha_response_field', '', 30, 30)
                    ->addRule(Form::FILLED, 'Zadejte kontrolu proti spamu.');
                $form->addSubmit('create', 'Odeslat');
                $form->getElementPrototype()->onsubmit('tinyMCE.triggerSave()');
                $form->onSuccess[] = callback($this, 'contactFormSubmitted');
                return $form;
        }

        public function ContactFormSubmitted(Form $form)
        {
            $resp = BasePresenter::reCaptcha();
            if (!$resp) {
                    $this->flashMessage('Zadejte znovu kontrolu proti spamu.', error');
                    if (!$this->presenter->isAjax()) {
                    $this->redirect('this');
                    } else {
                        $this->invalidateControl('form');
                        $this->invalidateControl('flashMessages');
                    }
            } else {
                   ...zaslání vzkazu...
            }
?>
MartyIX
Člen | 217
+
+1
-

http://stackoverflow.com/…oogle-chrome – tady je osvetleni problemu

Resil jsem to pomoci:

$form = new Form($this, 'form');
$form->getElementPrototype()
   // Validation is disabled because Chrome's form validation may lead to a JS error
   // http://stackoverflow.com/questions/7168645/invalid-form-control-only-in-google-chrome
   ->novalidate("novalidate");

Editoval MartyIX (9. 3. 2013 16:10)