Forum Webmastera, HTML, CSS, PHP, MySQL, Hosting, Domeny - Forum dla Webmasterów
[problem] YiiFramework zdublowane ID w widgetach - Wersja do druku

+- Forum Webmastera, HTML, CSS, PHP, MySQL, Hosting, Domeny - Forum dla Webmasterów (https://www.webmastertalk.pl)
+-- Dział: Technologie internetowe - tworzenie stron WWW (https://www.webmastertalk.pl/forum-technologie-internetowe-tworzenie-stron-www)
+--- Dział: Programowanie, Bazy danych (https://www.webmastertalk.pl/forum-programowanie-bazy-danych)
+--- Wątek: [problem] YiiFramework zdublowane ID w widgetach (/thread-problem-yiiframework-zdublowane-id-w-widgetach)



[problem] YiiFramework zdublowane ID w widgetach - R_Rafalsky - 15-03-2012

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?


RE: [problem] YiiFramework zdublowane ID w widgetach - Pedro84 - 16-03-2012

Wrzuć coś z kodu, bo ja chyba nie ogarniam dziś, nie łapię po prostu o co biega Smile


RE: [problem] YiiFramework zdublowane ID w widgetach - R_Rafalsky - 16-03-2012

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ę


RE: [problem] YiiFramework zdublowane ID w widgetach - Pedro84 - 16-03-2012

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.


RE: [problem] YiiFramework zdublowane ID w widgetach - R_Rafalsky - 16-03-2012

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!