За последние 24 часа нас посетили 48378 программистов и 3124 робота. Сейчас ищут 1082 программиста ...

Примеры реализации корневых архитектур

Тема в разделе "Решения, алгоритмы", создана пользователем Mr.M.I.T., 9 июл 2009.

  1. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Надоело один и тот же код писать

    Пример номер 1.
    На сайте создаём каталоги
    index.php
    PHP:
    1. <?
    2. $result=array(); // Главный буффер
    3. $_GET['module']=!$_GET['module']?false:$_GET['module']; // Переменная с названием модуля
    4.  
    5. if($_GET['module']){
    6.     if(is_file($file="moduls/".basename($_GET['module'].".php"))){ // Если модуль существует
    7.         include $file;  // загружаем его
    8.     }else{
    9.         $result['error']="Модуль не найден"; // если нет пишем ошибку в буффер
    10.     }
    11. }else{
    12.     include "moduls/default_module.php"; // Если переменная с модулем не существует, загружаем модуль по умолчанию
    13. }
    14.  
    15. print_r($result); // выводим значения буффера, по идее тут должен идти вывод в главный шаблон
    16. ?>
    Приложение: http://narod.ru/disk/10755376000/simple ... e.rar.html



    Пример номер 2

    Сложный, поэтому он только в приложении поместился
    Принцип такой:
    Каждый модуль является набором действий, таким образом index.php предаются 2 переменные, с названием модуля и действие
    index.php дёргает модуль и дёргает действие, причём если модуль не существует то дёргается дефолтный модуль, если действие не существует, дёргается дефолтное действие
    Действие может вернуть 3 типа результата: массив - тогда его значения будут добавленны в шаблон действия ввиде переменных. true - тогда будет просто загружен шаблон. false - действие выполнится, но шаблон не будет загружен
    Все шаблоны в системе структурированны по именам как {названия модуля}_{название дейтвия}.tpl
    за исключением шаблонов
    main.tpl - самый главный шаблон сайта
    error.tpl - шаблон для системных сообщений
    default_index.tpl - шаблон дефольного модуля index.class.php, дефолтного действия ActionIndex()

    Каталоги
    Приложение: http://narod.ru/disk/10755390000/oppMod ... e.rar.html



    Предлогайте свои примеры
     
  2. kostyl

    kostyl Guest

    У меня пока действие возвращает все что угодно. Довольно гибко, но иногда путаешься. В принципе тоже хочу перейти на более типизированные результаты. А, отличие от твоего, как я понял у меня может возвратить вид. Действие не тянет вид по названию. Программист сам определяет какой вид или виды в этом действие обработать и обработать ли вообще. Но сейчас в основном возвращаются виды, массив ошибок и ничего. Хочу перейти на тенденцию типизации действий: запускаемые всегда, запускаемые по запросу пользователя, запускаемые по запросу приложения, запускаемые по умолчанию если первые три или один или как то так, отсутствуют.
     
  3. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    kostyl
    а у меня тоже можно сделать чтобы действие вид возвращало
    например так:
    PHP:
    1. <?
    2. ActionSomething() {
    3.   display::Buffering("someVar",display::TplOne(array("var"=>"value"),"my_file.tpl")); // добавляем в главный шаблон переменную someVar содержащую результат выполнения шаблона my_file.tpl
    4.   return false; // чтоб шаблончик не грузило
    5. }
    6. ?>
    Ps/ Я пока ещё не встретил задачи не решаемой способом номер 2
     
  4. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    я вообще AJAX модель использую. весь контент грузится конкретно в нужное место. никаких перезагрузок страниц. все подгружается только когда надо и куда надо.

    p.s. мне глубоко насрать на всяких там SEO и поисковики... и не надо тут флудить на эту тему. плз.

    /index.php
    PHP:
    1.  
    2. <?php
    3.  
    4. require_once('./enigma/start.php');
    5.  
    6. Enigma::Run();
    7.  
    8. require_once('./enigma/stop.php');
    9.  
    10. ?>
    11.  
    /loader.php
    PHP:
    1.  
    2. <?php
    3.  
    4. require_once('./enigma/start.php');
    5.  
    6. $http = EnigmaHTTPRequest::GetInstance();
    7.  
    8. if($http->isPost()) {
    9.     $cz = $http->GetPost('cz');
    10.     if(!empty($cz)) {
    11.         $method = $http->GetPost('method','draw');
    12.         $html = Enigma::Run($cz,$method);  
    13.         print($html);
    14.     } else {
    15.         $http->Error('нет контент зоны!');
    16.     }
    17. } else {
    18.     Enigma::Home();
    19. }
    20.  
    21. require_once('./enigma/stop.php');
    22.  
    23. ?>
    дальше просто пишу классы с нужными методами и НЕ парюсь ни о чем...

    enigmaczhello.php
    PHP:
    1.  
    2. <?php
    3.  
    4. class EnigmaCZHello extends EnigmaCZ {
    5.  
    6.     function __construct() {
    7.         parent::__construct();
    8.         $this->file = __FILE__;
    9.     }
    10.  
    11.     function Draw() {
    12.  
    13.         $tpl = $this->GetTemplate();
    14.         $html = $tpl->Parse('HELLO');
    15.         return $html;
    16.     }
    17.  
    18. }
    19.  
    20. ?>
    21.  
    hello.html
    HTML:
    1.  
    2.  
    3. <!-- BEGIN HELLO -->
    4. Hi!
    5. <!-- END HELLO -->
    6.  
    7.  
     
  5. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Я тоже как то писал сайт онли ajax, но бросил, юником меня добил. Остановился я на gzip, грузит не намного медленнее аякса
    ты видишь будущее?

    Слушай, а ты вроде обещал выложить этот движок?
     
  6. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    конечно...
    все мы умрем и забрать "туда" сможем ну ни как не php-ный код...

    =)
     
  7. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    я не понял, а как ты грузишь файл enigmaczhello.php
    а понял
     
  8. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    autoload.php
    PHP:
    1.  
    2. <?php
    3.  
    4. /**
    5. * Автозагрузчик классов
    6. *
    7. * Используется для автоматической загрузки классов в код
    8. *
    9. * @package      Enigma
    10. * @version      1.0
    11. * @access       public
    12. * @link         [url=http://enigma.440hz.ru]http://enigma.440hz.ru[/url]
    13. * @license      [url=http://enigma.440hz.ru/license]http://enigma.440hz.ru/license[/url]
    14. * @author       Andrey Golubev <440hz@mail.ru>
    15. * @copyright    2008-2009 (c) 440hz
    16. * @version      $Id: autoload.php 69 2008-03-02 11:05:24Z 440hz $
    17. */
    18.  
    19. /**
    20. * получаем список файлов для сканирования
    21. * @param string $dir    директория сканирования
    22. * @param array  &$dirs  массив для хранения сканированной информации
    23. *
    24. * @return void
    25. */
    26. function __autoloadscanfiles($dir,&$dirs) {
    27.  
    28.     if (is_dir($dir)) {
    29.         if ($dh = opendir($dir)) {
    30.             while (($file = readdir($dh)) !== false) {
    31.                 if($file[0] == '.') continue;
    32.                 $filename = $dir.$file;
    33.                 if(is_dir($filename)) __autoloadscanfiles($filename.'/',$dirs);
    34.                 if(is_file($filename))  {
    35.                     list($classname,) = explode('.',$file);
    36.                     if(!isset($dirs[$classname]))
    37.                         $dirs[$classname] = $filename;
    38.                     else
    39.                         die("Дубликат класса [{$classname}]. Источник [{$dirs[$classname]}]");
    40.                 }
    41.  
    42.             }
    43.             closedir($dh);
    44.         }
    45.     }
    46. }
    47.  
    48. /**
    49. *
    50. * Автозагрузчик
    51. *
    52. * @param string $name имя класса для загрузки
    53. *
    54. * @return bool
    55. * @access public
    56. */
    57. function __autoload($name='') {
    58.  
    59.     static $dirs = false;
    60.  
    61.     if(!$dirs) __autoloadscanfiles(ENIGMA_CLASS_ROOT.'/',$dirs);
    62.  
    63.     if($name == '') return $dirs;
    64.  
    65.     // получили имя класса
    66.     $classname = strtolower($name);
    67.  
    68.     if(isset($dirs[$classname])) {
    69.         require_once($dirs[$classname]);
    70.         return true;
    71.     }
    72.  
    73.     die("не могу загрузить класс [{$name}]");
    74.  
    75. }
    76.  
    77. ?>
    78.  
     
  9. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    а как генеришь ссылки и зоны для них?
    вручную прямл в шаблончике?
     
  10. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    а ты HTML посмотри...

    =)
     
  11. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ну да. написать <div id="auth"></div> мне не сложно

    index.html
    HTML:
    1.  
    2.  
    3. <!-- BEGIN INDEX -->
    4.  
    5. <center>
    6. <table width="800px" border="1">
    7.     <tr>
    8.         <td align="left">
    9.         <div  id="auth"></div>
    10.         <script>$("#auth").EnigmaLoader('auth');</script>
    11.         </td>
    12.     </tr>
    13. </center>
    14.  
    15. <!-- END INDEX -->
    16.  
     
  12. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ыы?

    так а в админке? ну например добавляешь текст, как указать в нём ссылку на какой-нибудь раздел?
     
  13. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    неее... ты не там смотрнишь. этому старью лет 5-6...

    http://enigma.440hz.ru
     
  14. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    доделаю. выложу все исходники. как обесчал. соц. сеть допишу тока. бесплатную.
     
  15. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    440Hz
    скорее бы, интересно. Но что-то я не понял =)
     
  16. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    что именно?
     
  17. kostyl

    kostyl Guest

    Почти все понял только не понял, что происходит с этим:
    Код (Text):
    1. <script>$("#auth").EnigmaLoader('auth');</script>
    Туда пишется вызов соответствующий классу auth?
    А... Это потом парситься и вставляется JS вызова. А... Блин это ж jquery...
    Одно из требований JS вкл.
     
  18. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    что ты делаешь с ссылками а админке
    это он загружает плагин авторизации

    вообще интересно как там админицо

    вот пример созрел у меня:
    есть ссылки например в меню, они грузят body
    а есть ссылки в блоке с анонсом новостей и в этом блоке могут быть ссылки и на разделы меню и на разделы этого анонса и как ты выбираешь что грузить body или блок с анонсом?

    вобщем, когда я аяксом увлекался с этим у меня были большие проблемы, приходилось писать везде что-то типа <a href="javascript" onClick="GoTo()"></a>
     
  19. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ну это уже де факто... я не видел того, кто выключает JS серфя в инете. ну разве что параноики, ну и бог с ними.
     
  20. kostyl

    kostyl Guest

     
  21. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    вообще впервые идею контент-зон (CZ) я услыл от Михаила Зеленского. Идея до сих пор меня вдохновляет. Имея ядро (а я имею), позволяющее заниматься проектрованием отдельных блоков сайта со своей логикой и взаимосвязями, НЕ затрагивающей основную логику, очень интересна, как в самой разработке, так и в модульной фрхитектуре/структуре и командной среде.

    Может уже есть такие движки, но я не видел.

    кто работал в командах, знает, как сложно урегулировать отношения при кривой архитектуре, а так каждый делает свой кусок НЕ пересекаясь с остальными.
     
  22. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    да. ссылки все н ликабельные, но тоже можно выйти.

    http://domain.ru/modul/method/?params

    и там смотреть что вызвано. решаемо. не проблема.
     
  23. kostyl

    kostyl Guest

    440Hz
    Да. Отличный подход. +1000
    (ps: Я о таком когда то думал.... но не знал я тогда о Ajax и все забыл...)
     
  24. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    безусловно это не панацея для всех сайтов и решений. двигло пишется под заточку соц. сетей и аналогичные проекты.

    думаю, не удивлю никого, когда скажу, что уже давно аналитиками прощитано, что дальнейшее развитие инета уйдет в сторону "малых социльных групп". этозаконы развития как социума так и инета.

    иметь такой движок - значит "быть в теме".

    вспомни, как раньше, на сайты вешали форум, как обязательную фичу. теперь все хотят иметь свой собственный facebook (вконтакте/однокласники). при нормальном открытом API развитие такого движка обеспечится автоматом.

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

    ну так это как раз и не проблема, т.к. не требует мощностей и может спокойно развиваться.

    зачем грузитьаждый раз страницу? это ТРЕБОВАНИЕ поисковиков и SEO. Это большой бизнес и большие деньги. думаешь поисковики не могут выполнить страницу с JS и получить сгенерированный HTML ? Не смешите меня. тут все также как с топливными ресурсами и альтернативными источниками питания. Монополия и диктат и очень большие деньги.

    знаешь как поисковики стонут, что не могут интексировать тот же контакт? а поячему? да просто проиндексировав конткат они получат ВСЮ инфу и смугутр ее ПРОДАВАТЬ, а так инфой торгует конткат.

    основной критерий - БАБЛО!

    зачем сделали ЛИНУКС если была ФРЯ? - новых идей там нет как и небыло со времен первых версий онной. ответ прост - люди влезли на рынок и срубили бабла.
     
  25. kostyl

    kostyl Guest

    440Hz
    А ты не хочешь разработать библы, оширокопублить их и мастерить сервисы одни за другими(только бы идеи были), рубя бабло явно не топором?