• Středa, Říjen 22nd, 2008

Oblíbený plugin NexGEN Gallery je napsán pro vypnutý PHP Safe Mode, proto v režimu Safe Mode = On můžeme očekávat spoustu problémů.

Popis problému

Jedním ze zásadních nedostatků je nemožnost vytvoření nové galerie, resp. vytvoření složek na serveru. Plugin nás totiž pouze upozorní na zapnutý Safe Mode a vyzve k ručnímu vytvoření složek /nazev-galerie/ a /nazev-galerie/thumbs/ přímo přes FTP. Což ovšem není moc pohodlné, protože je třeba

  • ručně vytvořit obě složky a nastavit jim práva,
  • znovu přidat galerii se stejným názvem, aby se nová galerie uložila do databáze.

Protože jsem nikde nenašel žádné rozumné řešení, rozhodl jsem se tento problém vyřešit po svém, a to přeprogramováním části pluginu. Je to celkem provizorní řešení, ale funguje. A co víc, úprava pluginu je rychlá a jednoduchá, takže ji zvládne i začátečník.

Řešení spočívá v nahrazení PHP funkce mkdir() za funkci ftp_mkdir().

Editace pluginu

Nyní tedy k samotné editaci pluginu, která spočívá v drobné úpravě dvou souborů.

V textovém editoru otevřeme soubor /wp-content/plugins/nextgen-gallery/nggallery.php, kde bychom od řádku 95 měli nalézt následující kód:

// get value for safe mode
if ((gettype(ini_get('safe_mode')) == 'string')) {
// if sever did in in a other way
if (ini_get('safe_mode') == 'off') define('SAFE_MODE', FALSE);
else define('SAFE_MODE', ini_get('safe_mode'));
} else
define('SAFE_MODE', ini_get('safe_mode'));

Celou tuto část kódu zakomentujeme a přidáme následující řádek:

define('SAFE_MODE', FALSE);

Výsledný kód tedy bude po úpravě vypadat např. takto:

// get value for safe mode
define('SAFE_MODE', FALSE);
/*
if ((gettype(ini_get('safe_mode')) == 'string')) {
// if sever did in in a other way
if (ini_get('safe_mode') == 'off') define('SAFE_MODE', FALSE);
else define('SAFE_MODE', ini_get('safe_mode'));
} else
define('SAFE_MODE', ini_get('safe_mode'));
*/

Touto úpravou jsme plugin donutili, aby se choval tak, jako by byl Safe Mode vypnutý. Nenechme se zmást, že na titulní stránce pluginu je v info výpisu stále Safe Mode: On. Je to tím, že se v tomto výpisu kontroluje Safe Mode znovu a přímo ze serveru.

Nyní otevřeme další soubor, a sice wp-content/plugins/nextgen-gallery/admin/wp25/functions.php, kde od řádku 52 najdeme následující kód:

// 3. Now create "thumbs" folder inside
if ( !is_dir(WINABSPATH.$nggpath.'/thumbs') ) {
if ( !wp_mkdir_p ( WINABSPATH.$nggpath.'/thumbs') )
$txt .= __('Unable to create directory ', 'nggallery').' <strong>'.$nggpath.'/thumbs !</strong>';
}

Následující úprava je implementací již zmiňované funkce ftp_mkdir(). Existující kód upravíme do této podoby:

// 3. Now create "thumbs" folder inside
if ( !is_dir(WINABSPATH.$nggpath.'/thumbs') ) {
 
/* temporary solution by DJ Moonlite BEGIN */
// set up basic ftp connection
$conn_id = ftp_connect('ftp.mujserver.cz');
// ftp username
$conn_id_user = 'jmeno_uzivatele';
// ftp password
$conn_id_pass = 'heslo_pro_pristup';
// login with username and password
$login_result = ftp_login($conn_id, $conn_id_user, $conn_id_pass);
// try to make directory
$ftp_mkdir_result = ftp_mkdir($conn_id, 'www/'.$nggpath.'/thumbs');
if($ftp_mkdir_result) {
// set CHMOD to 0777
ftp_site($conn_id, 'CHMOD 0777 '. 'www/'.$nggpath.'/thumbs');
}
 
if ( !$ftp_mkdir_result )
$txt .= __('Unable to create directory ', 'nggallery').' <strong>'.$nggpath.'/thumbs !</strong>';
 
// close the connection
ftp_close($conn_id);
/* temporary solution by DJ Moonlite END */
}

Skript funguje tak, že v adresáři /nazev-nove-galerie/, který skript vytvořil pomocí funkce mkdir(), vytvoří nový adresář /nazev-nove-galerie/thumbs/, kterému posléze nastaví práva pro zápis. Ano, takový postup lze v zapnutém Safe Mode použít.

Pochopitelně nezapomeneme do skriptu vložit správné hodnoty proměnných, jako jsou adresa FTP serveru, jméno a heslo pro přihlášení, popř. cestu. Na Pipni.cz je wwwroot ve složce /www/, takže pokud chcete upravený skript použít pro jinou konfiguraci, přepište si cestu ke složce s galeriemi dle libosti.

Nyní, pokud do nové galerie uploadujeme fotky přes FTP, by měla fungovat funkce Scan folder for new images, kterou najdeme ve správě galerií. Nenechme se zaskočit tím, že po použití této funkce skript vytuhne a zůstane zobrazeno pouze menu. Jednoduše se přepneme do adresního řádku a načteme adresu, která v něm je. Poté bychom měli vidět všechny fotografie i s náhledy.

Podotýkám, že natvrdo nastavené vypnutí Safe Mode může způsobit různé nepředvídané chyby pluginu, tudíž je možné, že přestane fungovat něco, co předtím fungovalo apod. :-) Tak to prosím berte v potaz!

A to je celý zázrak, třeba se někomu bude hodit. :-)

Kategorie: Tipy a triky
Všechny komentáře k tomuto článku můžete sledovat prostřednictvím RSS 2.0 kanálu.

Komentáře: 3

  1. Super návod! Děkuji. A jen podotknu, že pokud by vás potom začal zlobit PHP memory_limit a nevytvářely se vám náhledy, tak zkuste tento návod http://seby.cz/wordpress/nextgen-gallery-a-problem-s-exceed-memory-limit/comment-page-1/#comment-452

  2. Rádo se stalo :-)

  3. Ahoj, mám hosting na pipni.cz, kde je zapnutý safe mode a zkoušel sem upravit plugin pro next gen gallery podle tohoto návodu. Vytvořím-li galerii v administraci, tak se vytvoří i na ftp serveru, ale nelze do ní nahrávat obrázky, při pokusu uploadovat obrázek píše hlášku: Adresář /DISK3/WWW/zelenydedek.cz/www/wp-content/gallery/lokomotiva neobsahuje žádné obrázky, nevíte čím by to mohlo být způsobena a jak se to dá řešit. Mockrát díky