Displaying 91-100 of 276 results.
Wiki: Yii 1.1 app db createCommand execution of SQL statement wayswiki
posted by admin on November 7, 2016
Once a database connection is established, SQL statements can be executed using CDbCommand. One creates a CDbCommand instance by calling CDbConnection::createCommand() with the specified SQL statement:

$connection=Yii::app()->db; // assuming you have configured a "db" connection
// If not, you may explicitly create a connection:
// $connection=new CDbConnection($dsn,$username,$password);
$command=$connection->createCommand($sql);
// if needed, the SQL statement may be updated as follows:
// $command->text=$newSQL;

A SQL statement is executed via CDbCommand in one of the following two ways:
  • execute(): performs a non-query SQL statement, such as INSERT, UPDATE and DELETE. If successful, it returns the number of rows that are affected by the execution.
  • query(): performs an SQL statement that returns rows of data, such as SELECT. If successful, it returns a CDbDataReader instance from which one can traverse the resulting rows of data. For convenience, a set of queryXXX() methods are also implemented which directly return the query results.

An exception will be raised if an error occurs during the execution of SQL statements.

$rowCount=$command->execute(); // execute the non-query SQL
$dataReader=$command->query(); // execute a query SQL
$rows=$command->queryAll(); // query and return all rows of result
$row=$command->queryRow(); // query and return the first row of result
$column=$command->queryColumn(); // query and return the first column of result
$value=$command->queryScalar(); // query and return the first field in the first row
//in Russian
$rowCount=$command->execute(); // выполнение запроса типа `INSERT`, `UPDATE` или `DELETE`
$dataReader=$command->query(); // выполнение запроса типа `SELECT`
$rows=$command->queryAll(); // возвращает все строки результата запроса
$row=$command->queryRow(); // возвращает первую строку результата запроса
$column=$command->queryColumn(); // возвращает первый столбец результата запроса
$value=$command->queryScalar(); // возвращает значение первого поля первой строки результата запроса
Read more
Resolved: Yii cjuidatepicker not saving
posted by admin on January 30, 2016
I have this field in my _form.php

<?php
$this->widget('zii.widgets.jui.CJuiDatePicker',
array(
'model' => $model,
'attribute' => 'founding',
'language' => Yii::app()->language,
'flat' => false, // tells the widget to show the calendar inline
'options' => array(
'showOn' => 'both', // also opens with a button
'dateFormat' => 'yy-mm-dd', // format of "2012-12-25"
'showOtherMonths' => true, // show dates in other months
'selectOtherMonths' => true, // can seelect dates in other months
'changeYear' => true, // can change year
'changeMonth' => true, // can change month
'yearRange' => '2000:2099', // range of year
'minDate' => '2000-01-01', // minimum date
'maxDate' => '2099-12-31', // maximum date
'showButtonPanel' => true, // show button panel
),
'htmlOptions' => array(
'size' => '10',
'maxlength' => '10',
),
)
);
?>


Controller SAVE() saving NULL. I var_dump($model) and see NULL.
Please help me to correct.Read more
Wiki: Yii 1: Как задавать стили css (class, id) для CMenu, пунктов меню и ссылок в менюwiki
posted by admin on October 10, 2016
Часто хочется задать свои стили css, своё оформление для меню CMenu. Это сводится к добавлению классов и идентификаторов id в html (виджет Cmenu формирует ненумерованный список <ul>, <li>;). В Yii для этих целей предусмотрены htmlOptions, itemOptions, and linkOptions.
1. Добавление названий id и class к CMenu.
Используются id и htmlOptions для добавления своих идентификаторов и классов.

//in your view
$this->widget('zii.widgets.CMenu', array(
'id'=>'myMenu',
'items'=>$this->myMenu,
'htmlOptions'=>array('class'=>'span-24 last'),
'encodeLabel'=>false, // чтобы можно было в label использовать html-теги (жирность, наклон, цвет и т.д.)
));

Это сформирует следующий html:

<ul class="span-24 last" id="myMenu">
...
</ul>

2. Добавление названий классов (class names) к пунктам CMenu (CMenu items) и ссылкам в пунктах меню (CMenu item links).
Используем itemOptions и linkOptions. Например:

//in your controller
$this->myMenu = array(
'id'=>'myMenu',
'items'=>array(
array(
'label'=>'Home',
'url'=>array('site/index'),
'itemOptions'=>array('class'=>'visited'),
'linkOptions'=>array('class'=>'bar'),
),
array('label'=>'Sign Out', 'url'=>array('site/signout')),
),
);

Эти команды позволят Yii сгенерировать следующий кусочек меню:

...
<ul id="myMenu">
<li class="visited">
<a class="bar" href="/site/index">Home</a>
</li>
...

Установив таким образом идентификаторы и классы в шаблоне html, далее расписывайте в файле стилей .css соответствующее оформление для них.Read more
Resolved: Yii CGridView get selected row event on shoose
posted by admin on April 23, 2016
as someone in another topic said, "I did my best to search for answers but didn't find the a solution".

First, I am newbie in Yii.

I have 2 frames, the 1st has a CGridView component that print data from MySql tables. My goal is when I click on a row in CGridView, let I know in the 2nd frame which rows where selected.

I have the CGridView with multiple selection, the frames, and read that selectionChanged is a "a javascript function that will be invoked after the row selection is changed. The function signature is function(id) where 'id' refers to the ID of the grid view. In this function, you may use $.fn.yiiGridView.getSelection(id) to get the key values of the currently selected rows."

My problem is, I don't know how to use selectionChanged function.Read more
Resolved: Yii 1.1 How to get attribute from model attributeLabels function in CDetailView custom field
posted by admin on October 12, 2016
I have this CDetailView

<?php $this->widget('zii.widgets.CDetailView', array(
'data'=>$model,
'attributes'=>array(
'id',
'username',
'personal_email',
'work_email',
array(
'label' => Yii::t('translation', 'Created'),
'type' => 'raw',
'value' => app::datetimeUserFriendly($model->created),
),
'updated',
. . .
),
)); ?>

I want to read label from model attributeLabels.Read more
Resolved: Yii DbConnection failed to open the DB connection: invalid data source name
posted by admin on January 22, 2016
DbConnection failed to open the DB connection: invalid data source name error, after uploading project to live. In local host all is right.

// This is the database connection configuration.
return array(
//'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',
// uncomment the following lines to use a MySQL database

'connectionString' => 'abcdefg.mysql.com;dbname=janna',
'emulatePrepare' => true,
'username' => 'root',
'password' => '',
'charset' => 'utf8',
);
Read more
Wiki: Yii 1.1: How to work with flash messageswiki
posted by admin on May 22, 2016
Summary
Set your messages in a controller:

Yii::app()->user->setFlash('success', "Data1 saved!");
Yii::app()->user->setFlash('error', "Data2 failed!");
Yii::app()->user->setFlash('notice', "Data3 ignored.");

Display them in your view:

<?php
foreach(Yii::app()->user->getFlashes() as $key => $message) {
echo '<div class="flash-' . $key . '">' . $message . "</div>\n";
}
?>

Setting flash messages
A flash message is used in order to keep a message in session through one or several requests of the same user. By default, it is removed from session after it has been displayed to the user. Flash messages are usually used in combination with HTTP redirections, because in this case there is no view, so messages can only be displayed in the request that follows redirection.

A flash message has a name and a content (AKA key and value). It is an entry of an associative array. The name is a string: often "notice", "success", or "error", but it can be anything. The content is usually a string. You can put HTML tags in your message if you display it raw. You can also set the message value to a number or an array: it will be serialized and kept in session like a string.

Flash messages can be set using the setFlash() Method of CWebUser. For example, if you would like to inform the user that his changes were successfully saved, you could add the following line to your Controller:

<?php
Yii::app()->user->setFlash('success', "Data saved!");
$this->redirect(array('thing/view', 'id' => 1));

In this example we used the key 'success'. If you want to define more than one flash messages, you will have to use different keys.
Displaying flash messages
To check for flash messages we use the hasFlash() Method and to obtain the flash message we use the getFlash() Method. Since Yii v1.1.3, there is also a method getFlashes() to fetch all the messages.

By default, fetching a message deletes it from the session. This means that a message is meant to be displayed only on the first page served to the user. The fetching methods have a boolean parameter that can change this behavior. See the API links in the previous paragraph.

Displaying statically
So showing of the flash message defined above in a view is done by

<?php if(Yii::app()->user->hasFlash('success')):?>
<div class="info">
<?php echo Yii::app()->user->getFlash('success'); ?>
</div>
<?php endif; ?>

These few lines of code will make a flash message with the key "success" visible to the user within a div of class "info". The message will be displayed until this or another page is (re)loaded in the browser.

If you want to always display all the flash messages, then you should add a block to your layout (by default protected/views/layout/main.php). Here is a more elaborate example:

<?php
$flashMessages = Yii::app()->user->getFlashes();
if ($flashMessages) {
echo '<ul class="flashes">';
foreach($flashMessages as $key => $message) {
echo '<li><div class="flash-' . $key . '">' . $message . "</div></li>\n";
}
echo '</ul>';
}
?>

The default CSS created by the Yii script yiic webapp has directives for three classes of flash messages on a div tag: flash-error, flash-notice, flash-success.

The best way to know if some flash messages are set is to check if Yii::app()->user->getFlashes() is empty. Since v1.1.7, Yii keeps an associative array of the flash keys in the form array("key1" => 0, ...), or null if not flash message is set. You can fetch this with Yii::app()->user->getState(CWebUser::FLASH_COUNTERS) but this is not recommended, as Yii could change this internal process.

Displaying dynamically (with Javascript)
If you want the flash message to appear somewhere above the content and then automatically fade out after a few seconds, you will have to add the following lines to your view:

<?php
Yii::app()->clientScript->registerScript(
'myHideEffect',
'$(".info").animate({opacity: 1.0}, 3000).fadeOut("slow");',
CClientScript::POS_READY
);
?>

With these lines of code we register a piece of jQuery (already included with YII) javascript code, using 'myHideEffect' as ID. It will be inserted in the jQuery's ready function (CClientScript::POS_READY). Due to the chainablity of jQuery the little script will run two effects on the .info DIV sequentially:

.animate({opacity: 1.0}, 3000)

Normally this would animate the .info DIV to a full opacity within 3 seconds. But the DIV is already rendered with full opacity upon page load, so calling this effect will just cause a delay for 3 seconds.

.fadeOut("slow")

This is the fadeOut effect which will hide the .info DIV at slow speed.Read more
Resolved: Yii Captcha Broken Image
posted by admin on March 12, 2016
The captcha image is broken (no image appearing). The other components of captcha (links, error matching code etc) seem to work correctly

In Controller:

public function actions() {
return array(
'captcha' => array(
'class' => 'CCaptchaAction',
'backColor' => 0xFFFFFF,
),
);
}


In View:

<?php if (CCaptcha::checkRequirements()): ?>
<div class="row">
<?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.

Letters are not case-sensitive.</div>
<?php echo $form->error($model, 'verifyCode'); ?>
</div>
<?php endif; ?>


In Model:

public $verifyCode;
....
public function rules() {
return array(
....
....
array('verifyCode', 'captcha', 'allowEmpty' => !CCaptcha::checkRequirements()),
);
}


Why I have this problem?Read more
Wiki: Yii 1.1 new CDbCriteriawiki
posted by admin on November 7, 2016

// создаем экземпляр класса CDbCriteria
$criteria = new CDbCriteria;
// выбираемые все столбцы из всех таблиц, участвующих в запросе
$criteria->select = '*';
//$criteria->select = array('post.id', 'post.category_id', 'post.user_id', 'post.title', 'user.name');
//$criteria->select = 'post.id, post.category_id, post.user_id, post.title, user.name';
// псевдоним(алиас) для текущей таблицы
$criteria->alias = 'post';
// выбираем только неповторяющиеся строки данных
$criteria->distinct = true;
// задаем условие запроса
$criteria->condition = 'post.is_hide = :is_hide AND post.user_id = :author_id';
// группируем
$criteria->group = 'post.category_id';
// условие для GROUP BY
$criteria->having = 'post.viwed > 100';
// задаем соединение с другой(ими) таблицами
$criteria->join = 'LEFT JOIN users as user ON user.id = post.user_id';
// максимальное количество возвращаемых записей
$criteria->limit = 20;
// смещение, с которого будут возвращаться записи
$criteria->offset = 5;
// сортировки результатов запроса
$criteria->order = 'post.date_create';
// параметры для замены в SQL выражении, для condition
$criteria->params = array(':is_hide'=>0, ':author_id'=>Yii::app()->user->id);
// внешние таблицы должны быть связаны с первичной таблицей в одном SQL-запросе
$criteria->together = true;
// получение связанных объектов в режиме "жадной" загрузки
$criteria->with = array('profile', 'comments', 'category');
// добавляем условие between (диапазон)
$criteria->addBetweenCondition('post.date_update', '09-12-2011', '09-12-2015');
// добавляем условие для сравнения переданного списка со значениями столбцов
$criteria->addColumnCondition(array('status'=>1), 'AND')
// добавляем условие IN к уже имеющемуся (condition)
$criteria->addInCondition('post.category_id', array('6', '24', '247'), 'OR');
// добавляем условие к уже имеющемуся (condition)
$criteria->addCondition("count_comments <= :count_comments");
// сливает критерий с другим
if($_POST['search_text']){
$criteriaSearch = new CDbCriteria();
$criteriaSearch->addSearchCondition('description', $_POST['search_text']. true, 'AND', 'LIKE');
$criteria->mergeWith($criteriaSearch, 'AND');
}
$posts = Post::model()->findAll($criteria);
Read more
Wiki: Yii 1.1 Улучшение производительностиwiki
posted by admin on March 24, 2016
Производительность веб-приложения зависит от многих факторов. Главные из них — обращение к базе данных, файловой системе и пропускная способность сети. В Yii, для уменьшения падения производительности из-за самого фреймворка, учтён каждый из этих факторов. Несмотря на это, многие части приложения можно улучшить для получения более высокой производительности.

1. Включение расширения APC
Включение расширения PHP APC — возможно, самый простой способ улучшить общую производительность приложения. Расширение оптимизирует и кэширует промежуточный код PHP и выигрывает время, затрачиваемое на интерпретацию скриптов PHP при каждом запросе.

2. Отключение режима отладки
Отключение режима отладки — ещё один лёгкий способ увеличить производительность. Приложение Yii работает в режиме отладки если константа YII_DEBUG определена как true. Режим отладки полезен при разработке, но не лучшим образом влияет на производительность из-за использования большего числа компонентов. К примеру, при журналировании ошибок, с каждым сообщением может записываться дополнительная информация.

3. Использование yiilite.php
Если используется расширение PHP APC, мы можем заменить yii.php другим загрузчиком — yiilite.php. Это даст приложению ещё больший прирост производительности.

Файл yiilite.php поставляется вместе с каждой версией Yii и представляет собой собранные вместе часто используемые классы. Все комментарии и выражения трассировки вырезаются, поэтому использование yiilite.php уменьшает количество подключаемых файлов и выполняемого кода.

Стоит заметить, что использование yiilite.php без APC может отрицательно повлиять на производительность, так как yiilite.php включает в себя классы, которые могут не требоваться при каждом запросе и отнимать некоторое время на парсинг. Также было отмечено, что на некоторых конфигурациях сервера yiilite.php медленнее даже при использовании APC. Лучший способ принятия решения об использовании yiilite.php — провести тесты на прилагающемся демонстрационном приложении hello world.

4. Использование кэширования
Как уже было описано в разделе «кэширование», Yii предоставляет несколько решений, которые могут значительно увеличить производительность приложения. Если генерация каких-либо данных занимает много времени, мы можем использовать кэширование данных для того, чтобы делать это не так часто. Если часть страницы остаётся неизменной, мы можем использовать кэширование фрагментов. Если вся страница не меняется, можно использовать кэширование страниц.

Если используется Active Record, можно включить кэширование структуры базы данных. Это можно сделать, установив в настройках свойству CDbConnection::schemaCachingDuration значение, большее 0.

Кроме описанных настроек приложения можно использовать кэширование на уровне сервера. Описанное выше кэширование APC относится как раз к ним. Существуют и другие решения, такие как Zend Optimizer, eAccelerator и Squid.

5. Оптимизация базы данных
Получение данных из базы часто является узким местом производительности приложения. Несмотря на то, что кэширование может смягчить потери, оно не решает проблему полностью. Когда в базе содержатся огромные объёмы данных, и нужно обновить кэш, получение данных может быть чрезмерно растратным при неверном составлении схемы данных или запросов.

Будьте осмотрительны при выборе индексов. Их использование может значительно ускорить SELECT-запросы, но замедляет запросы INSERT, UPDATE и DELETE.

Для сложных запросов рекомендуется создать view в базе данных вместо использования запросов из кода PHP, которые СУБД разбирает каждый раз.

Не злоупотребляйте Active Record. Хоть Active Record и является удобной проекцией данных в стиле ООП, но производительность при её использовании, из-за использования объектов для представления каждой строки результата, падает. Для приложений, интенсивно работающих с данными, рекомендуется использовать DAO или API для работы с СУБД на ещё более низком уровне.

Последний по счёту, но не по значению совет: используйте LIMIT в SELECT-запросах. Так вы сможете избежать получение избыточных данных из базы и расхода требующейся для их хранения памяти, выделенной PHP.

6. Минимизация файлов скриптов
Сложные страницы часто включают большое количество внешних файлов JavaScript и CSS. Так как каждый файл равен дополнительному запросу к серверу, мы должны уменьшить число файлов путём их слияния. Также не лишним будет уменьшить размер каждого из них для уменьшения времени передачи по сети. Существует немало инструментов для выполнения этих двух задач.

Для страницы, генерируемой Yii, не исключено, что некоторые скрипты подключаются компонентами, код которых изменять не хочется (например, компоненты ядра Yii). Как минимизировать такие скрипты показано далее.

Для начала опишем, какие файлы минимизировать. Зададим свойство scriptMap компонента clientScript. Это можно сделать как в настройках приложения, так и в коде. К примеру:

$cs=Yii::app()->clientScript;
$cs->scriptMap=array(
'jquery.js'=>'/js/all.js',
'jquery.ajaxqueue.js'=>'/js/all.js',
'jquery.metadata.js'=>'/js/all.js',

);

Приведённый код сделает файлы JavaScript доступными по URL /js/all.js. Если какой-либо из этих файлов требуется для каких-либо компонент, Yii подключит URL (один раз) вместо того, чтобы подключать отдельные файлы.

Нам понадобится использовать какой-либо инструмент для слияния (и, возможно, сжатия) JavaScript в один файл и записать результат в js/all.js.

То же относится и к файлам CSS.

Увеличить скорость загрузки страницы можно также при помощи Google AJAX Libraries API. К примеру, мы можем подключить jquery.js с серверов Google вместо того, чтобы использовать свой сервер. Для того, чтобы это сделать нужно настроить scriptMap следующим образом:

$cs=Yii::app()->clientScript;
$cs->scriptMap=array(
'jquery.js'=>false,
'jquery.ajaxqueue.js'=>false,
'jquery.metadata.js'=>false,

);

Устанавливая значения в false мы запрещаем Yii генерировать код для включения соответствующих файлов. Вместо этого подключим их с серверов Google:

<head>
<?php echo CGoogleApi::init(); ?>

<?php echo CHtml::script(
CGoogleApi::load('jquery','1.3.2') . "\n" .
CGoogleApi::load('jquery.ajaxqueue.js') . "\n" .
CGoogleApi::load('jquery.metadata.js')
); ?>

</head>


7. Использование символьных ссылок для ресурсов
Если ваш проект интенсивно использует ресурсы, то вы можете увеличить его производительность посредством символьных ссылок вместо стандартного копирования файлов. Для того, чтобы включить их вам нужно задать свойство linkAssets компонента приложения assetManager используя конфигурационный файл protected/config/main.php:

return array(
// ...
'components' => array(
// ...
'assetManager' => array(
'linkAssets' => true,
),
),
);

Имейте ввиду, что это потребует дополнительных настроек.Read more