diff --git a/docs/guide-pl/README.md b/docs/guide-pl/README.md index a7c00abd34..4b82690c84 100644 --- a/docs/guide-pl/README.md +++ b/docs/guide-pl/README.md @@ -92,7 +92,7 @@ Odbieranie danych od użytkowników * [Walidacja danych wejściowych](input-validation.md) * [Wysyłanie plików](input-file-upload.md) * [Odczytywanie tablicowych danych wejściowych](input-tabular-input.md) -* [Odbieranie danych z wielu modeli](input-multiple-models.md) +* [Pobieranie danych dla wielu modeli](input-multiple-models.md) Wyświetlanie danych diff --git a/docs/guide-pl/input-file-upload.md b/docs/guide-pl/input-file-upload.md new file mode 100644 index 0000000000..58e47a0eb1 --- /dev/null +++ b/docs/guide-pl/input-file-upload.md @@ -0,0 +1,194 @@ +Wysyłanie plików +=============== + +Przesyłanie plików w Yii jest zazwyczaj wykonywane przy użyciu klasy [[yii\web\UploadedFile]], która hermetyzuje każdy przesłany plik jako obiekt `UploadedFile`. +W połączeniu z [[yii\widgets\ActiveForm]] oraz [modelem](structure-models.md), możesz w łatwy sposób zaimplementować bezpieczny mechanizm przesyłania plików. + +## Tworzenie modeli + +Tak jak przy zwykłych polach tekstowych, aby przesłać pojedyńczy plik musisz utworzyć klasę modelu oraz użyć atrybutu tego modelu do przechowania instancji przesłanego pliku. +Powinieneś również zadeklarować zasadę walidacji do zwalidowania przesłanego pliku. +Dla przykładu: + +```php +namespace app\models; + +use yii\base\Model; +use yii\web\UploadedFile; + +class UploadForm extends Model +{ + /** + * @var UploadedFile + */ + public $imageFile; + + public function rules() + { + return [ + [['imageFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg'], + ]; + } + + public function upload() + { + if ($this->validate()) { + $this->imageFile->saveAs('uploads/' . $this->imageFile->baseName . '.' . $this->imageFile->extension); + return true; + } else { + return false; + } + } +} +``` + +W powyższym kodzie, atrybut `imageFile` zostanie użyty do przechowania instancji przesłanego pliku. Jest połączony z zasadą walidacji `file`, która korzysta z +walidatora [[yii\validators\FileValidator]], aby upewnić się, że przesłany plik posiada rozszerzenie `png` lub `jpg`. +Metoda `upload()` wywoła walidację oraz zapis przesłanego pliku na serwerze. + +Walidator `file` pozwala na sprawdzenie rozszerzenia, wielkości, typu MIME, itp. +Po więcej szczegółów zajrzyj do sekcji [Podstawowe walidatory](tutorial-core-validators.md#file) + +> Tip: Jeśli przesyłasz obrazek, możesz rozważyć użycie walidatora `image`. + Walidator ten jest implementowany przez [[yii\validators\ImageValidator]], który weryfikuje czy atrybut otrzymał prawidłowy obrazek który może być zapisany i przetworzony przez [rozszerzenie Imagine](https://github.com/yiisoft/yii2-imagine). + +## Renderowanie pola wyboru pliku + +Po zapisaniu modelu, utwórz pole wyboru pliku w widoku: + +```php + + + ['enctype' => 'multipart/form-data']]) ?> + + field($model, 'imageFile')->fileInput() ?> + + + + +``` + +Należy pamiętać, aby dodać opcję `enctype` do formularza, przez co plik będzie mógł być prawidłowo przesłany. +Wywołanie `fileInput()` spowoduje wyrenderowanie tagu ``, który pozwala użytkownikowi na wybranie oraz przesłanie pliku. + +## Implementacja kontrolera + +W akcji kontrolera musimy połączyć model oraz widok aby zaimplementować przesyłanie plików: + +```php +namespace app\controllers; + +use Yii; +use yii\web\Controller; +use app\models\UploadForm; +use yii\web\UploadedFile; + +class SiteController extends Controller +{ + public function actionUpload() + { + $model = new UploadForm(); + + if (Yii::$app->request->isPost) { + $model->imageFile = UploadedFile::getInstance($model, 'imageFile'); + if ($model->upload()) { + // plik został przesłany + return; + } + } + + return $this->render('upload', ['model' => $model]); + } +} +``` + +W powyższym kodzie, kiedy formularz jest wysłany, metoda [[yii\web\UploadedFile::getInstance()]] wywoływana jest do reprezentowania pliku jako instancji `UploadedFile`. +Następnie przystępujemy do walidacji modelu, aby upewnić się, że przesłany plik jest prawidłowy, po czym zapisujemy go na serwerze. + +## Przesyłanie wielu plików + +Możesz przesyłać wiele plików za jednym razem modyfikując odrobinę kod wylistowany w powyższych sekcjach. + +Najpierw powinieneś dostosować klasę modelu dodając opcję `maxFiles` do zasady walidacji `file`, aby określić dozwoloną maksymalną liczbę przesyłanych plików. +Metoda `upload()` powinna również zostać zaktualizowana, aby zapisywać pliki jeden po drugim. + +```php +namespace app\models; + +use yii\base\Model; +use yii\web\UploadedFile; + +class UploadForm extends Model +{ + /** + * @var UploadedFile[] + */ + public $imageFiles; + + public function rules() + { + return [ + [['imageFiles'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg', 'maxFiles' => 4], + ]; + } + + public function upload() + { + if ($this->validate()) { + foreach ($this->imageFiles as $file) { + $file->saveAs('uploads/' . $file->baseName . '.' . $file->extension); + } + return true; + } else { + return false; + } + } +} +``` + +W pliku widoku, powinieneś dodać opcję `multiple` do wywołania `fileInput()`, aby pole wyboru pliku pozwalało na wybór wielu plików na raz: + +```php + + + ['enctype' => 'multipart/form-data']]) ?> + + field($model, 'imageFiles[]')->fileInput(['multiple' => true, 'accept' => 'image/*']) ?> + + + + +``` + +Na koniec, w akcji kontrolera musimy zmienić wywołanie `UploadedFile::getInstance()` na `UploadedFile::getInstances()`, aby przypisać tablicę instancji `UploadedFile` do `UploadForm::imageFiles`. + +```php +namespace app\controllers; + +use Yii; +use yii\web\Controller; +use app\models\UploadForm; +use yii\web\UploadedFile; + +class SiteController extends Controller +{ + public function actionUpload() + { + $model = new UploadForm(); + + if (Yii::$app->request->isPost) { + $model->imageFiles = UploadedFile::getInstances($model, 'imageFiles'); + if ($model->upload()) { + // plik został przesłany + return; + } + } + + return $this->render('upload', ['model' => $model]); + } +} +``` diff --git a/docs/guide-pl/input-forms.md b/docs/guide-pl/input-forms.md new file mode 100644 index 0000000000..17d3c5c8da --- /dev/null +++ b/docs/guide-pl/input-forms.md @@ -0,0 +1,142 @@ +Tworzenie formularzy +============== + +Podstawowym sposobem korzystania z formularzy w Yii jest użycie [[yii\widgets\ActiveForm]]. Ten sposób powinien być używany, jeśli formularz jest bazowany na modelu. +Dodatkowo, [[yii\helpers\Html]] zawiera sporo użytecznych metod, które zazwyczaj używane są do dodawania przycisków i tekstów pomocniczych do każdego formularza. + +Formularz, który jest wyświetlany po stronie klienta, w większości przypadków, posiada odpowiedni [model](structure-models.md), który jest używany do walidacji danych wejściowych po stronie serwera. +(Sprawdź sekcję [Walidacja danych wejściowych](input-validation.md) aby uzyskać więcej szczegółów). +Podczas tworzenia formularza na podstawie modelu, pierwszym krokiem jest zdefiniowanie samego modelu. +Model może być bazowany na klasie [Active Record](db-active-record.md), reprezentując dane z bazy danych, lub może być też bazowany na klasie generycznej Model ([[yii\base\Model]]) aby przechwytywać dowolne dane wejściowe, np. formularz logowania. +W poniższym przykładzie pokażemy, jak model generyczny może być użyty do formularza logowania: + +```php + 'login-form', + 'options' => ['class' => 'form-horizontal'], +]) ?> + field($model, 'username') ?> + field($model, 'password')->passwordInput() ?> + +
+
+ 'btn btn-primary']) ?> +
+
+ +``` + +W powyższym kodzie, [[yii\widgets\ActiveForm::begin()|ActiveForm::begin()]] nie tylko tworzy instancję formularza, ale zaznacza też jego początek. +Cała zawartość położona pomiędzy [[yii\widgets\ActiveForm::begin()|ActiveForm::begin()]] i [[yii\widgets\ActiveForm::end()|ActiveForm::end()]] zostanie otoczona tagiem HTML'owym `
`. +Jak w każdym widżecie, możesz sprecyzować kilka opcji jak widżet powinien być skonfigurowany przez przekazanie tablicy do metody `begin`. +W tym przypadku dodatkowa klasa CSS i identyfikator ID zostały przekazane do otwierającego tagu ``. +Aby zobaczyć wszystkie dostępne opcje, zajrzyj do dokumentacji API [[yii\widgets\ActiveForm]]. + +Do utworzenia formularza, wraz z elementami etykiet oraz wszelkimi walidacjami JavaScript, wywoływana jest metoda [[yii\widgets\ActiveForm::field()|ActiveForm::field()]], która zwraca instancję obiektu [[yii\widgets\ActiveField]]. +Kiedy rezultat tej metody jest bezpośrednio wyświetlany, będzie on regularnym polem tekstowym. +Aby dostosować pola, możesz używać dodatkowych metod łączonych [[yii\widgets\ActiveField|ActiveField]]: + +```php +// pole hasła +field($model, 'password')->passwordInput() ?> +// dodanie podpowiedzi oraz zmiana etykiety +field($model, 'username')->textInput()->hint('Please enter your name')->label('Name') ?> +// utworzenie pola email w formacie HTML5 +field($model, 'email')->input('email') ?> +``` + +Powyższy kod utworzy tagi `