<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"  href="/xslt/final.xslt"?><html>
  <head>
    <title>Codeigniter Blog. Step7: Template+Benchmark+Cache. Game over.</title>
    <meta name="css" content=""/>
    <meta name="js" content=""/>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="id" content="10"/>
    <link rel="alternate" type="application/rss+xml" title="RSS" href="/rss.xml"/>
  </head>
  <body>
    <div class="main">
      <div class="wrap">
        <div class="L">
          <h1><a href="/">..</a> / Codeigniter Blog. Step7: Template+Benchmark+Cache. Game over.</h1>
          <ol class="tags big">
            <li>
              <a href="/codeigniter-blog">codeigniter-blog</a>
            </li>
          </ol>
          <div class="myContent"><p>От внешнего вида  кода c мешаниной из HTML и php/asp/#c/etc меня тошнит. Хотя дело вкуса. Некоторым нравится. Лозунги "PHP - лучший темплейтор", "Visual Studio думает за вас", "Зато Template Имярек очень гибкий!" имеют право на существование. Но поскольку я не разделяю этот лозунг, я все-таки приляпаю к блогу библиотеку темплейтов <a href="#" title="codeigniter.com/user_guide/libraries/parser.html" rel="nofollow" class="external">CodeIgniter.</a> Кстати, в Wiki Codeigniter приведены примеры как можно привинтить к нему <a href="#" title="codeigniter.com/wiki/Category:Libraries::TEMPLATE_ENGINES/" rel="nofollow" class="external">сторонние библиотеки</a> в количестве четырех штук, а в форуме встречаются указания на применение в CI любимого народом Smarty. </p>
<p>Впрочем, любая библиотека темплейтов, хоть частично и позволяет разделять представление от данных, все равно по сути является паллиативом (<em>Паллиативное лечение - помощь направленное на облегчение </em><wbr/><em>состояния пациента, чьё заболевание не поддаётся лечению</em>).  Идинственное что может спасти верстальщика от  напастей из звернца php-шаблонизаторов - XSLT, но это отдельная тема и с ней будем разбираться позже. </p>
<h2>1.</h2>
<p>До того как подключим темплейты к Codeigniter. Подключим библиотеку <a href="#" title="codeigniter.com/user_guide/libraries/benchmark.html" rel="nofollow" class="external">Benchmark</a> которая помогает отслеживать узкие места в проектировании. Нам это нужно чтобы засечь насколько увеличилось время генерации страниц с темплейтами и без них.  Как обычно открываем контроллер блога. /system/application/controller/blog.php и вставляем в его консруктор строку, отмечающую время начала работы. </p>
<p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">     function Blog()
     {
       parent::Controller();
       $this-&gt;   load-&gt;   library('session');
       $this-&gt;   benchmark-&gt;   mark('code_start');
       $this-&gt;   load-&gt;   helper('url');
       $this-&gt;   load-&gt;   helper('form');
       $this-&gt;   load-&gt;   library('session');
       $this-&gt;   load-&gt;   library('pagination');
      }</pre><!--/php--></td>
        </tr>
    </tbody>
</table>
</p>
<p>Добавляем в конце вьюера блога /system/application/views/blog_view.php строку, котрая выведет время затраченное на генерацию страницы:<br/>
<br/>
$this-&gt;   benchmark-&gt;   mark('code_end');<br/>
echo "&lt;p&gt;    Time generation: ".$this-&gt;   benchmark-&gt;   elapsed_time('code_start', 'code_end').'"&lt;/p&gt;   ';</p>
<p>Запускаем страницу нашего блога в броузере и засекаем время. У меня машинка дохленькая. Время генерации страницы 0.02 секунды.</p>
<h2>2.</h2>
<p>Модифицируем выдачу данных для вьюера в контроллере блога:</p>
<p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">     function index()
     {
       ...........................................................
       ...........................................................
       ...........................................................
        $from=intval($this-&gt;   uri-&gt;   segment(3));
        $this-&gt;   db-&gt;   limit(10,$from);
        $this-&gt;   db-&gt;   orderby("id", "desc");
        $query=$this-&gt;   db-&gt;   get('records');
        $data['blog_entries'] = $query-&gt;   result_array();
        $this-&gt;   parser-&gt;   parse('blog_view_teplate',$data);
     }</pre><!--/php--></td>
        </tr>
    </tbody>
</table>
</p>
<h2>3.</h2>
<p>Создаем новый вьюер /system/application/views/<span class="codecolor">blog_view_teplate</span>.php. Обращаем внимание, что он имеет расширение php. А это значит, что в него при необходимости добавить кучку PHP (за что боролиcь?)</p>
<p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">&lt;html&gt;  
&lt;body&gt;  
{blog_entries} &lt;!-- Здесь отрабатывается цикл по записям --&gt;   
&lt;h1&gt;   {title}&lt;/h1&gt;   
&lt;p&gt;   {body}&lt;/p&gt;   
&lt;p&gt;   &lt;a href="http://ci/blog/comments/{id}"&gt;   more...&lt;/a&gt;   &lt;/p&gt;   
{/blog_entries} &lt;!-- Здесь заканчивается цикл по записям --&gt;   
{pager}
&lt;/body&gt;   
&lt;/html&gt;  </pre><!--/php--></td>
        </tr>
    </tbody>
</table>
</p>
<p>Запускаем страницу нашего блога  и радуемся. Ку!</p>
<h2>4.</h2>
<p>Подкладываем в новый вьюер какашку в виде <a href="#" title="codeigniter.com/user_guide/libraries/benchmark.html" rel="nofollow" class="external">Benchmark</a></p>
<p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">.........................................................................
........................................................................
{pager}
&lt;?
$this-&gt;   benchmark-&gt;   mark('code_end');
echo "&lt;p align='right'&gt;    Time generation: ".$this-&gt;   benchmark-&gt;   elapsed_time('code_start', 'code_end')."&lt;/p&gt;   ";
?&gt;   
&lt;/body&gt;   
&lt;/html&gt;  </pre><!--/php--></td>
        </tr>
    </tbody>
</table>
</p>
<p>Запускаем страницу нашего блога   и обнаруживаем что время генерации страницы увеличилось на одну милисекунду. В принципе это на уровне стат.погрешности и можно было бы не принимать во внимание. Но блог рано или поздно нарастет функционалом и время генерации контента станет критическим. Поэтому неплохо было бы задуматься о кэшировании страниц.</p>
<h2>5.</h2>
<p>Кэш? Codeigniter думает за вас! (с).  <a href="#" title="codeigniter.com/user_guide/general/caching.html" rel="nofollow" class="external">Кэширование в нем есть</a>  (кстати, <a href="#" title="codeigniter.com/user_guide/database/caching.html" rel="nofollow" class="external">есть еще и кэширование SQL-запросов</a>). Не такое развитое как в других фреймворках, но все же оно предусмотрено. Достаточно вставить в самом начале функции контроллера, отвечающей за вывод информации строку: <br/>
$this-&gt;   output-&gt;   cache(<span class="codecolor">N</span>);  <br/>
и Codeigniter  позаботится о кэшировании страницы на N минут. Можно попробовать и добавить  в  /system/application/controller/blog.php - там где функция вывода комментарие в блоге:</p>
<p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">     function comments()
     {
         $this-&gt;   output-&gt;   cache(600);
         ..............................................
         ..............................................
         ..............................................</pre><!--/php--></td>
        </tr>
    </tbody>
</table>
</p>
<p>Для проверки добавим запись и обнаружим, что оан не добавилась. Но это только первое впечатление.  Подождем десять часов (или переставим системное время на десять часов вперед) и обнаружим, что запись появилась. Т.е. предустановленная функция кэширования работает, но не вполне так, как хотелось бы. Кэшем надо управлять.</p>
<h2>6.</h2>
<p>Алгоритм управления кэшем простой:</p>
<ul>
    <li>Необходимо вести время обновления кэша для конкретной страницы в БД. <br/>
    для этого  добавляем в таблицу записей records поле date<br/>
    ALTER TABLE records ADD date INT NOT NULL ; </li>
    <li>После добавления комментария к записи обнуляем  время обновления кэша (контроллер блога  /system/application/controller/blog.php)<br/>
    <br/>
    
<table class="code">
        <tbody>
            <tr>
                <td><!--php-->
                <pre class="brush: plain">  function comment_add()
      {
            // сбрасываем кэш
            $this-&gt;   db-&gt;   where('id', $_POST['record_id']);
            $this-&gt;   db-&gt;   update('records', array('date'=&gt;   0));
            $this-&gt;   db-&gt;   insert('comments',$_POST); 
            redirect('blog/comments/'.$_POST['record_id']); 
      }</pre><!--/php--></td>
            </tr>
        </tbody>
    </table>
    </li>
    <li>Перед вызовом страницы считываем время обновления кэша в переменную, например $cachetime;<br/>
    выставляем время кэша в БД равным ваньсуй или вань-ваньсуй (очень много);<br/>
    вызываем  кэш со временем $cashetime<br/>
    
<table class="code">
        <tbody>
            <tr>
                <td><!--php-->
                <pre class="brush: plain">function comments()
 {
        $id=$this-&gt;   uri-&gt;   segment(3);
       // определяем необходимость кэширования
       $query = $this-&gt;   db-&gt;   query('SELECT date FROM records WHERE id='.$id);
       $cachetime = $query-&gt;   first_row()-&gt;   date;
       $this-&gt;   db-&gt;   where('id', $id);
       // устанавливаем кэш в  ваньсуй
       $this-&gt;   db-&gt;   update('records', array('date'=&gt;   99999999));
       $this-&gt;   output-&gt;   cache($cachetime);
       $id=$this-&gt;   uri-&gt;   segment(3); // получаем номер записи блога из URL
       .......................................................................
       .......................................................................
       .......................................................................
      ........................................................................
 }</pre><!--/php--></td>
            </tr>
        </tbody>
    </table>
    </li>
    <li>Берем на заметку, что для полноценного кэширования необходимо прилепить еще обработку  <a href="#" title="phpclub.ru/faq/wakka.php?wakka=TekushhiePopolnenija/PerevodHTTPCaching/ControlClientCachingWithPhp" rel="nofollow" class="external">Last-Modified</a> </li>
</ul>
<h2>7. Game over</h2>
<p>Все что получилось складываем в архивную директорию <a href="/doc/step-by-step.zip">step7</a>. На этом объявляем работу с учебным блогом закрытой.</p>
<h2>P.S.</h2>
<p>Первая редакция сайта, который вы читаете,  выросла из этого цикла статей. Доработки были минимальными и касались только безопасности, о которой я практически ничего не писал.  Вторая редакция была более проработана и движок был полностью переписан на XSLT. Исходный XML любой страницы можно получить если прибавить к адресу суффикс "~xml". Например <a href="/article/10~xml">http://erum.nu/article/10~xml</a></p></div>
          <ol class="tags big">
            <li class="date">2007-09-03</li>
            <li>
              <a href="/codeigniter-blog">codeigniter-blog</a>
            </li>
          </ol>
          <ol class="see"/>
          <ul class="comment">
            <li id="a10" title="a0">
              <a name="ruFog (http://eterniya.ru)" title="" rel="19.10.07"/>
              <div>Дальше что-нить будет"<br/>(Подушка против "вы очень лаконичны")</div>
            </li>
            <li id="a11" title="a0">
              <a name="marazmus" title="" rel="23.10.07"/>
              <div>Большое человеческое спасибо за весь цикл статей.</div>
            </li>
            <li id="a13" title="a0">
              <a name="Timur" title="" rel="10.11.07"/>
              <div>Большое спасибо!<br/>Хотелось бы продолжение:)</div>
            </li>
            <li id="a14" title="a0">
              <a name="buddax2" title="" rel="15.11.07"/>
              <div>тут одна ошибочка, а именно: вы не загрузили библиотеку парсер в индексе блог.пхп<br/>$this-&gt;load-&gt;library("parser");<br/>блин, пока понял в чем дело... думал капец, я тупой...</div>
            </li>
            <li id="a16" title="a0">
              <a name="newnoob" title="" rel="28.11.07"/>
              <div>$data["blog_entries"] = $query-&gt;result_array();<br/>При таком коде, как мне обработать к примеру title. Допустим мне нужно сделать что бы title проходил через функцию транслита, без foreach не обойтись"</div>
            </li>
            <li id="a17" title="a0">
              <a name="nw" title="" rel="13.12.07"/>
              <div>К сожалению не нашёл контактов в этом блоге, поэтому решил написать в комментах.<br/>Не будет ли у вас желания опубликовать эти статьи на тему CodeIgniter в следующем PHP Inside (phpinside.ru)" Номер как раз планируем посвятить этому замечательному фреймворку.<br/>Если это будет интересно, напишите плз nw AT phpinside.ru</div>
            </li>
            <li id="a18" title="a0">
              <a name="dfk" title="" rel="19.12.07"/>
              <div>мм, не проще ли использовать memcached для кеширования данных" ведь тут вероятнее всего идет кеш на жесткий диск, а это медленнее кеша в памяти=)</div>
            </li>
            <li id="a19" title="a0">
              <a name="melik" title="" rel="17.01.08"/>
              <div>Спасибо тебе большое за статьи!</div>
            </li>
            <li id="a22" title="a0">
              <a name="&#x43A;&#x43D;&#x438;&#x436;&#x43A;&#x430;" title="" rel="23.01.08"/>
              <div>David Upton, "CodeIgniter for Rapid PHP Application Development"<br/>Packt Publishing | ISBN-10: 1847191746 | July 31, 2007 | 260 pages | PDF | 1.9MB<br/>http://dl.hayfilm.eu/index.php"name=News&amp;op=article&amp;sid=38<br/>(Подушка против транслита)</div>
            </li>
            <li id="a32" title="a0">
              <a name="&#x410;&#x43D;&#x434;&#x440;&#x435;&#x439;" title="" rel="02.03.08"/>
              <div>Ничего так, респект)Мне понравилось.</div>
            </li>
            <li id="a33" title="a0">
              <a name="_ci" title="" rel="02.03.08"/>
              <div>блин, а где RSS" (<br/>ps. да, я такой. ( for by pass lokanichny :) )</div>
            </li>
            <li id="a73" title="a10">
              <a name="&#x418;&#x441;&#x430;&#x430;&#x43A; &#x422;&#x44B;&#x43D;&#x433;&#x44B;&#x43B;&#x447;&#x430;&#x432;" title="" rel="03.09.08"/>
              <div>Увы. Жизнь заела и не до того. Сейчас по прошествии года информации о CI стало более чем достаточно. Т.ч. по-любому продолжение если и будет, оно скорее всего  направится чуть в сторону.</div>
            </li>
            <li id="a74" title="a18">
              <a name="&#x418;&#x441;&#x430;&#x430;&#x43A; &#x422;&#x44B;&#x43D;&#x433;&#x44B;&#x43B;&#x447;&#x430;&#x432;" title="" rel="03.09.08"/>
              <div>Вариантов кэширования огромное количество. И это отдельная тема. Но здесь, за исключением визивига я рассматривал только встроенные возможности CodeIgniter. <br/>Да и вообще. Если речь идет об оптимизации кэширования и больших нагрузках, м.б. и не стоит CodeIgniter трогать?</div>
            </li>
            <li id="a75" title="a16">
              <a name="&#x418;&#x441;&#x430;&#x430;&#x43A; &#x422;&#x44B;&#x43D;&#x433;&#x44B;&#x43B;&#x447;&#x430;&#x432;" title="" rel="03.09.08"/>
              <div>Codeigniter построен как MVC. Но M(модель) для упрощения я опустил. По хорошему любые преобразования данных должны быть именно там. Т.е. все манипуляции с БД должны быть вынесены из C(контроллера)</div>
            </li>
            <li id="a76" title="a17">
              <a name="&#x418;&#x441;&#x430;&#x430;&#x43A; &#x422;&#x44B;&#x43D;&#x433;&#x44B;&#x43B;&#x447;&#x430;&#x432;" title="" rel="03.09.08"/>
              <div>Виноват, не ответил своевременно. Не до того было. <br/>Но я вряд ли бы смог написать статью для Вашего замечательного журнала. Я не программист. А это все - так, баловство.</div>
            </li>
            <li id="a95" title="a33">
              <a name="&#x418;&#x441;&#x430;&#x430;&#x43A; &#x422;&#x44B;&#x43D;&#x433;&#x44B;&#x43B;&#x447;&#x430;&#x432;" title="erum.ru" rel="13.09.08"/>
              <div>RSS сделал, вот только будет он чем заполнен - не знаю.</div>
            </li>
            <li id="a223" title="a0">
              <a name="Summoner" title="cpu.homeunix.net" rel="18.01.09"/>
              <div>А разве такое кеширование будет работать?<br/>Ведь при первой же вызове comments()будет создан кеш на очень большой промежуток времени и до истечения этого времени функция comments обрабатываться небудет следовательно новые добавленые комментарии тоже небудут отображать</div>
            </li>
            <li id="a269" title="a0">
              <a name="&#x411;&#x435;&#x43B;&#x438;&#x448;&#x435;&#x432; &#x414;&#x435;&#x43D;&#x438;&#x441; aka ehoes" title="ehoes.net" rel="17.04.09"/>
              <div>Огромное спасибо за цикл статей! Для старта самое то!</div>
            </li>
            <li id="a271" title="a223">
              <a name="&#x418;&#x441;&#x430;&#x430;&#x43A; &#x422;&#x44B;&#x43D;&#x433;&#x44B;&#x43B;&#x447;&#x430;&#x432;" title="erum.ru" rel="20.04.09"/>
              <div>Вы правы. Задача кэширования вообще не является тривиальной и в общем виде не решается. Для мелкого блога типа этого можно проверять дату последней записи в блоге и по ней корректировать время кэширования.   Но для блога в котором записи оставляются раз в секунду такой механизм уже не подойдет. Там нужно придумывать что-то другое. <br/>Сейчас я в проектах использую библиотеку кэширования от Zend Framework. У нее намного больше возможностей.</div>
            </li>
            <li id="a288" title="a0">
              <a name="isi999" title="www.iskra.md" rel="27.05.09"/>
              <div>Вопрос,... если мы включаем в автозагрузку <br/>$autoload['libraries'] = array('database', 'session','pagination');и т.д.<br/>$autoload['helper'] = array('url','form', 'editor'); и т.д.<br/>Зачем их 2-ой раз грузить в конструкторах blog и admin?<br/>$this-&gt;load-&gt;helper('url');<br/>$this-&gt;load-&gt;helper('form');<br/>$this-&gt;load-&gt;library('session')<br/>получается лишний код.</div>
            </li>
            <li id="a325" title="a0">
              <a name="ROMAHi4" title="" rel="02.07.09"/>
              <div>В статье не указано о подключении парсера<br/>function Blog()<br/>{<br/>  ..<br/>  $this-&gt;load-&gt;library('parser');<br/>  ..<br/>}</div>
            </li>
            <li id="a342" title="a0">
              <a name="&#x410;&#x43B;&#x435;&#x43A;&#x441;" title="video-mania.org.ua" rel="29.09.09"/>
              <div>Спасибо большое автору, все понятно и доступно, огромное спасибо.</div>
            </li>
            <li id="a362" title="a0">
              <a name="&#x412;&#x438;&#x442;&#x44F;" title="" rel="16.11.09"/>
              <div>спасибо, помогло в секасе здорово!</div>
            </li>
            <li id="a391" title="a0">
              <a name="&#x410;&#x43D;&#x434;&#x440;&#x435;&#x439;" title="" rel="05.12.09"/>
              <div>Спасибо большое за эти очень полезные статьи.<br/>А что бы изменилось если бы вы использовали ещё и модели? <br/>Я так понимаю что частично то, что должна делать модель у вас делал контроллер.<br/>Что должно выполняться в модели конкретно в вашем примере?<br/>Спасибо!</div>
            </li>
            <li id="a392" title="a391">
              <a name="&#x418;&#x441;&#x430;&#x430;&#x43A; &#x422;&#x44B;&#x43D;&#x433;&#x44B;&#x43B;&#x447;&#x430;&#x432;" title="erum.ru" rel="05.12.09"/>
              <div>Спасибо и вам.<br/>Если бы я сделал как положено - все по  MVC, пример был бы идеологически более правильным, но менее понятным. Мне так кажется. Да и сам на простеньких сайтах обхожусь без моделей.<br/>Но модели я рассматривал в этом же блоге, но уже в другом цикле. Цикл правда остался незаконченным за ненадобностью - после этой публикации стало появляться очень много материалов по CI на русском языке.  К тому же я не считаю себя большим специалистом по PHP.</div>
            </li>
            <li id="a415" title="a0">
              <a name="GTAlex" title="blog.gtalex.ru/" rel="23.12.09"/>
              <div>а может всё таки сделаете следующий шаг - переделаете тоже самое но с использованием моделей, а то я вот не очень понимаю что именно по логике должно быть там - и так ведь всё окей :)</div>
            </li>
            <li id="a416" title="a415">
              <a name="&#x418;&#x441;&#x430;&#x430;&#x43A; &#x422;&#x44B;&#x43D;&#x433;&#x44B;&#x43B;&#x447;&#x430;&#x432;" title="erum.ru" rel="23.12.09"/>
              <div>Ох. А время откуда взять. <br/>И потом зачем? Для чистоты концепции? <br/>Статья старая написана давно. С тех пор появилась куча аналогичных,более грамотных.<br/>Да и фремворк пояаились получше. Сейчас бы я не CI взял бы, а УЙ.</div>
            </li>
            <li id="a425" title="a0">
              <a name="&#x410;&#x43B;&#x435;&#x43A;&#x441;&#x430;&#x43D;&#x434;&#x440;" title="miay78.hut1.ru" rel="17.01.10"/>
              <div>Помоги пожалуйста сделать такое-же чудо вместо моей гостевой, мне надо что-то типа "Задать вопрос учителю" и чтоб учитель со своего компа отвечал</div>
            </li>
            <li id="a493" title="a73">
              <a name="&#x439;&#x439;&#x439;&#x439;" title="" rel="07.04.10"/>
              <div>уеукеуке уке екнкен ри арпа пвапвапвпыфпфе  уе укекррыпва пав пвап вп  уккпвапавп рпр в вп рапр рпа</div>
            </li>
            <li id="a514" title="a0">
              <a name="&#x412;&#x430;&#x434;&#x438;&#x43C;" title="lenauto.ru" rel="18.05.10"/>
              <div>Здравствуйте.<br/>хотелось бы услышать ваш совет, <br/>с выбором методов многоуровневого хранения данных на сайте.<br/>заранее не могу предвидеть проблем, по этому прошу помощи.<br/>к примеру сайт 10 тыс страниц.<br/>вложенность разделов различная.<br/>не говоря уже о коментариях..<br/>подскажите где найти информацию о подходах структуры проектов?</div>
            </li>
            <li id="a539" title="a0">
              <a name="Levik" title="levik.info" rel="21.07.10"/>
              <div>Цикл статей - супер! Шаги от простого к сложному... Из недочетов - некоторые хелперы подгружаются два раза - в autoload и в конструкторе контроллера... Но, всё равно работает :)</div>
            </li>
            <li id="a547" title="a0">
              <a name="5nicca" title="" rel="01.08.10"/>
              <div>Спасибо :)<br/>Статьи понравились.</div>
            </li>
            <li id="a548" title="a0">
              <a name="&#x410;&#x43B;&#x435;&#x43A;&#x441;&#x430;&#x43D;&#x434;&#x440;" title="" rel="04.08.10"/>
              <div>А не планируете написать про реализацию еще и backend'a ? А также про hmvc или matchbox ?<br/>Было бы интересно.</div>
            </li>
            <li id="a549" title="a548">
              <a name="&#x418;&#x441;&#x430;&#x430;&#x43A; &#x422;&#x44B;&#x43D;&#x433;&#x44B;&#x43B;&#x447;&#x430;&#x432;" title="erum.ru" rel="04.08.10"/>
              <div>С момента написания этой статьи прошло очень много времени и появилось много информации на русском языке. Поэтому я не вижу особого смысла в продолжении. <br/>Кстати также как и в продолждении разработок на CodeIgnite. Имхо, он хорош только для первоначального изучения php-фреймворков.</div>
            </li>
            <li id="a568" title="a0">
              <a name="jetli13" title="shenlungdao.ru/" rel="27.10.10"/>
              <div>Добрый день. К сожалению нет форума. Решил спросить здесь. Не судите строго )<br/>Подскажите пожалуйста как правильно организовать взаимодействие между моделями.<br/>Ситуация :<br/>есть класс Blog (модель)<br/>(1) Blog может содержать в себе публикации (к примеру последние 10 штук) в виде массива объектов.<br/>(2) Либо Blog может лезть в БД и брать информацию по тем же последним 10 публикациям.<br/>в первом случае мы используем память не рационально. т.к. храним объекты со всеми методами и данными (приватными). Но удобно - есть один класс отвечающий за работу с данными публикации.<br/>Во втором мы имеем несколько точек доступа к одним и тем же данным. Т.е. при добавлении одного поля в таблицу нам придется менять поля в модели в нескольких местах. Для этого примера это всего 2 места но пример оч. простой просто показывающий суть вопроса. В реале это может быть сколь угодно сложная система.<br/>Можно конечно рассмотреть и 3 вариант, когда нет класса публикации и есть один большой класс Blog который запрашивает из базы все возможные данные и хранит в себе кучу методов для работы с ними, но это жесть и слишком большая ответственность для класса.<br/>Как все таки правильно? Вызывать модель из модели (кстати у модели нет своей ф-ции в отличие от контроллера но обойти через CI можно) или может каким нибудь образом использовать контроллер для взаимодействия.<br/>Слышал мнение что вызов модели из модели - зло. Но без внятных объяснений кроме "делай так и спи спокойно ) ".<br/>Спасибо!</div>
            </li>
            <li id="a581" title="a0">
              <a name="&#x412;&#x430;&#x441;&#x44F;" title="" rel="19.12.10"/>
              <div>а мне понравился цикл. Ещё бы по ajax немного</div>
            </li>
            <li id="a685" title="a0">
              <a name="&#x41C;&#x430;&#x43A;&#x441;&#x438;&#x43C; &#x41F;&#x435;&#x440;&#x435;&#x43F;&#x435;&#x43B;&#x438;&#x446;&#x430;" title="" rel="22.01.12"/>
              <div>Пользуюсь этим фреймворком уже несколько лет. Удобная справка и вообще хорошо документирован.<br/>Кстати, появилось руководство пользователя на русском для версии 2.0.0<br/><u class="external" title="codeigniter.su">http://codeigniter.su</u></div>
            </li>
          </ul>
        </div>
      </div>
      <div class="R">
        <a href="/" title="&#x41D;&#x430; &#x433;&#x43B;&#x430;&#x432;&#x43D;&#x443;&#x44E;"/>
      </div>
    </div>
    <div id="li"/>
  </body>
</html>

