CGridView на русском

Здравствуйте !

CGridView выводит надпись типа:

Displaying 1-5 of 5 result(s).

как ее сделать на русском языке.

Спасибо!

В protected/config/main.php добавляем:




'sourceLanguage'=>'ru',



и теперь на русском не только грид, но и все сообщения фреймворка :)

Ух ты, класс!

Спасибо огромное!

А можно еще вопросики:

  1. как-то изменять ширину колонок, например колонка ‘№’ - 50, а колонка ‘name’ - 350 - ну что-то вроде того.

  2. изменить оформление содержимого (например выводит дату - переносит типа так

2012-01-

25

к примеру добавить что-то вроде <nobr> и вообще какие-то теги, оформление в ячейку и т.п.

Спасибо!

Вот небольшой пример:




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

    'id'=>'order-grid',

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

    'filter'=>$model,

    'rowCssClassExpression'=>'$data->status == Order::STATUS_DONE ? "order-grid-row-done" : "order-grid-row-pending"',

    'columns'=>array(

        array(

            'name'=>'order_id',

            'htmlOptions'=>array('style'=>'width: 50px; text-align: center;'),

        ),

        array(

            'name'=>'user_id',

            'htmlOptions'=>array('style'=>'width: 100px; text-align: center;'),

        ),

        array(

            'type'=>'raw',

            'name'=>'search_user',

            'value'=>'CHtml::link($data->user->full_name, array("/user/user/update", "id"=>$data->user->user_id))',

            'htmlOptions'=>array('style'=>'text-align: center;'),

        ),

        array(

            'name'=>'item_count',

            'htmlOptions'=>array('style'=>'width: 100px; text-align: center;'),

        ),

        array(

            'name'=>'price',

            'htmlOptions'=>array('style'=>'width: 100px; text-align: center;'),

        ),

        array(

            'name'=>'status',

            'value'=>'$data->getStatusLabel()',

            'filter'=>$model->statusLabels(),

            'htmlOptions'=>array('style'=>'text-align: center;'),

        ),

        array(

            'name'=>'date',

            'htmlOptions'=>array('style'=>'width: 130px; text-align: center;'),

        ),

        array(

            'class'=>'CButtonColumn',

            'template'=>'{view} {delete}',

            'htmlOptions'=>array('style'=>'width: 75px;'),

            'buttons'=>array(

                'view'=>array(

                    'label'=>'Просмотр корзины',

                    'url'=>'url("/cart/order/view", array("id"=>$data->order_id))',

                    'imageUrl'=>url().'/images/cart.png',

                    'options'=>array(

                        'ajax'=>array(

                            'type'=>'GET',

                            'url'=>"js:$(this).attr('href')",

                            'success'=>'js:function(data){$("#dlg-cart-content").html(data); $("#dlg-cart").dialog("open");}',

                        ),

                    ),

                ),

            ),

        ),

    ),

));

?>



А вот небольшая документация: http://www.yiiframework.com/doc/api/1.1/CGridView :))

Так вроде смотрел, (точнее эти страницы и не закрываю никогда), вроде и расписано много, но все равно все нюансы понятны тому, кто уже знает, а кто только изучает, тому понятнее на таких примерах:

Просто ОГРОМНОЕ спасибо!

Можно еще один вопрос?

несколько значений в гриде выглядят так




 array(

    'name'=>'owner',

    'value'=>'$data->getOwnerName($data->owner)',

	'headerHtmlOptions'=>array('class'=>'myhead2'),

 ),

 array(

    'name'=>'dep_head',

    'value'=>'$data->getDepHead($data->owner)',

	'headerHtmlOptions'=>array('class'=>'myhead2'),

 ),



функция getOwner - берет номер работника (число из поля owner) и выводит фамилию

функция getDepHead - берет в базе номер работника и по нему из другой базы определяет начальника отдела (фамилию).

все хорошо, в гриде пишет что нужно.

Поиск реализован функцией search - создано автоматически при помощи gii как стандартный crud.

В поиске в форме сделано так:


echo $form->label($model,'owner'); 

echo $form->dropDownList($model, 'owner', $model->getOwnersList());


echo $form->label($model,'dep_head');

echo $form->dropDownList($model, 'dep_head', $model->getOwnersList());



getOwnersList - возвращает список всех работников, он общий.

При выборе owner - делает отбор, но поле owner как раз есть в базе

Как сделать, чтобы отбиралось по dep_head - в гриде оно есть, в базе нет?

Спасибо!

Нужно завести в классе модели поле dep_head, сделать его "safe" для сценария "search", а в методе search() уже добавлять условия (join, with и т.п.) в зависимости от значения $this->dep_head.

Сделал так:


class CmrClients extends CActiveRecord

{

	public $dep_head;

	public function rules()

	{

		return array(

...

			array('dep_head', 'safe', 'on'=>'search'),

		);

	}


	public function search($id=0)

	{

...

		$criteria->compare('dep_head',1);



Решил проверить и поставил фиксированное значение 1 - руководитель.

Выдает:


CDbException

CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[42S22]: Column not found: 1054 

Unknown column 'dep_head' in 'where clause'. The SQL statement executed was: 

SELECT COUNT(*) FROM `cmr_clients` `t` WHERE dep_head=:ycp0

т.е. он все равно dep_head как поле в таблице ищет.

как правильно сделать, подскажите, что-то непонятно…

Внутри search() нужно делать join таблиц или использовать with, если у вас прописаны связи в relations():




        public function search($id=0)

        {

            $criteria->with = array('otdel.nachalnik');

            $criteria->compare('nachalnik.name', 1);



Я названий и структуры таблиц не знаю, поэтому написал так, как написал :)

собственно понял, хотя реализовал только теперь то, что нужно. Разбил на несколько коротких запросов.

Зато теперь понял, как оно делается :) Не так страшно, как сразу казалось.

Проблема была в том, что в кондишине я указывал название поля dep_head, которого нет, а нужно было сравнивать с переменной $this->dep_head, которую я объявил. а в качестве поля - то, которое существует, т.к. оно идет в sql запрос.

Спасибо ОГРОМНОЕ-ПРЕОГРОМНОЕ !!!

Для одной формы понадобилось, чтобы все было в кодировке cp-1251, как тогда быть?

пробовал добавлять ‘charset’ => ‘Windows-1251’, в конфиг - да, все ок, страница в кодировке 1251, но сообщения в том же CGrid-e в ‘кракозябликах’

(Элементы 1—25 РёР· 475) типа такого

Что сделать?

Спасибо!

Файлы с переводами в кодировке utf8, вот и думайте, а надо ли вам оно менять их :)

оно, конечно, не надо…

тогда вопрос по-другому:

есть база в кодировке cp-1251 (и это изменить нельзя), как ее приделать к CGrid-у (или скорее к yii), чтобы выводило на экран в utf-8, а база была в cp-1251?

где-то так…

Multibyte String

чуточку смешно :)

не что такое uft-8 или что такое кодировка или т.п.

вопрос как сделать, чтобы yii на ходу менял кодировку при работе с базой

Попробуйте начать с установки http://www.yiiframework.com/doc/api/1.1/CDbConnection#charset-detail

А что тут смешного? Это была наводка куда смотреть… вот мой пример, только каждую колонку руками нужно настривать…


'columns'=>array(


       array(

	    'type'=>'raw',

            'name'=>'alias',

            'value'=>'mb_convert_encoding($data->alias, "UTF-8", "UCS-2")',

	),

..........................



Конечно, способ расточительный… но это для примера.

спасибо, такой способ в принципе не нужен.

и я же сказал вопрос не в том, как конвертируются кодировки,

вопрос в том, чтобы "на лету" преобразовывалась кодировка, без моего участия

вполне возможно, чтобы база была в cp-1251, а отдавалось все в utf-8, и все это прозрачно для кода