Tippek, trükkök, ötletek


(Kp) #1

Üdv,

Gondoltam létrehozom ezt a topic-ot, hogy "echte ungarishe" nyelven is lehessen már segítséget kérni, remélem nem csak nekem lesz jó és hasznos, hanem más - hozzám hasonlóan - kezdő yii rajongók is örömmel veszik majd.

Egyenlőre így ömlesztve, jöhetne ide bármilyen kérés, kérdés, aztán később szét lehet bontani…

Rögtön fel is vázolnám az első - talán nem csak engem érintő - problémát: egy többnyelvű weboldalt fejlesztek yii-vel, de igazából egy nagyon lényeges ponton elakadtam, és hosszas keresés és még több próbálkozás után sem találtam kielégítő választ, arra a kérdésre, hogy mi a legkézenfekvőbb, legesztétikusabb módja annak, hogy menet közben tudjak nyelvet választani az oldalon. Az egészet úgy képzeltem el, hogy $_SESSION változóban (mondjuk $_SESSION[‘lang’]) tárolnám le az éppen aktuális nyelvet, ami alapértelmezettként magyar. Ha pedig paraméterként az URL-ben átadom, hogy ?lang=en akkor váltana át angol nyelvre és értelemszerűen ez felül is íródna a $_SESSION-ben, hogy ne kelljen mindig paraméterezve használnom az url-eket. Egészen addig nincsen semmi gond, míg a konfigurációs main.php-ban állítgatom a “language” paramétert, szépen, az adott nyelvhez tartozó view file-okat jeleníti meg a yii. Igen ám, de sehogy sem bírtam rávenni a yii-t, hogy ezt a paramétert futás közben meg tudjam változtatni, illetve az még oké, hogy megváltoztatom, de a view file-okat már nem igazán akarja cserélgetni. Most ott tartok, hogy onBeginRequest-tel kísérletezgetek, hogy ne kelljen a saját frontController-t használni (erre láttam javaslatot a cookbook-ban).

Szóval a kérdés az lenne, hogy szerintetek, ezt hogyan lehetne a legésszerűbben megvalósítani. Nem akarok az index.php-ba "szemetelni", vagy a fő layout állományba, egy jó, de használható megoldást keresek.

U.i.: javaslatok jöhetnek a topic címével kapcsolatban, gondolom utólag ezt lehet módosítani…


(Mazan Robert) #2

Ez a megoldás nem bántja az index.php-t: http://www.yiiframework.com/doc/cookbook/26/


(Kp) #3

Igen, ezt is néztem már, de nem igazán akartam saját frontController-t használni, mindenesetre most jobb megoldás nem jut eszembe, és annyira nem is vészes…

Közben felmerült egy újabb problémám. Szeretnék statikus oldalakat is megjeleníteni, méghozzá úgy, hogy ne kelljen külön action-öket írni, hanem a megfelelő paraméterek után automatikusan töltődjön be a statikus oldal. http://www.yiiframework.com/doc/cookbook/22/ - eszerint, megy is minden, mint a karikacsapás, de ez ugye nincs tekintettel arra, hogy én magyar nyelvű statikus tartalmat akarok megjeleníteni, vagy esetleg valami mást. Minden esetben a views/site/pages/ mappából veszi a php-t. Erre nincs valami ötletetek, hogy adott nyelven a megfelelő mappából huzzú be a file-t? (pl.: views/site/pages/hu/)

Ok, közben megoldottam:




public function actions()

{

    return array(

        'page'=>array(

            'class'=>'CViewAction',

            'basePath'=>'pages/' . Yii::app()->language . '/' 

        ),

    );

}




(Kp) #4

Na, újabb problémám adódott. A nyelvválasztás szépen megy már, megcsináltam a view file-okat a megfelelő mappába, így:




views/

  site/

    hu/

      index.php

    en/

      index.php



Nincs semmi baj, az adott nyelvnek megfelelően betölti a megfelelő view file-t, egészen addig, amíg "site/" alól ki nem törlöm az eredeti "index.php"-t, ami azért furcsa mert ha egy üres "index.php"-t hagyok ott, - de lehet benne bármilyen tartalom - akkor nincs gond, behúza szépen a "hu/index.php"-t vagy épp az "en/index.php"-t, attól függően, hogy milyen az alkalmazás nyelve. De ha ezt az index.php-t törlöm, akkor "SiteController cannot find the requested view "index"." hibával elszáll az egész.

Ötlet?


(Imehesz) #5

Hali,

itt egy jo kis tipp, persze lehet, hogy a tobbseg szamara ez egyertelmu, de biztos ami biztos…

Elinditottam egy sajat project-et, (http://storedbyu.mehesz.net), ahol a TMDB film-adatbazishoz kapcsolodva az ember keresgelhet filmek, kesobbiekben kepregenyek es konyvek kozott is. A lenyege az egesznek, hogy email-kent elmentve tarthatja szamon a felhasznalo, hogy melyik film, konyv van meg neki (szoveges formaban, tehat nem foglal sok helyet).

En jelenleg GMAIL-t hasznalok es a TAG-ek segitsegevel konnyeden osztalyozhatom a filmeket. Melyiket adtam kolcson, melyiket szeretnem megvenni, vicces film vagy drama stb …

No, es itt jon a tipp: a TMDB API-t haromszor hasznalom (elvileg ketszer is eleg lenne, de a szineszek listajat csak az IMDB-tol tudom kinyerni) es a visszaadott rekordot eltarolom, hogy ha a kesobbiekben valaki ezt keresi, akkor a sajat adatbazisombol huzom elo az adatot es nem hivom meg a TMDB API-t - igy nem terhelem le a szervereket es maga a progi is gyorsabb lesz, hiszen helyi adatbazisbol dolgozik. A tablaban van egy auto_increment ID es ezen kivul meg egy egyedi kulcs az imdbID. Amikor valaki rakeres egy filmre, akkor behuzom az osszes talalatot a TMDB-tol es egyszeruen vegigmegyek a listan es megprobalom elmenteni oket, persze a boki az, hogy ha siman a $model->save() metodust hivom meg, akkor azonos imdbID eseten elszall a program SQL hibaval, tehat a save() elott ellenoriztetem az adatokat a modell validate() funkciojaval:


...

if( $model->validate() )

{

  if( $model -> save )

  {

    return true;

  }

}

...

most igy visszaolvasva eleg kesze-kuszanak tunik az egesz, de remelem a lenyeg kihamozhato —

–iM

ui: http://www.themoviedb.org/


(Buyakashal) #6

Sziasztok,

Most kezdtem a yii.t es kicsit elakadtam. Hogyan tudok gridview.ban checkbox.ot hozza adni az egyik oszlopban

ez a kodom eddig:


...

echo CHtml::beginForm();

$this->widget('zii.widgets.grid.CGridView', array(

	'dataProvider'=>$dataProvider,

	'columns'=>array(

		array(

			'name'=>'sending',

			'value'=>'CHtml::checkbox("to[]", false, array("value"=>"$data->Id"))',

		),

	),

));

echo '<input type="hidden" name="email" value="send"/>';

echo CHtml::submitButton('verstuur');

echo CHtml::endForm();

...

de checkbox helyett csak egy stringet ir ki. pl ezt: “<input value=“2” type=“checkbox” name=“to[]” id=“to” />” htmlnek megtenne de nem stringnek :D tudna vki segiteni?


(Imehesz) #7

(Buyakashal) #8

Elegge trukkosnek talalom atadni a paramtereket a dataprovider.nek.

Ahogy Qiang irta:

Sztem egyszerubb ha sajat grid.et generalok sajat view.kkal (pl minden egyes row.t egy renderPartial fgv.vel legeneralom).

Btw akadt egy masik kerdesem, es ez nem tudom, h yii bug e vagy mi a szosz. A lenyeg hasznalom a CMultiFileUpload widget.et

ez egy partial view.m




echo CHtml::beginForm('','post',array('enctype'=>'multipart/form-data')).$eol = "\n";

	$this->widget('CMultiFileUpload',

		array(	

			'name' => $type.'_upload_files',

			'id' => $type.'_upload_files', 

			'htmlOptions' => array(

				'class' => 'multi',

			),

			'accept' => Yii::t('multi', $accepted_file_types),

			'denied'=>Yii::t('multi','its a not allowed filetype'),

			'duplicate' => Yii::t('multi','its already there'),

			'remove' => Yii::t('multi','[x]'),

		)

	);

	echo CHtml::hiddenField('type',"$type").$eol;

	echo CHtml::hiddenField($type.'_file_project_name'.$i, $file_project_name).$eol;

	echo CHtml::submitButton('upload'.$type, array('id'=>'btn_upload_'.$type,'name'=>'btn_upload_'.$type,'value'=>'upload '.$type));



illetve, ami nem mukodik a multiupload widget.tel kapcs. az accepted types. Figyelmen kivul hagyja oket.

vkinek vmi otlete?


(Manfreed) #9

Üdv mindenkinek! Örülök hogy kezd épülni a yii mellé egy kis magyar közösség, saját magamból kiindulva szükség is van rá.

Az eddigi yii-s pályafutásomat illetőleg sehol sem tartok, de igyekszem tanulni, olvasgatni. Nem használtam semmi ilyesmit korábban, ha meg kellett valamit írni, azt megírtam nulláról. Egyelőre nagyon idegen ez az egész osztály-mvc-keretrendszer-stb dolog, de mindenképp tetszik, szóval a lelkesedésem maximális, a hozzáértésem kevésbé.

Már egy ideje próbálok csinálni valamit, egyelőre nem tudom mi lesz (tervezés zéró, ami megtetszik azt belépítem). Egyelőre azt próbálom kitalálni - és ebben a segítségeteket is kérném - hogy hol/hogy tudok magyarítani a jószágon?

A view-ekben, komponensekben láttam elvétve egyegy mondatot, ezeket kézzel lefordítottam, de van egy csomó üzenet, amit sehol sem találok (illetve de: a magban, de azt nem illik átírni). Nincs szükségem többnyelvű felületre ami menet közben fordít nekem, csupán arra, hogy lehetőleg minden üzenet ami megjelenik a böngészőben magyar legyen.

Válaszotokat előre is köszönöm


(Imehesz) #10

hali,

erre tobbfele megoldas is lehet.

Az egyik, az egyszerubb (form-ok eseteben), azaz hogy a validator-nak atkuldessz egy message valtozot es oda teszed bele a magyar szoveget. (lasd: http://www.yiiframework.com/doc/cookbook/1/ )

A masik, kicsit bonyolultabb, de elegansabb is egyben es nem csak form-oknal lehet hasznalni (i18n) - ahol egy teljsen "nyelvkeszletet" hasznalsz. http://www.yiiframework.com/doc/guide/topics.i18n

remelem igy el tudsz indulni

–iM


(Sacoka) #11

Olyan kérdésem lenne, hogy miféle praktikák vannak yii-ben az admin szekció elkülönítésére. Cake-ban a prefixekkel nagyon jól meg lehetett oldani ezeket. Olvastam olyat, hogy külön modult lehet létrehozni az adminnak, hogyan lehet megosztani a modelleket akkor? Mivel ugyanazokon fogsz elvileg dolgozni.

Ezt találtam, amit érdemes lehet követni:

http://www.yiiframework.com/doc/cookbook/33/

szerk. Vagy egyszerűbb lenne egy admin role-hoz kötni egy admin themet és actionoket és nem lenne modul?


(Kp) #12

Ha a yii-s core üzenetekre gondolsz, akkor első körben a config file-ban a komponensekhez írd be ezt:




'coreMessages'=>array(

	'basePath'=>'protected/messages',

),



Majd a protected/messages/ mappában hozz létre azon a nyelven egy könyvtárat, amit beállítottál a config-ban, tehát ha


'language' => 'hu'

akkor egy "hu" nevű mappát, és ide másold be a "framework\messages\hu\yii.php" file-t amibe aztán kedved szerint beírhatod a rendszerüzenetek magyar megfelelőjét.


(Kp) #13

Adott egy yii alkalmazás, ami egészen addig tökéletesen működik, míg nem próbálok keresőbarát url-eket használni az urlManager-rel, valahogy így:




'urlManager'=>array(

    'urlFormat'=>'path',

    'showScriptName'=>false,

    'rules'=>array(

        'pattern1'=>'route1',

        'pattern2'=>'route2',

        'pattern3'=>'route3',

    ),

)



Localhoston nincs probléma tökéletesen megy a dolog, míg ha feltolom éles szerverre az alábbi hibaüzenetet kapom:

Fatal error: Call to a member function parsePathInfo() on a non-object in /opt/share/www/b/bsplastic.hu/framework/web/CWebApplication.php on line 419

Ha kikommentezem a rules részt a konfigurációs állományból, akkor tökéletesen működik.

Valakinek valami ötlet?


(Imehesz) #14

hali

személy szerint még nem volt ilyen problémám , de egyelőre a szervereim csak PHP 5.2-sel futnak.

nézd meg ezt, hátha segít, vagy ad valami ötletet …

http://code.google.com/p/yii/issues/detail?id=960

–iM


(Maitnera) #15

Érdekes. Olyan mintha az urlManager komponens inicializálása során valami csendben elhasalna és a kompones helyett null vagy valami ilyesmit tárolna az inicializált komponenseket tároló tömbben. Ha nincs a hibalogban semmi, akkor én egy gyors manuális tesztet csinálnék, a rules szabályokat egyesével bekapcsolni és tesztelni.

Másik tippem, hogy a szabályok feldolgozását alapból cache-eli a yii, ha használsz cache-t akkor esetleg ezzel is lehet gond. (cache ürítés, vagy kikapcsolás)


(Pharsan) #16

Sziasztok!

Gyűröm a Yii-t néhány hete kiegészítő elfoglaltságként. Rájöttem, hasznos dolgokra pl. kép tárolása, megjelenítése blob-ban/ból.

Kellene segítség a cjuisliderimput, modell változóhoz (mezőhöz)kötésében. Nem íródik vissza a beállított érték.

Előre is köszi.

pharsan


(Sacoka) #17

Ennél több kellene, hogyan hívod meg a widgetet és hogyan kezeled le a postolt adatokat? A form submitja után megjelenik a slider értéke a post-ban? Mi a mező neve az adatbázis táblában?


(Pharsan) #18

Szako!

Kérdéseddel adtál ötletet, a debuggolás és Firebug segitett előrébb lépni.

Szóval ez itt a CRUD generált _form.php részlete, kiegészítve a slider-re vonatkozó kóddal:




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

.

.

.

	<div class="row">

		<?php echo $form->labelEx($model,'ertekeles'); ?>

		<?php echo $form->textField($model,'ertekeles'); ?>

		<?php echo $form->error($model,'ertekeles'); ?>

		<?php $form->widget('zii.widgets.jui.CJuiSliderInput', array(

		    'name'=>'Receptura_ertekeles',

		    'value'=>$model->ertekeles,

		    // additional javascript options for the slider plugin

		    'options'=>array(

			'event'=>'change',

		        'min'=>1,

		        'max'=>7,

		    ),

	            'htmlOptions'=>array(

                         'style'=>'width:100px;',

            ),

       )); ?>

	</div>

.

.

.



Fontos a sorrend, előbb kell szerepeljen a mező, azután a slider.

Valamint a “‘event’=>‘change’” különben csak összekapcsolódik, de nem íródik be a változóba.

További kérdésem akad…

Az update.php-ban beállítva a class="wide form"-ot a label és a mező egymás mellé kerül (szerintebb szebb).

Hogyan lehetne a slidert a mezővel egy sorba igazítani.

Esetleg a mezőt elrejteni és tooltip-ben az értéket. (Ez a bonusz feladat ;) )

Üdv

pharsan


(Sacoka) #19

Nem igazán értem, melyik mezővel? Ha "wide" osztályt hozzáadod a div-hez, akkor a labelek balra, az input mezők jobbra lesznek. Ha a slidert a textbox mellé akarod, akkor próbálkozz floattal. Nem használtam még a slider osztályt, így nem tudom milyen kimenetet generál.

Ha a textboxban nem akard megjeleníteni az értéket, akkor miért nem direktben tolod át az input értékét és törlöd a textboxot? A widgetben:


'name'=>'Receptura[ertekeles]'

feltételezve azt, hogy a modelled a Receptura.

Googlen ezt találtam, kiindulópontnak jó lehet:

http://efreedom.com/Question/1-3147387/Tooltip-Follow-Jquery-Slider-Handle


(Bg) #20

Hello,

Mostanság kezdtem el foglalkozni a Yii-vel és nem teljesen értek valamit.

miért van az hogy ha a menübe label tagnak étkezetes betüt adok meg akkor nem hajlandó kiírni az egyész menüt :S




		<?php $this->widget('zii.widgets.CMenu', array(

		'items'=>array(

			array('label'=>'Kezdőlap', 'url'=>array('/site/index')),

itt az Ő betű miatt az egész Kezdőlap menüt eltünteti.

Mit rontottam el?

előre is köszö