"Дока" на PHP-Fox

Тема в разделе "Коммерческие", создана пользователем be_nt_all, 24 сен 2007.

Информация :
Публиковать (для всех) нуленые версии, особенно от modulesgarden КАТЕГОРИЧЕСКИ не стоит. Тема мониторится оным разработчиком, а к нам приходят абузы которые нельзя игнорировать.
Статус темы:
Закрыта.
Модераторы: Amazko, Aste
  1. be_nt_all

    be_nt_all Писатель

    Регистр.:
    21 сен 2007
    Сообщения:
    4
    Симпатии:
    3
    Вот, перевёл кое что
    будет полезно при модификации PHPFox
    Как работает Phpfox 1.5+ (пример: Ограничение свободного членства для модуля)
    (Purefan :: phpFoX )
    Становится популярной тема, 'как я могу установить что только X может просматривать video/account/music/etc... секции?', здесь я покажу это и в то же время попробую немного разъяснить, как сценарий работает, так чтобы вы могли целиком воспользоваться его функциональностью
    Сначала немного (хм...) теории
    В сценарии содержится несколько папок, вот - описание, зачем они.
    • Design: Всё что будет показано на клиентской стороне, JavaScript и файлы шаблонов хранятся здесь
    • File: контент, присылаемые пользователями, такой как картинки профилей, фоны а так же темы (называемые стилями), флаги государств и даже файлы языков (как минимум, начиная с версии 1.6), текст, который посылается, когда регистрируется новый пользователь (все то, что вы можете редактировать из Admin Panel -> Site Content) запоминается в этой папке
    • Include: в этой папке - очень важные классы, здесь - классы, которые формируют структуру электронных писем, важные сообщения запоминаются в папке 'messages' , здесь же конфигурация системы и, разумеется, все модули находятся в этой папке (я доберусь до модулей попозже), наконец очень важный файл, который можно найти здесь init.inc.php (я расскажу вам позже, чем он важен)
    • Plugins: хорошо... плагины хранятся тут, в каждом из наших плагинов вы найдёте как минимум файл config.php который вы должны посмотреть для того, чтобы попробовать (ага... ;) ) конфигурировать ваш плагин.
    • * Site: это также очень важная папка, здесь вы найдете все файлы, которые автоматически соединяются с html файлом в design/templates/ folder
    хорошо, теперь содержательная (сочная) часть
    Когда скриптовый движок стартует он смотрит файл site/public/_pre.php чтобы создать меню, проверка, не забанен ли ip и несколько другие вещи, которые мы имеем в массиве вроде этого:
    Код:
    $aMenuPerms = array(
        'public'                => array('title'=>App::format('menu.public.home')),
        'public.gallery.main'   => array('title'=>App::format('menu.public.gallery'),
                                         'perm'=>'gallery',
                                         'sett'=>'gallery'),  
    Вы обратили внимание на индексы (ключи) этого массива? они выглядят несколько... забавно, не так ли?
    Это сделано не просто так, возьмём "public.gallery.main" - это адрес (url) по которому мы идём, посещая общедоступную часть галереи, в смысле... "главную" страницу галереи, ох... в общедоступной области! (по умолчанию имеем деление на публику и админов), н беспокойтесь о perm и sett, они используются в сценарии для других вещей, но мы можем только оставить их пустыми или не помещать их вообще, когда создаем новую секцию.
    Продолжим с нашим примером public.gallery.main, еще в папке site есть папка public, и внутри неё есть папка на с именем gallery а в ней есть файл main.php ;) ... нет, это не случайное совпадение. Сценарий берет этот файл 'зная' что ему придётся обратится к main.html в папке design, так зачем он сначала идёт сюда? хорошо, чтобы проверить любые предварительно загружаемые конфигурации, которые, возможно, будут нужны, в нашем случае этот файл это только проверит разрешение доступность через сервис Security модуля Account .
    Так что, если мы хотим предварительный загрузить любую переменную или конфигурацию, здесь мы можем сделать следующее: предполагая, что вы хотите, чтобы данная страница просматривалась только зарегистрированными членами, вам нужно бы вызвать Security Service из модуля Account, примерно так:
    Код:
    // Мы вызываем Security Service из  Account Module и присваиваем его
    // переменной $oSrvSec, заметьте что в действительности мы берём ссылку на
    // этот сервис мы можем реально изменять этот объект через переменную
    $oSrvSec = &App::getModuleService('Account', 'Security');
    // теперь мы можем входить как пользовотели, помня , что даже гости 
    // имеют id в системе так чтоони будут все еще идентифицироваться здесь
    $oUser = $oSrvSec->getCurrentUser();
    // Теперь вспомним таблицу `membership` в базе данных? первичный ключ 
    // этой базы - это номер, этот номер напрямую соотносится с PK 
    // таблицы пользователей, таким образом мы можем идентифицировать членство по
    // номеру:
    $isRegistered = ($oUser->aData['type'] == '3') ? true : false; 
    // тут я смотрю на массив aData, это всё равно,что сделать запрос 
    // к базе данных и затем извлечь (fetched) запись из таблицы user, это
    // безоговорочно, так что смотрим на поле 'type' этой записи и проверяем,
    // зарегистрирован ли, переменная isRegistered будет  true или  false  
    Теперь, когда мы имеем переменную isRegistered нам нужно сообщить парсеру (движке Smarty) об этом, есть два пути назначения переменных Smarty, но с тех пор, как мы передали переменную "code", мы должны использовать следующий путь:
    Код:
    // Для начала возьмём объект шаблона:
    $oTpl = &App::getTemplate();
    //и теперь присвоим нашу переменную переменной smarty:
    $oTpl->assignSrc(array(
          'isLoggedIn' => $isRegistered,
          ));  
    Вот оно, теперь когда файд шаблона загрузится он будет иметь доступ к переменной "isLoggedIn".
    Теперь, в нашем случае с секцией gallery файл шаблона Design/templates/public/gallery/main.html (угу, такой же путь, как в public.gallery.main)
    Так что сейчас нам нужно узнать кое-что о синтаксисе Smarty, вы можете найти полное руководство на сайте smarty но здесь нам нужен пример:
    Код:
    {if $isLoggedIn}
    Я хочу показать вессь этот текст..
    {else}
    Извините но вы не - зарегистрированный член
    {/if}
    И всё :).
    Небольшая подсказка, если вы хотите чтобы эта переменная isLoggedIn была доступна лоя всех файлов сессии, создайте файл php с именем _pre.php и сделайте то, что мы только что сделали для создания переменной там. Вам все еще нужно будет отредактировать все файлы шаблонов, в которых это используется, но переменная будет уже доступна.
    -=- продолжение следует -=-

    Добавлено через 8 минут
    О модулях (Modules), компонентах (Components), элементах (Items) и сервисах (Services:(

    Давайте на секунду остановимся и попробуем систематизировать все эти штуки - module/service/component. Модуль подобен секции в скрипте, фактически все секции - модули но мы можем иметь модули, которые не являются секциями, модуль - это только набор классов и функций, которые вместе обеспечивают бэкэнд (низкоуровнеыую часть) секции в сценарии, каждый модуль имеет встроенную файловую структуру, которую надо соблюдать вплоть до некоторого пункта, папками, которые должны находится внутри модуля, являются:

    • classes: должен содержать как минимум классы модуля (PhpFox_Module.class.php), компонента (PhpFox_Component<NAME>.class.php) и сервиса (PhpFox_Service<NAME>.class.php)
    • messages: возможно, включает файл с определенными переменными для вывода
    • include: должен включать определения для сокращённых вызовов таблиц по короткими именам, массив конфигурации...

    Так как вы, возможно, уже знаете, папка классов - основное тело модуля, начнём с класса модуля

    The Module Class (PhpFox_Module.class.php:(

    это имя файла никогда не изменяется, вне зависимости от модуля, и поэтому он содержит единственный класс модуля на модуль.

    Все файлы классов в сценарии должны начаться подобно этому:

    Код:
    class PhpFox_Mod_<MODULE NAME>_Module extends BaseModule  
    Имя модуля конечно должно соответственно измениться, но это синтаксис, которому надо следовать, затем каждый класс имеет один конструктор, который выполняет все начальные действия. в случае модуля (Module) он обеспечивает декларации сервисов (Services), элементов (Items) и компонентов (Components), это простой ассоциативный массив с именами файлов без расширения которые могут использоваться повсюду в модуле (и, также, вызываться из других модулей) чтобы совершать специфические действия (или получать доступ к этим действиям).

    Класс компонента (PhpFox_<Component-Name>.class.php:(

    Компонент - то, к чему обращаются файлы шаблонов обращаются, когда вы читаете html

    Код:
    {module module='X' component='mycomponent'}
    они обеспечивают некий верхний уровень обработки, который, возможно, включает другой файл шаблона и присваивание переменных (повторяю, assignSrc и простое присваивание объектам шаблона происходят здесь). Имя класса компонентов должно включать имя модуля:

    Код:
    class PhpFox_Mod_<MODULE-NAME>_<COMPONENT-NAME> extends BaseComponent  
    Класс сервиса (службы) (PhpFox_<Service-Name>.class.php)

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

    Код:
    class PhpFox_Mod_<MODULE-NAME>_<SERVICE-NAME> extends BaseService  
    Класс элемента (PhpFox_<Item-Name>.class.php)

    Элемент есть в основном предварительные загрузки базы данных, думайте о них, как об объектах набора данных. В модификациях, которые я делал, он импользуются очень мало, но они однако полезны, как постоянный объект для ссылки на него. Декларация класса:

    Код:
    class PhpFox_Mod_<Module-Name>_<Item-Name> extends DbItem  
    Теперь мы видим, есть прямое соответствие между значением в классе Модуля и именем его файла, так что уделяйте внимание этому, делая ваши собственные componentы/serviceы/itemы.

    Хорошо, теперь, когда мы немного разобрались с компонентами, давайте сосредоточимся на объекте шаблона. почти (если не все) компоненты в определённом месте нужны, чтобы вывести результат процесса, это делается с объектом шаблона, вам нужно присвоить некоторые значения ему и, наконец, вы скорее всего захотите взять файл шаблона для того, чтобы изменить переменные smarty и циклы, с которыми ваш компонент работает:

    Код:
    // Начнём с созданием объекта шаблона
     $oTpl = &$this->_oModule->getTemplate();
    
    // здесь ваш компонент должен сделать что то вроде загрузки (upload) 
    // картинки, или получение блога или чего вы о него хотите
    
    // теперь мы присваиванем переменные объекту шаблона
     $oTpl->assign(array(
                'myVar'    => $myResultingVar,
                 ));
    
    // Теперь, когда все переменные были присвоены объекту шаблона
    // мы можем сообщить объекту, какой файл хотим использовать
     return $oTpl->fetch('MyTemplateFile.html');
    
    // заметьте, мы всегла возвращаем его тут, но теоретически мы могли бы
    // присвоить его переменной, а затем другому объекту шаблона
    // Я не вижу применения этому, но они возможны 
    Но где мы берём файл "MyTemplateFile.html" ?? Из папки design/templates/_modules/<MyModuleName>/ folder ;) ага, мы имеем "дублирование" в структуре папок, в данном случае секций _modules и public, но поверьте мне, это намного проще, чем кажется и в этом намного больше смысла, чем в сваливании всего в одну и ту же папку.

    Надеюсь это поможет вам, парни, создать больше модулей и портировать ваши модификации, Я думаю описал немногим более чем 50% того, как работает скрипт, что как минимум должно помочь вам начать разбираться со всем остальным.

    Хорошей стартовой точкой для меня, в моём изучении, было скопировать модуль и редактировать его, пока я не достигал эффекта в некоторой секции, и посмотреть как это все соединяется со всем остальным.

    -=- продолжение следует -=-

    Добавлено через 11 минут
    The _pre.php file

    Как правило, любой файл обращается к _pre.php перед загрузкой модулей/секций/и т.д. для установки предопределённых значений, таких, как меню, или, например, инициализации Аякса. Он может также содержать функцию, которая используется статически в контексте этого модуля.
    Совершенный пример - файл /site/public/_pre.php. Этот файл загружает меню в массив, вроде этого:
    Код:
    $aMenuPerms = array(
        'public'                => array('title'=>App::format('menu.public.home')),
        'public.gallery.main'   => array('title'=>App::format('menu.public.gallery'),
                                         'perm'=>'gallery',
                                         'sett'=>'gallery'),
         'public.browse'         => array('title'=>App::format('menu.public.browse'),
                                         'perm'=>'account',
                                         'sett'=>'browse'),
        'public.blog.main'      => array('title'=>App::format('menu.public.blog'),
                                         'perm'=>'blog',
                                         'sett'=>'blogs'),
    ....  
    Видите эти значения title, perm и sett ? хорошо вам не стоит беспокоиться о них, они устанавливают текст, который показывается в меню безопасности, и имеющие к нему отношение вещи. Что действительно важно, так то, что, если вы хотите удалить любую ССЫЛКУ (LINK) из меню (только ссылку, модуль/секция все еще будет функционировать), вы можете просто закомментировать соответствующую часть массива:

    Код:
    $aMenuPerms = array(
        'public'                => array('title'=>App::format('menu.public.home')),
        'public.gallery.main'   => array('title'=>App::format('menu.public.gallery'),
                                         'perm'=>'gallery',
                                         'sett'=>'gallery'),
      /*   'public.browse'         => array('title'=>App::format('menu.public.browse'),
                                         'perm'=>'account',
                                         'sett'=>'browse'), I didnt want the Browse members section...*/
        'public.blog.main'      => array('title'=>App::format('menu.public.blog'),
                                         'perm'=>'blog',
                                         'sett'=>'blogs'),
    ....  
    И вы сделали это! вы можете все еще добираться до этой страницы, на прямую обратившись к ней, но она не будет показана в меню.

    Should you have any questions just post your mind out!

    Удачи!
    -------
     
    Walkman, budulay и indecline нравится это.
  2. nes

    nes Писатель

    Регистр.:
    22 июн 2009
    Сообщения:
    6
    Симпатии:
    0
    может кто сталкивался и знает как решить проблему:

    в галерее выбор категории идёт через post запрос, чтобы открыть категорию приходится ставить javascript на клик и сабмитить форму с параметрами категории. гугл такое не индексирует =/

    В каком файле идёт обработка этих данных,чтобы не приходилось так менять категорию


    function changegal(id)
    {
    document.mygal.elements[1].value=id;
    document.mygal.elements[2].value=id;
    document.mygal.submit();
    }


    вдуплил)))

    Перейти по ссылке[galbrowse_show]=1&galbrowse[category]=9 так по GET можно менять категорию
     
Статус темы:
Закрыта.