Crud - Wyświetlanie Większej Ilości Pól

Witam. Zaczynam przygodę z Yii i już mam problem. Utworzyłem i wygenerowałem cruda dla tabeli users która zawiera aż 20 pól. Gdy chcę zobaczyć listę userów, to widzę tylko pierwsze 6 pól a chciałbym żeby wszystkie były dostępne. Czy można to jakoś rozszerzyć?

Dopisz wyświetlanie kolejnych pól w /protected/views/{twoj_kontroler}/_view.php

Dzięki! Oto mi chodziło :) Teraz uczę się na podstawie tutorialu bloga: http://www.yiiframework.com/doc/blog/1.1/pl/prototype.auth

Mam wszystko tak samo, lecz dostaję taki error: Property "User.salt" is not defined.. Dziwne czemu metoda ma odwoływać się do nieistniejącego pola takiego jak salt… Błąd w kursie czy coś pomyliłem?

Jest kilka błedów w kursie i to jest jeden z nich.

Możesz dodać pole "salt" do tabeli lub zmienić tak procedure aby nie kozystała z logiki piola "salt".

Pewnie gdzieś pominięto informację o konieczności dodania pola salt do user. Dodaj je (jako np. VARCHAR (32)) i przegeneruj model User.

Sól to dodatkowy ciąg znaków (np. md5 z czasu rejestracji użytkownika w bazie i jakiegoś stałego ciągu znaków), utrudniający ewentualne "złamanie" hasła.

To nie oto chodziło. W angielskiej wersji jest inny kod generowania hasha i soli, i w polskim tutorialu nie ma uaktualnionego kodu.

Ufff… Po długim czasie wreszcie skończyłem czytać Poradnik do Yii i wiele rzeczy się wyjaśniło mi :) Teraz jeszcze chcę przejść przez kurs robienia bloga, ale pojawia mi się błąd:

Property "PostController._model" is not defined. w /protected/controllers/PostController.php(164)


if($this->_model===null)

Co jest nie tak?

Masz pole klasy


private $_model;

?

(http://www.yiiframework.com/doc/blog/1.1/en/post.display#customizing-x-7x-operation)

Dzięki, pomogło. Patrząc w licencje zauważyłem że w Yii nie wolno umieszczać logów, znaków towarowych. Czy jest jakaś opcja wykupienia licencji i robienia stron komercyjnych? A i czy lepiej korzystać z Zii(data provider,grid view) czy normalnie na modelu metodę find? Chodzi mi o szybkość.

Z tego co widzę tutaj, to chodzi o to, że nie można do własnych celów wykorzystywać nazwy Yii, jego logo itp. Możesz go oczywiście wykorzystywać do tworzenia stron komercyjnych, sklepów internetowych itp. Zresztą są płatne np. CMS-y bazujące na Yii (np. Monoray PRO).

Co do drugiego pytania, to w praktyce "pod spodem" komponenty w zii i tak odpalają metody z ORM Yii, więc raczej bez znaczenia.

Dobrze jest jednak kontrolować odpalane zapytania, czas ich trwania, pamiętać o tworzeniu właściwych relacji (oraz używaniu with()) bo niewłaściwie użyty ORM potrafi przy korzystaniu z np. CGridView często wygenerować sporo zbędnych zapytań. Podłącz sobie do projektu Yii debug toolbar i zobacz, jak to u ciebie wygląda.

Dzięki za odpowiedzi. Zainstalowałem sobie Yii-Booster ale ten Boostrap powoduje że strona mi się rozwala (w sensie układ css). Czy to tak ma być czy ja coś źle robię?

Rozplanowałem już sobie wszystkie strony, ale teraz muszę dorobić do nich odpowiednie kontrolery i modele. Jest przykładowo takie coś: użytkownik w menu ma zakładkę moje konto w której ma 3 podzakładki: update profilu, historia transakcji, swoje posty. Teraz to ma być wszystko ładowane pod kontroler "profile" czy może profile,transaction i news? A co jak potrzebuje na jakiejś stronie użyć dwóch kontrolerów? Robię kontroler który będzie rozszerzał tamte czy coś?

Edit: Bootstrap działa dobrze ale koliduje z moim css. Czy warto się bawić w zmienianie?

Jak chcesz, żeby stronka wyglądała/skalowała się dobrze do urządzeń z mniejszymi ekranami, to warto poprawić swojego CSS-a.

Na razie chyba zajmę się resztą aplikacji, a na końcu ewentualnie poprawianiem wyglądu.

W kontrolerze mam coś takiego:


public function actionRegister()

{

   $this->layout = 'content1';

   ...

   $this->render('register',array('model'=>$model,'title'=>'TYTUŁ NAGŁÓWKA'));

}

a w /layouts/content1.php:


<h1><?php echo $title; ?></h1><br>

<?php echo $content; ?>

Pytanie teraz czy w dobry sposób do widoku przesyłam zmienną $title? I dlaczego nie wyświetla layoutu? Gdy wpisze ‘column1’ to działa, ale dla content1 już nie…

Powinno być raczej (zakładam, że content1.php masz w /views/layouts):




public function actionRegister()

{

   $this->layout = '//layouts/content1';

   ...

   $this->title='TYTUŁ NAGŁÓWKA';

   $this->render('register',array('model'=>$model));

}



Co do layoutu to jednak się wyświetlał tylko zapomniałem dołączyć style xd.

Dalej nie wyświetla zmiennej, pomimo że w Debug Toolbar w ContextProporties jest


'title'  =>  'NAGŁÓWEK'

Zmień jeszcze layout:


<h1><?php echo $this->title; ?></h1><br>

<?php echo $content; ?>

Działa :) Teraz mam tylko problem z walidacją poprzez ajaxa. Mam coś takiego

controllers/SiteController.php:


	public function actionContact()

	{

		$model=new ContactForm;

		if(isset($_POST['ContactForm']))

		{

			$model->attributes=$_POST['ContactForm'];

			if($model->validate())

			{

				$name='=?UTF-8?B?'.base64_encode($model->name).'?=';

				$subject='=?UTF-8?B?'.base64_encode($model->subject).'?=';

				$headers="From: $name <{$model->email}>\r\n".

					"Reply-To: {$model->email}\r\n".

					"MIME-Version: 1.0\r\n".

					"Content-type: text/plain; charset=UTF-8";


				mail(Yii::app()->params['adminEmail'],$subject,$model->body,$headers);

				Yii::app()->user->setFlash('contact','Thank you for contacting us. We will respond to you as soon as possible.');

				$this->refresh();

			}

		}

		$this->render('contact',array('model'=>$model));

	}

views/contact.php:


<?php $this->title='Kontakt'; ?>

<?php $contact = new ContactForm(); ?>

<table cellspacing="0">

    <tbody>

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

                'id'=>'contact-form',

                'enableAjaxValidation' => true,

                'enableClientValidation'=>true,

                'clientOptions'=>array(

                    'validateOnSubmit' => true,

                    'validateOnChange' => true,

                    'validateOnType' => true

                ),

        )); ?>


                <p class="note">Fields with <span class="required">*</span> are required.</p>


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


                <tr>

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

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

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

                </tr>


                <tr>

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

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

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

                </tr>


                <tr>

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

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

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

                </tr>


                <tr>

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

                        <?php echo $form->textArea($model,'body',array('rows'=>6, 'cols'=>50,'class'=>'textarea2')); ?>

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

                </tr>


                <?php if(CCaptcha::checkRequirements()): ?>

                <tr>

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

                        <div>

                        <?php $this->widget('CCaptcha'); ?>

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

                        </div>

                        <div class="hint">Please enter the letters as they are shown in the image above.

                        <br/>Letters are not case-sensitive.</div>

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

                </tr>

                <?php endif; ?>


                <tr>

                        <?php echo CHtml::submitButton('',array('class'=>'submit submit_okay')); ?>

                </tr>


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

    </tbody>

</table>

views/layout/main.php:


 ...

<?php Yii::app()->clientScript->registerCoreScript('jquery'); ?>

 ...

Jednak walidacja nie działa na bieżąco, lecz dopiero dopiero po submicie pokazuje błędy. Patrzyłem w konsole i nie ma tam żadnych zapytań. Jak to naprawić?

W automatycznie wygenerowanych kontrolerach masz podobną metodę:


/**

 * Performs the AJAX validation.

 * @param CModel the model to be validated

*/

protected function performAjaxValidation($model) {

    if(isset($_POST['ajax']) && $_POST['ajax']==='contact-form')

    {

        echo CActiveForm::validate($model);

        Yii::app()->end();

    }

}

Dodaj jeszcze wywołanie w metodzie actionContact:


public function actionContact() {

    $model=new ContactForm;

    $this->performAjaxValidation($model);

    if(isset($_POST['ContactForm']))

    //...

}



Może się komuś przyda: w CActiveForm nie wolno używać znacznika <table> inaczej walidacja w ajaxie nei będzie działać.

Pytanie z innej beczki, w jaki sposób pobierać elementy i je wyświetlać? Bo próbowałem z dataProvider i cgridview ale tam jest od razu wygląd który mnie nie interesuje, a potrzebuje samemu zrobić go.

Udało mi się to zrobić w taki sposób:

Kontroler:


        public function actionIndex() {

            $package = Package::model()->findAll();

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

		'model' => $package,

            ));

        }

Widok:


foreach ($model as $package)

{

   $package = $package->getAttributes();

   ...

   echo "ID: ".$package['id'];

   ...

}

To że działa to jedno, a drugie, czy jest to zrobione w poprawny sposób zgodnie z modelem mvc?

Mam też problem z dopasowywaniem adresów

config/main.php:


                ...

		'urlManager'=>array(

			'urlFormat'=>'path',

			'rules'=>array(

				'<controller:\w+>/<id:\d+>'=>'<controller>/view',

				'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',

				'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',

                                'package/buy/<type:\w+>/<count:\d+>'=>'package/buy',

			),

                        'showScriptName'=>false,

                        'urlSuffix'=>'.html',

		),

                ...

widok:


<a href="<?php $this->createUrl('package/buy',array('type'=>'normal','count'=>'10')); ?>">KUP</a>

Jednak w miejsce href nie ma wstawionej żadnej wartości. W czym może być problem?