久久精品水蜜桃av综合天堂,久久精品丝袜高跟鞋,精品国产肉丝袜久久,国产一区二区三区色噜噜,黑人video粗暴亚裔

Gallery:整合的相關(guān)幫助指導(dǎo)

來自站長百科
(重定向自Gallery:Integration Howto
跳轉(zhuǎn)至: 導(dǎo)航、? 搜索

介紹[ ]

Gallery2被設(shè)計成能夠輕易地被嵌入到其他應(yīng)用程序中去。Embed.php中的GalleryEmbed類別提供了API來協(xié)助G2請求的處理和對話的維持,用戶登入以及G2與嵌入應(yīng)用程序間用戶/組數(shù)據(jù)的同步。在此份資料中, "嵌入應(yīng)用程序"簡稱為emApp。此文的包含有如下內(nèi)容的相關(guān)指導(dǎo):

  • 使用現(xiàn)有的整合代碼將G2整合到另一個應(yīng)用程序中去。
  • 編寫整合代碼來講G2整合到另一個應(yīng)用程序中去。

并且此文的著重點也在GalleryEmbed::init()上,你可以在如下頁面中找到有關(guān)嵌入& 整合的完整資料:

使用現(xiàn)有的整合代碼[ ]

  1. (單獨)安裝Gallery2以及用于嵌入Gallery2的應(yīng)用程序。
  2. 獲取轉(zhuǎn)為emApp所編寫的G2整合代碼并進行安裝。這可能是一個模塊或插件(如果emAPP支持的話)或是一個簡單的php文件。
  3. 按照整合代碼的指導(dǎo)首次進行用戶和組的同步。這可以作為模塊/插件安裝的一部分或通過特殊的php文件。
  4. 以站點管理員的身份登入Gallery2:
    1. 確保注冊(registration)模塊未被激活或未被安裝。
    2. Gallery2的對話壽命至少要設(shè)定為emAPP中對話壽命的兩倍。這是因為某用戶可能訪問Gallery2并接著繼續(xù)使用emAPP但不訪問Gallery2的頁面。更長的Gallery2對話超時能在他們重新訪問Gallery2頁面之前保證對話仍存在。注意如果Gallery2對話沒有超時而用戶返回的話,一個新的對話就會被創(chuàng)建。其他來自舊對話中的數(shù)據(jù)都丟失了,但用戶登入仍被保存了下來。
  5. 測試整合。
  6. 一旦所有東西都正常運行了,你就可以選項禁用對Gallery2的直接訪問,并僅允許通過emAPP進行訪問。要達到此目的,在你的config.php中設(shè)定embedOnly標(biāo)識。


編寫新的整合代碼[ ]

首先(單獨)安裝Gallery2以及用于嵌入Gallery2的應(yīng)用程序。

對所有Gallery2請求而言,在emApp中你需要一個入口點(entry point),(類似于獨立Gallery2中的main.php)。如果應(yīng)用程序支持的話,可以是模塊或插件,也可以是一個普通的php文件。決定訪問點和Gallery基礎(chǔ)目錄(Gallery2 Base Directory)(與web服務(wù)器文檔根目錄比較而言)的URI/路徑。舉例:

訪問點( = embedUri ) Gallery2基礎(chǔ)目錄( = g2Uri )
/appdir/gallery2.php /appdir/gallery2
/appdir/plugins/gallery2.php /appdir/lib/gallery2/
/appdir/index.php?module=gallery2 /gallery2/
/index.php?page=gallery /albums/

你可以將這些路徑作為至GalleryEmbed::init($embedUri, $g2Uri);的參量

  • embedUri = 訪問點的文檔根目錄的絕對URL路徑+ 文件名稱(以及所有查詢參量,但不是路徑)
  • g2Uri =文檔根目錄至Gallery2目錄的絕對URL路徑

請勿忘記打頭的'/'! 完整URL也是被允許的,例如

訪問點( = embedUri ) Gallery2基礎(chǔ)目錄( = g2Uri )
http://www.example.com/appdir/gallery2.php http://www.example.com/appdir/gallery2/
http://example.com/appdir/plugins/gallery2.php http://example.com/appdir/lib/gallery2/
http://example.com/index.php?module=gallery2 http://photos.example.com/

正如你所看到的,Gallery2以及Gallery2在你網(wǎng)站上的整合位置可以在兩個不同的子域上!你不應(yīng)該使用兩個完全不同的域,因為cookies(你是否登入)無法再兩個不同的域中共享。但不同的子域則是可以的,不過你得在站點管理(site admin) -> General中對Gallery2的 cookie.path做適當(dāng)?shù)母膭印?

對于登入頁面或app主頁面你還需要一個URI;Gallery2會將無適當(dāng)權(quán)限的訪問嘗試進行重新定向。

舉例
/
/appdir/login.php

用以處理某Gallery2請求的訪問點代碼看起來是這樣的:

require_once(dirname(__FILE__) . 'relative/path/to/gallery2/embed.php');
$ret = GalleryEmbed::init(array( 'embedUri' => {value}, 'g2Uri' => {value}, 'loginRedirect' => {value}, 'activeUserId' => {value}));
if ($ret) {
  // $ret->getAsHtml()具有錯誤的詳細信息
  exit;
} 
$g2data = GalleryEmbed::handleRequest(); 
if ($g2data['isDone']) {
  exit; // Gallery2已發(fā)送了output(redirect或binary數(shù)據(jù))
} 
// 使用$g2data['headHtml']以及$g2data['bodyHtml']
// 來顯示emApp中的Gallery2內(nèi)容
// 如果你不想直接使用$g2data['headHtml'],可以分別獲取css,
// javascript以及頁面標(biāo)題,通過呼叫…
if (isset($g2moddata['headHtml'])) {
  list($title, $css, $javascript) = GalleryEmbed::parseHead($g2moddata['headHtml']);
}

通過確保Gallery2中活動用戶符合emApp用戶,傳送到init()的'activeUserId'值啟用對話同步。該值為活動的emApp用戶id。在匿名/游客用戶(非具有id的emApp的匿名用戶)的某為空字串中傳送。要完成對話同步,請為emApp中的登出操作添加一個hook/callback/event-handler:

require_once(dirname(__FILE__) . 'relative/path/to/gallery2/embed.php');
$ret = GalleryEmbed::logout();

此hook非必須,但它能在登出時重置Gallery2對話,因此某登入用戶的對話將不會遺留在服務(wù)器中。

接下來確定你是否想支持cookieless瀏覽方式。如果Gallery2無法依靠cookies來追蹤其對話id的話,就需要完成額外的步驟。emApp必須能夠為自己的對話key和id提供一個key=value字串,并要具有一個可用API來存儲對話中的額外數(shù)據(jù)。以下為所需完成的額外步驟:

1. GalleryEmbed::init()呼叫的輸入數(shù)組必須也含有:

'embedSessionString' => {key=value}, 'gallerySessionId' => {value}

(當(dāng)value未知時忽略gallerySessionId)
2. 在init()呼叫之后:

$gallerySessionId = GalleryEmbed::getSessionId(); // {存儲emApp對話中的值}

其他可選任務(wù):

1.在進行handleRequest()呼叫之前設(shè)定GalleryCapabilities。檢查modules/core/classes/GalleryCapabilities.class來看看可用設(shè)定,并查看默認情況下GalleryEmbed::init()中所作的設(shè)定。例如:

GalleryCapabilities::set('showSidebar', false);

2. 檢查返回自handleRequest()內(nèi)容中的'sidebarHtml'。如上述例子中的GalleryCapabilities設(shè)定被使用,那么handleRequest()就可能返回'sidebarHtml'(當(dāng)某個core.ShowItem頁面被查看時)。你可以將此內(nèi)容包括在emApp邊欄上的某個模塊中。

接下來添加hook以使用戶保持Gallery2和emApp的同步。各例中的代碼看起來如下:

require_once(dirname(__FILE__) . 'relative/path/to/gallery2/embed.php');
$ret = GalleryEmbed::init();
if ($ret) {
  // $ret->getAsHtml() has error details..
}
// Call GalleryEmbed as required..
// ..
$ret = GalleryEmbed::done();
if ($ret->isError()) {
  // $ret->getAsHtml() has error details..
}

你需要hook來呼叫GalleryEmbed::createUser(),::updateUser()和::deleteUser()來分別進行用戶的創(chuàng)建,更新和刪除。如果emApp支持新用戶注冊和管理員函數(shù)直接注冊新用戶的話,就有兩create hook。

如果emApp支持用戶組,那么就添加hook以保持這些組的同步。組的同步是可選的,盡管emApp對此支持。過程與前文所述相同,使用GalleryEmbed::createGroup,::updateGroup,::deleteGroup(),::addUserToGroup() 和::removeUserFromGroup()。注意Gallery2不支持巢式組。如果emApp支持的話,那么hook就必須將組擴展到用戶列表并相應(yīng)地更新gallery2的組。

兼容性問題[ ]

  • 數(shù)據(jù)庫:某些整合可能需要兩應(yīng)用程序都使用相同的數(shù)據(jù)庫(區(qū)別只是表格前綴不同),兩應(yīng)用程序使用相同的數(shù)據(jù)庫連接
  • 當(dāng)你包括embed.php時,session.use_trans_sid會被關(guān)閉。因此,如果你的應(yīng)用程序依賴session.use_trans_sid(會降低PHP的速度),就得保證在ession_start()被呼叫之前重新啟用了它。

GalleryEmbed::init()的新(Gallery 2.1)說明[ ]

$ret = GalleryEmbed::init($arguments);

  • $arguments是一個聯(lián)合數(shù)組
  • $ret是一個GalleryStatus對象

參數(shù)[ ]

  • activeUserId字串/mixed – 活動用戶的emApp user Id(對匿名/游客用戶則是空字串)
  • embedUri字串 – 通過CMS應(yīng)用程序?qū)2進行訪問的URI。所有嵌入G2請求的Base URL(在內(nèi)部被稱為baseUri)。協(xié)議及host名稱是可選的。舉例: /index.php?module=gallery2,/portal/index.php?module=gallery2,/,http://www.example.com/index.php?module=gallery2,www.example.com/portal/index.php?module=gallery2
  • g2Uri字串- G2獨立位置的URI。自docroot至main.php目錄的路徑被定位。協(xié)議/host名稱均為可選的。舉例: /gallery2/, /sub/gallery2/,http://photos.example.com/,www.example.com/photos/main.php,
  • loginRedirect字串- 重新定向至emApp登入視圖的URI(如:/emApp/index.php)
  • embedSessionString字串- (可選)要支持cookieless瀏覽,為emApp對話key傳入key=value以及對話id值作為查詢參量添加到url中
  • gallerySessionId字串- (可選)要支持cookieless瀏覽,傳入G2對話id(當(dāng)沒有使用cookies時,CMS必須在請求之間追蹤此值)
  • activeLanguage字串- (可選)該對話正在使用的語言代碼、格式:{LANG}_{COUNTRY},ISO語言和ISO國家代碼(如en_US)
  • fullInit' => boolean - (可選)呼叫GalleryInitSecondPass(僅當(dāng)不呼叫handleRequest時使用)。默認為false。
  • apiVersion => array (int major, int minor) - (可選,但推薦使用)指定檢查你的整合是否與嵌入API(Embed API)兼容

特定行為[ ]

  • embedUri 影響所有由G2生成的URL但不包括靜態(tài)內(nèi)容(css文件,java小程序文件,外觀主題圖片)以及core.DownloadItem URL。
    • 如未特別指定,G2基于當(dāng)前REQUEST_URI及其默認的baseFile 'main.php'來生成URL。如果啟用了重寫模塊,URL的生成則是基于被存儲的embeddedLocation。
    • 如經(jīng)指定且完整URL包括host字串,G2會生成以'{PROTOCOL}://{HOST}/{embedUri}'開頭的URL。{PROTOCOL}和{HOST}由embedUri解析。{PROTOCOL}默認為'http',如通過https訪問的話那就是'https'。
    • 如經(jīng)指定并以'/'開頭,就會使用自動檢測到的{PROTOCOL}和{HOST}值生成URL。
    • 注:介于首個'/' (即協(xié)議http://之后的第一個)與最后一個'/'直接的內(nèi)容將被解釋為embedPath(對短URL來說很重要,因為短URL都有embedPath作為具有短url pendant的url的基礎(chǔ)而其他類型的URL會以完整的embedUri開頭)。
  • g2Uri 影響所有由G2生成的URL,就算G2被嵌入了,這些URL也會直接指向獨立的G2。即:core.DownloadItem以及所有靜態(tài)內(nèi)容(見前文)。
    • 如未特別指定,G2基于當(dāng)前REQUEST_URI及其默認的baseFile 'main.php'來生成URL (除非指定了embedUri,URL才會基于embedUri生成)
    • 如經(jīng)指定并以'/'開頭,G2就會生成以'{PROTOCOL}://{HOST}/{g2Path}'開頭的URL。
    • 如經(jīng)指定但不以'/'開頭,G2就會生成以'{PROTOCOL}://{g2Path}'開頭的URL。如果G2和emApp在不同的子域上時這就有用了。自動檢測的{PROTOCOL} 如經(jīng)指定也可被覆蓋。
  • fullInit影響G2的活動用戶,默認為false。
    • 如未特別指定,你只能在GalleryEmbed::init()之后呼叫GalleryEmbed::handleRequest();如果你沒有指定fullInit = true并呼叫了GalleryCoreApi或GalleryEmbed的其他方法的話,就很可能會發(fā)生錯誤。
    • 如設(shè)定為true,G2就被完全初始化了(基于當(dāng)前對話對活動用戶進行設(shè)定),而你則可以在GalleryEmbed::init()之后呼叫任何GalleryCoreApi或GalleryEmbed方法。
  • activeUserId影響G2活動用戶的對話。
    • 如省略,G2使用來自cookie(或來自GALLERYSID HTTP GET參數(shù))的對話ID并在稍后的::handleRequest / fullInit中載入對應(yīng)的對話數(shù)據(jù)/activeUser。
    • 如經(jīng)指定,G2會比對activeUserId和來自對話的activeUserId(cookie / GET argument)。
      • If activeUserId == externalId from session:沒有任何改變。
      • Else If activeUserId == :對話 /活動用戶被重置,activeUser = guest。
      • else (If activeUserId != externalId from session):被映射到externalId = activeUserId的G2用戶被設(shè)定為該對話以及該請求的活動用戶。
      • 注:如設(shè)定activeUserId了但尚未注冊或映射到G2 userId的話,GalleryEmbed::init()會返回一個ERROR_MISSING_OBJECT。
      • 注:現(xiàn)有對話的活動語言當(dāng)對話被重置/變更給另一個用戶時仍被保留。
  • activeLanguage影響對話及請求的活動語言。
    • 如省略,現(xiàn)有對話的活動語言不會被改變。如果是新對話的話,語言將會設(shè)為G2默認語言或(如有設(shè)定的話)對應(yīng)G2用戶所偏好的語言。
    • 如經(jīng)指定,G2會檢查符合{ll}_{CC}的某個語言代碼,這里{ll}代表2字母小寫的?SO語言代碼,而{CC}則代表2字母大寫的ISO國家代碼。而它將回退默認可用的{ll}_?? translation,或是站點默認語言。
  • loginRedirect影響G2中登入鏈接的URL。
    • 如省略,G2的登入鏈接仍會指向G2的登入表單,這樣一來用戶就無法自動登入到emApp中了。
    • 如經(jīng)指定,G2的登入鏈接將會指向給定的URL,這樣一來就能保證所有的用戶能夠登入emApp了。
    • 注:某個登入鏈接的顯示與否取決于GalleryCapabilities::set('login', true|false); ,這在G2 standalone中被設(shè)定為true(也就是顯示登入鏈接)并在GalleryEmbed::init();中設(shè)為false。如有必要,可在GalleryEmbed::init()呼叫之后將其重新設(shè)為true。
  • embedSessionString影響cookie-less瀏覽(保留所有G2 URL中emApp的對話ID)。
    • 如省略,G2不會主動支持cookie-less瀏覽。
    • 如經(jīng)指定,G2會將embedSessionString (字串格式{NAME}={VALUE}, {NAME} = URL GET argument應(yīng)被后置到所有G2生成的URL,{VALUE}為值(對話id))后置到所有由G2生成的URL。這樣一來就能保留URL中的emApp對話了。
      • 注:通常僅當(dāng)emApp檢測到用戶代理程序不接受cookies時你才會定義embedSessionString,因為embedSessionString只會讓URL變得更長更不美觀而大部分用戶都接受cookies。
  • gallerySessionId影響cookie-less瀏覽(保留emApp對話中的G2對話ID)。
    • 如省略,當(dāng)某用戶自嵌入的G2瀏覽到emApp中的某個其他頁面,而用戶代理程序不接受cookies時,G2會丟失對話。
    • 如經(jīng)指定,就算是進行cookie-less瀏覽,G2也不會丟失活動用戶的對話。
      • 注:通常你會將G2對話ID存儲在emApp的對話中,且如果emApp 檢測到了cookie-less瀏覽的話,你還會指定gallerySessionId。在你的emApp封包中,在包括modules/core/classes/GallerySession.class和GalleryUtilities.class之后,你可以使用sessionId = GalleryUtilities::getRequestVariables(SESSION_ID_PARAMETER); 來獲取G2對話ID。
  • apiVersion為你的整合所兼容的Embed API版本。如經(jīng)指定,Gallery會對照當(dāng)前Embed API版本來檢查你的API版本,而當(dāng)你的整合不兼容時會返回錯誤ERROR_PLUGIN_VERSION_MISMATCH。我們極度推薦指定此參量。

評論請求[ ]

  • g2Uri和embedUri是現(xiàn)在僅有的URL / 路徑相關(guān)的參量,且其所接受的格式很廣泛:從完整URL(如:http://www.example.com/portal/index.php?module=gallery2)到index.php。但僅當(dāng)對規(guī)則做嚴格要求時才有可能:
    • gallery2,gallery2/ 和 /gallery2都會被作為host或文件來對待而不是路徑。如果你想指定一個路徑,那它就必須被'/'包括起來。此情況中唯一有效的值是/gallery2/。gallery2/將會被解析為host = gallery2,path = /. gallery2而/gallery2會被解釋為path = /和file = gallery2。
    • 另一方面,遵循此規(guī)則并不難。那么你是怎么想的?
  • 我們是否該將embedUri / g2Uri拆分到強制性的embedPath + embedUri,g2Path以及可選的embedProtocol,embedHost,g2Protocol和g2Host中去呢? Internally, we make this distinction in g2 anyway. Would it be easier for integration writers to deal with g2Path which has always the same format and those integrations that also want to support different subdomains can put the G2 host string into g2Host? We could then treat g2Path = gallery2, gallery2/, /gallery2 and /gallery2/ all the same way, i.e. if you forget to add a leading / traling slash, it would still work. 90% of all one-time GalleryEmbed users would only need g2Path and embedPath + embedUri. The question is: is this concept of split up embedUri + embedPath too confusing? We could still have this approach and merge embedUri and embedPath into a single embedUri and still be quite tolerant to missing leading '/'.
  • 當(dāng)為G2和emApp使用不同子域時,不要忘記添加有關(guān)cookie domain/路徑的資料?;蛟S在GalleryEmbed中有便捷的方法可以設(shè)定cookie參量。


將整合代碼由Gallery 2.0 - 2.0.2改為Gallery 2.1所兼容的整合代碼[ ]

GalleryEmbed::init的參量在Gallery2.1中被修改了,因為舊參量過于復(fù)雜,也就是畫蛇添足。

  • G2即便被嵌入也需要生成URL 。
  • G2生成指向被嵌入的G2的URL,因此所有的請求都必須通過emApp或封包文件。
    • 所以,G2需要所有URL共有的base URL。如,如果被嵌入的G2通過http://www.example.com/portal/index.php?module=gallery2被訪問,那么G2所生成的所有URL必須以此base URL開頭。
    • http://www.example.com/部分已給出,PHP variable $_SERVER[HTTP_HOST]持有該值。
    • 我還需要知道portal/index.php?module=gallery2。這就證明了embedUri
  • G2還生成直接指向G2而不是嵌入的G2的URL。如,對靜態(tài)內(nèi)容(css文件,外觀主題圖片,java小程序(.jar文件))以及:core.DownloadItem請求。由于G2具有圖片防火墻,因此所有圖片的下載都應(yīng)經(jīng)應(yīng)用程序授權(quán)。因為我們按單位相冊頁面有+/- 12張縮略圖圖片要下載,因此這些請求必須為超輕量級的。我們無法僅為了向G2提交請求而加速emApp。這樣一來,DownloadItem請求會直接指向G2而無須通過emApp。
    • 所以,G2需要知道G2 standalone的base URL,如http://www.example.com/gallery2/
    • host部分已知了,所以我們只需要/gallery2/。由于G2和emApp常在相同的子域上,所以我們還可以請求自emApp至G2的相對路徑。這就證明了relativeG2Path
  • 最后,我們還想在任一隨機的emApp頁面上顯示imageblock。如,在新聞文章或Blog文章中。這是新聞文章的樣本URL:http://www.example.com/portal/index.php?module=news?aid=15?,F(xiàn)在針對新聞文章頁面上嵌入的imageblock,我們需要生成一個DownloadItem URL(直接指向G2)以及一個ShowItem URL(指向被嵌入的G2)。
    • 目前為止,我們僅有relativeG2Path和embedUri,所以我們必須解析當(dāng)前的請求URL ($_SERVER['REQUEST_URI']),以找到G2的位置。因此我們引入了embedPath。對于上面給出的例子來說,embedPath是 '/portal/'而embedUri被改為了'index.php?module=gallery2'。
  • G2短URL(重寫URL)也需要知道'embedPath'和g2Path(G2的路徑)。對此進行一次配置并存儲在數(shù)據(jù)庫中就可以了。也可針對每個請求進行提供。

實際的修改[ ]

將relativeG2Path要求替換為絕對g2Uri[ ]

引入g2Uri的原因:

  • embedPath和g2Uri會變成絕對的(穩(wěn)定性)
  • 絕對路徑比相對路徑要易懂
  • 啟用新特點:不同子域上的G2和emApp(見后文)
  • (如未使用短url),我們可再次將embedUri和embedPath合并到一個參量中去(embedUri)

g2Uri的格式:/path/ OR HOST_STRING/path/ 第一個斜線之前的字串被解釋為G2的host,而第一個斜線之后的字串就是路徑(你還可以包括進http:// bit,它也能被正確地解析)。

  • HOST_STRING是可選的。如未經(jīng)指定,我們使用$_SERVER[HTTP_HOST]來建立直接指向G2的URL。
  • 因此,大部分的用戶會有g(shù)2Uri = '/gallery2/'。
  • 舉例:如果G2安裝在http://www.example.com/gallery2/ 上,那么g2Uri就是'/gallery2/'
  • 舉例:如果G2出在相同的位置而emApp位于http://portal.example.com/(注意不同的子域)上,那么g2Uri就會是'www.example.com/gallery2/'或'http://www.example.com/gallery2/'

移除embedPath并將其并入embedUri[ ]

取代embedUri和embedPath,并合并為一個參量,名為embedUri

  • 在G2中,我們需要設(shè)法找到embedPath。它可以作為一個參量,或自當(dāng)前REQUEST_URI中解析出來
  • 舊式embedUri也包括有embedPath,我們可以解析最后一條斜線以找到embedPath
    • 舉例:embedUri = '/portal/index.php?module=gallery2',那么我們就會解析最后的一條'/'并找到'/portal/'
  • 這回比分別詢問embedUri和embedPath要更令人困擾嗎?尤其是目前我們有了g2Path,它具有與當(dāng)前embedPath相同的樣式。
  • 短URL又如何?短URL仍只進行一次配置,而且不需要任何其他的輸入。但我們還引入了一個特點,就是當(dāng)前的embedPath可以覆蓋經(jīng)存儲的embeddedLocation(在重寫模塊配置時存儲的embedPath)。我們引入它就是為了允許從多個vHost訪問啟用重寫的嵌入G2。如給定了embedUri是否還能夠?qū)崿F(xiàn)?我們?nèi)詴馕鰁mbedUri中的最后一個'/'來獲取embedPath。但embedUri很可能是短URL的格式,如embedUri = '/portal/gallery2/'。那么在此特例中的embedPath = embedUri,baseFile會是。無法想出會出現(xiàn)問題的情況。