Paweł
Koralewski
architekt aplikacji,
team leader
Temat: Modyfikacja symfony - ułatwienie dla developera
Może nie dla każdego, ale mnie się przydaje, więc postanowiłem napisać.1. Zmiana nazw kontrolerów
Domyślnie kontrolery nazywają się wszystkie tak samo actions.class.php, co utrudnia ich odnalezienie w edytorze. Zmiana dodaje nazwę kontrolera do nazwy pliku, czyli np. plik nazywa się mainActions.class.php. Jeśli taki plik nie zostanie znaleziony, to będzie użyty domyślny plik.
W pliku \lib\vendor\symfony\lib\controller\sfController.class.php w function controllerExists odszukuję linię:
$module_file = $dir.'/'.$classFile.'s.class.php';
i zamieniam na
$module_file = $dir.'/'.$moduleName.ucwords($classFile).'s.class.php';
if (!is_readable($module_file))
$module_file = $dir.'/'.$classFile.'s.class.php';
2. Przeniesienie plików widoków
Modyfikacje pozwalają przenieść pliki widoków oraz główny layout do /web_dir/views/application_name/, wtedy webmajster dostaje do modyfikowania tylko pliki jemu potrzebne. W/w pliki mogą istnieć również w ich standardowych lokalizacjach i stamtąd są później pobierane, gdy nie ma ich w nowej lokalizacji.
W lib/vendor/symfony/lib/config/sfApplicationConfiguration.class.php modyfikuję:
public function getTemplateDirs($moduleName)
{
$dirs = array();
$dirs[] = sfConfig::get('sf_web_dir').'/views/'.$this->application.'/'.$moduleName;
$dirs[] = sfConfig::get('sf_app_module_dir').'/'.$moduleName.'/templates'; // application
$dirs = array_merge($dirs, $this->getPluginSubPaths('/modules/'.$moduleName.'/templates')); // plugins
$dirs[] = $this->getSymfonyLibDir().'/controller/'.$moduleName.'/templates'; // core modules
$dirs[] = sfConfig::get('sf_module_cache_dir').'/auto'.ucfirst($moduleName.'/templates'); // generated templates in cache
return $dirs;
}
W config/ProjectConfiguration.class.php do funkcji setup() dodaję:
sfConfig::add(array(
'sf_app_template_dir' => sfConfig::get('sf_web_dir') .
DIRECTORY_SEPARATOR . 'views' .
DIRECTORY_SEPARATOR . $this->application,
));
Jeśli wcześniej zmieniłem domyślny katalog dla plików publicznych, to to ustawienie powinno być osobną instrukcją PHP.
3. Zmiana katalogu dla plików publicznych
Domyślnie jest to /web. Chcę zmienić na public_html (np. na potrzeby hostingu opartego o DirectAdmin). W config/ProjectConfiguration.class.php do funkcji setup() dodaję:
$sf_root_dir = sfConfig::get('sf_root_dir');
sfConfig::add(array(
'sf_web_dir_name' => $sf_web_dir_name = 'public_html',
'sf_web_dir' => $sf_root_dir . DIRECTORY_SEPARATOR . $sf_web_dir_name,
'sf_upload_dir' => $sf_root_dir . DIRECTORY_SEPARATOR . $sf_web_dir_name .
DIRECTORY_SEPARATOR . sfConfig::get('sf_upload_dir_name'),
));
Oczywiście jest to propozycja rozwiązania tych niedogodności. I są to DLA mnie niedogodności, które innym mogą nie przeszkadzać. Możliwe również, że da się je rozwiązać inaczej, jeśli tak, to chętnie poznam inne możliwości.
Wiem, że modyfikowanie kodu core nie jest dobrym rozwiązaniem, ale takie udało mi się wypracować najszybciej.Paweł Koralewski edytował(a) ten post dnia 08.12.10 o godzinie 11:30