We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 1035
    • 81 Posts
    Мысль хранить свои данные (ну записи блога или циклы статей) в своей таблице меня посетила давно, но серьёзно об этом я задумался только сейчас.

    Приведу структуру ресурсов для примера:

    -Главная блога
    -Категория один
    --ресурс-контроллер для отображения полного вида записи
    -Категория два
    --ресурс-контроллер для отображения полного вида записи
    ...
    (их немного, категорий)

    Для Добавления/редактирования/чтения записей в админке напишем модуль, не очень сложно...
    Вывод в front-end’е списка записей с разбивкой на страницы тоже несложен, как сделать понимаю...

    А вот как вывести полный вид записи?

    URL получается вида [(site_name)]путь_до_ресурс-контроллера/[*alias_ресурсf-контроллера*].html?id=id ........

    Вся соль в том, что нужно брать заданное значение в поле alias записи из своей таблицы (щас неважно как я туда его - алиас - буду записывать, понятное дело нужно вешать свой плагин с транслитерацией) и подставлять [*alias*] для ресурс-контроллера.
    Это я так понимаю можно сделать плагином повесив его на PageInit и PagePrerender???

    Вобщем вопрос такой: можно ли и как (в общих чертах) вставлять инфор-цию из своей таблицы в данный ресурс-контроллер, такое вообще возможно?

    P.S: Возможно я немножко путано все изложил, в таком случае спрашивайте, критикуйте )))...
    P.S2: Ресурс-контроллер, это такой же документ-ресурс, ничего особенного
      Чем я занят на данный момент, читайте в этой теме: [EVO] Ресурс-контроллер?
      • 9085
      • 630 Posts
      Quote from: Alextekkk at Dec 16, 2010, 10:39 AM

      Для Добавления/редактирования/чтения записей в админке напишем модуль, не очень сложно...
      Вывод в front-end’е списка записей с разбивкой на страницы тоже несложен, как сделать понимаю...

      А вот как вывести полный вид записи?
      ...
      Вобщем вопрос такой: можно ли и как (в общих чертах) вставлять инфор-цию из своей таблицы в данный ресурс-контроллер, такое вообще возможно?

      Ну почему бы и нет? В ресурс-контроллер запихиваем сниппет [!GetMyContent!] в котором к своей таблице в базе делается запрос (допустим, тот же mysql_query()) с учетом $_GET[’id’] и выводится соответствующий результат (допустим, echo $row->mycontent и плюшки всякие - заголовки/даты/тэги(?)...)

      * как вариант, можно "извратиться" и перехватывать всё это дело до вывода 404 страницы, тогда можно "навешивать" на "собственные алиасы" нужные ресурс-контроллеры (и не плодить их и категории) - где-то это дело обсуждалось.. в моих постах можно топик поискать.
      Хотя, не уверен, что это сочетается с идеологией MODx smiley
        Правильно заданный вопрос повышает вероятность получения нужного ответа.
        Что-то не работает? Загляните в лог ошибок!
        Есть проблема? "Локализуйте" её!
        Ответы на большинство вопросов по MODx | MODx RTFM | API Evo Revo | галопом по Европам Азиям smiley wikibooks(ru) Ditto(en) | Wayfinder e-book | Заметки и о MODx
        • 1035
        • 81 Posts
        Главное что это возможно )))
        Меня взволновал вопрос возможности вставки своих значений полей документа до его формирования и отдачи браузеру...
        Спасиб!))
          Чем я занят на данный момент, читайте в этой теме: [EVO] Ресурс-контроллер?
          • 1035
          • 81 Posts
          Да, помимо сего прочего придется еще и кэширование самому делать...
          ТО есть Если запись менялась или устарела то берем из базы и заносим в кеш именно этой записи иначе берем из кеша (файл кеша создается для каждой записи блога), даже не знаю что лучше - один файл кеша для таблицы или n-множество кеш файлов...

          А если записей 8,10,15,20 и т.д. тысяч? :О
            Чем я занят на данный момент, читайте в этой теме: [EVO] Ресурс-контроллер?
            • 9085
            • 630 Posts
            Quote from: Alextekkk at Dec 16, 2010, 12:09 PM

            Да, помимо сего прочего придется еще и кэширование самому делать...
            ТО есть Если запись менялась или устарела то берем из базы и заносим в кеш именно этой записи иначе берем из кеша (файл кеша создается для каждой записи блога), даже не знаю что лучше - один файл кеша для таблицы или n-множество кеш файлов...

            А если записей 8,10,15,20 и т.д. тысяч? :О

            "универсальное" кэширование - по значимой части URL (например, сохраняем всё в файл с именем {в key-value кэш с ключом} md5($_SERVER[’REQUEST_URI’]).$_GET[’id’]))

            * кэш ещё надо как-то очищать wink

            ps. А вообще, один "простой" запрос по primary-ключу не так уж сильно загрузит базу smiley
              Правильно заданный вопрос повышает вероятность получения нужного ответа.
              Что-то не работает? Загляните в лог ошибок!
              Есть проблема? "Локализуйте" её!
              Ответы на большинство вопросов по MODx | MODx RTFM | API Evo Revo | галопом по Европам Азиям smiley wikibooks(ru) Ditto(en) | Wayfinder e-book | Заметки и о MODx
              • 1035
              • 81 Posts
              Quote from: esche at Dec 16, 2010, 12:53 PM


              * кэш ещё надо как-то очищать wink


              Или перезаписывать...
                Чем я занят на данный момент, читайте в этой теме: [EVO] Ресурс-контроллер?
                • 9085
                • 630 Posts
                Quote from: Alextekkk at Dec 16, 2010, 02:33 PM

                Quote from: esche at Dec 16, 2010, 12:53 PM
                * кэш ещё надо как-то очищать wink
                Или перезаписывать...
                В общем случае, когда "обновление" кэша приводит к перезаписи нескольких файлов его лучше очищать и генерировать при следующем обращении (как и сделано в MODx). Если же при обновлении будет затронут только один файл, то вполне возможно, что переписать его особых проблем не составит.

                p.s. А как там с генерацией списков статей (статьи за месяц, по определенному тэгу - какие там ещё выборки имеются?) - они кэшируются? Ну и "бонус" напоследок - как искать будем? smiley
                  Правильно заданный вопрос повышает вероятность получения нужного ответа.
                  Что-то не работает? Загляните в лог ошибок!
                  Есть проблема? "Локализуйте" её!
                  Ответы на большинство вопросов по MODx | MODx RTFM | API Evo Revo | галопом по Европам Азиям smiley wikibooks(ru) Ditto(en) | Wayfinder e-book | Заметки и о MODx
                  • 1035
                  • 81 Posts
                  Quote from: esche at Dec 16, 2010, 11:39 PM

                  p.s. А как там с генерацией списков статей (статьи за месяц, по определенному тэгу - какие там ещё выборки имеются?) - они кэшируются? Ну и "бонус" напоследок - как искать будем? smiley

                  Вывод последних статей паджинация ссылки тэги все это можно сделать... Просто надо все это обмозговать - чем я щас и займусь, как что надумаю, отпишусь (может появятся первые "наброски" кода huh)
                  А вот поиск... С этим надо быть ОЧЕНЬ аккуратным...
                  Пойду еще раз "курну" манны по регулярке (у меня сней плохо... sad), при поиске главное, это:
                  1. Обработать все что ввел юзер в поиск и выжечь оттуда все ненужное (возможно же все? - Слова<2букв, SQL, html/тэги...)
                  ну и конечно же длина строки введенной юзером должна имет лимит на определенное кол-во символов, все остальное надо отрезать....
                  2. Выполнение самого запроса и его обработка... Тут можно толковать сей пункт и как подзадачу задачи поиска и как вывод инфы из базы...
                  Да, там ж должны быть ссылки типа Read More... или Read Full...

                  p.s: вобщем интересное дельце намечается ))), сам я его похоже не осилю, придется обращаться за помощью к знакомым....
                    Чем я занят на данный момент, читайте в этой теме: [EVO] Ресурс-контроллер?
                    • 6862
                    • 97 Posts
                    Я делал подобные связки не раз. Тут есть несколько путей решения.

                    1-й путь связка модуль + сниппет как вы сказали, и конечно в своей таблице надо сохранять alias или генирировать его по какому-нибудь критерию, обрабатывать пагинацию и вывод. И добавлять примерно такие строки в .htaccess для обработки ЧПУ
                    RewriteCond %{REQUEST_FILENAME} !-f
                    RewriteCond %{REQUEST_FILENAME} !-d
                    RewriteRule ^cat/(.*)/tovar/(.*).html$ index.php?id=214&alias=$1&articul=$2 [L,QSA]
                    RewriteRule ^cat/(.*)/page(.*).html$ index.php?id=213&alias=$1&pagenum=$2 [L,QSA]
                    RewriteRule ^cat/(.*)/$ index.php?id=212&alias=$1 [L,QSA]
                    

                    в данном случае 3 ресурса (id=212, id=213, id=214) являются контролерами и в них вызываются 3 разных снипетта

                    2-й путь
                    Использовать внешний скрипт полностью отдельно, к примеру в какой-нибудь подпапке скрипт магазина, каталога и т.д. и парситть в нем шаблон модыкса. ТО есть вставить в код скрипта примерно такое:

                    define('MODX_BASE_PATH', '/home/clients/client23/domains/site.ru/html/');
                    define("IN_PARSER_MODE", true);
                    define("IN_MANAGER_MODE", false);
                    if (!defined('MODX_API_MODE')) {
                        define('MODX_API_MODE', true);
                    }
                    @include_once(MODX_BASE_PATH.'manager/includes/config.inc.php');
                    include_once(MODX_BASE_PATH.'manager/includes/document.parser.class.inc.php');
                    $modx = new DocumentParser;
                    $modx->getSettings();
                    $modx->documentMethod = 'id';
                    $modx->documentIdentifier = 4;
                    
                    $Block_Menu = '{{Блок_Главное_меню}}';
                    $Block_Menu = $modx->rewriteUrls($modx->parseDocumentSource($Block_Menu));
                    $Block_Menu = str_replace('a href="/shop/', 'a href="http://www.site.ru/', $Block_Menu);
                    
                    
                    $Block_Novosti = '{{Блок_Новости}}';
                    $Block_Novosti = $modx->rewriteUrls($modx->parseDocumentSource($Block_Novosti));
                    $Block_Novosti = str_replace('[!', '[[', $Block_Novosti);
                    $Block_Novosti = str_replace('!]', ']]', $Block_Novosti);
                    $Block_Novosti = $modx->rewriteUrls($modx->parseDocumentSource($Block_Novosti));
                    $Block_Novosti = str_replace('a href="/shop/', 'a href="http://www.site.ru/', $Block_Novosti);
                    
                    
                    $Block_Poisk = '{{Блок_Быстрый_поиск}}';
                    $Block_Poisk = $modx->rewriteUrls($modx->parseDocumentSource($Block_Poisk));
                    
                    
                    $Block_Footer_Counters = '{{Блок_Счетчики}}';
                    $Block_Footer_Counters = $modx->rewriteUrls($modx->parseDocumentSource($Block_Footer_Counters));
                    
                    $Block_Copyright = '{{Блок_Копирайт}}';
                    $Block_Copyright = $modx->rewriteUrls($modx->parseDocumentSource($Block_Copyright));
                    



                    И использовать $Block_Menu, $Block_Novosti и т.д. в шаблоне внешнего скрипта при генерации страницы.
                      • 1035
                      • 81 Posts
                      Очень ценный совет )
                      Радует еще и тот факт что подобные задачи уже решались)))
                        Чем я занят на данный момент, читайте в этой теме: [EVO] Ресурс-контроллер?