Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
[problem] YiiFramework zdublowane ID w widgetach
#1
Witam,

Na stronie głównej posiadam dwa widgety zawierające odpowiednio formularz logowania i rejestracji. Oba formularze korzystają z tego samego modelu, w którym zdefiniowane są scenariusze dla tych dwóch przypadków. Oba formularze dodawana są do widoku za pomocą metody renderPartial przez co pojawia się problem zdublowania ID dla poszczególnych pól formularza i przez to nie działa walidator compareAttribute. Czy jest jakiś prosty sposób na zmianę ID pól jednego z formularzy by nie musieć grzebać w akcjach logowania i rejestracji a tym bardziej w modelu?
Jak pomogłem daj '+'. To nie boli, a ja mam satysfakcję Smile

Any sufficiently advanced technology is indistinguishable from magic.
Odpowiedz
#2
Wrzuć coś z kodu, bo ja chyba nie ogarniam dziś, nie łapię po prostu o co biega Smile
Dobre samopoczucie w tym tygodniu sponsoruje cytat:
Cytat:Mogę tylko tylko na prawo i lewo ale na środek nie mogę.
Odpowiedz
#3
Dobra to tak na szybko

Widok Login:

Kod:
<?php
    $form=$this->beginWidget('CActiveForm', array(
    'id'=>'login_form_widget',
    'enableClientValidation'=>true,
    'clientOptions'=>array(
        'validateOnSubmit'=>true,
    ),
)); ?>

    <div class="row">
        <?php echo $form->label($model,'login'); ?>
        <?php echo $form->textField($model,'login'); ?>
        <?php echo $form->error($model,'login'); ?>
    </div>

    <div class="row">
        <?php echo $form->label($model,'password2'); ?>
        <?php echo $form->passwordField($model,'password2'); ?>
        <?php echo $form->error($model,'password2'); ?>
    </div>
    
    <div class="row rememberMe">
        <?php echo $form->checkBox($model,'rememberMe'); ?>
        <?php echo $form->label($model,'rememberMe'); ?>
        <?php echo $form->error($model,'rememberMe'); ?>
    </div>
    <div class="clear"></div>

    <div class="row buttons">
        <?php echo CHtml::submitButton('Zaloguj',array('id'=>'lightbox_login_submit')); ?>
    </div>

<?php $this->endWidget(); ?>

Widok register
Kod:
<?php $form=$this->beginWidget('CActiveForm', array(
        'id'=>'rejestracja-form',
        'enableClientValidation'=>true,
        'clientOptions'=>array(
            'validateOnSubmit'=>true,
        ),
    )); ?>
        
        <div class="row">
    <?php echo $form->labelEx($model,'login'); ?>
    <?php echo $form->textField($model,'login'); ?>
    <?php echo $form->error($model,'login'); ?>
        </div>
        
        <div class="row">
    <?php echo $form->labelEx($model,'password2'); ?>
    <?php echo $form->passwordField($model,'password2'); ?>
    <?php echo $form->error($model,'password2'); ?>
        </div>
        
        <div class="row">
    <?php echo $form->labelEx($model,'password'); ?>
    <?php echo $form->passwordField($model,'password'); ?>
    <?php echo $form->error($model,'password'); ?>
        </div>
        
      <div class="row">
    <?php echo $form->labelEx($model,'email'); ?>
    <?php echo $form->textField($model,'email'); ?>
    <span class="adnotation">E-maile nie będą ujawniane osobom trzecim</span>
    <?php echo $form->error($model,'email'); ?>
        </div>
    
        <div class="accept_terms row">
    <?php echo $form->checkBox($model,'accept'); ?>
    <?php echo $form->labelEx($model,'accept'); ?>
    <?php echo $form->error($model,'accept'); ?>
        </div>
        <div class="clear"></div>
        <div id="register" class="row buttons">
    <?php echo CHtml::submitButton('Zarejestruj',array('submit' => '/rejestracja',"id"=>"lightbox_register_submit")); ?>
        </div>
    </div>
    <?php $this->endWidget(); ?>

Layout:

Kod:
<?php
$this->renderPartial('site/login',array('model'=>$model));
?>
<?php
$this->renderPartial('site/register',array('model'=>$model));
?>

W ten sposób ID dla login i haslo są zdublowane (występują zarówno w logowaniu i rejestracji, które jednocześnie są na stronie) i powoduje błędy w JS - nie wspominam już o walidacji. Tutaj masz screen z konsoli:

http://screenshooter.net/8216679/awqscet

EDIT:

Nie chcę przerabiać żadnej z tych akcji ani nawet modelu. Jakie jest najmniej inwazyjne rozwiązanie by id w tych widgetach się różniło i poszczególne akcje mogły spokojnie walidować formularz za pomocą metod $model->attributes($_POST) i $model->validate();

W ostatniej chwili dostałem info, by logowanie i rejestracja było w formie lightboxach bez AJAXa (bo tak brzydko się ładuje a powinno być od razu) i komplikuje mi to sprawę
Jak pomogłem daj '+'. To nie boli, a ja mam satysfakcję Smile

Any sufficiently advanced technology is indistinguishable from magic.
Odpowiedz
#4
http://www.yiiframework.com/doc/api/1.1/CHtml#textField-detail

Trzeci parametr, $htmlOptions podajesz jako tablica: array('id' => 'ID POLA')

PS: id nie ma nic do walidacji po stronie serwera.
Dobre samopoczucie w tym tygodniu sponsoruje cytat:
Cytat:Mogę tylko tylko na prawo i lewo ale na środek nie mogę.
Odpowiedz
#5
Eh to ja mam jednak gorszy dzień Smile Takie głupoty porobić. Wstyd Big Grin

Poza tym compare nie działało mi dlatego, gdyż było przypisane do scenariusza rejestracji, reszta waldiatorów była bez scenariusza, instancję modelu tworzyłem bez scenariusza i stąd nie miałem walidacji. Głupie błędy a pół dnia zmarnowane...

Dzięki!
Jak pomogłem daj '+'. To nie boli, a ja mam satysfakcję Smile

Any sufficiently advanced technology is indistinguishable from magic.
Odpowiedz


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości
Sponsorzy i przyjaciele
SeoHost.pl