Formo – moduł formularzy – modyfikacje II
W poprzedniej notce opisałem kilka modyfikacji mających na celu zwiększenie wygody korzystania z modułu Formo. W dzisiejszej będę kontynuował temat zamieszczając kolejną porcję pomocnych modyfikacji koncentrując się na kontrolce uploadu.
Uwzględnianie domyślnego katalogu uploadu
Domyślnym miejscem uploadu plików w Kohanie jest katalog upload zlokalizowany w głównym katalogu frameworka. Z bliżej nieokreślonych przyczyn Formo nie uwzględnia go podczas zapisuj przesłanego pliku, korzystając domyślnie z katalogu uploads. Pierwszym krokiem do zmiany tego jest usunięcie nazwy domyślnego katalogu Formo. Aby tego dokonać należy zmodyfikować plik formo_drivers_core/file.php zamieniając 5 linie z
public $upload_path = 'uploads';
na
public $upload_path = '';
Drugim krokiem jest dodanie uwzględniania kohanowej lokalizacji katalogu. Możemy to osiągnąć zamieniając 84 linie z
$full_path = upload::save($fname, $time.$file['name'],
DOCROOT.$this->upload_path, 0777);
na
$full_path = upload :: save( $fname, $time . $file[ 'name' ],
Kohana :: config( 'upload.directory' ) . '/' .
$this -> upload_path, 0777 );
Zmiana sposobu generowania nazwy plików
Podczas zapisuj pliku Formo dodaje do jego nazwy aktualny znacznik czasu wykorzystując do tego funkcję time, dzięki czemu unikami nadpisywania plików posiadających taką samą nazwę. W chwili gdy umożliwiamy wgranie kilku plików jednocześnie może wystąpić sytuacja, że wgrywane pliki będą nazywały się tak samo, przez co nadpiszą się wzajemnie. Aby tego uniknąć należy zamienić
$time = time();
znajdujący się w 53 linii na
$time = microtime( );
Poprawa nazwy komunikatu błędu
W pliku z komunikatami Formo można znaleźć klucz invalid_file informujący o wybraniu niepoprawnego pliku. W 75 linii wdarła się literówka, przez którą komunikat błędu wyszukiwany jest po kluczu invalidfile. Należy więc zmienić nazwę klucza w pliku językowym, albo 75 linię kontrolki file na
return $this -> error = Kohana :: lang( 'formo.invalid_file' );
Zwracanie nazwy wgranego pliku
Korzystając z pluginu ORM do automatycznego zapisywania danych z formularzy do bazy danych nie możemy użyć kontrolki file. Dzieje się tak dlatego, że metoda get_value służąca do pobierania wartości pola formularza zamiast nazwy pliku zwraca tablicę z informacjami o nim. Aby umożliwić bezproblemową współpracę kontrolki file z pluginem ORM należy zmienić wspomnianą metodę na
public function get_value()
{
return $this -> data[ 'file_name' ];
}
Dodatkowo, aby nie utracić poprzedniej funkcjonalności metody możemy dodać kolejną, która umożliwi pobranie informacji o pliku.
public function get_data( )
{
return $this -> data;
}
Zapobieganie podwójnej walidacji
Powyższy kod może spowodować pewien problem. Metoda sprawdzająca poprawność przesłanego pliku będzie wykonywana dwa razy, co spowoduje zwróceniem błędu informującego o niepoprawności przesłanego pliku podczas drugiego wywołania metody. Zapobiegnięciem tego problemu jest dodanie na początku metody validate_this następującego kodu:
if( $this -> was_validated ) return;
Zmiana standardowego komunikatu błędu na komunikat z pliku i18n
W chwili gdy kontrolka oznaczona jako wymagana nie zostanie wypełniona ukaże się nam komunikat Required pomimo że w pliku językowym zdefiniowaliśmy inną wiadomość. Aby wymusić korzystanie z lokalizowanych komunikatów należy zamienić kod z linii 339 pliku Formo_Element.php
$this->error = $this->required_msg;
na
$this->error = Kohana :: lang( 'formo.required_msg' );
Zobacz także:
Tagi: formation, Formo, formularze, Kohana
Kategoria: Kohana, Kohana, Moduły
Zapobieganie podwójnej walidacji bardzo mi się przydało :)
microtime też było jak znalazł, bo w obecnym projekcie chcę przesłać kilka plików naraz :)