[SOLVED] Come ti taggo record di una tabella con un form ajax

Ho creato una tabella per memorizzare dei tag. Ho creato model e crud via shell. Quindi, sono andato nella view di un altro controller ed ho copiato il codice html del _form.


<h1>Aggiungi un nuovo tag:</h1>

<?php if (!Yii::app()->user->isGuest): ?>

  <?php

  $form = $this->beginWidget('CActiveForm', array(

              'id' => 'tags-form',

              'enableAjaxValidation' => false,

          ));

  ?>

  <?php echo $form->errorSummary(Tags::model()); ?>

  <div class="row">

    <?php echo $form->textField(Tags::model(), 'tag', array('size' => 50, 'maxlength' => 50)); ?>

    <?php echo $form->error(Tags::model(), 'tag'); ?>

  </div>

  <div class="row buttons">

    <?php echo CHtml::ajaxSubmitButton(Tags::model()->isNewRecord ? 'Create' : 'Save', array('tags/create')); ?>

  </div>

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

<?php endif; ?>

Ho corretto il bottone di submit. In questo modo ho realizzato un form ajax.




<?php echo CHtml::ajaxSubmitButton(Tags::model()->isNewRecord ? 'Create' : 'Save', array('tags/create')); ?>



Funziona. Però … però adesso vorrei ripulire la casella di testo, e fare una chiamata ajax per mostrare i tags aggiunti sino a questo momento.

Nel terzo parametro di ajaxSubmitButton, che cosa ci devo mettere? Ho tentato con array(‘onclick’=>‘alert("!!!");’). Mi aspettavo di ricevere un alert.

Il mio errore




    <?php 

    echo CHtml::ajaxSubmitButton(Tags::model()->isNewRecord ? 'Create' : 'Save', array('tags/create'), array(

        'update' => '#elencotags',

        'complete' => 'alert(\'!\');',

        'success' => 'alert(\'!!\');'

    ));

    ?>



La soluzione (togliere il punto e virgola alla fine … ):




    <?php 

    echo CHtml::ajaxSubmitButton(Tags::model()->isNewRecord ? 'Create' : 'Save', array('tags/create'), array(

        'update' => '#elencotags',

        'complete' => 'alert(\'!\')',

        'success' => 'alert(\'!!\')'

    ));

    ?>



Eccomi giunto ad una soluzione finale che voglio condividere con voi:

Nel mio database ho una tabella che ho chiamato Tags:

CREATE TABLE IF NOT EXISTS Tags (

id int(11) NOT NULL AUTO_INCREMENT,

idtable int(11) NOT NULL,

table varchar(50) NOT NULL,

tag varchar(50) NOT NULL,

PRIMARY KEY (id)

)

Rispettivamente abbiamo:

id: campo chiave della tabella tags

idtable: campo chiave del record che verrà taggato

table: tabella che verrà taggata

tag: nome del tag

Molto semplice come vedete. Posso, quindi, raccogliere i tag del record di una tabella. A prescindere dalla tabella. Questo è molto importante.

Quindi creo il form che mi permette di popolare questa tabella:




<h1>Aggiungi un nuovo tag:</h1>

<?php if (!Yii::app()->user->isGuest): ?>

  <?php

  $form = $this->beginWidget('CActiveForm', array(

              'id' => 'tags-form',

              'enableAjaxValidation' => false,

          ));

  ?>

  <?php echo $form->errorSummary(Tags::model()); ?>

  <div class="row">

    <?php echo CHtml::hiddenField('nascondimi', 'si'); ?>

    <?php echo CHtml::hiddenField('Tags[table]', $model->tableName()); ?>

    <?php echo CHtml::hiddenField('Tags[idtable]', $model->id); ?>

    <?php echo $form->textField(Tags::model(), 'tag', array('size' => 50, 'maxlength' => 50)); ?>

    <?php echo $form->error(Tags::model(), 'tag'); ?>

  </div>

  <div class="row buttons">

    <?php

    echo CHtml::ajaxSubmitButton(Tags::model()->isNewRecord ? 'Create' : 'Save', array('tags/create'), array(

        'complete' => 'function(data){$("#Tags_tag").val("");$("#elencotags").html(data.responseText);}'

    ));

    ?>

  </div>

  <div id="elencotags"><?php $this->renderPartial('/tags/lista', array('model' => Tags::model()->findAll())); ?></div>

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

<?php endif; ?>



Ed in questa parte, vengono mostrati i tag inseriti.




  <div id="elencotags"><?php $this->renderPartial('/tags/lista', array('model' => Tags::model()->findAll())); ?></div>



Al submit del form, il campo viene svuotato, e l’elenco dei tag aggiornato da questa view:




<?php $count = count($model); ?>

<?php foreach ($model as $tag): ?>

  <?php echo $tag['tag'] . (--$count == 0 ? '.' : ', '); ?>

<?php endforeach; ?>



Più avanti proverò ad aggiungerci l’autocomplete. Mi piace molto questa soluzione, spero possa essere di aiuto per migliorare l’ux delle nostre app.