diff options
Diffstat (limited to 'demos/blog-tutorial/protected')
| -rw-r--r-- | demos/blog-tutorial/protected/pages/Day2/CreateAR.page | 252 | 
1 files changed, 126 insertions, 126 deletions
diff --git a/demos/blog-tutorial/protected/pages/Day2/CreateAR.page b/demos/blog-tutorial/protected/pages/Day2/CreateAR.page index 99e91d5a..0cf28bdd 100644 --- a/demos/blog-tutorial/protected/pages/Day2/CreateAR.page +++ b/demos/blog-tutorial/protected/pages/Day2/CreateAR.page @@ -1,127 +1,127 @@ -<com:TContent ID="Main"> - -<h1>Creating Active Record Classes</h1> - -<p> -We need to create two <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a> classes, <tt>UserRecord</tt> and <tt>PostRecord</tt>, to represent data records in the <tt>users</tt> and <tt>posts</tt> tables, respectively. Active Record classes must extend from the base class <tt>ActiveRecord</tt>, and must define property names that matches with the field names of the corresponding table. -</p> - -<p> -To better organize our directories, we create a new directory <tt>protected/database</tt> to hold the class files. We also modify our application configuration by inserting the following lines. It is equivalent to adding the directory <tt>protected/database</tt> to PHP include_path, which allows us to use the classes without explicitly including them. -</p> - -<com:TTextHighlighter CssClass="source" Language="xml"> -<paths> -  <using namespace="Application.database.*" /> -</paths> -</com:TTextHighlighter> - -<p> -Instead of writing the classes manually, we will use the <a href="?page=GettingStarted.Wsat">PRADO Web Site Administration Tool</a> to generate the classes for us. -So we need to modify again our application configuration in the services section like follows: -</p> - - <p class="block-content"> -<com:TTextHighlighter CssClass="source" Language="xml"> -<services>  -    ... -    <service id="wsat" class="System.Wsat.TWsatService" Password="my_secret_password" /> -</services> -</com:TTextHighlighter> -</p> - -<p class="block-content"> -        Then you are ready to go to: http://localhost/yoursite/index.php?wsat=TWsatLogin where you should see -        the following page: -</p> -<img src="<%~wsat_login.png%>" style="width: 700px;" /> -<p class="block-content"> -    In the text field you need to type the password previosly specified in the service inclusion. This  -    is part of a basic security system to avoid undesirable persons to use this tool. -</p> - - <p class="block-content"> -        In order to generate AR classes you need to go to: http://localhost/divermania/index.php?wsat=TWsatGenerateAR  -        by clicking the proper links in the welcome page. Then you should see the following page:         -</p> -<img src="<%~blog_wsat_generate_ar.png%>" style="width: 700px;" /> - -<p> -    In the <tt>Output Folder</tt> field we used the <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Components">namespace format</a> again, the path <tt>Application.database</tt> indicates that we want to put our class's files in the <tt>protected/database/</tt> folder. -    The <tt>*</tt> in the <tt>Table Name</tt> field means that we want to generate all AR classes, you can specify a table name instead if you want to generate just a specific AR class. -</p> - -<p> -Afterward we should see the following directory structure with two new files under <tt>protected/database</tt>: -</p> - -<img src="<%~ directories2.gif %>" class="output" /> - -<p> -If we check the <tt>PostRecord</tt> class file, we should see something similar to the following content: -</p> - -<com:TTextHighlighter CssClass="source" Language="php"> -class PostRecord extends TActiveRecord -{ -    const TABLE='posts'; -     -    public $post_id; -    public $author_id; -    public $create_time; -    public $title; -    public $content; -    public $status; - -    public static function finder($className=__CLASS__) -    { -        return parent::finder($className); -    } -     -    public static $RELATIONS = array ( -        'author' => array(self::BELONGS_TO, 'UserRecord', 'author_id') -    ); -         -    public function __toString()  -    { -        return $this->title; -    } -} -</com:TTextHighlighter> - -<p> -As we see, for each field in the <tt>posts</tt> table, the class has a corresponding data member. The constant <tt>TABLE</tt> specifies the table name for the <tt>PostRecord</tt>. The static method <tt>finder()</tt> allows us to perform query and retrieve post data in terms of <tt>PostRecord</tt> objects. -</p> - -<h1>Relationship Between Posts and Users</h1> -<p> -Recall that there was a foreign key relationship between the <tt>users</tt> and <tt>posts</tt> table. The entity-relationship diagram is shown below for convienence. -</p> - -<img src="<%~ ER.gif %>" class="output" /> - -<p> -From the entity-relationship diagram above, we see that the <tt>posts</tt> table contains a field named <tt>author_id</tt>. This <tt>author_id</tt> field is a foreign key to the reference table <tt>users</tt>. In particular, the values in the  <tt>author_id</tt> field should be of that from the <tt>users</tt> table's <tt>username</tt> field. One of the consequence of this relationship, thinking in terms of objects, is that each "post" belongs to an "author" and one "author" may have many "posts". -</p> - -<p> -The static <tt>$RELATIONS</tt> property of <tt>PostRecord</tt> defines that the property <tt>$author</tt> belongs to an <tt>UserRecord</tt>. In <tt>array(self::BELONGS_TO, 'UserRecord')</tt>, the first element defines the relationship type, in this case <tt>self::BELONGS_TO</tt>. The second element is the name of related record, in this case an <tt>UserRecord</tt>. -</p> - -<p> -An array of <tt>UserRecord</tt> with and its corresponding posts may be fetched as follows. -</p> - -<com:TTextHighlighter CssClass="source" Language="php"> -$users = UserRecord::finder()->withPosts()->findAll(); -</com:TTextHighlighter> - -<com:TipBox> -The method <tt>withXXX()</tt> (where XXX is the relationship property name, in this case, <tt>Posts</tt>) fetches the corresponding <tt>PostRecords</tt> using a second query (not by using a join). The <tt>withXXX()</tt> method accepts the same arguments as other finder methods of TActiveRecord, e.g. <tt>withPosts('status = ?', 0)</tt>. -</com:TipBox> - -<p> -Further detailed documentation can be found in the quickstart <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a> docs. -</p> - +<com:TContent ID="Main">
 +
 +<h1>Creating Active Record Classes</h1>
 +
 +<p>
 +We need to create two <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a> classes, <tt>UserRecord</tt> and <tt>PostRecord</tt>, to represent data records in the <tt>users</tt> and <tt>posts</tt> tables, respectively. Active Record classes must extend from the base class <tt>ActiveRecord</tt>, and must define property names that matches with the field names of the corresponding table.
 +</p>
 +
 +<p>
 +To better organize our directories, we create a new directory <tt>protected/database</tt> to hold the class files. We also modify our application configuration by inserting the following lines. It is equivalent to adding the directory <tt>protected/database</tt> to PHP include_path, which allows us to use the classes without explicitly including them.
 +</p>
 +
 +<com:TTextHighlighter CssClass="source" Language="xml">
 +<paths>
 +  <using namespace="Application.database.*" />
 +</paths>
 +</com:TTextHighlighter>
 +
 +<p>
 +Instead of writing the classes manually, we will use the <a href="?page=GettingStarted.Wsat">PRADO Web Site Administration Tool</a> to generate the classes for us.
 +So we need to modify again our application configuration in the services section like follows:
 +</p>
 +
 + <p class="block-content">
 +<com:TTextHighlighter CssClass="source" Language="xml">
 +<services> 
 +    ...
 +    <service id="wsat" class="System.Wsat.TWsatService" Password="my_secret_password" />
 +</services>
 +</com:TTextHighlighter>
 +</p>
 +
 +<p class="block-content">
 +        Then you are ready to go to: http://localhost/yoursite/index.php?wsat=TWsatLogin where you should see
 +        the following page:
 +</p>
 +<img src="<%~wsat_login.png%>" style="width: 700px;" />
 +<p class="block-content">
 +    In the text field you need to type the password previosly specified in the service inclusion. This 
 +    is part of a basic security system to avoid undesirable persons to use this tool.
 +</p>
 +
 + <p class="block-content">
 +        In order to generate AR classes you need to go to: http://localhost/divermania/index.php?wsat=TWsatGenerateAR 
 +        by clicking the proper links in the welcome page. Then you should see the following page:        
 +</p>
 +<img src="<%~blog_wsat_generate_ar.png%>" style="width: 700px;" />
 +
 +<p>
 +    In the <tt>Output Folder</tt> field we used the <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Components">namespace format</a> again, the path <tt>Application.database</tt> indicates that we want to put our class's files in the <tt>protected/database/</tt> folder.
 +    The <tt>*</tt> in the <tt>Table Name</tt> field means that we want to generate all AR classes, you can specify a table name instead if you want to generate just a specific AR class.
 +</p>
 +
 +<p>
 +Afterward we should see the following directory structure with two new files under <tt>protected/database</tt>:
 +</p>
 +
 +<img src="<%~ directories2.gif %>" class="output" />
 +
 +<p>
 +If we check the <tt>PostRecord</tt> class file, we should see something similar to the following content:
 +</p>
 +
 +<com:TTextHighlighter CssClass="source" Language="php">
 +class PostRecord extends TActiveRecord
 +{
 +    const TABLE='posts';
 +    
 +    public $post_id;
 +    public $author_id;
 +    public $create_time;
 +    public $title;
 +    public $content;
 +    public $status;
 +
 +    public static function finder($className=__CLASS__)
 +    {
 +        return parent::finder($className);
 +    }
 +    
 +    public static $RELATIONS = array (
 +        'author' => array(self::BELONGS_TO, 'UserRecord', 'author_id')
 +    );
 +        
 +    public function __toString() 
 +    {
 +        return $this->title;
 +    }
 +}
 +</com:TTextHighlighter>
 +
 +<p>
 +As we see, for each field in the <tt>posts</tt> table, the class has a corresponding data member. The constant <tt>TABLE</tt> specifies the table name for the <tt>PostRecord</tt>. The static method <tt>finder()</tt> allows us to perform query and retrieve post data in terms of <tt>PostRecord</tt> objects.
 +</p>
 +
 +<h1>Relationship Between Posts and Users</h1>
 +<p>
 +Recall that there was a foreign key relationship between the <tt>users</tt> and <tt>posts</tt> table. The entity-relationship diagram is shown below for convienence.
 +</p>
 +
 +<img src="<%~ ER.gif %>" class="output" />
 +
 +<p>
 +From the entity-relationship diagram above, we see that the <tt>posts</tt> table contains a field named <tt>author_id</tt>. This <tt>author_id</tt> field is a foreign key to the reference table <tt>users</tt>. In particular, the values in the  <tt>author_id</tt> field should be of that from the <tt>users</tt> table's <tt>username</tt> field. One of the consequence of this relationship, thinking in terms of objects, is that each "post" belongs to an "author" and one "author" may have many "posts".
 +</p>
 +
 +<p>
 +The static <tt>$RELATIONS</tt> property of <tt>PostRecord</tt> defines that the property <tt>$author</tt> belongs to an <tt>UserRecord</tt>. In <tt>array(self::BELONGS_TO, 'UserRecord')</tt>, the first element defines the relationship type, in this case <tt>self::BELONGS_TO</tt>. The second element is the name of related record, in this case an <tt>UserRecord</tt>.
 +</p>
 +
 +<p>
 +An array of <tt>UserRecord</tt> with and its corresponding posts may be fetched as follows.
 +</p>
 +
 +<com:TTextHighlighter CssClass="source" Language="php">
 +$users = UserRecord::finder()->withPosts()->findAll();
 +</com:TTextHighlighter>
 +
 +<com:TipBox>
 +The method <tt>withXXX()</tt> (where XXX is the relationship property name, in this case, <tt>Posts</tt>) fetches the corresponding <tt>PostRecords</tt> using a second query (not by using a join). The <tt>withXXX()</tt> method accepts the same arguments as other finder methods of TActiveRecord, e.g. <tt>withPosts('status = ?', 0)</tt>.
 +</com:TipBox>
 +
 +<p>
 +Further detailed documentation can be found in the quickstart <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a> docs.
 +</p>
 +
  </com:TContent>
\ No newline at end of file  | 
