"Дока" на PHP-Fox

Статус
В этой теме нельзя размещать новые ответы.

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!

Удачи!
-------
 
может кто сталкивался и знает как решить проблему:

в галерее выбор категории идёт через 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 можно менять категорию
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху