Permalink
Browse files

merge from 1.0

  • Loading branch information...
1 parent 89a7786 commit ef45bc85bfe214b999f6a39923bbc67792e08d08 qiang.xue committed Sep 6, 2009
Showing with 2,453 additions and 904 deletions.
  1. +11 −2 CHANGELOG
  2. +10 −0 UPGRADE
  3. +3 −3 docs/blog/ja/prototype.auth.txt
  4. +2 −2 docs/blog/ja/prototype.summary.txt
  5. +2 −2 docs/blog/pl/comment.admin.txt
  6. +146 −0 docs/blog/ru/comment.model.txt
  7. +127 −0 docs/blog/ru/post.admin.txt
  8. +198 −0 docs/blog/ru/post.create.txt
  9. +117 −0 docs/blog/ru/post.display.txt
  10. +200 −0 docs/blog/ru/post.model.txt
  11. +2 −2 docs/blog/ru/prototype.scaffold.txt
  12. +5 −1 docs/guide/database.ar.txt
  13. +3 −3 docs/guide/de/basics.component.txt
  14. +1 −1 docs/guide/de/basics.namespace.txt
  15. +1 −1 docs/guide/de/caching.overview.txt
  16. +9 −1 docs/guide/de/database.ar.txt
  17. +37 −1 docs/guide/de/extension.create.txt
  18. +2 −1 docs/guide/de/extension.overview.txt
  19. +67 −1 docs/guide/de/extension.use.txt
  20. +4 −2 docs/guide/de/topics.url.txt
  21. +1 −1 docs/guide/es/basics.entry.txt
  22. +33 −0 docs/guide/extension.create.txt
  23. +1 −0 docs/guide/extension.overview.txt
  24. +63 −0 docs/guide/extension.use.txt
  25. +2 −2 docs/guide/pl/basics.component.txt
  26. +3 −2 docs/guide/pl/basics.namespace.txt
  27. +9 −1 docs/guide/pl/caching.data.txt
  28. +1 −1 docs/guide/pl/caching.overview.txt
  29. +12 −1 docs/guide/pl/changes.txt
  30. +4 −1 docs/guide/pl/database.ar.txt
  31. +36 −1 docs/guide/pl/extension.create.txt
  32. +2 −1 docs/guide/pl/extension.overview.txt
  33. +75 −11 docs/guide/pl/extension.use.txt
  34. +3 −3 docs/guide/pl/topics.auth.txt
  35. +5 −4 docs/guide/pl/topics.url.txt
  36. +8 −1 docs/guide/pl/topics.webservice.txt
  37. +33 −0 docs/guide/pt/extension.overview.txt
  38. +238 −0 docs/guide/pt/extension.use.txt
  39. +63 −63 docs/guide/ru/basics.component.txt
  40. +3 −3 docs/guide/ru/basics.controller.txt
  41. +19 −19 docs/guide/ru/basics.namespace.txt
  42. +74 −74 docs/guide/ru/basics.view.txt
  43. +1 −1 docs/guide/ru/caching.overview.txt
  44. +7 −2 docs/guide/ru/database.ar.txt
  45. +2 −2 docs/guide/ru/database.arr.txt
  46. +35 −2 docs/guide/ru/extension.create.txt
  47. +11 −10 docs/guide/ru/extension.overview.txt
  48. +63 −1 docs/guide/ru/extension.use.txt
  49. +8 −5 docs/guide/ru/topics.url.txt
  50. +108 −0 docs/guide/zh_cn/topics.security.txt
  51. +24 −0 framework/base/CApplication.php
  52. +51 −10 framework/db/ar/CActiveRecord.php
  53. +11 −0 framework/db/ar/CActiveRecordBehavior.php
  54. +194 −194 framework/messages/bg/yii.php
  55. +1 −1 framework/messages/de/yii.php
  56. +1 −1 framework/messages/es/yii.php
  57. +170 −171 framework/messages/ru/yii.php
  58. +1 −1 framework/messages/uk/yii.php
  59. +9 −240 framework/utils/CTimestamp.php
  60. +121 −51 framework/yiilite.php
View
@@ -14,8 +14,14 @@ Version 1.1a to be released
- Chg: Changed AR table aliasing so that it uses relation names as default table aliases (Qiang)
- Chg: Changed the default value of allowEmpty to be false for CCompareValidator. (Qiang)
-Version 1.0.9 to be released
-----------------------------
+
+Version 1.0.10 to be released
+-----------------------------
+
+
+Version 1.0.9 September 6, 2009
+-------------------------------
+- Bug #470: Fixed CTimestamp getdate bug which is related with timezone setting (Qiang)
- Bug #499: Blog demo approve comment page doesn't have proper pagination (Qiang)
- Bug #510: CHtml::htmlButton() should render the label as the element body rather than value attribute (Qiang)
- Bug #513: CNumberValidator does not validate as expected when the attribute value is not string (Qiang)
@@ -27,6 +33,7 @@ Version 1.0.9 to be released
- Bug #550: CCaptcha does not respect image alt option (Qiang)
- Bug #551: multiget in caching components does not use proper keys (Qiang)
- Bug: Set sequenceName in Oracle tables to be empty string so that yiic model command generates correct validation rules for PK (Qiang)
+- Enh #417: Added CActiveRecord::beforeFind and onBeforeFind event (Qiang)
- Enh #419: Improved the performance of lazy relational AR by avoiding joining when possible (Qiang)
- Enh #473: Upgraded jquery multifile plugin to version 1.46 (Qiang)
- Enh #500: Added CDbCache::gcProbability (Qiang)
@@ -42,6 +49,8 @@ Version 1.0.9 to be released
- Enh #547: Changed CSort::resolveLabel and validateAttribute to be public (Qiang)
- Enh #549: Changed hour pattern in CDateTimeParser so that it is consistent with CDateFormatter (Qiang)
- Enh #554: Added CViewRenderer::fileExtension (Qiang)
+- Enh #555: Added CApplication::timeZone (Qiang)
+- Enh: Improved AR performance by not raising events when no event handlers (Qiang)
- Enh: Added CWebUser::setStateKeyPrefix() (Qiang)
- Enh: Added CLocale::getMonthNames and CLocale::getWeekDayNames (Qiang)
- Enh: Added uncheckValue option for CHtml::activeRadioButton (Qiang)
View
10 UPGRADE
@@ -21,8 +21,18 @@ should look like [$i]Field in order to support array-typed fields
- Please read the Guide for further details on how to upgrade from v1.0.x to v1.1.
+Upgrading from v1.0.9
+---------------------
+
Upgrading from v1.0.8
---------------------
+- ActiveRecord lazy loading is changed for optimization purpose. Previously,
+when lazy loading occurs, the related table will be joined with the primary
+table. Now, the related table will be queried without joining the primary table.
+As a result, if you are using lazy loading and the corresponding relation
+declaration includes reference to the primary table, the query will fail.
+To fix this problem, please specify the lazy loading query options with the
+actual primary table column values.
Upgrading from v1.0.7
---------------------
@@ -42,11 +42,11 @@ class UserIdentity extends CUserIdentity
}
~~~
-`authenticate()` メソッドにおいて、 `User` クラスを用いて `User` テーブルの行を参照しています。`User` テーブルの `username` 列は特定のユーザ名(大文字小文字の区別なし)と同一です。`User` クラスは前のセクションで `yiic` ツールによって作られたものであることを思い出してください。`User` クラスは [CActiveRecord] を継承しているため、 [ActiveRecord 機能](http://www.yiiframework.com/doc/guide/database.ar)を、オブジェクト指向に(OOP)のっとったやり方で `User` テーブルにアクセスすることができます。
+`authenticate()` メソッドにおいて、 `User` クラスを用いて `User` テーブルの行を参照しています。`User` テーブルの `username` 列は特定のユーザ名(大文字小文字の区別なし)と同一です。`User` クラスは前のセクションで `yiic` ツールによって作られたものであることを思い出してください。`User` クラスは [CActiveRecord] を継承しているため、 [ActiveRecord 機能](http://www.yiiframework.com/doc/guide/database.ar)を、オブジェクト指向(OOP)にのっとったやり方で `User` テーブルにアクセスすることができます。
`UserIdentity` クラスでは、`getId()` メソッドをオーバーライドして、`User` テーブルから見つかったユーザの `id` を返すようにしています。元の実装では、代わりにユーザ名を返すようになっていました。`username` と `id` プロパティはともにユーザセッションに保存され、コードのどこからでも `Yii::app()->user` でアクセスすることが可能です。
-> Tip|ヒント: `UserIdentity` クラスにおいて、対応するクラスファイルを読み込むことなく [CUserIdentity] を参照しています。 これは [CUserIdentity] が Yii framework のコアクラスであるためです。Yii は任意のコアクラスが最初に参照されたときに、自動的のそのクラスファイルを読み込みます。`User` クラスでも同じことが行われています。 なぜなら、 `User` クラスファイルが、`/wwwroot/blog/protected/models` ディレクトリ以下にあり、アプリケーション初期構成の書きコードで PHP の `include_path` に追加されているからです。
+> Tip|ヒント: `UserIdentity` クラスにおいて、対応するクラスファイルを読み込むことなく [CUserIdentity] を参照しています。 これは [CUserIdentity] が Yii framework のコアクラスであるためです。Yii は任意のコアクラスが最初に参照されたときに、自動的のそのクラスファイルを読み込みます。`User` クラスでも同じことが行われています。 なぜなら、 `User` クラスファイルが、`/wwwroot/blog/protected/models` ディレクトリ以下にあり、アプリケーション初期構成の下記コードで PHP の `include_path` に追加されているからです。
>
> ~~~
> [php]
@@ -81,4 +81,4 @@ switch($identity->errorCode)
修正後の `UserIdentity` クラスを確認するため、ブラウザで URL `http://www.example.com/blog/index.php` にアクセスし、 `User` テーブルのユーザ名とパスワードでログインしてみてください。 [ブログデモ](http://www.yiiframework.com/demos/blog/) で提供されるデータベースを利用した場合、ユーザー名 `demo` 、パスワード `demo` でアクセスできるはずです。このブログシステムにはユーザ管理機能はありません。そのため、ユーザーはウェブインターフェースで、自身のアカウントを変更したり、新しいアカウントを作成出来ません。ユーザ管理機能はブログアプリケーションの将来の機能拡張として検討されるでしょう。
-<div class="revision">$Id: prototype.auth.txt 702 2009-02-18 19:29:48Z qiang.xue $</div>
+<div class="revision">$Id: prototype.auth.txt 702 2009-02-18 19:29:48Z qiang.xue $</div>
@@ -11,10 +11,10 @@
6. 記事とコメントの CRUD 基本操作ができるようコードを実装しました
7. 認証メソッドを変更し、 `User` テーブルに対してチェックするように変更しました
-新しいプロジェクトでは、多くの場合、この最初の参るストーン 1 から 4 の手順をこなすことになるでしょう。
+新しいプロジェクトでは、多くの場合、この最初のマイルストーン 1 から 4 の手順をこなすことになるでしょう。
`yiic` ツールによって生成されたコードは、データベーステーブルのための完全な CRUD 操作機能を実装しますが、実際に利用する際にはしばしば、変更する必要があります。この理由から、次の2つのマイルストーンでは、初期の要求を満たすように、投稿とコメントについて発生する CRUD コードをカスタマイズします。
一般的には、最初に[モデル](http://www.yiiframework.com/doc/guide/basics.model)クラスファイルで、適切な[バリデーション](http://www.yiiframework.com/doc/guide/form.model#declaring-validation-rules)ルールを加え、[リレーションオブジェクト](http://www.yiiframework.com/doc/guide/database.arr#declaring-relationship)を宣言する変更を行います。その後、それぞれの CRUD 操作のために[コントローラアクション](http://www.yiiframework.com/doc/guide/basics.controller)と[ビュー](http://www.yiiframework.com/doc/guide/basics.view)コードを変更します。
-<div class="revision">$Id: prototype.summary.txt 683 2009-02-16 05:20:17Z qiang.xue $</div>
+<div class="revision">$Id: prototype.summary.txt 683 2009-02-16 05:20:17Z qiang.xue $</div>
@@ -78,7 +78,7 @@ public function actionList()
$criteria=new CDbCriteria;
$criteria->condition='Comment.status='.Comment::STATUS_PENDING;
- $pages=new CPagination(Comment::model()->count());
+ $pages=new CPagination(Comment::model()->count($criteria));
$pages->pageSize=self::PAGE_SIZE;
$pages->applyLimit($criteria);
@@ -110,4 +110,4 @@ Zaleca się aby żądania GET nie modyfikowały danych na serwerze. W przeciwnym
możemy mieć do czynienia z niebezpieczeństwem, że użytkownik nieumyślnie może zmienić
dane po stronie serwera parokrotnie jeśli będzie odświeżał stronę kilka razy.
-<div class="revision">$Id: comment.admin.txt 1050 2009-05-22 20:06:18Z qiang.xue $</div>
+<div class="revision">$Id: comment.admin.txt 1335 2009-08-15 20:34:36Z qiang.xue $</div>
@@ -0,0 +1,146 @@
+Доработка модели Comment
+========================
+
+Также, как и в модели `Post`, в модели `Comment` нам необходимо поправить методы
+`rules()`, `relations()` и `safeAttributes()`. Кроме того, нужно задать свои
+подписи некоторым полям в методе `attributeLabels()`.
+
+
+Изменение метода `rules()`
+--------------------------
+
+Начнём с уточнения правил валидации, сгенерированных при помощи `yiic`.
+Для комментариев будем использовать следующие правила:
+
+~~~
+[php]
+public function rules()
+{
+ return array(
+ array('author,email,content', 'required'),
+ array('author,email,url','length','max'=>128),
+ array('email','email'),
+ array('url','url'),
+ array('verifyCode', 'captcha', 'on'=>'insert',
+ 'allowEmpty'=>!Yii::app()->user->isGuest),
+ );
+}
+~~~
+
+Здесь мы указываем, что атрибуты `author`, `email` и `content` обязательны.
+Длина `author`, `email` и `url` не может превышать 128 символов. Атрибут `email`
+должен содержать корректный email-адрес. `url` должен содержать корректный URL.
+Атрибут `verifyCode` должен проверяться как код [CAPTCHA](http://ru.wikipedia.org/wiki/Captcha).
+
+Здесь `verifyCode` используется для хранения кода подтверждения, введённого
+пользователем для того, чтобы оставить комментарий. Так как в таблице `Comment`
+поля `verifyCode` нет, нам надо явно описать его как public свойство класса.
+Для его валидации используется специальный валидатор `captcha`, которому
+соответствует класс [CCaptchaValidator]. Более того, валидация будет проводиться
+только при добавлении нового комментария(см. параметр `on`). Для аутентифицированных
+пользователей валидация не требуется(см. параметра `allowEmpty`).
+
+
+Изменение метода `safeAttributes()`
+-----------------------------------
+
+Далее изменим метод `safeAttributes()`. Укажем атрибуты, которые могут быть
+назначены пакетно.
+
+~~~
+[php]
+public function safeAttributes()
+{
+ return array('author', 'email', 'url', 'content', 'verifyCode');
+}
+~~~
+
+Приведённый выше код также показывает, что форма комментирования будет состоять
+из нескольких полей: автор, почта, URL, текст и код подтверждения.
+
+
+Изменение метода `relations()`
+------------------------------
+
+При разработке портлета «последние комментарии» нам необходимо получить список
+последних комментариев с информации о записях, связанных с ними. Поэтому мы
+добавляем информацию об отношении в метод `relations()`:
+
+~~~
+[php]
+public function relations()
+{
+ return array(
+ 'post'=>array(self::BELONGS_TO, 'Post', 'postId',
+ 'joinType'=>'INNER JOIN'),
+ );
+}
+~~~
+
+Стоит отметить, что тип join для отношения `post` — `INNER JOIN`. Сделано это
+так как комментарий должен относиться к записи.
+
+
+Изменение метода `attributeLabels()`
+------------------------------------
+
+Изменим метод `attributeLabels()`. Зададим свои подписи атрибутам. Метод возвращает
+массив пар имя атрибута-подпись. При вызове [CHtml::activeLabel()], сначала
+будет проверено, существует ли своя подпись. Если подпись не задана — будет
+сгенерирована подпись по умолчанию.
+
+~~~
+[php]
+public function attributeLabels()
+{
+ return array(
+ 'author'=>'Имя',
+ 'url'=>'Сайт',
+ 'content'=>'Комментарий',
+ 'verifyCode'=>'Код подтверждения',
+ );
+}
+~~~
+
+> Tip|Подсказка: Подпись по умолчанию генерируется на основе имени атрибута.
+ Сначала имя разбивается на слова учитывая camelCase. Затем каждый символ каждого
+ слова переводится в верхний регистр. К примеру, атрибуту с именем `verifyCode`
+ будет присвоена подпись `Verify Code`.
+
+
+Изменение процесса сохранения
+-----------------------------
+
+Так как мы хотим обновлять количество комментариев для каждой записи при удалении
+или публикации нового комментария, нам необходимо изменять соответствующее поле
+записи. Для этого переопределим методы `afterSave()` и `afterDelete()` модели
+`Comment`. Также переопределим метод `beforeValidate()`. Это позволит нам
+конвертировать текст из формата Markdown в HTML и выставлять время создания
+комментария.
+
+~~~
+[php]
+protected function beforeValidate($on)
+{
+ $parser=new CMarkdownParser;
+ $this->contentDisplay=$parser->safeTransform($this->content);
+ if($this->isNewRecord)
+ $this->createTime=time();
+ return true;
+}
+
+protected function afterSave()
+{
+ if($this->isNewRecord && $this->status==Comment::STATUS_APPROVED)
+ Post::model()->updateCounters(array('commentCount'=>1), "id={$this->postId}");
+}
+
+protected function afterDelete()
+{
+ if($this->status==Comment::STATUS_APPROVED)
+ Post::model()->updateCounters(array('commentCount'=>-1), "id={$this->postId}");
+}
+~~~
+
+
+<div class="revision">$Id: comment.model.txt 814 2009-03-10 18:00:11Z qiang.xue $</div>
Oops, something went wrong.

0 comments on commit ef45bc8

Please sign in to comment.