Query Search Yii.1.14

Ciao a tutti sono un newbie di yii, seguendo la documentazione di yii, non ho capito una cosa, usando il modulo gii creo il model e le operazioni crud e fino a qui tutto ok,solo che quando devo utilizzare la funzione search i risultati vengono sempre associati ad un widget (Clist o Grid)che utilizzano il dataprovider!, io vorrei poter estrarre i dati dentro un div che ho scritto io…estraendo e facendo ciclare i campi in base alla ricerca che ho ottenuto ad esempio vorrei ottenere i risultati della ricerca in questo blocco

,a fianco a questo blocco…avro la form di ricerca che ogni volta mi farà cambiare i risultati in base alla ricerca.La funzione search che ho utilizzato è questa

ora non riesco a capire come estrapolare i dati nella view ed associare la funzione ai campi della form! help

Ciao, anche io sono un newbie ed in attesa di una risposta dei "veterani" ti espongo quel poco che ho compreso.

Naturalmente potresti eseguire un ciclo "for" per visualizzare i dati nel view, ma te lo sconsiglio.

Yii non è rigido, puoi personalizzare i widget a piacimento.

Ti consiglio di leggere questo codice, per me è stato di grande aiuto.

Spero di esserti stato di aiuto.

Ho creato con il modulo gii la CRUD, ora stavo andando a modificare la ricerca…,ma i risultati non li voglio in un widget…, il controller AttivitaController


public function actionAdmin()

	{

		$model=new Attivita('search');

		$model->unsetAttributes();  // clear any default values

		if(isset($_GET['Attivita']))

			$model->attributes=$_GET['Attivita'];


		$this->render('admin',array(

			'model'=>$model,

		));

	}

il modello Attivita:


public function search()

	{

		// @todo Please modify the following code to remove attributes that should not be searched.


		$criteria=new CDbCriteria;


		$criteria->compare('id',$this->id,true);

		$criteria->compare('eventi_id',$this->eventi_id,true);

		$criteria->compare('nome',$this->nome,true);

		$criteria->compare('descrizione',$this->descrizione,true);

		$criteria->compare('indirizzo',$this->indirizzo,true);

		$criteria->compare('titolo',$this->titolo,true);

		$criteria->compare('coordinate',$this->coordinate,true);

		$criteria->compare('image',$this->image,true);

		$criteria->compare('categoria',$this->categoria,true);

		$criteria->compare('username',$this->username,true);

		$criteria->compare('psw',$this->psw,true);


		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

	}

poi la view _search


<?php

/* @var $this AttivitaController */

/* @var $model Attivita */

/* @var $form CActiveForm */

?>


<div class="wide form">


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

	'action'=>Yii::app()->createUrl($this->route),

	'method'=>'get',

)); ?>


	


	<div class="row">

		<?php echo $form->label($model,'nome'); ?>

		<?php echo $form->textField($model,'nome',array('size'=>60,'maxlength'=>255)); ?>

	</div>


	


	<div class="row buttons">

		<?php echo CHtml::submitButton('Search'); ?>

	</div>


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

   


</div><!-- search-form -->

infine la view admin…che nelle operazioni crud preimpostate usa il widget


<?php

/* @var $this AttivitaController */

/* @var $model Attivita */


$this->breadcrumbs=array(

	'Attivitas'=>array('index'),

	'Manage',

);


$this->menu=array(

	array('label'=>'List Attivita', 'url'=>array('index')),

	array('label'=>'Create Attivita', 'url'=>array('create')),

);


Yii::app()->clientScript->registerScript('search', "

$('.search-button').click(function(){

	$('.search-form').toggle();

	return false;

});

$('.search-form form').submit(function(){

	$('#attivita-grid').yiiGridView('update', {

		data: $(this).serialize()

	});

	return false;

});

");

?>


<h1>Manage Attivitas</h1>


<p>

You may optionally enter a comparison operator (<b>&lt;</b>, <b>&lt;=</b>, <b>&gt;</b>, <b>&gt;=</b>, <b>&lt;&gt;</b>

or <b>=</b>) at the beginning of each of your search values to specify how the comparison should be done.

</p>


<?php echo CHtml::link('Advanced Search','#',array('class'=>'search-button')); ?>

<div class="search-form" style="display:none">

<?php $this->renderPartial('_search',array(

	'model'=>$model,

)); ?>

</div><!-- search-form -->


<?php /* $this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'attivita-grid',

	'dataProvider'=>$model->search(),

	'filter'=>$model,

	'columns'=>array(

		'id',

		'eventi_id',

		'nome',

		'descrizione',

		'indirizzo',

		'titolo',

		/*

		'coordinate',

		'image',

		'categoria',

		'username',

		'psw',

		*/

		array(

			'class'=>'CButtonColumn',

		),

	),

)); */?>


<?php 


/* faccio ciclare..,ma quando uso la form per cambiare ricerca..mi rimangono comunque tutti i risultati */


$dataProvider = Attivita::model()->search();


$dataArray = $dataProvider->getData();


foreach ($dataArray as $dati){

    

    echo CHtml::encode($dati->nome)."<br>";

}







?>



faccio ciclare…,ma quando uso la form per cambiare ricerca…mi rimangono comunque tutti i risultati, non riesco a capire…, se devo creare un’altro widget :( o cosa fare… help

Se non vuoi un widget, cicla il risultato della query con un for. Il widget fa la stessa cosa.

Io avevo fatto cosi:


$dataProvider = Attivita::model()->search();


$dataArray = $dataProvider->getData();


foreach ($dataArray as $dati){

    

    echo CHtml::encode($dati->nome)."<br>";

}

ma cosi facendo rimangono sempre tutti i risultati…,quando metto il parametro di ricerca sulla form…,vengono visualizzati sempre tutti i risultati!, mi manca un pezzo :(

Ti manca il pezzo del widget. Devi implementare un mondo di roba. Io fossi in te spenderei tempo a modificare il widget affinchè appaia come preferisci tu. In ogni caso, ricordati sempre che puoi limitare il numero di record restituiti.

quindi dovrei crearmi un widget personalizzato per la mia struttura? che alla fine sarebbe questa:


 <img src="<?php echo Yii::app()->theme->baseUrl; ?>/images/world_map.jpg" class="imgMap" />

<div class="marker" id="france" data-coords="<?php echo CHtml::encode($data->coordinate);?>">

    

    <h3><?php echo CHtml::encode($data->nome); ?></h3>


</div>

io avevo sfruttato la CListView e mi funziona!, solo che quando non trova i risultati…, mi oscura l’immagine–>


<?php echo Yii::app()->theme->baseUrl; ?>/images/world_map.jpg" class="imgMap" />

nella lista mette invece nessun risultato trovato…a me dovrebbe rimanere l’immagine senza i marker(in quanto risultati trovati 0)

Ho seguito il tuo consiglio e sono andato a modificare il widget…, in questo caso la funzione renderEmpty

Intendi dire che hai modificato il codice del framework, oppure ne hai creato uno tuo? Il codice del framework non andrebbe mai toccato, altrimenti perdi la possibilità di scaricarti gli aggiornamenti.

No ho fatto un copia incolla dei widget…,rinomimati e modificati per quello che dovevo fare,anche perchè quelli originali mi servivano per altre funzioni

Attenzione: in questo modo hai duplicato del codice e se si presentano dei bug nei widget i tuoi non erediteranno le correzioni. Cerca sempre di estendere.

Ho modificato la funzione renderEmpty e la _View