<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-4892242742838504581</atom:id><lastBuildDate>Sun, 12 Apr 2026 19:18:51 +0000</lastBuildDate><category>linux</category><category>php</category><category>Laravel</category><category>mysql</category><category>Hardware</category><category>Windows</category><category>sieci</category><category>PowerShell</category><category>software</category><category>MariaDB</category><category>apache</category><category>html</category><category>Microsoft</category><category>bezpieczeństwo LAN</category><category>cygwin</category><category>hosting</category><category>Akcesoria</category><category>CMS</category><category>Laptop</category><category>Open Office</category><category>drupal 7</category><category>gpg</category><category>jquery</category><category>sieci LAN</category><category>xml</category><category>zabezpieczenie sieci LAN</category><title>Blog Informatyczny</title><description>Blog informatyczny w którym poruszane są zagadnienia należące do świata technologii informacji.   </description><link>https://informatyka-porady.blogspot.com/</link><managingEditor>noreply@blogger.com (Lelio Michele Lattari)</managingEditor><generator>Blogger</generator><openSearch:totalResults>62</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-2260172727152927119</guid><pubDate>Mon, 08 Sep 2025 14:44:00 +0000</pubDate><atom:updated>2025-09-08T16:45:27.758+02:00</atom:updated><title>Programowanie kontra AI – Czy warto jeszcze uczyć się kodowania?</title><description>
  &lt;p style=&quot;text-align: left;&quot;&gt;&lt;b&gt;W świecie, w którym sztuczna inteligencja potrafi napisać działający kod w kilka sekund, pytanie o sens nauki programowania wydaje się coraz bardziej zasadne. Czy warto poświęcać miesiące lub lata na opanowanie języków i algorytmów, skoro narzędzia takie jak ChatGPT czy GitHub Copilot potrafią wygenerować gotowe rozwiązania niemal od ręki? A może właśnie teraz — bardziej niż kiedykolwiek — powinniśmy uczyć się kodować, by zrozumieć, co naprawdę dzieje się „pod maską”? W tym artykule przyglądamy się przyszłości programowania w epoce AI i zastanawiamy, kto naprawdę wygra ten wyścig: człowiek czy maszyna?&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7Xth_7WxAb49NS1K8peofFkWmOfsNxeEWiH2t8IOrbZGYDZrTsY1KXG0U0C-afZW4NVnQPugVwhUhrFiLfyfCW2HUWBzKYxFXSvW9hBA8Kv8gFzErqTHwUO_g5ucHQPcIoYpCSfs9U7pUuMOAaII5HGJudDvqKpFwGhd4dMMWSb9Kl2jrHND_Mf2DUSg/s1256/programowanie-w-erze-AI.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Programista w dobie AI&quot; border=&quot;0&quot; data-original-height=&quot;660&quot; data-original-width=&quot;1256&quot; height=&quot;336&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7Xth_7WxAb49NS1K8peofFkWmOfsNxeEWiH2t8IOrbZGYDZrTsY1KXG0U0C-afZW4NVnQPugVwhUhrFiLfyfCW2HUWBzKYxFXSvW9hBA8Kv8gFzErqTHwUO_g5ucHQPcIoYpCSfs9U7pUuMOAaII5HGJudDvqKpFwGhd4dMMWSb9Kl2jrHND_Mf2DUSg/w640-h336/programowanie-w-erze-AI.jpg&quot; title=&quot;Programista w dobie AI&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;1. Nowa era – i stare pytania&lt;/h2&gt;
  &lt;p&gt;
    Jeszcze kilka lat temu nauka programowania była jedną z najlepszych inwestycji w przyszłość. Wystarczyło opanować JavaScript, PHP czy Pythona, by bez trudu znaleźć pracę w rozwijającej się branży IT. Kursy, bootcampy i studia informatyczne rosły jak grzyby po deszczu, a każdy, kto potrafił tworzyć aplikacje webowe, był rozchwytywany na rynku.
  &lt;/p&gt;
  &lt;p&gt;
    Dziś jednak ta pewność zaczyna się chwiać. Pojawienie się zaawansowanych modeli sztucznej inteligencji, takich jak ChatGPT czy GitHub Copilot, wywołało prawdziwą rewolucję. W kilka sekund można uzyskać gotową funkcję, a nawet szkic całego projektu. Narzędzie, które miało pomagać, zaczęło zastępować. Pojawia się zatem pytanie: &lt;strong&gt;czy warto jeszcze uczyć się programowania, skoro AI może to zrobić szybciej i bezbłędnie?&lt;/strong&gt;
  &lt;/p&gt;

  &lt;h2&gt;2. Sztuczna inteligencja naprawdę programuje… ale nie rozumie&lt;/h2&gt;
  &lt;p&gt;
    Nie ma wątpliwości: AI potrafi dziś napisać kod, który działa. Może przetwarzać dane, tworzyć komponenty interfejsu, optymalizować zapytania SQL, a nawet generować testy jednostkowe. Według GitHub Octoverse 2023, niemal &lt;strong&gt;46% kodu tworzonego z użyciem GitHub Copilot pochodzi od AI&lt;/strong&gt;. W badaniu &lt;a href=&quot;https://survey.stackoverflow.co/2024/#developer-tools-ai&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Stack Overflow Developer Survey 2024&lt;/a&gt; ponad &lt;strong&gt;70% programistów przyznało, że regularnie wspomaga się AI przy pracy&lt;/strong&gt;.
  &lt;/p&gt;
  &lt;p&gt;
    Ale czy to znaczy, że programista stał się zbędny?&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;Nie. Bo sztuczna inteligencja, choć imponująca, nadal nie rozumie tego, co tworzy.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Działa w oparciu o przewidywanie i statystykę – nie o zrozumienie logiki systemu. Jeśli wpiszesz błędne lub nieprecyzyjne polecenie, otrzymasz kod, który wygląda dobrze, ale może zawierać logiczne pułapki, błędy brzegowe lub niezgodności z rzeczywistością biznesową.
  &lt;/p&gt;

  &lt;h2&gt;3. Kodowanie to więcej niż pisanie kodu&lt;/h2&gt;
  &lt;p&gt;
    To, co odróżnia człowieka od AI, to &lt;strong&gt;świadomość procesu&lt;/strong&gt;. Dobry programista to nie tylko „klepacz kodu”, ale przede wszystkim analityk, projektant i architekt systemów. To osoba, która potrafi zadawać właściwe pytania, przewidzieć konsekwencje, dobrać odpowiednią strukturę danych i zadbać o bezpieczeństwo aplikacji.
  &lt;/p&gt;
  &lt;p&gt;
    Nawet najlepsza AI nie zastąpi nikogo, kto zna specyfikę konkretnego projektu, rozumie potrzeby użytkowników, umie zaprojektować system tak, by był skalowalny, bezpieczny i zrozumiały dla zespołu.
  &lt;/p&gt;

  &lt;h2&gt;4. Co się dzieje, gdy AI się myli?&lt;/h2&gt;
  &lt;p&gt;
    Wyobraź sobie, że AI tworzy fragment kodu, który usuwa dane z bazy, bo źle zinterpretowała kontekst zapytania SQL. Jeśli nie wiesz, co tam się dzieje, nie zauważysz zagrożenia, dopóki nie będzie za późno. W &lt;a href=&quot;https://arxiv.org/abs/2304.03442&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;badaniach OpenAI&lt;/a&gt; i niezależnych analizach wykazano, że AI potrafi generować kod z &lt;strong&gt;poważnymi błędami logicznymi&lt;/strong&gt; – które są trudne do wykrycia dla początkującego.
  &lt;/p&gt;
  &lt;p&gt;
    AI nie bierze odpowiedzialności. Nie zna kontekstu, nie ma intuicji, nie potrafi ocenić ryzyka. Dlatego człowiek bez wiedzy programistycznej, który polega wyłącznie na AI, przypomina pilota prowadzącego samolot według instrukcji z YouTube’a. Może się udać – dopóki nie przyjdzie burza.
  &lt;/p&gt;

  &lt;h2&gt;5. Czy programiści znikną z rynku pracy?&lt;/h2&gt;
  &lt;p&gt;
    Zawód programisty nie zniknie – ale będzie ewoluował. Zmieni się rola programisty: mniej ręcznego pisania kodu, więcej zrozumienia, projektowania, integracji i testowania. AI nie odbierze pracy tym, którzy rozumieją systemy – odbierze ją tym, którzy &lt;em&gt;bezmyślnie przepisują kod, nie rozumiejąc jego działania&lt;/em&gt;.
  &lt;/p&gt;
  &lt;p&gt;
    W &lt;a href=&quot;https://www3.weforum.org/docs/WEF_Future_of_Jobs_2023.pdf&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;raporcie World Economic Forum 2023&lt;/a&gt; wskazano, że kompetencje przyszłości w IT to m.in. &lt;strong&gt;systemowe myślenie, współpraca człowiek-AI i rozumienie złożonych architektur&lt;/strong&gt;. To oznacza, że osoby z głębokim zrozumieniem technologii i logiki aplikacji będą jeszcze bardziej potrzebne – choć ich praca będzie wyglądać inaczej niż dotąd.
  &lt;/p&gt;

  &lt;h2&gt;6. Współpraca, nie rywalizacja&lt;/h2&gt;
  &lt;p&gt;
    Najlepsi programiści już dziś używają AI tak, jak kiedyś używali Stack Overflow – jako pomocnika. Traktują ją jak dodatkową parę rąk: do nudnych zadań, do generowania testów, do szybkich konwersji i sugestii. Ale to oni podejmują decyzje, analizują, kontrolują jakość. Kluczową umiejętnością będzie nie samo „kodowanie”, ale &lt;strong&gt;umiejętność efektywnej współpracy z AI&lt;/strong&gt;.
  &lt;/p&gt;

  &lt;h2&gt;7. Wniosek: Ucz się programowania, by rozumieć, nie tylko pisać&lt;/h2&gt;
  &lt;p&gt;
    W erze, w której sztuczna inteligencja może napisać kod szybciej niż człowiek, nauka programowania nie traci sensu – przeciwnie, nabiera nowego znaczenia. To już nie tylko rzemiosło, ale umiejętność kontroli, weryfikacji i głębokiego rozumienia. Kodowanie to nie tylko „pisanie kodu” – to sposób myślenia i porządkowania rzeczywistości.
  &lt;/p&gt;
  &lt;p&gt;
    Jeśli chcesz być twórcą, a nie tylko użytkownikiem technologii, jeśli chcesz podejmować decyzje, a nie ślepo akceptować propozycje AI – &lt;strong&gt;ucz się programowania. Teraz bardziej niż kiedykolwiek&lt;/strong&gt;.
  &lt;/p&gt;

  &lt;hr /&gt;

  &lt;h3&gt;Źródła i dalsza lektura:&lt;/h3&gt;&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;https://survey.stackoverflow.co/2024/#developer-tools-ai&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Stack Overflow Developer Survey 2024&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://www3.weforum.org/docs/WEF_Future_of_Jobs_2023.pdf&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;World Economic Forum – Future of Jobs 2023 (PDF)&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2304.03442&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;OpenAI – LLM-generated code: Limitations and risks&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://github.com/features/copilot&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;GitHub Copilot – oficjalna strona&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://exercism.org&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Exercism – darmowa platforma do nauki kodowania z mentorem&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://www.codecademy.com/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Codecademy – interaktywna nauka programowania&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;

</description><link>https://informatyka-porady.blogspot.com/2025/09/programowanie-kontra-ai-czy-warto.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7Xth_7WxAb49NS1K8peofFkWmOfsNxeEWiH2t8IOrbZGYDZrTsY1KXG0U0C-afZW4NVnQPugVwhUhrFiLfyfCW2HUWBzKYxFXSvW9hBA8Kv8gFzErqTHwUO_g5ucHQPcIoYpCSfs9U7pUuMOAaII5HGJudDvqKpFwGhd4dMMWSb9Kl2jrHND_Mf2DUSg/s72-w640-h336-c/programowanie-w-erze-AI.jpg" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-5011714390000301367</guid><pubDate>Fri, 05 Sep 2025 16:25:00 +0000</pubDate><atom:updated>2025-09-06T22:48:03.614+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">hosting</category><title>Opinie o OVH – W przypadku problemów zalecają wyższy abonament!</title><description>&lt;style&gt;
.conversation-section {
  background: #f9f9f9;
  padding: 20px;
  font-family: Arial, sans-serif;
  border: 1px solid #ddd;
}
.message {
  padding: 10px;
  margin-bottom: 15px;
  border-left: 4px solid #bbb;
  background: #fff;
}
.message.from-user {
  border-left-color: #2a9d8f;
}
.message.from-ovh {
  border-left-color: #264653;
  background: #f4f4f4;
}
.message p {
  margin: 5px 0;
}
&lt;/style&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h1 data-end=&quot;288&quot; data-start=&quot;223&quot;&gt;&quot;Szybkie i niezawodne kopie zapasowe&quot;? Tylko w teorii&lt;/h1&gt;
&lt;p data-end=&quot;702&quot; data-start=&quot;348&quot;&gt;Firma OVH, znana z oferowania przystępnych cenowo usług VPS, serwerów dedykowanych i chmury, od lat kusi klientów sloganami o niezawodności i wydajności. Ale co się dzieje, gdy pojawia się realny problem, a klient – zamiast marketingowych obietnic – zderza się z rzeczywistością? Okazuje się, że OVH Polska ma na to jedną odpowiedź: &lt;strong data-end=&quot;701&quot; data-start=&quot;681&quot;&gt;wyższy abonament&lt;/strong&gt;.&lt;/p&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKrHjTKNjfBUuuTac3BlIFVQsIpM6fvsiJGYpODmLqzfUGTJvRhHHKeQLyuwPc77EsA-3DUsUZz9NiRNK4dVBQWAN6HI8CN9ST7g-TXNGNglGDqLA_C3pEzpwKZfcKyX0qczzjzjJN7gVk5ILA1oU3VtTR5CN76GDCiRqy-cn3-z85ACrh58Bwu_OFgEc/s1256/Bez%20nazwy%20(1256%20x%20660%20px)%20(71).jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;OVH - Opinie klientów&quot; border=&quot;0&quot; data-original-height=&quot;660&quot; data-original-width=&quot;1256&quot; height=&quot;336&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKrHjTKNjfBUuuTac3BlIFVQsIpM6fvsiJGYpODmLqzfUGTJvRhHHKeQLyuwPc77EsA-3DUsUZz9NiRNK4dVBQWAN6HI8CN9ST7g-TXNGNglGDqLA_C3pEzpwKZfcKyX0qczzjzjJN7gVk5ILA1oU3VtTR5CN76GDCiRqy-cn3-z85ACrh58Bwu_OFgEc/w640-h336/Bez%20nazwy%20(1256%20x%20660%20px)%20(71).jpg&quot; title=&quot;OVH - Opinie klientów&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Opinie o OVH&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p data-end=&quot;702&quot; data-start=&quot;348&quot;&gt;Tak było w moim przypadku. Korzystając z płatnej opcji „Automatyczne kopie zapasowe” przy usłudze VPS, postanowiłem po raz pierwszy – i jak się okazało, ostatni – przywrócić backup z interfejsu OVH. Działo się to 24 sierpnia 2025 roku. W sytuacji awaryjnej, gdy szybki dostęp do danych miał kluczowe znaczenie, backup, który według oficjalnych opisów OVH miał być &lt;em data-end=&quot;1080&quot; data-start=&quot;1057&quot;&gt;“szybki i niezawodny”&lt;/em&gt;, był gotowy... po &lt;strong data-end=&quot;1120&quot; data-start=&quot;1099&quot;&gt;ponad 9 godzinach&lt;/strong&gt;.&lt;/p&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicHKlRO4e81HndX2YmPTRprFM4WDedWx8w0kDl5cF3q50ShWqMPgzhVU_Fn7aDjPsbK6B6EmdGx3rJ7uL8FiAV54-u3Z7LiJ_fjWHcmma459e1CxIpZ-Y5Ro3Ksqd68j8HDhCGm6C7IXztrTAzuH2yJM_mG27ZImBQ1KhyphenhyphennqY-j-Ev_Wad8jLUOZHnwdY/s1094/ScreenShot%20Tool%20-20250828175617%20(2).png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Zautomatyzowany backup VPS w OVH&quot; border=&quot;0&quot; data-original-height=&quot;395&quot; data-original-width=&quot;1094&quot; height=&quot;232&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicHKlRO4e81HndX2YmPTRprFM4WDedWx8w0kDl5cF3q50ShWqMPgzhVU_Fn7aDjPsbK6B6EmdGx3rJ7uL8FiAV54-u3Z7LiJ_fjWHcmma459e1CxIpZ-Y5Ro3Ksqd68j8HDhCGm6C7IXztrTAzuH2yJM_mG27ZImBQ1KhyphenhyphennqY-j-Ev_Wad8jLUOZHnwdY/w640-h232/ScreenShot%20Tool%20-20250828175617%20(2).png&quot; title=&quot;Zautomatyzowany backup VPS w OVH&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Piękna obietnica, ale w rzeczywistości BEZ POKRYCIA&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 data-end=&quot;1192&quot; data-start=&quot;1123&quot;&gt;Kontakt z konsultantem? Owijanie w bawełnę i sprzeczne informacje&lt;/h2&gt;
&lt;p data-end=&quot;1527&quot; data-start=&quot;1194&quot;&gt;Zgłoszenie problemu (numer sprawy &lt;strong data-end=&quot;1242&quot; data-start=&quot;1228&quot;&gt;CS11470948&lt;/strong&gt;) skutkowało pisemną rozmową z konsultantem OVH Polska, panem &lt;strong data-end=&quot;1311&quot; data-start=&quot;1296&quot;&gt;Łukaszem L.&lt;/strong&gt;. Jego pierwsza odpowiedź zaskoczyła mnie nie mniej niż sama awaria — zamiast konkretnego wyjaśnienia, zasugerował, że &lt;strong data-end=&quot;1469&quot; data-start=&quot;1430&quot;&gt;problemem może być zbyt tani serwer&lt;/strong&gt;, i że &lt;strong data-end=&quot;1506&quot; data-start=&quot;1476&quot;&gt;przejście na wyższy pakiet&lt;/strong&gt; rozwiązałoby sprawę.&lt;/p&gt;
&lt;p data-end=&quot;1770&quot; data-start=&quot;1529&quot;&gt;Jednak już kilka wiadomości dalej ten sam konsultant przyznał, że... &lt;strong data-end=&quot;1667&quot; data-start=&quot;1598&quot;&gt;nawet droższy serwer nie gwarantuje szybszego dostępu do backupów&lt;/strong&gt;. Czyli najpierw OVH sugeruje dopłatę, a potem sam pracownik firmy przyznaje, że &lt;strong data-end=&quot;1769&quot; data-start=&quot;1748&quot;&gt;to nic nie zmieni&lt;/strong&gt;.&lt;/p&gt;
&lt;p data-end=&quot;1932&quot; data-start=&quot;1772&quot;&gt;Czy można to nazwać czymś innym niż próbą naciągania klienta? Czy nie jest to klasyczny przykład wprowadzania w błąd, graniczący z nieuczciwą praktyką handlową?&lt;/p&gt;
&lt;h2 data-end=&quot;1991&quot; data-start=&quot;1934&quot;&gt;OVH nie przewiduje rezygnacji. I nie uznaje reklamacji&lt;/h2&gt;
&lt;p data-end=&quot;2405&quot; data-start=&quot;1993&quot;&gt;Kiedy okazało się, że usługa nie działa zgodnie z opisem, zażądałem rezygnacji z opcji backupu i zwrotu opłat. Tym bardziej, że był to mój &lt;strong data-end=&quot;2173&quot; data-start=&quot;2132&quot;&gt;pierwszy i jedyny kontakt z tą usługą&lt;/strong&gt; – przez wiele miesięcy płaciłem za backup, z którego nigdy nie korzystałem. OVH jednak odpowiedziało, że owszem&amp;nbsp;&lt;strong data-end=&quot;2338&quot; data-start=&quot;2279&quot;&gt;jest możliwość rezygnacji z opcji, ale nie da się zatrzymać opłat&lt;/strong&gt;, bo nie ma do tego podstaw, mimo że reklamowana funkcjonalność zwyczajnie &lt;strong data-end=&quot;2404&quot; data-start=&quot;2386&quot;&gt;nie zadziałała&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 data-end=&quot;2444&quot; data-start=&quot;2407&quot;&gt;Skarga do UOKiK i działania prawne&lt;/h2&gt;
&lt;p data-end=&quot;2506&quot; data-start=&quot;2446&quot;&gt;W tej sytuacji zdecydowałem się &lt;strong data-end=&quot;2505&quot; data-start=&quot;2478&quot;&gt;złożyć oficjalne skargi&lt;/strong&gt;:&lt;/p&gt;
&lt;ul data-end=&quot;2609&quot; data-start=&quot;2507&quot;&gt;
&lt;li data-end=&quot;2545&quot; data-start=&quot;2507&quot;&gt;
&lt;p data-end=&quot;2545&quot; data-start=&quot;2509&quot;&gt;do &lt;strong data-end=&quot;2542&quot; data-start=&quot;2512&quot;&gt;Rzecznika Praw Konsumentów&lt;/strong&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2609&quot; data-start=&quot;2546&quot;&gt;
&lt;p data-end=&quot;2609&quot; data-start=&quot;2548&quot;&gt;oraz do &lt;strong data-end=&quot;2608&quot; data-start=&quot;2556&quot;&gt;Urzędu Ochrony Konkurencji i Konsumentów (UOKiK)&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2905&quot; data-start=&quot;2611&quot;&gt;W załącznikach przekazałem zarówno zapis rozmowy z konsultantem, jak i marketingowe opisy usług, które okazały się nie mieć wiele wspólnego z rzeczywistością. Kopia skargi trafiła także do centrali &lt;strong data-end=&quot;2828&quot; data-start=&quot;2809&quot;&gt;OVHcloud France&lt;/strong&gt;, by właściciele marki byli świadomi, jak polski oddział psuje ich reputację.&lt;/p&gt;
&lt;h2 data-end=&quot;2952&quot; data-start=&quot;2907&quot;&gt;Opinie o OVH? Będą coraz bardziej rzetelne&lt;/h2&gt;
&lt;p data-end=&quot;3308&quot; data-start=&quot;2954&quot;&gt;Jako konsument postanowiłem również &lt;strong data-end=&quot;3033&quot; data-start=&quot;2990&quot;&gt;rozpocząć publikowanie uczciwych opinii&lt;/strong&gt; o OVH Polska — na forach, portalach opinii i wszędzie tam, gdzie inni klienci szukają informacji przed wyborem usługodawcy. Nie zamierzam nikogo zniechęcać — po prostu opisuję &lt;strong data-end=&quot;3234&quot; data-start=&quot;3210&quot;&gt;własne doświadczenia&lt;/strong&gt; i dokumentuję, jak OVH traktuje klientów, gdy pojawia się realny problem.&lt;/p&gt;
&lt;hr data-end=&quot;3313&quot; data-start=&quot;3310&quot; /&gt;
&lt;h3 data-end=&quot;3331&quot; data-start=&quot;3315&quot;&gt;Podsumowanie&lt;/h3&gt;
&lt;p data-end=&quot;3534&quot; data-start=&quot;3333&quot;&gt;Jeśli szukasz taniego VPS-a do prostych zastosowań – OVH może wydawać się atrakcyjne. Ale jeśli zależy Ci na wsparciu, niezawodnych backupach i rzetelnym traktowaniu, &lt;strong data-end=&quot;3533&quot; data-start=&quot;3500&quot;&gt;warto się dwa razy zastanowić&lt;/strong&gt;.&lt;/p&gt;
&lt;p data-end=&quot;3615&quot; data-start=&quot;3536&quot;&gt;&lt;strong data-end=&quot;3615&quot; data-start=&quot;3536&quot;&gt;Bo kiedy pojawi się problem, OVH zaproponuje tylko jedno: większy rachunek.&lt;/strong&gt;&lt;/p&gt;&lt;p data-end=&quot;3615&quot; data-start=&quot;3536&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;strong data-end=&quot;3615&quot; data-start=&quot;3536&quot;&gt;CHCESZ WIĘCEJ SZCZEGÓŁOW?&lt;/strong&gt;&lt;/h2&gt;&lt;p data-end=&quot;3615&quot; data-start=&quot;3536&quot;&gt;&lt;/p&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;&lt;a href=&quot;https://drive.google.com/file/d/1RSjBU1hJS2YSqbBRzrQakwitS0jvA1R2/view?usp=sharing&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Pobierz transkrypcję rozmowy z konsultantem OVH&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://drive.google.com/file/d/1sN_qEVrZrfP5b7hJPl6kysyXphdidYHE/view?usp=sharing&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Pobierz broszurę OVH reklamującą usługę zautomatyzowanego backupu&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://drive.google.com/file/d/1v744BMziU12wnpuGCnay1qXTGAINiLi-/view?usp=sharing&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Pobierz kolejną broszurę OVH reklamującą usługę zautomatyzowanego backupu&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Obejrzyj materiał video&amp;nbsp;&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/oSQfzv3IliA&quot; width=&quot;320&quot; youtube-src-id=&quot;oSQfzv3IliA&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p data-end=&quot;3615&quot; data-start=&quot;3536&quot;&gt;&lt;strong data-end=&quot;3615&quot; data-start=&quot;3536&quot;&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;</description><link>https://informatyka-porady.blogspot.com/2025/09/opinie-o-ovh-w-przypadku-problemow.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKrHjTKNjfBUuuTac3BlIFVQsIpM6fvsiJGYpODmLqzfUGTJvRhHHKeQLyuwPc77EsA-3DUsUZz9NiRNK4dVBQWAN6HI8CN9ST7g-TXNGNglGDqLA_C3pEzpwKZfcKyX0qczzjzjJN7gVk5ILA1oU3VtTR5CN76GDCiRqy-cn3-z85ACrh58Bwu_OFgEc/s72-w640-h336-c/Bez%20nazwy%20(1256%20x%20660%20px)%20(71).jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-4821725923002808279</guid><pubDate>Sun, 16 Mar 2025 16:54:00 +0000</pubDate><atom:updated>2025-03-16T17:54:08.115+01:00</atom:updated><title> Sposoby na niedrogi monitoring posesji - Poradnik</title><description>&lt;p&gt;Bezpieczeństwo naszego domu i posesji jest niezwykle istotne, ale nie zawsze musimy wydawać fortunę na systemy monitoringu. Współczesna technologia oferuje wiele niedrogich, ale skutecznych rozwiązań, które pozwalają na kontrolowanie otoczenia naszego domu. W tym artykule przedstawiamy sposoby na tanie i efektywne monitorowanie posesji.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRllOBjmMJ2n3uUqcBt-nvsifl9TFjO93IIXSXww6DDJ5lj378KHiX-r92uZyW22DKS6-zBEmE1026rFjbHCtvZpNnbOL1FklSqLEL4bwpRNCeyYr4ezS_ozLcYIG8yjCwo2BwUyNLoCmpPH-JacbXPHxMNnDFvh_9JnpODjOo37p5j05XqbkrAOQMtB4/s1256/tani-monitoring-domu.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Tani monitoring domu&quot; border=&quot;0&quot; data-original-height=&quot;628&quot; data-original-width=&quot;1256&quot; height=&quot;272&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRllOBjmMJ2n3uUqcBt-nvsifl9TFjO93IIXSXww6DDJ5lj378KHiX-r92uZyW22DKS6-zBEmE1026rFjbHCtvZpNnbOL1FklSqLEL4bwpRNCeyYr4ezS_ozLcYIG8yjCwo2BwUyNLoCmpPH-JacbXPHxMNnDFvh_9JnpODjOo37p5j05XqbkrAOQMtB4/w543-h272/tani-monitoring-domu.jpg&quot; title=&quot;Tani monitoring domu&quot; width=&quot;543&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;1. Wybór odpowiedniej kamery&lt;/h3&gt;&lt;p&gt;Najważniejszym elementem monitoringu jest kamera. W zależności od potrzeb możemy wybrać modele przewodowe lub bezprzewodowe, pracujące w sieci Wi-Fi lub z wykorzystaniem karty SIM. Istnieją również kamery z funkcją noktowizji, detekcją ruchu i możliwością nagrywania na kartę pamięci.&lt;/p&gt;&lt;p data-pm-slice=&quot;1 1 []&quot;&gt;Przy wyborze kamery warto zwrócić uwagę na kilka kluczowych parametrów:&lt;/p&gt;&lt;ul data-spread=&quot;false&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Kąt widzenia&lt;/strong&gt; – im szerszy, tym większy obszar obejmie kamera. Standardowe modele mają kąt widzenia od 90° do 130°.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rozdzielczość&lt;/strong&gt; – im wyższa, tym lepsza jakość obrazu. Dobre kamery powinny mieć co najmniej 1080p (Full HD), choć coraz popularniejsze są modele 2K i 4K.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Odporność na warunki atmosferyczne&lt;/strong&gt; – kamery zewnętrzne powinny mieć odpowiednią klasę szczelności (np. IP66 lub IP67), aby były odporne na deszcz, śnieg i kurz.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zasięg noktowizji&lt;/strong&gt; – kamery z podczerwienią umożliwiają nagrywanie w nocy. Warto zwrócić uwagę na maksymalny zasięg podany przez producenta.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sposób zasilania&lt;/strong&gt; – niektóre modele działają na baterie lub energię słoneczną, co eliminuje konieczność prowadzenia kabli zasilających.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Wybierając odpowiednią kamerę, warto dopasować jej parametry do specyficznych warunków i potrzeb monitoringu posesji.&lt;/p&gt;&lt;h3&gt;2. Wykorzystanie istniejącej sieci Wi-Fi&lt;/h3&gt;&lt;p&gt;Jeżeli na posesji posiadamy dostęp do internetu, warto wybrać kamerę obsługującą Wi-Fi. Dzięki temu nie trzeba prowadzić przewodów, co znacząco obniża koszty instalacji. Dodatkowo, wiele modeli pozwala na podgląd obrazu na smartfonie w czasie rzeczywistym.&lt;/p&gt;&lt;h3&gt;3. Korzystanie z kamer zewnętrznych i wewnętrznych&lt;/h3&gt;&lt;p&gt;Aby uzyskać kompleksowy monitoring, warto połączyć kamery zewnętrzne z wewnętrznymi. Kamery zewnętrzne zabezpieczą posesję, a te umieszczone wewnątrz domu pozwolą na kontrolowanie wnętrza w przypadku włamania lub innych niepożądanych zdarzeń.&lt;/p&gt;&lt;h3&gt;4. Użycie kart pamięci zamiast chmury&lt;/h3&gt;&lt;p&gt;Chociaż przechowywanie nagrań w chmurze jest wygodne, często wiąże się z dodatkowymi kosztami. Wybór kamery obsługującej karty microSD pozwala na nagrywanie materiału bez konieczności opłacania abonamentu.&lt;/p&gt;&lt;p data-pm-slice=&quot;1 3 []&quot;&gt;Warto jednak pamiętać, że nagrania przechowywane lokalnie mogą być narażone na ryzyko utraty, np. w przypadku kradzieży kamery lub uszkodzenia karty pamięci. Aby temu zapobiec, można zastosować kilka zabezpieczeń:&lt;/p&gt;&lt;ul data-spread=&quot;false&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Wybór kamery z funkcją szyfrowania nagrań&lt;/strong&gt;, co uniemożliwia ich odczytanie po fizycznym wyjęciu karty.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Regularne tworzenie kopii zapasowych na zewnętrznym dysku lub serwerze NAS&lt;/strong&gt;, co zapewnia dodatkową ochronę.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Montaż kamery w trudno dostępnym miejscu&lt;/strong&gt;, aby zminimalizować ryzyko jej kradzieży.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Korzystanie z kamer obsługujących hybrydowe przechowywanie danych&lt;/strong&gt;, czyli lokalne nagrywanie z opcjonalnym zapisem w chmurze.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;5. Kamery z funkcją detekcji ruchu&lt;/h3&gt;&lt;p&gt;Kamery wyposażone w czujniki ruchu potrafią rejestrować obraz tylko wtedy, gdy wykryją aktywność w swoim polu widzenia. Pozwala to zaoszczędzić miejsce na karcie pamięci i ułatwia przeglądanie nagrań.&lt;/p&gt;&lt;h3&gt;6. Samodzielna instalacja&lt;/h3&gt;&lt;p&gt;Wiele nowoczesnych kamer można zainstalować samodzielnie bez potrzeby angażowania specjalistów. Modele zasilane przez baterie lub energię słoneczną są jeszcze łatwiejsze w montażu, ponieważ nie wymagają prowadzenia przewodów zasilających.&lt;/p&gt;&lt;p data-pm-slice=&quot;1 1 []&quot;&gt;Aby uzyskać najlepszą jakość obrazu i minimalizować martwe strefy, warto przestrzegać kilku zasad dotyczących umiejscowienia kamer:&lt;/p&gt;&lt;ul data-spread=&quot;false&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Montaż na odpowiedniej wysokości&lt;/strong&gt; – zaleca się instalowanie kamer na wysokości 2,5–3 metrów, co zapewnia szeroki kąt widzenia i chroni urządzenie przed łatwym demontażem przez intruza.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unikanie bezpośredniego światła&lt;/strong&gt; – umieszczanie kamer w miejscach narażonych na silne światło słoneczne lub refleksy może pogorszyć jakość nagrań.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pokrycie newralgicznych punktów&lt;/strong&gt; – warto zamontować kamery przy wejściu do budynku, furtce, bramie oraz innych potencjalnych punktach dostępu.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Korzystanie z szerokokątnych obiektywów&lt;/strong&gt; – modele z większym kątem widzenia mogą objąć większą część posesji, minimalizując liczbę potrzebnych kamer.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ochrona przed warunkami atmosferycznymi&lt;/strong&gt; – w przypadku kamer zewnętrznych warto zamontować je pod zadaszeniem lub wybrać modele o wysokiej odporności na warunki pogodowe.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Dzięki odpowiedniemu rozmieszczeniu kamer można zwiększyć skuteczność monitoringu i uniknąć niepożądanych martwych stref.&lt;/p&gt;&lt;h3&gt;7. Czy rejestrator jest konieczny?&lt;/h3&gt;&lt;p&gt;W tradycyjnych systemach monitoringu często stosuje się rejestratory wideo (NVR lub DVR), które pozwalają na przechowywanie nagrań z wielu kamer. Jednak w przypadku nowoczesnych kamer IP nie zawsze jest to konieczne. Wiele modeli pozwala na zapis materiału na kartach pamięci, w chmurze lub na serwerze NAS. Dzięki temu można uniknąć dodatkowych kosztów związanych z zakupem i instalacją rejestratora.&lt;/p&gt;&lt;h3&gt;8. Wzmocnienie sygnału Wi-Fi dla kamer zewnętrznych&lt;/h3&gt;&lt;p&gt;Jeśli planujemy instalację kamery zewnętrznej łączącej się przez Wi-Fi, warto zadbać o stabilne połączenie internetowe. Ściany budynku mogą osłabiać sygnał, co prowadzi do problemów z transmisją obrazu. W takich sytuacjach przydatnym rozwiązaniem może być zastosowanie zewnętrznego punktu dostępowego, takiego jak &lt;b&gt;TP-LINK EAP113 Outdoor&lt;/b&gt;.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgItU1A6o5t8WQoskk6cM7Yv6NnrwueahaYsa69FvSgomsqgjbBkGLdU3lJyskHz1W-iW9t_iHnHUP6l6T3WN-3F1aWFmtw4VXTz6zd98IideD-gy8p9W11BBh95fJ5fTElWVihyphenhyphenvWcjELhfymCvjAWdKLChRuPRSQ7xRpFS4MHK80LZCp3HrTLqIi2V0Y/s253/9421_ap-tp-link-eap113-outdoor_1730304926_small.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;TP-LINK EAP113 Outdoor&quot; border=&quot;0&quot; data-original-height=&quot;250&quot; data-original-width=&quot;253&quot; height=&quot;316&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgItU1A6o5t8WQoskk6cM7Yv6NnrwueahaYsa69FvSgomsqgjbBkGLdU3lJyskHz1W-iW9t_iHnHUP6l6T3WN-3F1aWFmtw4VXTz6zd98IideD-gy8p9W11BBh95fJ5fTElWVihyphenhyphenvWcjELhfymCvjAWdKLChRuPRSQ7xRpFS4MHK80LZCp3HrTLqIi2V0Y/w320-h316/9421_ap-tp-link-eap113-outdoor_1730304926_small.jpg&quot; title=&quot;TP-LINK EAP113 Outdoor&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Urządzenie TP-LINK EAP113 Outdoor zwiększa zasięg sieci i poprawia jakość połączenia z kamerami monitoringu. &lt;a disabled=&quot;false&quot; href=&quot;https://www.ceneo.pl/160499943#cid=47659&amp;amp;crid=730149&amp;amp;pid=28050&quot;&gt;Sprawdź cenę&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Polecane kamery&lt;/h3&gt;&lt;p&gt;Dla osób szukających sprawdzonych i niedrogich rozwiązań, warto rozważyć następujące modele kamer:&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;b&gt;TP-LINK Tapo C310&lt;/b&gt; – solidna kamera zewnętrzna z łącznością Wi-Fi: &lt;a disabled=&quot;false&quot; href=&quot;https://www.ceneo.pl/99293749#cid=47659&amp;amp;crid=729788&amp;amp;pid=28050&quot;&gt;Sprawdź cenę&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRuy9Bk6ZhbVY1bjcvdj8PO8J4jagl_Np9bihq9V7Ko0Antww0GvsI8LGgmuTKilzzmNOIYFyIzn3oFevvFoQd4rDkSIoggjGg3wMdr8qKqjJ-vyx45S9-t1OvN0oD82VYeDO-wY2wjaaXblShtIRU3cobUAmIFJ2XjDngs79K7dANVDs0yqElnJYPIBs/s1256/tapo-c310.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;TP-LINK TAPO C310&quot; border=&quot;0&quot; data-original-height=&quot;628&quot; data-original-width=&quot;1256&quot; height=&quot;160&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRuy9Bk6ZhbVY1bjcvdj8PO8J4jagl_Np9bihq9V7Ko0Antww0GvsI8LGgmuTKilzzmNOIYFyIzn3oFevvFoQd4rDkSIoggjGg3wMdr8qKqjJ-vyx45S9-t1OvN0oD82VYeDO-wY2wjaaXblShtIRU3cobUAmIFJ2XjDngs79K7dANVDs0yqElnJYPIBs/w320-h160/tapo-c310.jpg&quot; title=&quot;TP-LINK TAPO C310&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;SETTI+ SC970 3MP 4G&lt;/b&gt; – kamera z obsługą karty SIM do miejsc bez Wi-Fi: &lt;a disabled=&quot;false&quot; href=&quot;https://www.ceneo.pl/172064885#crid=729913&amp;amp;pid=28050&quot;&gt;Sprawdź cenę&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQxgP8MW_frJw83RmClUCOCnkE96WYw4dba1P5ZOYJHjJ7K8jdKmLItqYCqlE_RoRtiHo1PPY6tr_S6ha6V5NEak2pG6avCPDyGuU-ckunwBHPL0sjzDSL10oAry_XJYMJn5IKt8WL7b0fvg6KjlNvYyS54mUncxqAZx4LeJ5saAaphkilaY0HSFAfhWM/s800/Kamera_SETTI+_%20SC970_3MP_4G.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Kamera SETTI+  SC970 3MP 4G&quot; border=&quot;0&quot; data-original-height=&quot;600&quot; data-original-width=&quot;800&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQxgP8MW_frJw83RmClUCOCnkE96WYw4dba1P5ZOYJHjJ7K8jdKmLItqYCqlE_RoRtiHo1PPY6tr_S6ha6V5NEak2pG6avCPDyGuU-ckunwBHPL0sjzDSL10oAry_XJYMJn5IKt8WL7b0fvg6KjlNvYyS54mUncxqAZx4LeJ5saAaphkilaY0HSFAfhWM/w320-h240/Kamera_SETTI+_%20SC970_3MP_4G.jpg&quot; title=&quot;Kamera SETTI+  SC970 3MP 4G&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Kamera IP Imou Cruiser Dual 10MP (5MP + 5MP)&lt;/b&gt; – model o wysokiej rozdzielczości i szerokim kącie widzenia: &lt;a disabled=&quot;false&quot; href=&quot;https://www.ceneo.pl/165465879#crid=729914&amp;amp;pid=28050&quot;&gt;Sprawdź cenę&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxkbQz-_83vxjwvfRQdCAUDXOzcCBCP-a_GbnnPXPfe5dOkG4QV6jlMyfVWUKgeGJMCy4y_WmIyrOrvt3LY5NtuzATyttg0TW3SZJYRGauA6Gf1FDJqdW3eukqG3qV1PD9lpxb9ziezGrRqadkO-ykROrAGuNjziRGz1rdCgYfnRGwF9kq0DlLuBhpE5M/s800/Kamera_IP_Imou_%20Cruiser_Dual_%2010MP_(5MP+5MP).jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Kamera IP Imou Cruiser Dual 10MP (5MP + 5MP)&quot; border=&quot;0&quot; data-original-height=&quot;600&quot; data-original-width=&quot;800&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxkbQz-_83vxjwvfRQdCAUDXOzcCBCP-a_GbnnPXPfe5dOkG4QV6jlMyfVWUKgeGJMCy4y_WmIyrOrvt3LY5NtuzATyttg0TW3SZJYRGauA6Gf1FDJqdW3eukqG3qV1PD9lpxb9ziezGrRqadkO-ykROrAGuNjziRGz1rdCgYfnRGwF9kq0DlLuBhpE5M/w320-h240/Kamera_IP_Imou_%20Cruiser_Dual_%2010MP_(5MP+5MP).jpg&quot; title=&quot;Kamera IP Imou Cruiser Dual 10MP (5MP + 5MP)&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Kamera IP wewnętrzna Xiaomi Smart Camera C200&lt;/b&gt; – budżetowa opcja do monitoringu wnętrza domu: &lt;a disabled=&quot;false&quot; href=&quot;https://www.ceneo.pl/141954214#crid=729915&amp;amp;pid=28050&quot;&gt;Sprawdź cenę&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4aABdioe3Ahu6ScOe5zpQQBmbSVVTRJgGZvKIoUme20lh8BICOZv57QlozJysaqQ11nyO4DT9XQ4TkbrMBcLcdXza5Y-goMnI2OFfLM4_MyQsr-rk6giYnZZLPPZf2ZhcKW18GfKBjeEYiGYEv_hi_TKGiyFcD-2eoqknDDG_NWo3E4LOUx1uKEAhJ24/s500/Kamera-XIAOMI-Smart-C200-01-front.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Xiaomi Smart Camera C200&quot; border=&quot;0&quot; data-original-height=&quot;500&quot; data-original-width=&quot;500&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4aABdioe3Ahu6ScOe5zpQQBmbSVVTRJgGZvKIoUme20lh8BICOZv57QlozJysaqQ11nyO4DT9XQ4TkbrMBcLcdXza5Y-goMnI2OFfLM4_MyQsr-rk6giYnZZLPPZf2ZhcKW18GfKBjeEYiGYEv_hi_TKGiyFcD-2eoqknDDG_NWo3E4LOUx1uKEAhJ24/w320-h320/Kamera-XIAOMI-Smart-C200-01-front.jpg&quot; title=&quot;Xiaomi Smart Camera C200&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Kamera TP-LINK Tapo C320WS&lt;/b&gt; – kamera z wysoką jakością obrazu i noktowizją w kolorze: &lt;a disabled=&quot;false&quot; href=&quot;https://www.ceneo.pl/119663219#crid=729916&amp;amp;pid=28050&quot;&gt;Sprawdź cenę&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzjIS8wwMswrqSoqIzciWO3VvsQOHOhdEHirJL0J4IvMsDYhYoBH3rr-odHfYIOtceDTqpiVGRwRzS-MxgYGDgWcN-5gP41GDhTKPjJRKoG7aUjsl3fYuFnah9azC88O_gPMf313fD-TL2yUjlWBqHoEU53jykWOpEj1rLCVMM8SQwVvbrsw3eSM4sTEg/s800/Kamera_TP-LINK_%20Tapo_C320WS.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Kamera TP-LINK Tapo C320WS&quot; border=&quot;0&quot; data-original-height=&quot;600&quot; data-original-width=&quot;800&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzjIS8wwMswrqSoqIzciWO3VvsQOHOhdEHirJL0J4IvMsDYhYoBH3rr-odHfYIOtceDTqpiVGRwRzS-MxgYGDgWcN-5gP41GDhTKPjJRKoG7aUjsl3fYuFnah9azC88O_gPMf313fD-TL2yUjlWBqHoEU53jykWOpEj1rLCVMM8SQwVvbrsw3eSM4sTEg/w320-h240/Kamera_TP-LINK_%20Tapo_C320WS.jpg&quot; title=&quot;Kamera TP-LINK Tapo C320WS&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Podsumowanie&lt;/h3&gt;&lt;p&gt;Monitoring posesji nie musi wiązać się z dużymi kosztami. Wybierając odpowiednie kamery, korzystając z sieci Wi-Fi oraz zapisując nagrania na kartach pamięci, można stworzyć skuteczny system nadzoru bez konieczności ponoszenia dużych wydatków. Dzięki nowoczesnym technologiom można mieć pełną kontrolę nad bezpieczeństwem swojego domu bez angażowania drogich usług profesjonalnych firm.&lt;/p&gt;&lt;p data-pm-slice=&quot;1 1 []&quot;&gt;Przy wyborze systemu monitoringu warto zwrócić uwagę na kilka kluczowych aspektów:&lt;/p&gt;&lt;ul data-spread=&quot;false&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ciągłe zasilanie&lt;/strong&gt; – kamery wymagające stałego podłączenia do prądu są bardziej stabilne, ale mogą być trudniejsze w instalacji niż modele bateryjne.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Przechowywanie nagrań&lt;/strong&gt; – warto zdecydować, czy lepszym rozwiązaniem będzie lokalna karta pamięci, rejestrator NVR, serwer NAS czy usługa chmurowa.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bezpieczeństwo danych&lt;/strong&gt; – szyfrowanie nagrań i regularne tworzenie kopii zapasowych pozwalają uniknąć ich utraty lub przejęcia przez osoby trzecie.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Kwestie prawne&lt;/strong&gt; – należy pamiętać, że monitoring nie może naruszać prywatności osób trzecich. Kamery nie powinny rejestrować obszarów należących do sąsiadów ani przestrzeni publicznej w sposób naruszający przepisy RODO.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Odpowiednie zaplanowanie systemu monitoringu pozwala zwiększyć bezpieczeństwo posesji bez zbędnych kosztów i problemów prawnych.&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;</description><link>https://informatyka-porady.blogspot.com/2025/03/sposoby-na-niedrogi-monitoring-posesji.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRllOBjmMJ2n3uUqcBt-nvsifl9TFjO93IIXSXww6DDJ5lj378KHiX-r92uZyW22DKS6-zBEmE1026rFjbHCtvZpNnbOL1FklSqLEL4bwpRNCeyYr4ezS_ozLcYIG8yjCwo2BwUyNLoCmpPH-JacbXPHxMNnDFvh_9JnpODjOo37p5j05XqbkrAOQMtB4/s72-w543-h272-c/tani-monitoring-domu.jpg" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-5275199199639114813</guid><pubDate>Fri, 01 Sep 2023 00:51:00 +0000</pubDate><atom:updated>2023-09-01T02:54:59.211+02:00</atom:updated><title> Pułapki internetowych programów afiliacyjnych - Zagrożenia, puste obietnice i analiza programu ComperiaLead</title><description>&lt;p&gt;W dzisiejszym świecie Internetu, gdzie możliwości zarobku online wydają się niemal nieskończone, niestety pojawiają się również oszuści gotowi wykorzystać naszą chęć sukcesu. Osoby, które poszukują sposobu na zdobycie dodatkowego źródła dochodu, często padają łatwo ofiarą kuszących obietnic i złudzeń. Warto przyjrzeć się dokładnie temu, jak oszuści działają i jakie zagrożenia niosą ze sobą programy, które na pierwszy rzut oka wydają się być okazją życia.&amp;nbsp;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Rozkwit oszustw w Internecie - Pułapki bajecznych obietnic&lt;/h3&gt;&lt;p&gt;W rzeczywistości internetowej nie brakuje programów afiliacyjnych obiecujących ogromne zarobki bez większego wysiłku. To jednak często zbyt piękne, by były prawdziwe. Oszuści często wykorzystują ludzką chęć łatwego sukcesu. Przed podjęciem jakiejkolwiek współpracy, zawsze warto dokładnie zbadać i zastanowić się, czy obietnice są realistyczne, czy raczej brzmią jak kolejna próba naciągania.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;ComperiaLead pod lupą!&lt;/h3&gt;&lt;p&gt;W kontekście pułapek, które czyhają online, warto przyjrzeć się pewnym programom afiliacyjnym, które również mogą budzić wątpliwości. ComperiaLead to jeden z programów, który przyciąga moją uwagę, obiecując atrakcyjne zarobki poprzez promowanie produktów innych firm. Jednak, jak każdy program afiliacyjny, zasługuje na szczegółową analizę.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Koniecznie obejrzyj ten materiał wideo:&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/gsYrinlvhDA&quot; width=&quot;528&quot; youtube-src-id=&quot;gsYrinlvhDA&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Czynniki, które warto oceniać&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Przy ocenie programu afiliacyjnego, takiego jak ComperiaLead, warto zwrócić uwagę na kilka istotnych czynników:&lt;/p&gt;&lt;p&gt;&lt;b&gt;Wiarygodność firmy -&lt;/b&gt;&amp;nbsp;Czy firma prowadząca program afiliacyjny jest znana i wiarygodna? Warto przeszukać internet w poszukiwaniu opinii i informacji na temat firmy.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Warunki współpracy&lt;/b&gt; - Czy warunki współpracy są jasne i przejrzyste? Czy nie brakuje kluczowych informacji dotyczących płatności, warunków i procesu rozliczeniowego?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Historia wypłat -&lt;/b&gt;&amp;nbsp;Czy istnieją rzeczywiste dowody na to, że osoby uczestniczące w programie otrzymały swoje zarobki?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Opinie&lt;/b&gt; - Czy można znaleźć opinie innych afiliantów, którzy pracowali z tym programem? Negatywne opinie lub brak opinii mogą być sygnałem ostrzegawczym.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Podsumowanie&lt;/h3&gt;&lt;p&gt;W erze Iinternetu każda osoba zainteresowana zarabianiem online musi być świadoma, że oszuści czają się na każdym kroku. Programy afiliacyjne, takie jak ComperiaLead, mogą przyciągać obietnicami szybkich zarobków, ale ważne jest zachowanie rozwagi i dokładnej analizy. Zawsze warto działać zgodnie ze zdrowym rozsądkiem, sprawdzić wiarygodność programu oraz skonsultować się z innymi, zanim zdecydujemy się na zaangażowanie w jakikolwiek program afiliacyjny. Pamiętajmy, że unikanie oszustw i podejmowanie informowanych decyzji to klucz do sukcesu w świecie internetowego zarabiania.&lt;/p&gt;</description><link>https://informatyka-porady.blogspot.com/2023/09/puapki-internetowych-oszustow.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/gsYrinlvhDA/default.jpg" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-7076170157295232704</guid><pubDate>Thu, 17 Aug 2023 14:53:00 +0000</pubDate><atom:updated>2023-08-17T16:53:10.484+02:00</atom:updated><title> Domena internetowa – Odpowiednio dobrana nazwa to klucz do sukcesu Twojej firmy</title><description>&lt;p&gt;W erze cyfrowej wiele firm przemieszcza swoją działalność do wirtualnej przestrzeni. Strona internetowa staje się wizytówką przedsiębiorstwa, a odpowiednio dobrana domena to klucz do jej skuteczności. W tym artykule wyjaśnimy, czym dokładnie jest domena internetowa i dlaczego w przypadku stron firmowych jej wybór jest tak ważny, zwłaszcza w kontekście polskiego rynku i rozszerzenia .pl.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdi50RMth1QYM-EZXWCI8tYJEUpzsuxkwRbj_h9bssyhb1sn_kcfQ87ytXeGT32SKTv64JRh9xMx6KahJVM-ynXrd_u_p1kh35Yms4wS3ijCGBGtSmO8nfaV95Fd-nIoobwOhvKJsf8QAR9XB_MytdOQVZBCJkLRWtGIgUwWktqm_dsrIaa4bWlxdNyys/s1000/Bez%20nazwy%20(1000%C3%97628%20px).jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Wybór nazwy domeny to kluczowa strategia&quot; border=&quot;0&quot; data-original-height=&quot;628&quot; data-original-width=&quot;1000&quot; height=&quot;251&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdi50RMth1QYM-EZXWCI8tYJEUpzsuxkwRbj_h9bssyhb1sn_kcfQ87ytXeGT32SKTv64JRh9xMx6KahJVM-ynXrd_u_p1kh35Yms4wS3ijCGBGtSmO8nfaV95Fd-nIoobwOhvKJsf8QAR9XB_MytdOQVZBCJkLRWtGIgUwWktqm_dsrIaa4bWlxdNyys/w400-h251/Bez%20nazwy%20(1000%C3%97628%20px).jpg&quot; title=&quot;Wybór nazwy domeny to kluczowa strategia&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Czym jest domena internetowa?&lt;/h2&gt;&lt;p&gt;Domena internetowa to adres, pod którym dana strona jest dostępna w sieci. Działa ona na podobnej zasadzie co adres mieszkalny – pozwala użytkownikom odnaleźć konkretną stronę w nieskończonym oceanie informacji, jakim jest internet. Każda domena składa się z nazwy (np. &quot;twojafirma&quot;) oraz rozszerzenia (np. &quot;.pl&quot;).&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Nazewnictwo domen&lt;/h2&gt;&lt;p&gt;Chociaż istnieje wiele różnych rozszerzeń domen, w Polsce najpopularniejszym i najbardziej rozpoznawalnym jest .pl. To rozszerzenie kojarzone jest z polskimi firmami i instytucjami, a dla wielu użytkowników stanowi synonim wiarygodności i lokalności.&lt;/p&gt;&lt;p&gt;Niektóre firmy decydują się na rejestrację w innych domenach, takich jak .com, .net czy .org, jednak jeśli Twoja firma działa głównie na terenie Polski, rozszerzenie .pl jest najbardziej odpowiednie.&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Dlaczego wybór nazwy domeny jest tak ważny?&lt;/h2&gt;&lt;p&gt;&lt;b&gt;Rozpoznawalność&lt;/b&gt; - Dobra domena powinna być krótka, łatwa do zapamiętania i bezproblemowa w wymowie. Dzięki temu klienci bez trudu odnajdą Twoją stronę w sieci.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Profesjonalizm&lt;/b&gt; - Domena .pl świadczy o tym, że Twoja firma jest zlokalizowana w Polsce i skierowana do polskich klientów. Wybierając lokalne rozszerzenie, zyskujesz zaufanie potencjalnych klientów.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Optymalizacja pod wyszukiwarki (SEO)&lt;/b&gt; - Wybór odpowiedniej domeny może wpłynąć na pozycję Twojej strony w wynikach wyszukiwania. Domeny z popularnymi słowami kluczowymi w nazwie mają większe szanse na wysoką pozycję w wyszukiwarkach.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Unikatowość&lt;/b&gt; - Wybierając domenę, warto upewnić się, że jest ona unikatowa i nie kojarzy się z konkurencyjnymi markami.&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Rejestracja domeny – jak to zrobić?&lt;/h2&gt;&lt;p&gt;Rejestracja domeny internetowej jest procesem, który pozwala na zarezerwowanie wybranego adresu, dzięki czemu nikt inny nie będzie mógł go użyć. Procedura ta zwykle jest prosta i składa się z kilku kroków.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Wyszukiwanie&lt;/b&gt; - Zacznij od sprawdzenia dostępności wybranej nazwy domeny. Wielu dostawców usług hostingowych i rejestratorów domen oferuje narzędzia online, które pozwolą Ci na to w łatwy sposób. Jeśli Twoja wymarzona nazwa jest dostępna – to świetnie! Jeśli nie – będziesz musiał wymyślić alternatywę lub rozważyć inne rozszerzenie.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Wybór dostawcy -&lt;/b&gt;&amp;nbsp;Istnieje wiele firm zajmujących się rejestracją domen. Wybierając dostawcę, zwróć uwagę na cenę, okres ważności domeny, dodatkowe usługi (np. hosting czy certyfikaty SSL) oraz opinie innych użytkowników.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Rejestracja -&lt;/b&gt;&amp;nbsp;Po wyborze dostawcy i upewnieniu się co do dostępności nazwy, można przejść do formalnej rejestracji. W tym kroku konieczne będzie podanie niezbędnych danych – zarówno kontaktowych, jak i dotyczących płatności. Wiele rejestratorów domen oferuje różne okresy ważności domeny, zaczynając od roku.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Konfiguracja -&lt;/b&gt;&amp;nbsp;Po zarejestrowaniu domeny, warto skonfigurować jej ustawienia, takie jak serwery DNS, które wskazują na lokalizację Twojej strony w sieci.&lt;/p&gt;&lt;p&gt;Pamiętaj, że domena musi być odnawiana co jakiś czas (zazwyczaj co roku). Jeśli jej nie odnowisz, ryzykujesz utratę nazwy, co może otworzyć drzwi dla konkurencji lub cyberprzestępców.&lt;/p&gt;&lt;p&gt;Zakładanie domeny to inwestycja w Twój wizerunek online. Dlatego warto poświęcić czas na przemyślenie odpowiedniej nazwy i wybór solidnego dostawcy.&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Typowe błędy przy wyborze nazwy domeny&lt;/h2&gt;&lt;p&gt;Wybór odpowiedniej nazwy domeny jest kluczem do sukcesu w sieci, ale wiele firm popełnia błędy, które mogą utrudnić ich widoczność lub zrozumienie przez użytkowników. Poznaj najczęstsze pułapki, w które warto nie wpadać.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Zbyt długa nazwa&lt;/b&gt; - Krótkie, zwięzłe nazwy są łatwiejsze do zapamiętania. Unikaj używania długich fraz, które użytkownicy mogą błędnie wpisać lub zapomnieć.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Używanie trudnych do zrozumienia skrótów -&lt;/b&gt;&amp;nbsp;Chociaż skróty mogą wydawać się kuszącym rozwiązaniem, nie zawsze są one intuicyjne dla użytkowników.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Zbyt skomplikowana pisownia -&lt;/b&gt;&amp;nbsp;Unikaj nazw, które są trudne do wymówienia lub pisania. To zwiększa ryzyko błędów przy wpisywaniu adresu przez użytkowników.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Używanie myślników&lt;/b&gt; - Choć myślniki są dozwolone w nazwach domen, mogą wprowadzać w błąd. Często są źle interpretowane lub zapominane przez użytkowników.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Niejasne rozszerzenia -&lt;/b&gt;&amp;nbsp;Chociaż istnieje wiele kreatywnych rozszerzeń domen dostępnych na rynku, warto zastanowić się, czy potencjalny klient rozpozna i zaufa takiej domenie tak samo, jak popularnym rozszerzeniom jak .pl czy .com.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Nie sprawdzanie praw autorskich -&lt;/b&gt;&amp;nbsp;Upewnij się, że wybrana nazwa nie narusza praw autorskich innych firm. Niechcący możesz narazić się na problemy prawne.&lt;/p&gt;&lt;p&gt;Unikanie tych pułapek pomoże Ci wybrać skuteczną i efektywną nazwę domeny, która będzie służyć Twojej firmie przez wiele lat.&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Wnioski&lt;/h2&gt;&lt;p&gt;Domena internetowa to nie tylko adres Twojej strony, ale przede wszystkim narzędzie marketingowe. Wybierając odpowiednią domenę, budujesz wizerunek firmy w sieci, przyciągasz więcej klientów i zyskujesz przewagę nad konkurencją. Jeśli działasz na terenie Polski, rozszerzenie .pl będzie idealnym wyborem, gwarantującym wiarygodność i lokalne powiązanie z rynkiem.&lt;/p&gt;</description><link>https://informatyka-porady.blogspot.com/2023/08/domena-internetowa-odpowiednio-dobrana.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdi50RMth1QYM-EZXWCI8tYJEUpzsuxkwRbj_h9bssyhb1sn_kcfQ87ytXeGT32SKTv64JRh9xMx6KahJVM-ynXrd_u_p1kh35Yms4wS3ijCGBGtSmO8nfaV95Fd-nIoobwOhvKJsf8QAR9XB_MytdOQVZBCJkLRWtGIgUwWktqm_dsrIaa4bWlxdNyys/s72-w400-h251-c/Bez%20nazwy%20(1000%C3%97628%20px).jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-2795807040381173439</guid><pubDate>Wed, 16 Aug 2023 21:35:00 +0000</pubDate><atom:updated>2023-08-16T23:41:19.729+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CMS</category><title>Jaki CMS może być najbardziej odpowiedni dla witryny firmowej?</title><description>

        
&lt;section id=&quot;introduction&quot;&gt;
            &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5R6WzcwIcQcTXXTBOxFxAmoZBjHtNLzXmiGKAww05pd1D3nT6SqV3-UuEY_mL3WR_7ckxEHxO65mwM4zXj6VC4sD9Y30mte5W7_ecMwjAAZDbAP4I7VTVPr4BlA8TTKYwWqC-RGTTsVe8nYfcn5NVqpNUDt5Q_Uts2qcp4GEcD3pBCLiUvxw-PrN8DSA/s1200/Projekt%20bez%20nazwy%20-%202023-08-16T234015.838.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Jaki system CMS dla strony firmowej?&quot; border=&quot;0&quot; data-original-height=&quot;628&quot; data-original-width=&quot;1200&quot; height=&quot;335&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5R6WzcwIcQcTXXTBOxFxAmoZBjHtNLzXmiGKAww05pd1D3nT6SqV3-UuEY_mL3WR_7ckxEHxO65mwM4zXj6VC4sD9Y30mte5W7_ecMwjAAZDbAP4I7VTVPr4BlA8TTKYwWqC-RGTTsVe8nYfcn5NVqpNUDt5Q_Uts2qcp4GEcD3pBCLiUvxw-PrN8DSA/w640-h335/Projekt%20bez%20nazwy%20-%202023-08-16T234015.838.jpg&quot; title=&quot;Jaki system CMS dla strony firmowej?&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Każda nowoczesna firma zdaje sobie sprawę z tego, jak ważna jest obecność w sieci. Witryna firmowa to nie tylko wizytówka, ale także narzędzie do pozyskiwania klientów, prezentowania oferty czy nawet realizowania sprzedaży. Wybór odpowiedniego systemu zarządzania treścią (CMS - Content Management System) jest kluczowy dla efektywnego i wydajnego zarządzania treścią na stronie. Poniżej przedstawiamy kilka popularnych systemów CMS oraz ich główne zalety.&lt;/p&gt;
        &lt;/section&gt;

&lt;div id=&quot;navbar&quot;&gt;&lt;ul&gt;
        
        &lt;li&gt;&lt;a href=&quot;#wordpress&quot;&gt;WordPress&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#joomla&quot;&gt;Joomla!&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#drupal&quot;&gt;Drupal&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#wix&quot;&gt;Wix&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#shopify&quot;&gt;Shopify&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#alternative-cms&quot;&gt;Alternatywne i mniej znane systemy CMS - Kiedy na nie stawiać?&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#summary&quot;&gt;Podsumowanie&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
    &lt;/div&gt;

    
        

        &lt;section id=&quot;wordpress&quot;&gt;
    &lt;h2&gt;1. WordPress&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcIZLA_7IyE155P7QFmpwm6GXGPxjN1YKNBZeJv-x2qMc2TiHNVBZf3NdtlVfX9JPTUa05L4XWxDTjiJZsHj7nmJYhvwIOnskEUzQHvFZw6gc2ls1Qaah708cB3f2D_qz-d8BaO41w4g9GkNBAYtIwI2fw2nVlfZ1YNlDz6Yd3iwbNInMBr2TgWpG1h0g/s225/pobrane%20(2).png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Logo WordPress&quot; border=&quot;0&quot; data-original-height=&quot;225&quot; data-original-width=&quot;225&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcIZLA_7IyE155P7QFmpwm6GXGPxjN1YKNBZeJv-x2qMc2TiHNVBZf3NdtlVfX9JPTUa05L4XWxDTjiJZsHj7nmJYhvwIOnskEUzQHvFZw6gc2ls1Qaah708cB3f2D_qz-d8BaO41w4g9GkNBAYtIwI2fw2nVlfZ1YNlDz6Yd3iwbNInMBr2TgWpG1h0g/w200-h200/pobrane%20(2).png&quot; title=&quot;Logo WordPress&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
    &lt;p&gt;&lt;strong&gt;&lt;u&gt;WordPress&lt;/u&gt;&lt;/strong&gt; to bez wątpienia najpopularniejszy na świecie system zarządzania treścią, napędzający około 40% wszystkich stron internetowych. Początkowo został stworzony jako platforma do blogowania, ale z czasem ewoluował, stając się pełnoprawnym systemem CMS.&lt;/p&gt;
    
    &lt;p&gt;&lt;strong&gt;Zalety&lt;/strong&gt;:&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;strong&gt;Intuicyjność&lt;/strong&gt;: Dzięki przyjaznemu interfejsowi użytkownika, nawet osoby bez doświadczenia technicznego mogą łatwo publikować treści.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Bogata baza wtyczek&lt;/strong&gt;: Istnieją tysiące wtyczek, które pozwalają rozszerzyć funkcjonalność witryny, od SEO, przez e-commerce, aż po narzędzia społecznościowe.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Aktualizacje i bezpieczeństwo&lt;/strong&gt;: Regularne aktualizacje zapewniają bezpieczeństwo i nowe funkcje. Ponadto istnieją liczne wtyczki zwiększające bezpieczeństwo strony.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Wielka społeczność&lt;/strong&gt;: Z racji swojej popularności, WordPress posiada ogromną społeczność użytkowników i deweloperów, którzy chętnie udzielają wsparcia na różnych forach.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Tematy responsywne&lt;/strong&gt;: Dzięki bogatej bazie motywów, możesz wybrać design, który będzie odpowiedni dla Twojego biznesu i jednocześnie dostosowany do urządzeń mobilnych.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Elastyczność&lt;/strong&gt;: WordPress umożliwia tworzenie różnorodnych stron - od blogów, przez portale informacyjne, aż po sklepy internetowe dzięki WooCommerce.&lt;/li&gt;
    &lt;/ul&gt;
    
    &lt;p&gt;&lt;strong&gt;Wady&lt;/strong&gt;:&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;strong&gt;Częste aktualizacje&lt;/strong&gt;: Chociaż aktualizacje przynoszą poprawki, mogą czasami powodować problemy z kompatybilnością wtyczek.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Zasobochłonność&lt;/strong&gt;: Bez odpowiedniej optymalizacji, strony oparte na WordPressie mogą być wolniejsze niż te zbudowane na lżejszych platformach.&lt;/li&gt;
    &lt;/ul&gt;
    
    &lt;p&gt;&lt;strong&gt;Kiedy wybrać?&lt;/strong&gt;: Idealny dla małych i średnich firm, blogerów, sklepów internetowych oraz wszelkich witryn, które potrzebują prostych, ale funkcjonalnych stron z możliwością łatwej rozbudowy w przyszłości. Dzięki swojej elastyczności, WordPress sprawdza się w wielu różnych zastosowaniach.&lt;/p&gt;
&lt;/section&gt;

        &lt;section id=&quot;joomla&quot;&gt;
    &lt;h2&gt;2. Joomla&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRXGkDiDz5KjwGXCcSliqznkRnq8cej_l_Pd9Fjzc8-vCb_RuhevJpartu1To42wlltar6fhkuyBQnTi1I7D8HxKwKNuIaAzRQe4WguSLEeICKxGbwp30zyFXX_VHX5-49qftUHitQ_DVM4Pstwna5XmM-XsgEOqUXV5FosCsjuZVEA9WI2Dugn32wU6U/s640/joomla-logo.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Logo Joomla&quot; border=&quot;0&quot; data-original-height=&quot;430&quot; data-original-width=&quot;640&quot; height=&quot;215&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRXGkDiDz5KjwGXCcSliqznkRnq8cej_l_Pd9Fjzc8-vCb_RuhevJpartu1To42wlltar6fhkuyBQnTi1I7D8HxKwKNuIaAzRQe4WguSLEeICKxGbwp30zyFXX_VHX5-49qftUHitQ_DVM4Pstwna5XmM-XsgEOqUXV5FosCsjuZVEA9WI2Dugn32wU6U/w320-h215/joomla-logo.jpg&quot; title=&quot;Logo Joomla&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
    &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.joomla.org/Main_Page&quot;&gt;Joomla&lt;/a&gt;&lt;/strong&gt; jest drugim, po WordPressie, najpopularniejszym systemem zarządzania treścią. Jest to rozbudowany, ale jednocześnie intuicyjny CMS, który jest często wybierany przez średnie i duże firmy do tworzenia zaawansowanych witryn internetowych.&lt;/p&gt;
    
    &lt;p&gt;&lt;strong&gt;Zalety&lt;/strong&gt;:&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;strong&gt;Funkcjonalność&lt;/strong&gt;: Joomla oferuje wiele wbudowanych narzędzi i funkcji, które często wymagają dodatkowych wtyczek w innych systemach CMS.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Fleksybilność&lt;/strong&gt;: Możliwość tworzenia różnorodnych typów treści bez konieczności instalowania dodatkowych rozszerzeń.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Bezpieczeństwo&lt;/strong&gt;: Regularne aktualizacje i liczne narzędzia zabezpieczające sprawiają, że Joomla jest jednym z bardziej bezpiecznych systemów CMS na rynku.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Wsparcie społeczności&lt;/strong&gt;: Podobnie jak WordPress, Joomla posiada silną społeczność, która chętnie udziela wsparcia i tworzy nowe rozszerzenia.&lt;/li&gt;
    &lt;/ul&gt;
    
    &lt;p&gt;&lt;strong&gt;Wady&lt;/strong&gt;:&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;strong&gt;Krzywa uczenia się&lt;/strong&gt;: Joomla może być nieco trudniejsza dla początkujących użytkowników w porównaniu do WordPressa, jednak jej elastyczność i zaawansowane funkcje rekompensują ten fakt.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Wykonanie i optymalizacja&lt;/strong&gt;: Chociaż Joomla jest dość szybka &quot;out of the box&quot;, niektóre rozbudowane strony mogą wymagać dodatkowej optymalizacji.&lt;/li&gt;
    &lt;/ul&gt;
    
    &lt;p&gt;&lt;strong&gt;Kiedy wybrać?&lt;/strong&gt;: Joomla jest idealna dla tych, którzy szukają bardziej zaawansowanych funkcji i narzędzi bez konieczności instalowania wielu wtyczek. Działa świetnie dla średnich i dużych przedsiębiorstw, organizacji non-profit oraz portali informacyjnych. Dzięki swoim zaawansowanym funkcjom, jest również popularnym wyborem dla stron społecznościowych i witryn intranetowych.&lt;/p&gt;
&lt;/section&gt;

       &lt;section id=&quot;drupal&quot;&gt;
    &lt;h2&gt;&lt;br /&gt;3. Drupal&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXjWmo394FS9Lji7-6ugEnj1ATfG-d5Szw062emuFFxmFhIePJzGO5tH9o5p4Ajr6oPxJg6wfX69U0zR6cc7F8G0EdSt2qfJQA0DxQeTT9WgUwMVGOxkA-3bHyAqegKL7T2BEisy824a6bPx2NVljR2QVJCFn2rCuaei6Exm9qIgTubLj7HHSt2UfmP_E/s492/Wordmark2_blue_RGB(1).png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Logo Drupal&quot; border=&quot;0&quot; data-original-height=&quot;376&quot; data-original-width=&quot;492&quot; height=&quot;245&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXjWmo394FS9Lji7-6ugEnj1ATfG-d5Szw062emuFFxmFhIePJzGO5tH9o5p4Ajr6oPxJg6wfX69U0zR6cc7F8G0EdSt2qfJQA0DxQeTT9WgUwMVGOxkA-3bHyAqegKL7T2BEisy824a6bPx2NVljR2QVJCFn2rCuaei6Exm9qIgTubLj7HHSt2UfmP_E/w320-h245/Wordmark2_blue_RGB(1).png&quot; title=&quot;Logo Drupal&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
    &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.drupal.org/&quot;&gt;Drupal&lt;/a&gt;&lt;/strong&gt; jest kolejnym potężnym systemem zarządzania treścią, który zdobył uznanie na całym świecie, zwłaszcza wśród zaawansowanych deweloperów i dużych organizacji. Jego modularna struktura pozwala na tworzenie skomplikowanych witryn z zaawansowaną funkcjonalnością.&lt;/p&gt;
    
    &lt;p&gt;&lt;strong&gt;Zalety&lt;/strong&gt;:&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;strong&gt;Modularność i rozbudowa&lt;/strong&gt;: Drupal jest znany z szerokiej gamy modułów, które można dostosować do różnorodnych potrzeb.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Bezpieczeństwo&lt;/strong&gt;: Znany jest z silnych funkcji bezpieczeństwa, co sprawia, że jest częstym wyborem dla dużych korporacji i rządowych witryn internetowych.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Wsparcie społeczności&lt;/strong&gt;: Mimo że jest mniej popularny niż WordPress czy Joomla, Drupal posiada bardzo aktywną i zaawansowaną społeczność deweloperów.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Zaawansowana funkcjonalność&lt;/strong&gt;: Drupal jest idealny dla projektów wymagających zaawansowanej funkcjonalności i niestandardowych rozwiązań.&lt;/li&gt;
    &lt;/ul&gt;
    
    &lt;p&gt;&lt;strong&gt;Wady&lt;/strong&gt;:&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;strong&gt;Stroma krzywa uczenia się&lt;/strong&gt;: Drupal jest często uważany za trudniejszy dla początkujących, wymaga większej wiedzy technicznej niż konkurencyjne CMS-y.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Złożoność&lt;/strong&gt;: Jego zaawansowane funkcje mogą być nadmiarowe dla małych witryn lub projektów o prostszej strukturze.&lt;/li&gt;
    &lt;/ul&gt;
    
    &lt;p&gt;&lt;strong&gt;Kiedy wybrać?&lt;/strong&gt;: Drupal jest doskonałym wyborem dla dużych przedsiębiorstw, instytucji edukacyjnych, rządowych i wszelkich projektów, które wymagają zaawansowanej funkcjonalności i skomplikowanej struktury. Jeśli planujesz rozwijać witrynę z mnóstwem niestandardowych funkcji i jesteś gotów zainwestować w specjalistyczną wiedzę lub zespół, Drupal może być idealnym rozwiązaniem.&lt;/p&gt;
&lt;/section&gt;

       &lt;section id=&quot;wix&quot;&gt;
    &lt;h2&gt;4. Wix&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPFGbSU0d5d0fmaCUsJndqUDI86sqLH2zp8Y7Lz2PzqYsV6yh8xy41UquFTrl4n6W-P_8JNpwLHdqhx_GVttQI8MdEazBUl821HmZZRN2yyAJ9EboWRclS-vb-lK67XxXN3MUXq8h1DujJlWkgNqU7ysTzQhK6jxWGMFCCWFEaEX85Duh1mEieduDUKOg/s2560/Wix.com_Logo.svg.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Logo Wix&quot; border=&quot;0&quot; data-original-height=&quot;600&quot; data-original-width=&quot;2560&quot; height=&quot;75&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPFGbSU0d5d0fmaCUsJndqUDI86sqLH2zp8Y7Lz2PzqYsV6yh8xy41UquFTrl4n6W-P_8JNpwLHdqhx_GVttQI8MdEazBUl821HmZZRN2yyAJ9EboWRclS-vb-lK67XxXN3MUXq8h1DujJlWkgNqU7ysTzQhK6jxWGMFCCWFEaEX85Duh1mEieduDUKOg/w320-h75/Wix.com_Logo.svg.png&quot; title=&quot;Logo Wix&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
    &lt;p&gt;&lt;strong&gt;Wix&lt;/strong&gt; jest platformą do tworzenia stron internetowych opartą na chmurze, która zyskała popularność dzięki prostocie użytkowania oraz funkcji &quot;przeciągnij i upuść&quot;. Jest to idealne rozwiązanie dla początkujących oraz dla osób, które chcą stworzyć atrakcyjną witrynę bez konieczności zdobywania wiedzy technicznej.&lt;/p&gt;
    
    &lt;p&gt;&lt;strong&gt;Zalety&lt;/strong&gt;:&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;strong&gt;Intuicyjność&lt;/strong&gt;: Dzięki edytorowi &quot;przeciągnij i upuść&quot;, tworzenie strony jest niezwykle proste, nawet dla osób bez doświadczenia technicznego.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Gotowe szablony&lt;/strong&gt;: Wix oferuje setki profesjonalnie zaprojektowanych szablonów, które można łatwo dostosować do indywidualnych potrzeb.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Wbudowane narzędzia&lt;/strong&gt;: Od galerii zdjęć, poprzez formularze kontaktowe, aż po sklep internetowy - Wix oferuje wiele narzędzi dostępnych &quot;od ręki&quot;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Hosting w cenie&lt;/strong&gt;: Nie musisz martwić się o zakup i konfigurację hostingu, ponieważ jest on już wliczony w cenę.&lt;/li&gt;
    &lt;/ul&gt;
    
    &lt;p&gt;&lt;strong&gt;Wady:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Mniej elastyczny&lt;/strong&gt;: Chociaż Wix jest prosty w użyciu, nie oferuje takiej głębokości dostosowywania, jak tradycyjne systemy CMS.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Opłaty miesięczne&lt;/strong&gt;: W przeciwieństwie do wielu systemów CMS, które można pobrać za darmo, Wix wymaga miesięcznych opłat, które mogą się sumować w dłuższej perspektywie.&lt;/li&gt;
    &lt;/ul&gt;
    
    &lt;p&gt;&lt;strong&gt;Kiedy wybrać?&lt;/strong&gt;&amp;nbsp;Wix jest doskonałym wyborem dla małych firm, artystów, fotografów i innych profesjonalistów, którzy chcą stworzyć estetyczną witrynę z minimalnym wysiłkiem. Jeśli nie planujesz rozbudowywać swojej strony w zaawansowany sposób i chcesz szybkiego rozwiązania &quot;wszystko w jednym&quot;, Wix będzie dla Ciebie idealny.&lt;/p&gt;
&lt;/section&gt;

        &lt;section id=&quot;shopify&quot;&gt;
    &lt;h2&gt;5. Shopify&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQU2ycyzYFkI7s1zB4QsGC1g-8abcvuil1Yw4RA6z0TRrFluIFS3hJYePFW5WGnPldgBwjKpkKsum4fw__Z2HYkII1lndZQW5c1eCsB4oIYMeoaB-1pEfS-CzkykiwRSnJeOYe2UoAW1SmUvgj5ddrtX-mrN2UjgtP9DDZNlYCSyewqPACWqmFUleR1ok/s920/png-transparent-circle-ecommerce-round-icon-shopify-popular-services-brands-vol-2-icon.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Logo Shopify&quot; border=&quot;0&quot; data-original-height=&quot;920&quot; data-original-width=&quot;920&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQU2ycyzYFkI7s1zB4QsGC1g-8abcvuil1Yw4RA6z0TRrFluIFS3hJYePFW5WGnPldgBwjKpkKsum4fw__Z2HYkII1lndZQW5c1eCsB4oIYMeoaB-1pEfS-CzkykiwRSnJeOYe2UoAW1SmUvgj5ddrtX-mrN2UjgtP9DDZNlYCSyewqPACWqmFUleR1ok/w200-h200/png-transparent-circle-ecommerce-round-icon-shopify-popular-services-brands-vol-2-icon.png&quot; title=&quot;Logo Shopify&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
    &lt;p&gt;&lt;strong&gt;Shopify&lt;/strong&gt; to jedna z czołowych platform e-commerce, która umożliwia tworzenie profesjonalnych sklepów internetowych. Stworzona z myślą o sprzedawcach, niezależnie od ich poziomu doświadczenia technicznego, Shopify jest łatwa w obsłudze, ale jednocześnie oferuje wszystkie niezbędne narzędzia do prowadzenia skutecznej sprzedaży online.&lt;/p&gt;
    
    &lt;p&gt;&lt;strong&gt;Zalety&lt;/strong&gt;:&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;strong&gt;Użytkowność&lt;/strong&gt;: Dzięki intuicyjnemu interfejsowi, nawet początkujący sprzedawcy mogą szybko uruchomić swój sklep.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Wszechstronność&lt;/strong&gt;: Oferuje narzędzia zarówno dla małych, niezależnych sprzedawców, jak i dla dużych przedsiębiorstw e-commerce.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Bezpieczeństwo&lt;/strong&gt;: Shopify zapewnia wysoki poziom bezpieczeństwa transakcji oraz danych klientów.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Integracje&lt;/strong&gt;: Dostęp do tysięcy aplikacji i wtyczek umożliwiających integrację z różnorodnymi narzędziami i usługami zewnętrznymi.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Wsparcie 24/7&lt;/strong&gt;: W razie problemów czy wątpliwości, zespół wsparcia Shopify jest dostępny całą dobę.&lt;/li&gt;
    &lt;/ul&gt;
    
    &lt;p&gt;&lt;strong&gt;Wady&lt;/strong&gt;:&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;strong&gt;Opłaty&lt;/strong&gt;: Oferuje model subskrypcji, co oznacza comiesięczne lub coroczne opłaty. Ponadto, za niektóre wtyczki i aplikacje mogą być naliczane dodatkowe opłaty.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Customizacja&lt;/strong&gt;: Chociaż Shopify jest bardzo elastyczny, pewne zaawansowane dostosowania mogą wymagać znajomości języków programowania.&lt;/li&gt;
    &lt;/ul&gt;
    
    &lt;p&gt;&lt;strong&gt;Kiedy wybrać?&lt;/strong&gt;: Shopify jest idealny dla przedsiębiorców, którzy chcą prowadzić sklep internetowy bez głębokiej wiedzy technicznej. Niezależnie od tego, czy planujesz sprzedawać kilka produktów, czy prowadzić duże przedsiębiorstwo e-commerce, Shopify dostarcza narzędzia niezbędne do osiągnięcia sukcesu w sprzedaży online.&lt;/p&gt;
&lt;/section&gt;

      &lt;section id=&quot;alternative-cms&quot;&gt;
    &lt;h2&gt;Alternatywne i mniej znane systemy CMS - Kiedy na nie stawiać?&lt;/h2&gt;
    &lt;p&gt;Obok powszechnie znanych systemów CMS, istnieje wiele alternatywnych i mniej znanych rozwiązań. Takie systemy jak Grav, &lt;a href=&quot;https://octobercms.com/&quot;&gt;OctoberCMS&lt;/a&gt; czy SilverStripe oferują unikalne funkcjonalności, które mogą okazać się idealne dla konkretnych potrzeb biznesowych. Wybierając mniej popularny CMS, można zyskać na elastyczności, bezpieczeństwie (mniejsza liczba ataków skierowana na mniej popularne systemy) oraz unikatowości strony (mniej typowych szablonów).&lt;/p&gt;
    &lt;p&gt;&lt;strong&gt;Kiedy wybrać mniej znane CMS-y?&lt;/strong&gt; Stawiając na mniej popularne systemy, warto zwrócić uwagę na kilka kluczowych aspektów:&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;strong&gt;Wsparcie społeczności&lt;/strong&gt;: Mniejsza popularność systemu często wiąże się z mniejszym wsparciem społeczności. Sprawdzenie, czy system jest regularnie aktualizowany i czy istnieją dostępne źródła pomocy, jest kluczowe.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Elastyczność&lt;/strong&gt;: Niektóre mniej znane CMS-y oferują większą elastyczność w dostosowywaniu niż mainstreamowe systemy. Może to być kluczowe dla specyficznych potrzeb.&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;Specyficzne funkcjonalności&lt;/strong&gt;: Wybierając alternatywny CMS, warto sprawdzić, czy oferuje on funkcje, które są niezbędne dla Twojego biznesu i czy nie będziesz potrzebować inwestować w dodatkowe wtyczki czy modyfikacje.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;p&gt;Ostateczna decyzja o wyborze systemu powinna być oparta na dokładnej analizie potrzeb firmy oraz możliwości oferowanych przez dany CMS. Wybór mniej popularnego systemu może być trafiony, jeśli odpowiada on specyficznym wymaganiom projektu.&lt;/p&gt;
&lt;/section&gt;  
      
      &lt;section id=&quot;summary&quot;&gt;
            &lt;h2&gt;Podsumowanie&lt;/h2&gt;
            &lt;p&gt;Wybór CMS zależy od wielu czynników: potrzeb firmy, budżetu, oczekiwań w zakresie funkcjonalności czy dostępności wsparcia. Ważne jest, by dokładnie przeanalizować potrzeby firmy i zastanowić się, który system będzie najbardziej odpowiedni, zarówno na chwilę obecną, jak i z perspektywy przyszłych lat.&lt;/p&gt;
        &lt;/section&gt;
   </description><link>https://informatyka-porady.blogspot.com/2023/08/jaki-cms-moze-byc-najbardziej.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5R6WzcwIcQcTXXTBOxFxAmoZBjHtNLzXmiGKAww05pd1D3nT6SqV3-UuEY_mL3WR_7ckxEHxO65mwM4zXj6VC4sD9Y30mte5W7_ecMwjAAZDbAP4I7VTVPr4BlA8TTKYwWqC-RGTTsVe8nYfcn5NVqpNUDt5Q_Uts2qcp4GEcD3pBCLiUvxw-PrN8DSA/s72-w640-h335-c/Projekt%20bez%20nazwy%20-%202023-08-16T234015.838.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-8688501812323754046</guid><pubDate>Thu, 03 Aug 2023 15:36:00 +0000</pubDate><atom:updated>2023-08-03T17:41:25.869+02:00</atom:updated><title>Apple iPhone - Jak skanować dokumenty w formacie PDF bez konieczności dodatkowych aplikacji?</title><description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Apple znane jest z tego, że tworzy produkty, które są nie tylko eleganckie, ale także funkcjonalne. Jedną z tych funkcji jest możliwość skanowania dokumentów bezpośrednio na twoim iPhone za pomocą wbudowanej aplikacji &#39;Notatki&#39;. To idealne rozwiązanie dla osób, które często pracują w terenie i potrzebują szybkiego i łatwego sposobu na digitalizację dokumentów.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDv5npOX1N1Ydk5-tbmD5PKvkUIMGTJyV17cbukcB4qda3ZhAetKXXiuL9OBypzldm2LSFQ5FF_ZzOZC7vnKoSt_1vGTUoLBcT8Y0QPvXdZL1eIckGTWxZcNA3hHsbKy7PQXddhScs9okGHve1UVo7dHXfS9KxIjbKHZcbRRsK6S2_UmRuizqp_DZkuCg/s1200/Projekt%20bez%20nazwy%20(31).jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Apple Iphone&quot; border=&quot;0&quot; data-original-height=&quot;628&quot; data-original-width=&quot;1200&quot; height=&quot;334&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDv5npOX1N1Ydk5-tbmD5PKvkUIMGTJyV17cbukcB4qda3ZhAetKXXiuL9OBypzldm2LSFQ5FF_ZzOZC7vnKoSt_1vGTUoLBcT8Y0QPvXdZL1eIckGTWxZcNA3hHsbKy7PQXddhScs9okGHve1UVo7dHXfS9KxIjbKHZcbRRsK6S2_UmRuizqp_DZkuCg/w640-h334/Projekt%20bez%20nazwy%20(31).jpg&quot; title=&quot;Apple Iphone&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Skanowanie dokumentów telefonem iPhone bez instalowania płatnych aplikacji&lt;/h2&gt;&lt;div&gt;Czy wiesz, że Twój iPhone jest nie tylko narzędziem do komunikacji, ale także przenośnym skanerem dokumentów? Dzięki fabrycznie zainstalowanej aplikacji &#39;Notatki&#39; od Apple, instalowanie kosztownych programów do skanowania dokumentów staje się całkowicie zbędne.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Aplikacja Notatki to potężny skaner!&lt;/b&gt;&lt;/h3&gt;&lt;div&gt;Aplikacja &#39;Notatki&#39; pozwala na łatwe skanowanie, zapisywanie dokumentów w formacie PDF i udostępnianie ich, wszystko to bezpośrednio z twojego telefonu. Oto jak to zrobić:&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Krok 1: Otwórz aplikację &#39;Notatki&#39;&lt;/h4&gt;&lt;p&gt;Na swoim iPhone otwórz aplikację &#39;Notatki&#39;. Możesz to zrobić, przesuwając ekran w dół i wpisując &#39;Notatki&#39; w polu wyszukiwania lub znaleźć ikonę aplikacji na swoim ekranie głównym.&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Krok 2: Utwórz nową notatkę&lt;/h4&gt;&lt;p&gt;Po otwarciu aplikacji &#39;Notatki&#39; kliknij ikonę w prawym dolnym rogu, aby utworzyć nową notatkę.&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Krok 3: Skanowanie dokumentu&lt;/h4&gt;&lt;p&gt;W nowej notatce, kliknij na ikonę aparatu, która znajduje się na pasku narzędzi u dołu ekranu.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfirIEpvoLXyzV0mhtB9OZX1vmjmGVX4cq7rU8UNiT99KrIZXznZ4VwubsFmMm5U_t_wlUeUj9ngHMtfH9sg7Efik9qLtBbI7wTJJKfRl_7jCgQA1fB7rlObuvZNlXRQyFmuJlErL7duy8yXmV3-oFGARUedSCrcGGtXtp8pSy3hgK1hyxwHe9Oa6wflY/s2048/364346089_963608614743443_4002264735013054392_n.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Aby zeskanować dokument, w nowej notatce kliknij w ikonę aparatu&quot; border=&quot;0&quot; data-original-height=&quot;2048&quot; data-original-width=&quot;946&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfirIEpvoLXyzV0mhtB9OZX1vmjmGVX4cq7rU8UNiT99KrIZXznZ4VwubsFmMm5U_t_wlUeUj9ngHMtfH9sg7Efik9qLtBbI7wTJJKfRl_7jCgQA1fB7rlObuvZNlXRQyFmuJlErL7duy8yXmV3-oFGARUedSCrcGGtXtp8pSy3hgK1hyxwHe9Oa6wflY/w296-h640/364346089_963608614743443_4002264735013054392_n.jpg&quot; title=&quot;Aby zeskanować dokument, w nowej notatce kliknij w ikonę aparatu&quot; width=&quot;296&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Aby zeskanować dokument, w nowej notatce kliknij w ikonę aparatu&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;p&gt;Następnie wybierz &#39;Skanuj dokumenty&#39;. Twoja kamera uruchomi się i będzie gotowa do skanowania.&lt;/p&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN2j1DKc1QlH477qYZD5tcZxeXWiwNb8UM8LFXgkjz0yIhUgLVJxORDxt6kT33ctAu2KmjYH2ZM2caffy9RPMu0LTr4na5ALaIXyO3l0KjrHXUzu1Fjz11CUjVIh7BUqijrFbkaoTmRux64LJV5yC4hSnhaPz6XYtm_KDx9sM-ZK6PZ5H1gFhX8SEnHsg/s2048/364234613_273863418597312_4074167864706178772_n.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Skanowanie dokumentów w telefonie iPhone - Wybierz skanuj dokumenty&quot; border=&quot;0&quot; data-original-height=&quot;2048&quot; data-original-width=&quot;946&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN2j1DKc1QlH477qYZD5tcZxeXWiwNb8UM8LFXgkjz0yIhUgLVJxORDxt6kT33ctAu2KmjYH2ZM2caffy9RPMu0LTr4na5ALaIXyO3l0KjrHXUzu1Fjz11CUjVIh7BUqijrFbkaoTmRux64LJV5yC4hSnhaPz6XYtm_KDx9sM-ZK6PZ5H1gFhX8SEnHsg/w296-h640/364234613_273863418597312_4074167864706178772_n.jpg&quot; title=&quot;Skanowanie dokumentów w telefonie iPhone - Wybierz skanuj dokumenty&quot; width=&quot;296&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Skanowanie dokumentów w telefonie iPhone - Wybierz skanuj dokumenty&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;p&gt;Umieść dokument, który chcesz zeskanować, na płaskiej powierzchni. Spróbuj utrzymać aparat nad dokumentem tak, aby cały dokument był widoczny na ekranie. iPhone automatycznie wykryje krawędzie dokumentu. Jeśli chcesz to zrobić ręcznie, możesz nacisnąć przycisk migawki.&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Krok 4: Zapisywanie skanu jako PDF&lt;/h4&gt;&lt;p&gt;Po zeskanowaniu dokumentu, możesz dostosować kolor, obrócić go lub przyciąć według własnych preferencji. Kiedy skończysz, kliknij &#39;Zachowaj&#39;. Dokument zostanie zapisany w notatce jako PDF.&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Krok 5: Udostępnianie skanu&lt;/h4&gt;&lt;p&gt;Jeśli chcesz udostępnić skan, kliknij na ikonę udostępniania w prawym górnym rogu ekranu (kwadrat z wychodzącą strzałką). Pojawi się menu z różnymi opcjami udostępniania, w tym wiadomości, e-mail, AirDrop i wiele innych. Wybierz preferowany sposób udostępniania i postępuj zgodnie z instrukcjami.&lt;/p&gt;&lt;p&gt;To jest wszystko! Teraz wiesz, jak skanować dokumenty za pomocą aplikacji &#39;Notatki&#39; na iPhone, zapisywać je jako PDF i udostępniać innym. To proste, szybkie i nie wymaga dodatkowych aplikacji. Z pewnością stanie się to przydatnym narzędziem w Twoim zestawie technologicznym.&lt;/p&gt;</description><link>https://informatyka-porady.blogspot.com/2023/08/apple-iphone-jak-skanowac-dokumenty-w.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDv5npOX1N1Ydk5-tbmD5PKvkUIMGTJyV17cbukcB4qda3ZhAetKXXiuL9OBypzldm2LSFQ5FF_ZzOZC7vnKoSt_1vGTUoLBcT8Y0QPvXdZL1eIckGTWxZcNA3hHsbKy7PQXddhScs9okGHve1UVo7dHXfS9KxIjbKHZcbRRsK6S2_UmRuizqp_DZkuCg/s72-w640-h334-c/Projekt%20bez%20nazwy%20(31).jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-7937477108648113707</guid><pubDate>Wed, 02 Aug 2023 21:22:00 +0000</pubDate><atom:updated>2023-08-02T23:38:44.318+02:00</atom:updated><title>Podłączanie drukarki do Portu USB routera Orange Funbox 6 i dodanie jej w systemie Windows 10</title><description>&lt;p&gt;Drukarki sieciowe zmieniły sposób, w jaki zarówno domy, jak i biura korzystają z technologii druku. W przeszłości, drukarki były zazwyczaj podłączone bezpośrednio do pojedynczego komputera, co ograniczało ich dostępność dla innych użytkowników. Dziś, dzięki urządzeniom takim jak router Funbox 6, można łatwo udostępnić drukarkę wszystkim użytkownikom w sieci lokalnej, podłączając ją do portu USB routera.&lt;/p&gt;&lt;p&gt;Podłączenie drukarki do routera (który umożliwia takie rozwiązanie) ma wiele zalet. Po pierwsze, pozwala na drukowanie z dowolnego urządzenia podłączonego do tej samej sieci, co drukarka, bez konieczności przepinania kabli. Po drugie, eliminuje konieczność utrzymania dodatkowego komputera, do którego drukarka jest bezpośrednio podłączona, w stanie włączonym, tylko po to, aby urządzenie mogło być zawsze dostępne w całej lokalnej sieci. Po trzecie, niektóre drukarki mogą nie posiadać funkcji Wi-Fi, więc podłączenie ich do routera może być jedynym sposobem na umożliwienie drukowania sieciowego.&lt;/p&gt;&lt;p&gt;W tym przewodniku pokażemy, jak podłączyć drukarkę do portu USB na routerze &lt;b&gt;Orange Funbox 6&lt;/b&gt; oraz jak dodać tak podłączoną drukarkę do systemu Windows 10 w lokalnej sieci komputerowej.&amp;nbsp;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Część 1: Podłączanie Drukarki do Routera&lt;/h2&gt;&lt;p&gt;&lt;b&gt;Przygotowanie&lt;/b&gt; - Upewnij się, że drukarka jest włączona i gotowa do użycia. Potrzebujesz też kabla USB do połączenia drukarki z routerem.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Podłączanie drukarki&lt;/b&gt; - Podłącz drukarkę do routera za pomocą kabla USB, wpinając go do portu USB na tylnej stronie routera Funbox 6.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8PKP5G0NJgQ9boFG-8cntSrot8xOnNqqwIVEijRv31kFh7EsUc82Ub9XAZJostXuSWjwPlTS0iBGjJpU-JEoAFjB8uDpVabvEepazJhke2ilLhFVQAWJpVDrdesLnJyRyade4BYPpBYAQAy_jxhOntTSz2V7U9cxMbDfFav_bsZJPKesKuU56jmjRH4M/s1200/Projekt%20bez%20nazwy%20(18).jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Podłącz drukarkę do portu USB routera Funbox&quot; border=&quot;0&quot; data-original-height=&quot;628&quot; data-original-width=&quot;1200&quot; height=&quot;334&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8PKP5G0NJgQ9boFG-8cntSrot8xOnNqqwIVEijRv31kFh7EsUc82Ub9XAZJostXuSWjwPlTS0iBGjJpU-JEoAFjB8uDpVabvEepazJhke2ilLhFVQAWJpVDrdesLnJyRyade4BYPpBYAQAy_jxhOntTSz2V7U9cxMbDfFav_bsZJPKesKuU56jmjRH4M/w640-h334/Projekt%20bez%20nazwy%20(18).jpg&quot; title=&quot;Podłącz drukarkę do portu USB routera Funbox&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Dostęp do ustawień routera -&lt;/b&gt;&amp;nbsp;Na komputerze z odpowiednio skonfigurowanym interfejsem sieciowym (dla tego przykładu jest to sieć 191.168.1/24), wpisz adres IP routera w przeglądarce internetowej. Domyślny adres IP dla routera Funbox 6 to zwykle 192.168.1.1.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Logowanie -&lt;/b&gt;&amp;nbsp;Zaloguj się do routera, używając swojego loginu i hasła. Jeśli nie zmieniałeś tych ustawień, fabrycznie ustawione hasło admina znajdziesz na naklejce umieszczonej na obudowie routera.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Konfiguracja drukarki -&lt;/b&gt;&amp;nbsp;Po zalogowaniu się do routera, przejdź do sekcji &quot;Ustawienia&quot;, a następnie wybierz &quot;USB&quot;. Powinno się tam pojawić informacje o podłączonym urządzeniu. Włącz opcję &quot;Udostępnij drukarkę w sieci&quot;.&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Część 2: Dodawanie udostępnionej w sieci drukarki w systemie Windows 10&lt;/h2&gt;&lt;p&gt;&lt;b&gt;Dostęp do ustawień drukarki -&lt;/b&gt;&amp;nbsp;Na swoim komputerze z systemem Windows 10, otwórz &quot;Ustawienia&quot; (możesz to zrobić, naciskając klawisz Windows + I), a następnie kliknij &quot;Urządzenia&quot;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Dodawanie drukarki -&lt;/b&gt;&amp;nbsp;Kliknij &quot;Drukarki i skanery&quot;, a następnie kliknij &quot;Dodaj drukarkę lub skaner&quot;. &lt;b&gt;Kliknij opcję &quot;Drukarki, której szukam nie ma na liście&quot;.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Konfiguracja połączenia sieciowego&lt;/b&gt; - W następnym kroku, wybierz opcję &quot;Dodaj drukarkę, korzystając z adresu IP lub nazwy hosta&quot;. W polu &quot;Adres hosta lub adres IP&quot; wpisz &lt;b&gt;http://funbox:631&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi3dAS5JFqxgMtbQMJFwSc4rYA7Bqxj4-DTHzHysNcgwr36JiPSu26mZNr1UUJBxaABMj67EvhoL1Fssq6rHdnq-n75KREv-aErVrd3OhzN_doDnk0L2G1wgIg0WPCpCF-cMlOf8gv-Y07ILdJuX7vMFDcmzMDasTrWGdGHBT6Y5A48eAd3JbVHCnQBFk/s1200/httpfunbox631.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Dodawanie drukarki sieciowej w systemie Windows 10 - Drukarki nie ma na liście&quot; border=&quot;0&quot; data-original-height=&quot;628&quot; data-original-width=&quot;1200&quot; height=&quot;335&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi3dAS5JFqxgMtbQMJFwSc4rYA7Bqxj4-DTHzHysNcgwr36JiPSu26mZNr1UUJBxaABMj67EvhoL1Fssq6rHdnq-n75KREv-aErVrd3OhzN_doDnk0L2G1wgIg0WPCpCF-cMlOf8gv-Y07ILdJuX7vMFDcmzMDasTrWGdGHBT6Y5A48eAd3JbVHCnQBFk/w640-h335/httpfunbox631.jpg&quot; title=&quot;Dodawanie drukarki sieciowej w systemie Windows 10 - Drukarki nie ma na liście&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Dodawanie drukarki sieciowej, podłączonej do portu USB routera Orange Funbox 6&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Wybór drukarki&lt;/b&gt; - Zostaniesz poproszony o wybór odpowiedniego sterownika dla swojej drukarki. Wybierz producenta i model drukarki z listy, a następnie kliknij &quot;Dalej&quot;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Zakończenie instalacji &lt;/b&gt;-&amp;nbsp;Wprowadź nazwę dla drukarki i kliknij &quot;Dalej&quot;. Po chwili drukarka powinna być dodana do listy drukarek i skanerów w systemie Windows 10.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Testowanie połączenia -&lt;/b&gt;&amp;nbsp;Aby upewnić się, że konfiguracja przebiegła pomyślnie, otwórz dowolny dokument i spróbuj go wydrukować, wybierając nowo dodaną drukarkę.&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Wnioski&lt;/h2&gt;&lt;div&gt;Podłączenie drukarki do portu USB routera Funbox 6 pozwala na łatwe udostępnienie drukarki dla wszystkich użytkowników sieci. Proces ten może wymagać kilku kroków konfiguracyjnych, ale korzyści płynące z możliwości wygodnego drukowania z dowolnego urządzenia w sieci są tego warte.&lt;/div&gt;</description><link>https://informatyka-porady.blogspot.com/2023/08/podaczanie-drukarki-do-portu-usb.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8PKP5G0NJgQ9boFG-8cntSrot8xOnNqqwIVEijRv31kFh7EsUc82Ub9XAZJostXuSWjwPlTS0iBGjJpU-JEoAFjB8uDpVabvEepazJhke2ilLhFVQAWJpVDrdesLnJyRyade4BYPpBYAQAy_jxhOntTSz2V7U9cxMbDfFav_bsZJPKesKuU56jmjRH4M/s72-w640-h334-c/Projekt%20bez%20nazwy%20(18).jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-7020164406639734187</guid><pubDate>Tue, 01 Aug 2023 15:06:00 +0000</pubDate><atom:updated>2023-08-10T23:30:45.752+02:00</atom:updated><title>ComperiaLead Opinie - Podziel się swoją opinią - Uwaga na ten program partnerski!</title><description>&lt;h1&gt;ComperiaLead: Opinie i poradnik zarabiania&lt;/h1&gt;

&lt;p&gt;Powiada się, że programy partnerskie (przynajmniej niektóre z nich) stanowią doskonałą metodę generowania dodatkowych zysków online. Szczególnie atrakcyjne okazje oferuje sektor finansowy, a ComperiaLead to jeden z najbardziej fascynujących programów partnerskich do rozważenia. W tym obszernym przewodniku zapoznasz się ze wszystkimi niezbędnymi informacjami o ComperiaLead, jego funkcjonowaniu, korzyściach i sposobie partnerstwa. Czy warto współpracować&amp;nbsp; z ComperiaLead? Koniecznie przeczytaj ten przewodnik do końca, abyś mógł rozważyć wszelkie pro i kontra, a następnie podjąć najbardziej odpowiednią decyzję.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;Jakie korzyści przynosi ComperiaLead?&lt;/h2&gt;

&lt;p&gt;ComperiaLead to program partnerski należący do Comperia.pl, jednej z największych porównywarek produktów finansowych w Polsce. Program umożliwia generowanie zysków poprzez polecanie produktów finansowych, takich jak kredyty, pożyczki, konta bankowe czy ubezpieczenia. Więcej informacji na temat programu i oferty można znaleźć na stronie &lt;a href=&quot;https://www.comperialead.pl/&quot;&gt;https://www.comperialead.pl/&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Jak działa ComperiaLead?&lt;/h2&gt;

&lt;p&gt;Program partnerski ComperiaLead działa na podstawie modelu CPA (Cost Per Action), co oznacza, że partnerzy otrzymują prowizję za konkretne akcje, takie jak wypełnienie formularza, złożenie wniosku czy podpisanie umowy.&lt;/p&gt;

&lt;p&gt;Aby rozpocząć współpracę z ComperiaLead jako partner, w pierwszej kolejności należy zarejestrować się na stronie, a następnie uzupełnić dane. Po akceptacji twojej aplikacji otrzymasz dostęp do panelu, w którym znajduje się lista dostępnych produktów finansowych do promocji oraz niezbędne materiały reklamowe.&lt;/p&gt;

&lt;h2&gt;Jakie są korzyści z uczestnictwa w programie ComperiaLead?&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Specjalizacja w branży finansowej:&lt;/strong&gt; ComperiaLead koncentruje się na produktach finansowych, co pozwala partnerom skupić się na jednym temacie i budować swoją pozycję jako eksperta w dziedzinie finansów.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wsparcie dla partnerów:&lt;/strong&gt; ComperiaLead oferuje wsparcie dla swoich partnerów na każdym etapie współpracy, w tym pomoc w wyborze odpowiedniego produktu finansowego, udostępnienie materiałów reklamowych oraz konsultacje marketingowe.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Atrakcyjne prowizje:&lt;/strong&gt; Model CPA pozwala na osiągnięcie konkurencyjnych prowizji, związanych z konkretnymi akcjami użytkowników, takimi jak złożenie wniosku czy podpisanie umowy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Przejrzystość wyników:&lt;/strong&gt; Panel partnera umożliwia śledzenie wyników kampanii, co ułatwia optymalizację działań i zwiększenie zarobków.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wypłaty:&lt;/strong&gt; ComperiaLead oferuje terminowe wypłaty prowizji, co jest istotne dla utrzymania płynności finansowej partnerów.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;Jak zarabiać z ComperiaLead?&lt;/h3&gt;

&lt;p&gt;Aby rozpocząć współpracę z ComperiaLead, wystarczy wykonać kilka prostych kroków:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Rejestracja:&lt;/strong&gt; Przejdź na stronę &lt;a href=&quot;https://www.comperialead.pl/&quot;&gt;https://www.comperialead.pl/&lt;/a&gt; i zarejestruj się jako wydawca. Wypełnij formularz rejestracyjny, podając swoje dane, adres e-mail i hasło.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weryfikacja:&lt;/strong&gt; Po zarejestrowaniu się, otrzymasz e-mail z linkiem do weryfikacji konta. Kliknij w link, aby aktywować swoje konto.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uzupełnienie danych:&lt;/strong&gt; Zaloguj się na swoje konto i uzupełnij dodatkowe dane, takie jak adres strony internetowej, tematyka strony oraz dane kontaktowe.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wybór produktu finansowego:&lt;/strong&gt; Przejrzyj listę dostępnych produktów finansowych i wybierz te, które najlepiej pasują do Twojej strony i odbiorców.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pobranie materiałów reklamowych:&lt;/strong&gt; Po zatwierdzeniu wyboru produktu finansowego, otrzymasz dostęp do materiałów reklamowych, takich jak bannery, linki tekstowe czy dedykowane kody rabatowe.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Promocja:&lt;/strong&gt; Umieść materiały reklamowe na swojej stronie, blogu, w newsletterze czy profilach społecznościowych. Pamiętaj, aby stosować się do zasad programu partnerskiego i dbać o jakość swoich działań.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitorowanie wyników:&lt;/strong&gt; Regularnie sprawdzaj wyniki swojej kampanii w panelu wydawcy, aby optymalizować swoje działania i zwiększać zarobki.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wypłata prowizji:&lt;/strong&gt; Po osiągnięciu minimalnej kwoty wypłaty, możesz zlecić wypłatę prowizji na podany wcześniej rachunek bankowy.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Podsumowanie obietnic jak z bajki&lt;/h2&gt;

&lt;p&gt;Program partnerski ComperiaLead to RZEKOMO atrakcyjna propozycja dla wydawców zainteresowanych zarabianiem na afiliacji w branży finansowej. Dzięki specjalizacji w tej dziedzinie, wsparciu dla wydawców, konkurencyjnym prowizjom oraz przejrzystości wyników, współpraca z ComperiaLead może przynieść znaczące zyski. Jeśli jesteś zainteresowany wykorzystaniem potencjału programów partnerskich w branży finansowej, warto rozważyć współpracę z ComperiaLead. Brzmi nieco bajkowo - nieprawdaż?&lt;/p&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr75zRvjuBTjJpNbDQG4-R1r6mYVhpeDhUQK1OISfViIQ2ynEncD_dRpbEayAXzoRdnEsKDCoaVRwg1wBZ9GXvfvUg3YqeTJxlO-0mT4UvUpQ0ai-m5m1Bg_Qsuf0WHeZBZ7GfzkIUgPfsnytlp5fx4kH_TtjvxIS3DKpUzEevfmej-_RBL_QkOE6GsFs/s1200/Potencjalna%20warto%C5%9B%C4%87%20moich%20wniosk%C3%B3w.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;b&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;628&quot; data-original-width=&quot;1200&quot; height=&quot;335&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr75zRvjuBTjJpNbDQG4-R1r6mYVhpeDhUQK1OISfViIQ2ynEncD_dRpbEayAXzoRdnEsKDCoaVRwg1wBZ9GXvfvUg3YqeTJxlO-0mT4UvUpQ0ai-m5m1Bg_Qsuf0WHeZBZ7GfzkIUgPfsnytlp5fx4kH_TtjvxIS3DKpUzEevfmej-_RBL_QkOE6GsFs/w640-h335/Potencjalna%20warto%C5%9B%C4%87%20moich%20wniosk%C3%B3w.jpg&quot; width=&quot;640&quot; /&gt;&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Potencjalna wartość prowizji z moich wniosków to ponad 6000 zł - W rzeczywistości nie otrzymałem ani grosza!&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;p&gt;Moje doświadczenia z ComperiaLead: Czy warto?&lt;/p&gt;&lt;div class=&quot;blog-post&quot;&gt;

&lt;p&gt;Chciałbym dziś podzielić się z Tobą moimi doświadczeniami związanych z programem partnerskim ComperiaLead. Współpraca z nimi wydawała się obiecująca. Przecież to platforma, która korzysta z innowacji, aby dostarczać produkty finansowe i pozafinansowe na rynek. Niestety, rzeczywistość okazała się zupełnie inna.&lt;/p&gt;

&lt;p&gt;Nie jestem jedyną osobą, która doświadczyła problemów z ComperiaLead. Wielu użytkowników wyraziło negatywne opinie, głównie z powodu dużej liczby odrzucanych wniosków. Osobiście miałem do czynienia z podobnymi problemami. Na moim koncie ComperiaLead, w sumie powiązanych jest 53 wniosków o potencjalnej wartości prowizji wynoszącej ponad 6000 zł. Niestety, niektóre wszystkie zostały odrzucone z niewiadych, tajemniczych dla mnie przyczyn!&lt;/p&gt;

&lt;p&gt;Próbowałem wyjaśnić tę sytuację kilkakrotnie. Wysyłałem e-maile, pisałem na ogólnie dostępny adres kontaktowy w witrynie ComperiaLead, ale niestety, nie otrzymałem odpowiedzi, która by mi pomogła zrozumieć, dlaczego moje wnioski są ciągle odrzucane.&lt;/p&gt;

&lt;p&gt;Wszystko to jest dla mnie frustrujące. Wszystkie moje działania marketingowe zostały wstrzymane od dnia 17/04/2023. Moje doświadczenia z ComperiaLead nie były pozytywne, ale wierzę, że są to problemy, które mogą być naprawione. W końcu, jak mówi stare powiedzenie, z każdego błędu można się nauczyć.&lt;/p&gt;

&lt;p&gt;Jeśli masz doświadczenie z ComperiaLead, podziel się swoją opinią. Twoje doświadczenia mogą pomóc innym zrozumieć, na co powinni być przygotowani.&lt;/p&gt;

&lt;p&gt;Dziękuję za przeczytanie mojego wpisu. Pamiętaj, że Twoja opinia jest cenna, więc nie wahaj się jej podzielić!&lt;/p&gt;
&lt;/div&gt;

&lt;h2&gt;Prawdziwe opinie o ComperiaLead - Rzeczywistość okazała się inna!&lt;/h2&gt;

&lt;p&gt;Doprawdy, myślałem, że współpraca z ComperiaLead będzie przełomem. Z entuzjazmem skierowałem swoje energie na to partnerstwo, przekonany, że to właśnie ten program partnerski otworzy mi drzwi do świata finansowego. Błyskotliwe obietnice atrakcyjnych prowizji i konkurencyjnych produktów finansowych sprawiły, że zdecydowałem się na ten krok.&lt;/p&gt;

&lt;p&gt;Rejestracja była prosta, podobnie jak wypełnienie formularza z moimi danymi. Poświęciłem godziny na przeglądanie dostępnych produktów finansowych, starannie wybierając te, które według mnie najlepiej pasowały do mojej strony i odbiorców. Pobrałem gotowe materiały reklamowe, włożyłem mnóstwo pracy w ich umieszczenie na mojej stronie, blogu, w newsletterze, a nawet na profilach społecznościowych.&lt;/p&gt;

&lt;h3&gt;Czy słynny program partnerski naprawdę dotrzymuje swoich obietnic?&lt;/h3&gt;

&lt;p&gt;Mimo mojego zaangażowania i ciężkiej pracy, zarobki nigdy nie nadeszły. Monitorowałem wyniki kampanii, optymalizowałem swoje działania, ale na moim koncie nie pojawiła się ani jedna złotówka prowizji.&lt;/p&gt;

&lt;p&gt;Pomimo, iż jedna z moich witryn internetowych, na której umieszczałem kreacje ComperiaLead, jest odwiedzana przez 10 do 20 tysięcy osób dziennie, to czas, który poświęciłem na budowanie tej współpracy, okazał się stracony.&lt;/p&gt;

&lt;p&gt;To była nauczka, że nie wszystko, co błyszczy, jest złotem. Zaufałem ComperiaLead, ale niestety, to zaufanie nie zostało wynagrodzone. Teraz patrzę na przyszłość z nadzieją, że znajdę partnerstwo, które naprawdę zasługuje na moje zaangażowanie i wysiłek.&lt;/p&gt;


&lt;div class=&quot;email-content&quot;&gt;

&lt;h3&gt;&quot;Szanowny Panie,&lt;/h3&gt;

&lt;p&gt;pisałem w tej sprawie do Państwa już kilkadziesiąt razy w ciągu ostatnich 2 miesięcy, otrzymując praktycznie zero logicznych i wyjaśniających kwestię odpowiedzi. W załącznikach przesyłam zrzuty ekranu z obecnego stanu moich wniosków.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pozdrawiam&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;L. M. Lattari&quot;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;

&lt;h3&gt;&quot;Witam ponownie!&lt;/h3&gt;

&lt;p&gt;Piszę do Państwa po raz nie wiem który! Tym razem chciałem tylko poinformować, że cała ta sprawa zostanie przekazana odpowiednim Urzędom do głębszego zbadania, po czym prawdopodobnie zajmą się nią media.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Miłego dnia!&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;

&lt;h3&gt;&quot;Witam ponownie!&lt;/h3&gt;

&lt;p&gt;Od wielu miesięcy moje wnioski są rozpatrywane i po kolei odrzucane - jeden po drugim. Czy można w końcu się od Państwa dowiedzieć jaka jest przyczyna takiej sytuacji? Czemu WSZYSTKIE wnioski (już około 50) są odrzucane?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pozdrawiam,&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;L. M. Lattari&quot;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;

&lt;h3&gt;&quot;Witam ponownie!&lt;/h3&gt;

&lt;p&gt;Przypominam, iż cały czas oczekuję na wyjaśnienie kwestii moich wniosków. Niektóre z nich są z początku marca. Kiedy mogę się spodziewać wyjaśnienia tej sprawy?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pozdrawiam&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;

&lt;h3&gt;&quot;Dzień Dobry!&lt;/h3&gt;

&lt;p&gt;Kiedy mogę się spodziewać rozliczenia wniosków z początku marca? Wciąż są w trakcie weryfikacji, a mamy już prawie czerwiec :-) hehehehehe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pozdrawiam&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;


&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Jeśli temat Cię zainteresował...&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-align: left;&quot;&gt;Jeśli temat wiarygodności ComperiaLead wydaje Ci się ciekawy i warty dalszego zagłębienie, zapraszam do lektury artykułu pt.&amp;nbsp;&lt;b&gt;&lt;a href=&quot;https://skarbnik.info/poradniki/uwaga-na-comperialead-opinie-o-firmie&quot;&gt;Opinie o ComperiaLead - Uwaga na ten program partnerski! Stanowczo odradzam!&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;h1 style=&quot;background-color: white; box-sizing: border-box; color: #212529; font-family: system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;Noto Sans&amp;quot;, &amp;quot;Liberation Sans&amp;quot;, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 2.5rem; font-weight: 500; line-height: 1.2; margin: 0px 0px 0.5rem;&quot;&gt;&lt;span style=&quot;background-color: transparent; font-size: x-large;&quot;&gt;Feedback na temat ComperiaLead&lt;/span&gt;&lt;/h1&gt;

&lt;p&gt;ComperiaLead to sieć afiliacyjna, która przekształca innowacje w dochody, dostarczając innowacyjne narzędzia do prezentacji produktów finansowych i pozafinansowych dostępnych na rynku. Wyróżniając się na tle konkurencji, ComperiaLead oferuje unikalne widgety, które często są niedostrzegane przez inne platformy.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;W ostatnim czasie jednak, ComperiaLead napotkało na kilka problemów, które nie pozostały niezauważone. Internauci wyraźnie wyrazili swoje negatywne opinie, głównie z powodu dużej liczby odrzuconych wniosków. Chociaż jest to wyzwanie dla platformy, jest to również szansa na rozwój i poprawę.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Prośba o prawdziwe opinie&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Drogi Czytelniku,&lt;/div&gt;&lt;div class=&quot;request&quot;&gt;

    &lt;p&gt;Twoje doświadczenia i opinie są dla nas niezwykle cenne. Jeśli miałaś/miałeś do czynienia z programem partnerskim ComperiaLead, prosimy o podzielenie się swoją historią. Bez względu na to, czy Twoje doświadczenia były pozytywne czy negatywne, pragniemy je poznać.&lt;/p&gt;

    &lt;p&gt;Twoja opinia pomoże innym użytkownikom zrozumieć, czego mogą się spodziewać po współpracy z ComperiaLead. Prosimy, aby Twoje komentarze były szczegółowe i oparte na rzeczywistych doświadczeniach. Pamiętaj, że Twoja opinia może pomóc komuś podjąć ważną decyzję.&lt;/p&gt;
    
    &lt;p&gt;Z góry dziękujemy za poświęcony czas i szczerość.&lt;/p&gt;
&lt;/div&gt;
</description><link>https://informatyka-porady.blogspot.com/2023/08/comperialead-opinie-podziel-sie-swoja.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr75zRvjuBTjJpNbDQG4-R1r6mYVhpeDhUQK1OISfViIQ2ynEncD_dRpbEayAXzoRdnEsKDCoaVRwg1wBZ9GXvfvUg3YqeTJxlO-0mT4UvUpQ0ai-m5m1Bg_Qsuf0WHeZBZ7GfzkIUgPfsnytlp5fx4kH_TtjvxIS3DKpUzEevfmej-_RBL_QkOE6GsFs/s72-w640-h335-c/Potencjalna%20warto%C5%9B%C4%87%20moich%20wniosk%C3%B3w.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Polska</georss:featurename><georss:point>51.919438 19.145136</georss:point><georss:box>23.609204163821154 -16.011114 80.229671836178852 54.301386</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-6621949136854660787</guid><pubDate>Sat, 01 Jun 2019 12:50:00 +0000</pubDate><atom:updated>2019-06-09T15:59:02.497+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">hosting</category><title>Wielka awaria hostingu OVH</title><description>&lt;br /&gt;
&lt;h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Drogi OVH – prawda boli, ale muszę o tym napisać&lt;/span&gt;&lt;/h2&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;OVH&lt;/b&gt;&lt;/span&gt; jest firmą hostingową cieszącą się świetnymi opiniami wśród specjalistów
z branży IT. Moim zdaniem, które opiera się na osobistych doświadczeniach, jest
to wielogłowy kolos, w którym panuje prawdziwy chaos i brak skupienia uwagi na potrzebach klienta.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Skoro taka jest moja opinia na temat &lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;OVH&lt;/b&gt;&lt;/span&gt;, to
czemu powierzyłem hosting mojej najbardziej ruchliwej witryny &lt;a href=&quot;http://zdrowepasje.pl/&quot;&gt;zdrowepasje.pl&lt;/a&gt; akurat
tej firmie? Otóż właśnie dlatego, że większość osób z mojej branży zawodowej bardzo
dobrze się na jej temat wypowiadało i nadal to robi. Ślepo zaufałem moim kolegom, ale
niestety wynikło z tego jedynie to, że OVH w dużej mierze mnie zawiodło! &lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Po przykrych przejściach z kilkoma firmami hostingowymi,
takimi jak słynne i słusznie zniesławione &lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;home.pl&lt;/b&gt;&lt;/span&gt;, czy przewrażliwiony na
punkcie spamu i ataków hakerskich, a przy tym absurdalnie opancerzony &lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;superhost.pl&lt;/b&gt;&lt;/span&gt;,
postanowiłem przenieść jedną z moich bardziej ruchliwych witryn na &lt;b&gt;OVH&lt;/b&gt;. W
związku z faktem, że profesjonalna usługa hostingowa, jaką posiadałem w firmie
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;Superhost&lt;/b&gt;&lt;/span&gt; i za którą płaciłem ponad 600 zł rocznie, okazała się być
niewystarczająca dla jednego z moich serwisów web – serwer odcinał dostęp do
usługi przy około 30-40 jednoczesnych wizytach w witrynie – postanowiłem
przenieść się do rzekomo bardziej wiarygodnej (zdaniem moich kolegów) firmy,
jaką miała być OVH. Po zapoznaniu się z ofertą, wybrałem pakiet &lt;span style=&quot;background: white; color: #273b54; letter-spacing: 0.1pt;&quot;&gt;&lt;b&gt;perf2014x1&lt;/b&gt;, który obecnie kosztuje mnie około 640 zł
rocznie. Ponieważ moja witryna zdrowepasje.pl jest dość popularna – mam około
5000 wizyt dziennie – dopłacam niecałe 50 zł miesięcznie za dodatkowe zasoby. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;background: white; color: #273b54; letter-spacing: 0.1pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaQXg0gHU1VmgZujk4iCZxxu31aPGcjM9wJKXa2wqTfB8XtoEcjC9J5bTgSK01jks4gw24skpSksQY_JOCkv8bq5wb06xgmfrFFZ4r3uSUlKkeIbwfLwcWbyKhF33JrdnwLOEmvZ0SzjA/s1600/hh11.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;656&quot; data-original-width=&quot;1549&quot; height=&quot;270&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaQXg0gHU1VmgZujk4iCZxxu31aPGcjM9wJKXa2wqTfB8XtoEcjC9J5bTgSK01jks4gw24skpSksQY_JOCkv8bq5wb06xgmfrFFZ4r3uSUlKkeIbwfLwcWbyKhF33JrdnwLOEmvZ0SzjA/s640/hh11.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;background: white; color: #273b54; letter-spacing: 0.1pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;background: white; color: #273b54; letter-spacing: 0.1pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;background: white; color: #273b54; letter-spacing: 0.1pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;W sumie mój główny serwis
na &lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;OVH&lt;/span&gt;&lt;/b&gt; działa szybko i sprawnie. Po wykupieniu dodatkowych zasobów - które są mi przydzielane dynamicznie w razie potrzeby, nie występują jakiekolwiek przekroczenia limitów nawet przy jednoczesnych 100-150 wizytach w witrynie. Wydajność usług jest
prawdziwym plusem w przypadku wybranego przeze mnie pakietu. Niestety, nie
można powiedzieć tego samego o ich dostępności!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;background: white; color: #273b54; letter-spacing: 0.1pt;&quot;&gt;Całkowity koszt utrzymania
mojego serwisu na OVH to ponad 1200 zł rocznie.&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;
&lt;/span&gt;Czy wydając takie pieniądze i stawiając na tak popularną firmę
hostingową jak OVH można mieć pewność, że nasz serwis web będzie przez cały
czas dostępny? &lt;/span&gt;Okazuje się, że odpowiedź na to pytanie brzmi jednoznacznie
NIE. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Jestem z &lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;OVH&lt;/span&gt;&lt;/b&gt; od ponad roku. Wielokrotnie, mając potrzebę
skontaktowania się z działem technicznym, korzystałem z udostępnianych w panelu
klienta formularzy oraz z komórki. Na niektóre odpowiedzi dotyczące poruszonych
przeze mnie kwestii czekałem tygodniami! Zdarzało się również, że telefoniczny
kontakt z firmą graniczył się z cudem, zwłaszcza w okresach poprzedzających dni
wolne od pracy. &lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaFthyphenhyphenzFzMebLnD6ySYh4p-o0Xn6Tte0q4LIBVvB-QEKBNDAA8JOFnJVpxj4CILeXW5cf65Nwe3A4yu5iiq59rWrC1UGJUyIC0RXKlxXDkSDcsDZhFUxi3tFOVm461AsoFpHHz1oXyqsc/s1600/ovh-odpowiedz.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Awaria OVH - odpowiedź na moje zgłoszenie&quot; border=&quot;0&quot; data-original-height=&quot;796&quot; data-original-width=&quot;1076&quot; height=&quot;472&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaFthyphenhyphenzFzMebLnD6ySYh4p-o0Xn6Tte0q4LIBVvB-QEKBNDAA8JOFnJVpxj4CILeXW5cf65Nwe3A4yu5iiq59rWrC1UGJUyIC0RXKlxXDkSDcsDZhFUxi3tFOVm461AsoFpHHz1oXyqsc/s640/ovh-odpowiedz.png&quot; title=&quot;Awaria OVH - odpowiedź na moje zgłoszenie&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Dnia 31/05/2019 miała miejsce wielka &lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;awaria&lt;/b&gt;&lt;/span&gt; hostingu pod
znakiem &lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;OVH&lt;/span&gt;&lt;/b&gt;. &lt;b&gt;Pomimo wysokich kosztów, jakie ponoszę za jego utrzymanie online, mój serwis www nie był dostępny przez około 4 godziny.&lt;/b&gt; Przy
tak wysokich kosztach, tego typu sytuacja jest niedopuszczalna. Oto, co w trakcie awarii widziały osoby próbujące wyświetlić zawartość stron mojej witryny:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ1sn6zv7dnQcgCQwAV7Z5taf-4Lv6r2h_L1tiN9WOsNT1k5gqMgVM42G3_BXC8YpAIPr7m7FKRPT3vJrSktnit8dkqrMPPz7iOvRyqKbYMJVwFoDk0u5aonHPfasT-GLJZqmvOWraLz8/s1600/Screenshot_20190531_161833_com.android.chrome.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;969&quot; data-original-width=&quot;467&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ1sn6zv7dnQcgCQwAV7Z5taf-4Lv6r2h_L1tiN9WOsNT1k5gqMgVM42G3_BXC8YpAIPr7m7FKRPT3vJrSktnit8dkqrMPPz7iOvRyqKbYMJVwFoDk0u5aonHPfasT-GLJZqmvOWraLz8/s640/Screenshot_20190531_161833_com.android.chrome.jpg&quot; width=&quot;308&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Wielka szkoda, że &quot;hosting&quot; w trakcie czterogodzinnej i niezapowiedzianej konserwacji w godzinach popołudniowych zapomniał dodać, że jego nazwa brzmi &lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;OVH!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmkCmtmhUO1NkIPWpWnULnMhfDnKhnBhTBvGm7LuVM84Y4ZV1931NJGsqMrJmi2X5Tg1MUtid-PPIv74UHswH_9Sr7FidIIh1NktCtyNH0UZWvpiwBOlksRxX14JUO0H3k2OakdCI0Tzw/s1600/ovh-awaria.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;830&quot; data-original-width=&quot;1600&quot; height=&quot;330&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmkCmtmhUO1NkIPWpWnULnMhfDnKhnBhTBvGm7LuVM84Y4ZV1931NJGsqMrJmi2X5Tg1MUtid-PPIv74UHswH_9Sr7FidIIh1NktCtyNH0UZWvpiwBOlksRxX14JUO0H3k2OakdCI0Tzw/s640/ovh-awaria.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Drogi czytelniku mojego bloga! Skoro artykuł Cie nie zanudził i jakoś doszedłeś do tego miejsca, to najwyraźniej oznacza, że interesujesz się kwestiami związanymi z hostingiem web. Czy po zapoznaniu się przedstawionymi powyżej faktami zaufasz
firmie OVH? A jeśli nie, to jaką firmę hostingową polecasz z własnego doświadczenia?&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;h3&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;OVH: nie ma gwarancji na działanie usług&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;Jakość udzielanej pomocy w hostingu OVH jest żałosna. Do działu pomocy technicznej można się dodzwonić - tylko teoretycznie - od poniedziałku do piątku, bodajże od 8 do 17. W praktyce jednak dobicie się do konsultanta graniczy się z cudem. Bywa tak, że po dokonaniu wyboru tematu rozmowy na klawiaturze telefonu, połączenie się urywa, słyszymy komunikat &quot;opcja jest niedostępna&quot;, lub zwyczajnie nikt się nie zgłasza.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;Po pracach technicznych, które miały miejsce w efekcie wielkiej piątkowej awarii, problemy wcale się nie zakończyły, jak zresztą widać z utworzonych przeze mnie zgłoszeń:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC3XLvfI_SNESuB2ha4LDotaVr5pguj9sGhkyD-VT7ZNul5ZY12W898xu6Kd9oA7TSHv03gJMh6wc04s0AuTXD_69R78EskERtcgOlDRnfroG5f96tU4ARKpwa1dFo_stv7LSzjYYvpAs/s1600/ovh-zgloszenia.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;778&quot; data-original-width=&quot;1579&quot; height=&quot;314&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC3XLvfI_SNESuB2ha4LDotaVr5pguj9sGhkyD-VT7ZNul5ZY12W898xu6Kd9oA7TSHv03gJMh6wc04s0AuTXD_69R78EskERtcgOlDRnfroG5f96tU4ARKpwa1dFo_stv7LSzjYYvpAs/s640/ovh-zgloszenia.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Jedna z ciekawszych i najbardziej zaskakujących odpowiedzi, jakie otrzymałem od firmy OVH Polska brzmi następująco:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGlSVFZTMI2YiHNrgYWmHtMWcD1IVbncFfqMaTMe117VE2lX1CHTWvH-1I6rHSxQhhR6xS6f7xk3gXPqdJvtuCgcwsUNCSzfb_5vJjP6GkNYBneP675pvPnQPXyZFXpSrYdUXonDCXst4/s1600/SLA.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;300&quot; data-original-width=&quot;715&quot; height=&quot;268&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGlSVFZTMI2YiHNrgYWmHtMWcD1IVbncFfqMaTMe117VE2lX1CHTWvH-1I6rHSxQhhR6xS6f7xk3gXPqdJvtuCgcwsUNCSzfb_5vJjP6GkNYBneP675pvPnQPXyZFXpSrYdUXonDCXst4/s640/SLA.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;b&gt;Proszę o Wasze zdania w komentarzach!&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;</description><link>https://informatyka-porady.blogspot.com/2019/06/wielka-awaria-hostingu-ovh.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaQXg0gHU1VmgZujk4iCZxxu31aPGcjM9wJKXa2wqTfB8XtoEcjC9J5bTgSK01jks4gw24skpSksQY_JOCkv8bq5wb06xgmfrFFZ4r3uSUlKkeIbwfLwcWbyKhF33JrdnwLOEmvZ0SzjA/s72-c/hh11.jpg" height="72" width="72"/><thr:total>12</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-1601392378289836079</guid><pubDate>Tue, 05 Dec 2017 10:49:00 +0000</pubDate><atom:updated>2017-12-05T11:49:32.796+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PowerShell</category><title>Wysyłanie wiadomości Email z PowerShell</title><description>Bywają sytuację, w których zależy nam na szybkim skorzystaniu z wiersza poleceń, na przykład aby niezawodnie wysłać wiadomość Email z komputera na którym ciężko jest uruchomić cokolwiek innego. Z doświadczenia wiem dobrze, że takie sytuacje zdarzają się nierzadko.&lt;br /&gt;
&lt;br /&gt;
Czy wiedziałeś, że istnieje możliwość wysyłania wiadomości Email z wiersza poleceń PowerShell systemu Windows? Tak. Istnieje taka możliwość, a na dodatek jest to banalnie proste, pod warunkiem oczywiście, że mamy połączenie z internetem. Już wyjaśniam jak to zrobić.&lt;br /&gt;
&lt;br /&gt;
W Windows PowerShell &lt; v 2.0 wysyłanie wiadomości Email było nieco trudniejsze, lecz dziś można się w tym zakresie cieszyć sporym ułatwieniem. 
Od wersji 2.0 PowerShell&#39;a, do wysyłania wiadomości Email w tym środowisku służy nam cmdlet
  
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Send-MailMessage&lt;/div&gt;
&lt;br /&gt;
Ten cmdlet może być stosowany na kilka różnych sposobów, a oto jego najbardziej popularne parametry: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
– Attachments (łańcuch)&lt;br /&gt;
Pełna ścieżka i nazwy plików, które mają zostać dołączone do wiadomości e-mail.&lt;br /&gt;
&lt;br /&gt;
–Bcc (łańcuch)&lt;br /&gt;
Pole BCC, zawierające adresatów.&lt;br /&gt;
&lt;br /&gt;
–Body&lt;br /&gt;
Ciało (treść) wiadomości.&lt;br /&gt;
&lt;br /&gt;
–BodyAsHtml&lt;br /&gt;
Tej opcji należy użyć jeśli ciało wiadomości ma zostać wysłane jako HTML.&lt;br /&gt;
&lt;br /&gt;
–Cc (łańcuch)&lt;br /&gt;
Pole CC, zawierające adresatów.&lt;br /&gt;
&lt;br /&gt;
–Credential (PSCredential)&lt;br /&gt;
Konto, które ma uprawnienia do wysyłania wiadomości e-mail. Domyślnym kontem jest bieżący użytkownik.&lt;br /&gt;
&lt;br /&gt;
–DeliveryNotificationOption Opcja&lt;br /&gt;
Powiadomienia o dostarczeniu zostaną wysłane na adres e-mail podany w parametrze -From.&lt;br /&gt;
&lt;br /&gt;
Możliwe opcje DeliveryNotificationOption:&lt;br /&gt;
&lt;br /&gt;
None – Brak Powiadomienia (domyśłnie)&lt;br /&gt;
OnSuccess - Powiadom, jeśli dostawa zakończyła się powodzeniem.&lt;br /&gt;
OnFailure - Powiadom, jeśli dostawa nie zakończyła się powodzeniem.&lt;br /&gt;
Opóźnienie - Powiadom, jeśli dostawa jest opóźniona.&lt;br /&gt;
Nigdy - Nigdy nie powiadamiaj.&lt;br /&gt;
&lt;br /&gt;
–Encoding Kodowanie&lt;br /&gt;
Kodowanie używane dla ciała i tematu&lt;br /&gt;
&lt;br /&gt;
–From (łańcuch)&lt;br /&gt;
Adres Email, z którego wysyłana jest poczta.&lt;br /&gt;
&lt;br /&gt;
–Priority Priorytet&lt;br /&gt;
Low, Normal, Hogh&lt;br /&gt;
&lt;br /&gt;
–SmtpServer (łańcuch)&lt;br /&gt;
Serwer smtp, stosoway do wysyłania wiadomości&lt;br /&gt;
&lt;br /&gt;
–Subject (łańcuch)&lt;br /&gt;
Temat wiadomości&lt;br /&gt;
&lt;br /&gt;
–To (łańcuch)&lt;br /&gt;
Adresat - adres email adresata wiadomości&lt;br /&gt;
&lt;br /&gt;
–UseSsl&lt;br /&gt;
Zastosuj protokół Secure Sockets Layer (SSL) aby nawiązać połączenie z serwerem SMTP i wysłać wiadomość e-mail. SSL nie jest domyślnie używany.&lt;/div&gt;
&lt;br /&gt;
Nie trzeba tych parametrów dogłębnie studiować. Jak już wspomniałem wcześniej, wysyłanie wiadomości Email z PowerShell jest banalnie proste. Zobaczmy jak to działa na prostym przykładzie. Zauważymy, że w poniższym przykładzie będzie konieczne wprowadzenie poświadczeń dla serwera SMTP w okienku pojawiającym się natychmiast po zatwierdzeniu polecenia: 
 
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHgRsFUkCaTk6CC37CZqeBxiUU1HzEwBod0OAF6aRQQTLnVXTDfd-OJU24mGIx8y5j6DK4BqNlGnOv9OlP05IBNgo4rlyCbZsZ5KLH-wTJDomcG4-Ya_sWv9ZG5lufCC18SAIAaBOyibE/s1600/powershell.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;169&quot; data-original-width=&quot;579&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHgRsFUkCaTk6CC37CZqeBxiUU1HzEwBod0OAF6aRQQTLnVXTDfd-OJU24mGIx8y5j6DK4BqNlGnOv9OlP05IBNgo4rlyCbZsZ5KLH-wTJDomcG4-Ya_sWv9ZG5lufCC18SAIAaBOyibE/s1600/powershell.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyUhWixy296fwzQKpL0eGNaRgmrWxfRepXNBo3eE63YXw6a8ZKdZ1DqhSm-wVJOyqdWUTonNqnlzJt9mIDipuUAsYaHGM7djbIWYQlkAjP1ZKSG7ZAeI40EzoAp8yTHOOECsl5xhyphenhyphen1EfE/s1600/powershell2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;262&quot; data-original-width=&quot;579&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyUhWixy296fwzQKpL0eGNaRgmrWxfRepXNBo3eE63YXw6a8ZKdZ1DqhSm-wVJOyqdWUTonNqnlzJt9mIDipuUAsYaHGM7djbIWYQlkAjP1ZKSG7ZAeI40EzoAp8yTHOOECsl5xhyphenhyphen1EfE/s1600/powershell2.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
A oto przykładowy kod cmdleta Send-EmailMesage wraz z przykładowymi wartościami parametrów, które możesz dostosować do własnych potrzeb, aby szybko i efektownie wysyłać wiadomości Email bezpośrednio ze środowiska PowerShell:

&lt;div class=&quot;code&quot;&gt;$From = &quot;adminexample.com&quot;&lt;br /&gt;
$To = &quot;user1@example.com&quot;&lt;br /&gt;
$Cc = &quot;user2@example.com&quot;&lt;br /&gt;
$Attachment = &quot;C:\temp\file.txt&quot;&lt;br /&gt;
$Subject = &quot;Wiadomość testowa&quot;&lt;br /&gt;
$Body = &quot;Treść przykładowej wiaodmości&quot;&lt;br /&gt;
$SMTPServer = &quot;smtp.example.com&quot;&lt;br /&gt;
$SMTPPort = &quot;587&quot;&lt;br /&gt;
Send-MailMessage -From $From -to $To -Cc $Cc -Subject $Subject `&lt;br /&gt;
-Body $Body -SmtpServer $SMTPServer -port $SMTPPort -UseSsl `&lt;br /&gt;
-Credential (Get-Credential) -Attachments $Attachment&lt;/div&gt;&lt;br /&gt;

Aby przetestować wysyłanie wiadomości Email z poziomu Windows PowerShell skopiuj i wklej powyższy kod do notatnika, dostosuj parametry do własnych potrzeb, skopiuj i wklej całość do okienka PowerShell, a następnie wprowadź poświadczenia konta SMTP. W przypadku wątpliwości lub jakichkolwiek pytań proszę o komentarze!</description><link>https://informatyka-porady.blogspot.com/2017/12/wysyanie-wiadomosci-email-z-powershell.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHgRsFUkCaTk6CC37CZqeBxiUU1HzEwBod0OAF6aRQQTLnVXTDfd-OJU24mGIx8y5j6DK4BqNlGnOv9OlP05IBNgo4rlyCbZsZ5KLH-wTJDomcG4-Ya_sWv9ZG5lufCC18SAIAaBOyibE/s72-c/powershell.jpg" height="72" width="72"/><thr:total>17</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-925499211822192109</guid><pubDate>Sun, 03 Dec 2017 16:03:00 +0000</pubDate><atom:updated>2020-02-21T17:54:18.485+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Hardware</category><title>Ubezpieczenie sprzętu elektronicznego - Oto jak firmy robią nas w konia!</title><description>Przy zakupie nowego laptopa bądź innego przenośnego sprzętu elektronicznego spora ilość konsumentów decyduje się na wykupienie specjalnego ubezpieczenia, które zdaniem sprzedawcy miało by pokryć koszty naprawy w &quot;każdym przypadku uszkodzenia&quot;.  &lt;br /&gt;
&lt;br /&gt;
Sprzedawcy chętnie nakłaniają klientów do &quot;zainwestowania&quot; w ubezpieczenie sprzętu elektronicznego, zapewniając, że daje ono całkowitą ochronę w przypadku zalania, pęknięcia, całkowitego zniszczenia itp. Wydając niemałą sumę pieniędzy na sprzęt elektroniczny, bardzo łatwo jest ulec takim sugestiom i wydać dodatkową kwotę na ubezpieczenie, szczególnie w przypadku gdy sprzedający zapewnia, że zabezpieczy ono konsumenta w przypadku wystąpienia uszkodzeń mechanicznych, które jak wiadomo, są najczęstszą przyczyną odmów naprawy sprzętu w ramach gwarancji. Swoją drogą jakiś czas temu opublikowałem &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/04/serwis-lenovo-uszkodzenie-mechaniczne.html&quot;&gt;artykuł dotyczący popularnych nieuczciwych praktyk serwisów gwarancyjnych&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij44ctRYFRrQXIe9oXrpQW2j5I9SKfcOJ_EELNXgRWhWjMvYcQaiwf0BXmBzGzwj5YUt4MhrFRmuzlnwdugcfUMQqybYloET4kWILD8gSsG6d0cSQIuHX7T6CKYgT1ccURqtsSlFXeoC0/s1600/laptop-broken-screen.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1024&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij44ctRYFRrQXIe9oXrpQW2j5I9SKfcOJ_EELNXgRWhWjMvYcQaiwf0BXmBzGzwj5YUt4MhrFRmuzlnwdugcfUMQqybYloET4kWILD8gSsG6d0cSQIuHX7T6CKYgT1ccURqtsSlFXeoC0/s320/laptop-broken-screen.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Najczęściej ubezpieczenie sprzętu elektronicznego jest nam oferowane w sklepach dużych sieci handlowych, takich jak Saturn czy Media Markt. Prowizja, jaką otrzymują sklepy od towarzystw ubezpieczeniowych za pośrednictwo w takiej sprzedaży polis jest niemała. Sklepy i sprzedawcy bardzo dobrze zarabiają na takich produktach i dlatego zawsze proponują je klientom kupującym drogą elektronikę. Cena takiego ubezpieczenia zależy od jego wariantu, ale jest zawsze wysoka i często może sięgać ponad 25% wartości zakupionego sprzętu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-kQ1DztaqzF4a-Sez9uUelXitOl3ZHQNto9C6d2vxvCx1qLIRnUNjw9ibBrmVKjd7tE-Oa8mUEIDlyziQ-7zaHyDB1kuAM8SYl7qZXtkix9YWJ-Rfww40kw4TmK7j81NxIyysAKdY7bI/s1600/saturn.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;674&quot; data-original-width=&quot;969&quot; height=&quot;278&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-kQ1DztaqzF4a-Sez9uUelXitOl3ZHQNto9C6d2vxvCx1qLIRnUNjw9ibBrmVKjd7tE-Oa8mUEIDlyziQ-7zaHyDB1kuAM8SYl7qZXtkix9YWJ-Rfww40kw4TmK7j81NxIyysAKdY7bI/s400/saturn.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
To jedno wielkie oszustwo&lt;/h2&gt;
&lt;br /&gt;
Bardzo niewiele ochrony za bardzo wysoką składkę - tak o ubezpieczeniach sprzętu elektronicznego mówi mec. Aleksander Daszewski z Biura Rzecznika Finansowego.&lt;br /&gt;
&lt;br /&gt;
Z oficjalnego raportu wynika, iż obecnie do Rzecznika Finansowego wpływa średnio ponad 60 skarg miesięcznie w związku z ubezpieczeniami elektroniki zakupionymi w sklepach dużych sieci handlowych. Ale to tylko znikoma ilość przypadków, w świetle ogromnej ilości wprowadzonych w błąd konsumentów, którzy z różnych powodów nie decydują się złożyć skargi, pomimo odmowy odszkodowania ze strony zakładu ubezpieczeń. W rzeczywistości, niemalże w każdym przypadku roszczenia odszkodowania ze strony konsumenta, towarzystwo ubezpieczeniowe znajduje powód by stanowczo odmówić. Wyjątkiem są drobne szkody, w których wystarczy wymiana tanich elementów, takich jak obudowa, głośnik, złącze itp. itp&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWTFlRKv-2_M_HFRbPALhZ9oTlrSMZPIZVmLOz_KgsX1_LOnuS7uS8jcQNEojWHcJq6KRsClGiG851cEvLD1LDS9w5Es4ifb7wVtr8NsI3oQXySA3l5vGIo9OFuz97qCf_M5sh4Q7eukY/s1600/Raport_Rzecznika_Finansowego__ubezpieczenia_sprzetu_elektronicznego__22462.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Ubezpieczenie sprzętu elektronicznego: skargi złożone przez konsumentów&quot; border=&quot;0&quot; data-original-height=&quot;360&quot; data-original-width=&quot;585&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWTFlRKv-2_M_HFRbPALhZ9oTlrSMZPIZVmLOz_KgsX1_LOnuS7uS8jcQNEojWHcJq6KRsClGiG851cEvLD1LDS9w5Es4ifb7wVtr8NsI3oQXySA3l5vGIo9OFuz97qCf_M5sh4Q7eukY/s1600/Raport_Rzecznika_Finansowego__ubezpieczenia_sprzetu_elektronicznego__22462.JPG&quot; title=&quot;Ubezpieczenie sprzętu elektronicznego: skargi złożone przez konsumentów&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Ubezpieczenie sprzętu elektronicznego: skargi złożone przez konsumentów. Źródło: Rzecznik Finansowy&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
W świetle oficjalnie złożonych przez konsumentów skarg najgorzej wypadają towarzystwa ubezpieczeniowe Ergo Hestia, Warta, Europa, PZU i Allianz.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Zapoznaj się z treścią OWU&lt;/h2&gt;
&lt;br /&gt;
Przed podjęciem decyzji o zakupie ubezpieczenia elektroniki naprawdę warto jest zapoznać się z treścią OWU - Ogólne Warunki Ubezpieczenia.  Decydująca dla określenia zakresu odpowiedzialności ubezpieczyciela jest definicja &quot;przypadkowego uszkodzenia&quot;, widniejąca w OWU. &lt;strong&gt;Odszkodowanie jest przyznawane tylko i wyłącznie w takich przypadkach&lt;/strong&gt;, a definicja tego typu zdarzenia brzmi następująco:&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&quot;Za przypadkowe uszkodzenie uważa się uszkodzenie ubezpieczonego sprzętu wskutek nieszczęśliwego wypadku lub przepięcia prądu&quot;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Według OWU &quot;nieszczęśliwym wypadkiem&quot; jest natomiast:&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&quot;Nagłe zdarzenie wywołane przyczyną zewnętrzną, wskutek którego uszkodzeniu uległ ubezpieczony sprzęt, który w chwili tegoż wypadku był użytkowany w sposób zgodny z instrukcją obsługi&quot;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Zastanów się! Komu by się to opłacało?&lt;/h2&gt;
&lt;br /&gt;
Nie łudź się, że wykupując polisę ubezpieczeniową sprzętu elektronicznego, zostanie ci przyznane odszkodowanie w każdym przypadku uszkodzenia sprzętu. Zastanów się! Gdyby tak było, towarzystwa ubezpieczeniowe już dawno by zbankrutowały! Nikomu nie opłacało by się takie rozwiązanie i nikt by na tym nie zarobił. Większa część składek opłacanych przez posiadaczy tego typu polis przeznaczona jest na zapłatę prowizji pośredników, czyli sklepów oferujących konsumentom polisę!&lt;br /&gt;
&lt;br /&gt;
Towarzystwa ubezpieczeniowe znajdują różne przyczyny odmowy odszkodowania, a niestety niemal zawsze są one zgodne z prawem. Rzecz w tym, że większość konsumentów - przeważnie ogarnięta zakupowym szałem - w ogóle nie analizuje treści OWU przed podjęciem decyzji o zawarciu umowy.&lt;br /&gt;
&lt;br /&gt;
Bywają dziwne przypadki odmów odszkodowania jak przykładowo uznanie, że 16-miesięczne dziecko „celowo i umyślnie&quot; wrzuciło laptopa do wanny - źródło: Rzecznik Finansowy. Gdy taką argumentację eksperci Rzecznika obalili, ubezpieczyciel próbował odmówić wypłaty, powołując się na to, że zgodnie z instrukcją obsługi laptopa, baterie powinny być przechowywane poza zasięgiem dzieci!  
Najczęstszą przyczyną odmowy odszkodowania ze strony towarzystw ubezpieczeniowych jest brak opisanego wyżej, tak zwanego &lt;strong&gt;czynnika zewnętrznego&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
Oto lista przykładowych sytuacji, w których o odszkodowaniu możesz sobie tylko pomarzyć: 
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Popijałeś wodę i niechcący zalałeś laptopa lub telefon&lt;/li&gt;
&lt;li&gt;Laptop, tablet bądź telefon wypadł ci z rąk i się rozwalił&lt;/li&gt;
&lt;li&gt;Nadepnąłeś niechcący na laptopa&lt;/li&gt;
&lt;li&gt;Biegłeś z laptopem, potknąłeś się i rozwaliłeś go całkowicie&lt;/li&gt;
&lt;li&gt;Twój pies lub kot obsikał ci laptopa, a ten przestał działać&lt;/li&gt;
&lt;li&gt;Telefon (np. Xperia) trzymałeś w tylnej kieszeni spodni i zgniotłeś go gdy usiadłeś&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Czemu w powyższych sytuacjach możesz zapomnieć o odszkodowaniu, nawet jeśli posiadasz drogi wariant polisy? Otóż, zgodnie z definicją nieszczęśliwego wypadku i czynnika zewnętrznego, wylanie wody na laptopa lub inny sprzęt wynika wyłącznie z nieostrożności użytkownika i nie ma tu mowy o jakimkolwiek czynniku zewnętrznym. Upadek laptopa wskutek niepodjęcia właściwych środków ostrożności nie kwalifikuje się jako nieszczęśliwy wypadek, lecz wynika z winy użytkownika. Obsikanie laptopa przez psa też jest wynikiem niezachowania należytych środków ostrożności. Podobne wnioski można wyciągnąć dla pozostałych okoliczności, które widnieją na liście.&lt;br /&gt;
&lt;br /&gt;
Największym problemem jest wprowadzanie konsumentów w błąd, jakoby ubezpieczenie pokrywało koszty zniszczenia sprzętu w każdym przypadku. To jest zupełnie niezgodne z rzeczywistością. Taka sytuacja wynika głównie z nieznajomości OWU ze strony sprzedawców kierujących się głównie motywem prowizyjnym lub ich chęci szybkiego zysku. Prowizje dla sklepów sięgają nawet 70% płaconych przez klienta składek. Bardzo często sprzedawcy są dodatkowo wynagradzani za uzyskany w ten sposób dochód.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Jak uzyskać odszkodowanie&lt;/h2&gt;
&lt;br /&gt;
W przypadku odmowy odszkodowania w ramach ubezpieczenia elektroniki należy złożyć pisemną reklamację do towarzystwa ubezpieczeniowego. W przypadku negatywnego rozpatrzenia reklamacji ze strony towarzystwa ubezpieczeniowego warto skontaktować się z &lt;a href=&quot;https://rf.gov.pl/sprawy-biezace/Raport_Rzecznika_Finansowego__ubezpieczenia_sprzetu_elektronicznego__22462&quot;&gt;Rzecznikiem Finansowym&lt;/a&gt;, który w większości przypadków jest w stanie skutecznie pomóc konsumentom. </description><link>https://informatyka-porady.blogspot.com/2017/12/podstepne-warunki-ubezpieczenia-sprzetu.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij44ctRYFRrQXIe9oXrpQW2j5I9SKfcOJ_EELNXgRWhWjMvYcQaiwf0BXmBzGzwj5YUt4MhrFRmuzlnwdugcfUMQqybYloET4kWILD8gSsG6d0cSQIuHX7T6CKYgT1ccURqtsSlFXeoC0/s72-c/laptop-broken-screen.png" height="72" width="72"/><thr:total>39</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-7949630254071140659</guid><pubDate>Sat, 02 Dec 2017 20:29:00 +0000</pubDate><atom:updated>2017-12-04T21:12:39.730+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Laravel</category><category domain="http://www.blogger.com/atom/ns#">php</category><title>Laravel od Podstaw: kompozytor widoku</title><description>W poprzedniej części szkolenia p.t. &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/12/laravel-od-podstaw-szablony-widokow-i.html&quot;&gt;Szablony widoków i style CSS&lt;/a&gt; nauczyliśmy się pracować ze złożonymi szablonami widoków. Zobaczyliśmy jak uprościć sobie pracę w przypadku widoków złożonych z wielu sekcji, takich jak menu nawigacyjne, boczna kolumna, stopka, zawartość główna. W tej części szkolenia zaprezentuję kolejną ważną ciekawostkę ułatwiającą pracę z widokami, a mowa będzie o Laravel View Composer, czyli o kompozytorze widoków.&lt;br /&gt;
&lt;br /&gt;
Czym jest Laravel View Compser? Otóż wyobraźmy sobie że zawartość naszej szkoleniowej prawej kolumny widoku powinna być dynamiczna. Niech to będzie przykładowo lista najnowszych postów. Załóżmy, że taka lista powinna się wyświetlać w prawej kolumnie w każdym widoku witryny. Pamiętając część szkolenia dotyczącą sposobu przekazywania wartości zmiennych do widoków, teoretycznie moglibyśmy do każdego z widoków, który zawiera prawą boczną kolumnę, przekazać tego typu listę postów, uzyskaną za pomocą przygotowanej w tym celu metody naszej klasy Post. To by zadziałało, ale nie było by to najlepsze rozwiązanie zadania, ponieważ powielanie kodu nie należy do dobrych praktyk programistycznych. W rzeczywistości wyglądało by to paskudnie, gdyby w każdej z funkcji zwracającej widok mielibyśmy się powtarzać: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;nbsp;public function index() {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;$posts = Post::all();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;$newest = Post::newest(5);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;return view(&#39;posts.index&#39;, compact(&#39;posts&#39;, &#39;newest&#39;));&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;} 
&lt;br /&gt;
&lt;br /&gt;
public function create() {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $newest = Post::newest(5);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return view(&#39;posts.create&#39;, compact(&#39;newest&#39;));&lt;br /&gt;
&lt;br /&gt;
} 
&lt;/div&gt;
&lt;br /&gt;
Na szczęście jest na to lepsze rozwiązanie, a kod powyższych metod można uprościć: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;nbsp;public function index() {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;$posts = Post::all();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;return view(&#39;posts.index&#39;, compact(&#39;posts&#39;));&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;} 
&lt;br /&gt;
&lt;br /&gt;
public function create() {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return view(&#39;posts.create&#39;);&lt;br /&gt;
&lt;br /&gt;
} 
&lt;/div&gt;
&lt;br /&gt;
Zanim jednak przejdę do najważniejszej części tego tematu, przedstawię metodę Post::newest(), czyli funkcję zwracającą żądaną ilość najnowszych postów. Metoda znajdująca się wewnątrz ciała klasy Post, czyli w pliku app/Post.php wygląda następująco: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;nbsp;public static function newest($n) {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return static::latest(&#39;created_at&#39;)-&amp;gt;take($n)-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;} 
&lt;/div&gt;
&lt;br /&gt;
Powyższa funkcja typu static zwraca listę postów uporządkowanych malejąco według ich czasu utworzenia, czyli na samej górze listy znajdują się najnowsze posty. Lista zawiera ostatnie $n postów. W parametrze $n możemy zapodać limit listy postów.&lt;br /&gt;
&lt;br /&gt;
Zakładając, że w miejscu :n wstawimy wartość $n, efekt zastosowanych w naszej funkcji metod Eloquent&#39;a jest taki sam jak w przypadku zapytania SQL:

&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
SELECT * from posts order by created_at desc limit :n&lt;/div&gt;
&lt;br /&gt;
Gdy projektujemy tego typu metodę warto ją sobie przetestować interaktywnie w php artisan tinker. Zobaczmy jak działa metoda Post::newest():

&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia2u5qJZiR037V1oDnVyDVSPO4qFEq5X0ZwrdgzW4HWKth2cnCsw1p-VZqZjHTlUoOdjw3IO69zjm3W1Cico530hMb8K3tkcArn09Z5UbvTfF0taX3b2uIgcV7pChwGV8yqW-FmcejMJw/s1600/1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;787&quot; data-original-width=&quot;620&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia2u5qJZiR037V1oDnVyDVSPO4qFEq5X0ZwrdgzW4HWKth2cnCsw1p-VZqZjHTlUoOdjw3IO69zjm3W1Cico530hMb8K3tkcArn09Z5UbvTfF0taX3b2uIgcV7pChwGV8yqW-FmcejMJw/s1600/1.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;
Modyfikujemy szablon widoku prawej kolumny&lt;/h2&gt;
&lt;br /&gt;
Aby lista najnowszych postów mogła się prawidłowo wyświetlać w prawej kolumnie widoku, należy odpowiednio dopasować nasz szkoleniowy szablon widoku. Dostosujmy więc omówiony w poprzednim szkoleniu szablon kolumny bocznej do następującego stanu: 

&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;lt;aside class=&quot;col-sm-3 ml-sm-auto blog-sidebar&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;div class=&quot;sidebar-module&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;h4&amp;gt;Najnowsze posty&amp;lt;/h4&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;ol class=&quot;list-unstyled&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @foreach ($newest as $post)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href=&quot;{{asset(&#39;/posty/&#39;.$post-&amp;gt;id)}}&quot;&amp;gt;{{$post-&amp;gt;title}}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @endforeach&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/aside&amp;gt;&amp;lt;!-- /.blog-sidebar --&amp;gt; 
&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;
Kompozytor widoku&lt;/h2&gt;
&lt;br /&gt;
Funkcje kompozytora widoku to wywołania zwrotne lub metody klasy wywoływane podczas renderowania widoku. Jeśli masz dane, które chcesz powiązać z widokiem za każdym razem, gdy widok jest renderowany, kompozytor widoku może pomóc uporządkować tę logikę w jednym miejscu.
Aby w naszym szkoleniowym przykładzie wywoływanie metody Post::newest() nie było konieczne z osobna dla każdego widoku w skład którego wchodzi nasza szkoleniowa lista postów, z pomocą przychodzi nam Laravel View Composer. 
Zobaczmy jak to działa w praktyce! Wewnątrz metody boot() w pliku  
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
app/Providers/AppServiceProvider.php&lt;/div&gt;
należy umieścić następującą funkcję, która ma za zadanie przekazać do widoku bocznej kolumny listę najnowszych pięciu postów, uzyskaną poprzez metodę Post::newest(): 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
view()-&amp;gt;composer(&#39;layouts.aside&#39;, function($view) {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $view-&amp;gt;with(&#39;newest&#39;, Post::newest(5));&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;}); 
&lt;/div&gt;
&lt;br /&gt;
Nie zapomnijmy na samej górze pliku, przed deklaracją klasy, umieścić  
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
use App\Post;&lt;/div&gt;
&lt;br /&gt;
Zobaczmy teraz jakie efekty przyniosła nasza praca:
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw1xQlkDKtDobiUoFbC9xu_5XvGxB4y75_mwcjR2_yRPZvAPR_1RFe6_4xQgGbiPKpWqz3V6U_HsQUpUENK0V7l_8vwkoXCHVGvMvpPk93UNHSY1sInF-y1Ga1QQOHwaSfUkwMzaHIay8/s1600/2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Nasz szkoleniowy widok listy postów&quot; border=&quot;0&quot; data-original-height=&quot;627&quot; data-original-width=&quot;1600&quot; height=&quot;251&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw1xQlkDKtDobiUoFbC9xu_5XvGxB4y75_mwcjR2_yRPZvAPR_1RFe6_4xQgGbiPKpWqz3V6U_HsQUpUENK0V7l_8vwkoXCHVGvMvpPk93UNHSY1sInF-y1Ga1QQOHwaSfUkwMzaHIay8/s640/2.jpg&quot; title=&quot;Nasz szkoleniowy widok listy postów&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Nasz szkoleniowy widok listy postów&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHpcukfOhXLGoi6GJhafF95u5h38KTRgG7pbaKi2sNfVF-GI__u9tunF-jH_bh_34MZXGuNXDVGX1X50n6t9_1pf2y6BNMgGqfVQKgrLLq443DMIsTAhUxH1-6MdOxPcxiCQ8Y_bYWfzo/s1600/3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Nasz szkoleniowy widok zawartości posta&quot; border=&quot;0&quot; data-original-height=&quot;626&quot; data-original-width=&quot;1600&quot; height=&quot;250&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHpcukfOhXLGoi6GJhafF95u5h38KTRgG7pbaKi2sNfVF-GI__u9tunF-jH_bh_34MZXGuNXDVGX1X50n6t9_1pf2y6BNMgGqfVQKgrLLq443DMIsTAhUxH1-6MdOxPcxiCQ8Y_bYWfzo/s640/3.jpg&quot; title=&quot;Nasz szkoleniowy widok zawartości posta&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Nasz szkoleniowy widok zawartości posta&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA3bJKNRZLUrSkfhqMrkL5xGHK4Oj5KFnBrbz3YMuZ82sLzz8XMwjxn6af_BNf_oXYydgyQqbALSX82ww-L37PReFQcqpmvpHfei_XkpA17l1yAJoJoQua-uZKf0UN4Q8N-WdNgYK_mK8/s1600/4.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Nasz szkoleniowy widok tworzenia nowego posta&quot; border=&quot;0&quot; data-original-height=&quot;686&quot; data-original-width=&quot;1600&quot; height=&quot;274&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA3bJKNRZLUrSkfhqMrkL5xGHK4Oj5KFnBrbz3YMuZ82sLzz8XMwjxn6af_BNf_oXYydgyQqbALSX82ww-L37PReFQcqpmvpHfei_XkpA17l1yAJoJoQua-uZKf0UN4Q8N-WdNgYK_mK8/s640/4.jpg&quot; title=&quot;Nasz szkoleniowy widok tworzenia nowego posta&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Nasz szkoleniowy widok tworzenia nowego posta&lt;br /&gt;
&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;
&lt;br /&gt;&lt;/h2&gt;
&lt;h2&gt;
Podsumowanie&lt;/h2&gt;
&lt;br /&gt;
W tej części szkolenia poznaliśmy kompozytor widoku, którego stosowanie ułatwia nam pisanie czystego i niepowielającego się kodu. W kolejnej części szkolenia mam zamiar opisać podstawowe mechanizmy uwierzytelniania w Laravel.


</description><link>https://informatyka-porady.blogspot.com/2017/12/laravel-od-podstaw-kompozytor-widoku.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia2u5qJZiR037V1oDnVyDVSPO4qFEq5X0ZwrdgzW4HWKth2cnCsw1p-VZqZjHTlUoOdjw3IO69zjm3W1Cico530hMb8K3tkcArn09Z5UbvTfF0taX3b2uIgcV7pChwGV8yqW-FmcejMJw/s72-c/1.jpg" height="72" width="72"/><thr:total>12</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-5671922927401594693</guid><pubDate>Fri, 01 Dec 2017 17:23:00 +0000</pubDate><atom:updated>2017-12-02T21:32:00.401+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Laravel</category><category domain="http://www.blogger.com/atom/ns#">php</category><title>Laravel od podstaw: szablony widoków i style CSS</title><description>W poprzednich częściach szkolenia nauczyliśmy się, między innymi,  jak tworzyć trasy, widoki i kontrolery zasobów. Dowiedzieliśmy się jak odczytywać dane z tabeli bazy danych i przekazywać je do widoków oraz jak zapisywać w tabeli bazy danych informacje wprowadzane przez użytkowników do formularza HTML. Omówiłem również walidację formularzy oraz zabezpieczenia przed atakami CSRF – Cross-SIte Request Forgery. &lt;br /&gt;
&lt;br /&gt;
Moje przykłady były bardzo uproszczone, szczególnie jeśli chodzi o elementy HTML oraz stylizację CSS widoków. Sądzę, że nadszedł już czas aby zająć się i tym aspektem frameworka Laravel.&lt;br /&gt;
&lt;br /&gt;
W niniejszej części szkolenia wprowadzę temat widoków z szablonami oraz arkuszy CSS w Laravel. Zademonstruję te podstawowe front-endowe aspekty Laravel korzystając z szablonu HTML udostępnionego w witrynie https://getbootstrap.com/, który postaramy się razem odtworzyć w Laravel, zachowując podobne zasady strukturalne, czyli menu nawigacyjne, prawą kolumnę, zawartość główną oraz stopkę. &lt;br /&gt;
&lt;br /&gt;
Dla celów niniejszej części szkolenia wykorzystam szablon Bootstrap&#39;a, który wygląda tak: 

&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBfH9cDxPrcZIWg5dR6NdnCFcr0QYKOdQnTwZnkKlZNRVy-9RsuxndYUjDoUh08EMmZSaDX6laiT_pFOfbV3nyp24L_o0i10_8sA-Qv9GFpJyb_3sAC579OPlqOXc5wZoV12hFOVoHY8c/s1600/1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Przykładowy szablon Bootstrap&quot; border=&quot;0&quot; data-original-height=&quot;799&quot; data-original-width=&quot;1600&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBfH9cDxPrcZIWg5dR6NdnCFcr0QYKOdQnTwZnkKlZNRVy-9RsuxndYUjDoUh08EMmZSaDX6laiT_pFOfbV3nyp24L_o0i10_8sA-Qv9GFpJyb_3sAC579OPlqOXc5wZoV12hFOVoHY8c/s640/1.jpg&quot; title=&quot;Przykładowy szablon Bootstrap&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Przykładowy szablon Bootstrap&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Zachęcam do zapoznania się ze &lt;a href=&quot;https://getbootstrap.com/docs/4.0/examples/blog/&quot;&gt;strukturą tego szablonu&lt;/a&gt;. W tym celu warto podejrzeć i przeanalizować jego kod HTML.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Złożone widoki i szablony w Laravel&lt;/h2&gt;
&lt;br /&gt;
Załóżmy, że projektujemy witrynę internetową, wizualnie złożoną z menu, zawartości głównej, prawej kolumny bocznej oraz stopki. Załóżmy w celach szkoleniowych, że menu, prawa kolumna oraz stopka mają mieć zawsze taką samą zawartość, niezależnie od podstrony, natomiast zawartość główna ma się zmieniać w zależności od otwieranej podstrony. Oczywiście, że nie ma sensu powielać kodu HTML menu, prawej kolumny, bądź stopki na każdej z podstron. Jak do tej kwestii podejść w środowisku Laravel? Przejdźmy teraz do praktyki.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Do dzieła&lt;/h2&gt;
&lt;br /&gt;
Aby rozpocząć stwórzmy sobie w przestrzeni naszej aplikacji szkoleniowej katalog zawierający tak zwane szablony widoków aplikacji. Osobiście chętnie umieszczam szablony pod resources/views/layouts względem głównego katalogu aplikacji. Tworzymy katalog szablonów: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
resources/views/layouts&lt;/div&gt;
&lt;br /&gt;
Następnie stwórzmy nasz główny szablon, na którym będą się opierały wszystkie widoki naszej aplikacji. Można tego typu szablon nazwać przykładowo master.blade.php, a następnie zapiszmy nasz szablon w katalogu szablonów, czyli: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
resources/views/layouts/master.blade.php&lt;/div&gt;
&lt;br /&gt;
Zakładam, że czytelnicy śledzili poprzednie części szkolenia i wiedzą co oznacza w Laravel i jaką pełni funkcję rozszerzenie .blade. Jeśli nie, zachęcam do zapoznania się z tym tematem.&lt;br /&gt;
&lt;br /&gt;
Ponieważ nasza szkoleniowa struktura witryny ma się opierać na szablonie Bootstrap&#39;a, warto załączyć główne style CSS Bootstrap&#39;a korzystając z udostępnianego w tym celu przez Bootstrapa CDN&#39;a, a następnie style CSS konkretnego szablonu zapisać lokalnie na serwerze aplikacji.&lt;br /&gt;
&lt;br /&gt;
W celach związanych z niniejszym tematem szkolenia, kod html naszego przykładowego szablonu Bootstrap&#39;a dzielę na kilka części i zapisuję je w katalogu resources/views/layouts: 
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;master.blade.php - szablon główny&lt;/li&gt;
&lt;li&gt;nav.blade.php - menu nawigacyjne&lt;/li&gt;
&lt;li&gt;aside.blade.php - prawa kolumna boczna&lt;/li&gt;
&lt;li&gt;footer.blade.php - stopka&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Style CSS Bootstrap&#39;a załączam jako odnośnik CDN w master.blade.php i dodaję odnośnik do lokalnego arkusza CSS ze stylami wybranego szablonu, który zachowuję w pliku public/css/blog.css&lt;br /&gt;
&lt;br /&gt;
Kod naszego szablonu głównego master.blade.php, czyli podstawowego szablonu naszej aplikacji web, wygląda następująco: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1, shrink-to-fit=no&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;meta name=&quot;description&quot; content=&quot;&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;meta name=&quot;author&quot; content=&quot;&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;title&amp;gt;Szablon Bootstrap w Laravel&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;!-- Główne style CSS Bootstrap - CDN --&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;beta.2/css/bootstrap.min.css&quot;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; integrity=&quot;sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb&quot;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; crossorigin=&quot;anonymous&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;!-- Style CSS tego szablonu Bootstrap --&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;{{ asset(&#39;css/blog.css&#39;) }}&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; {{-- W tym miejscu szablon menu --}}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;@include(&#39;layouts.nav&#39;)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;main role=&quot;main&quot; class=&quot;container&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;div class=&quot;row&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;div class=&quot;col-sm-8 blog-main&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {{-- To jest miejsce na dynamiczną zawartość główną --}}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {{-- Tu pojawia się zawartość bloku o nazwie &#39;content&#39; --}}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @yield(&#39;content&#39;)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&amp;lt;!-- /.blog-main --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @include(&#39;layouts.aside&#39;)&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&amp;lt;!-- /.row --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/main&amp;gt;&amp;lt;!-- /.container --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;{{-- Tutaj szablon stopki --}}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;@include(&#39;layouts.footer&#39;)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
Zawartość nav.blade.php: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;lt;header&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;lt;div class=&quot;blog-masthead&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div class=&quot;container&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;nav class=&quot;nav&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;a class=&quot;nav-link active&quot; href=&quot;#&quot;&amp;gt;Home&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;a class=&quot;nav-link&quot; href=&quot;#&quot;&amp;gt;About&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/nav&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;lt;div class=&quot;blog-header&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div class=&quot;container&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;h1 class=&quot;blog-title&quot;&amp;gt;The Bootstrap Blog&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;p class=&quot;lead blog-description&quot;&amp;gt;An example blog template&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/header&amp;gt;&lt;/div&gt;
&lt;br /&gt;
Zawartość aside.blade.php: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;lt;aside class=&quot;col-sm-3 ml-sm-auto blog-sidebar&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;div class=&quot;sidebar-module sidebar-module-inset&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;h4&amp;gt;About&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;p&amp;gt;Etiam porta &amp;lt;em&amp;gt;sem malesuada magna&amp;lt;/em&amp;gt; mollis euismod.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;div class=&quot;sidebar-module&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;h4&amp;gt;Archives&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;ol class=&quot;list-unstyled&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;March 2014&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;February 2014&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;January 2014&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;div class=&quot;sidebar-module&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;h4&amp;gt;Elsewhere&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;ol class=&quot;list-unstyled&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;GitHub&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;Twitter&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;Facebook&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/aside&amp;gt;&amp;lt;!-- /.blog-sidebar --&amp;gt;&lt;/div&gt;
&lt;br /&gt;
Zawartość footer.blade.php: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;lt;footer class=&quot;blog-footer&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;p&amp;gt;Blog template built for &amp;lt;a href=&quot;https://getbootstrap.com/&quot;&amp;gt;Bootstrap&amp;lt;/a&amp;gt; by &amp;lt;a href=&quot;https://twitter.com/mdo&quot;&amp;gt;@mdo&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;p&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;a href=&quot;#&quot;&amp;gt;Back to top&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;lt;/footer&amp;gt;&lt;/div&gt;
&lt;br /&gt;
Następnie, aby wykorzystać stworzony system szablonów w naszej szkoleniowej aplikacji, zmieniam zawartość wszystkich widoków - nad którymi pracowaliśmy w poprzednich częściach szkolenia - w przedstawiony poniżej sposób.&lt;br /&gt;
&lt;br /&gt;
Widok listy postów index.blade.php: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
@extends(&#39;layouts.master&#39;)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;@section(&#39;content&#39;)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;h1&amp;gt;Lista postów&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;@foreach ($posts as $post)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href=&quot;posty/{{ $post-&amp;gt;id }}&quot;&amp;gt;{{ $post-&amp;gt;title&amp;nbsp; }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;@endforeach&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;@endsection&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyteNCQBavx4QmzXc2w7t5B-UUXsyQct485pLuLFS7ZEJ-mpeX1tDRkPoW0ryJ4VLlUMZJQhtagE5hTweswCrl553lvM4j4A0zHaghajyXJ3TCI8y2FbtETvDvunFN0HP8NwX5OTG_kzs/s1600/2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Nasz nowy szkoleniowy widok listy postów&quot; border=&quot;0&quot; data-original-height=&quot;805&quot; data-original-width=&quot;1600&quot; height=&quot;322&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyteNCQBavx4QmzXc2w7t5B-UUXsyQct485pLuLFS7ZEJ-mpeX1tDRkPoW0ryJ4VLlUMZJQhtagE5hTweswCrl553lvM4j4A0zHaghajyXJ3TCI8y2FbtETvDvunFN0HP8NwX5OTG_kzs/s640/2.jpg&quot; title=&quot;Nasz nowy szkoleniowy widok listy postów&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Nasz nowy szkoleniowy widok listy postów&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Widok zawartości posta show.blade.php: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
@extends(&#39;layouts.master&#39;)&lt;br /&gt;
&lt;br /&gt;
@section(&#39;content&#39;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;lt;h1&amp;gt;{{$post-&amp;gt;title}}&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;p&amp;gt;{{ $post-&amp;gt;body }}&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@endsection&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMcPZPuIhy3maSy0niD0PSReNARXEjYwqSaoHnWy6S3QBYAsBXIw-S4GeyMAvFf9rQOMVxbwZlRUK_aiYCoLLA8Ix324u7Bi0I1vOJNhOZjA4z8SSH8ioZcXQxxVMxJMkyDuez3sqXEuE/s1600/3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Nasz nowy widok zawartości posta&quot; border=&quot;0&quot; data-original-height=&quot;796&quot; data-original-width=&quot;1600&quot; height=&quot;318&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMcPZPuIhy3maSy0niD0PSReNARXEjYwqSaoHnWy6S3QBYAsBXIw-S4GeyMAvFf9rQOMVxbwZlRUK_aiYCoLLA8Ix324u7Bi0I1vOJNhOZjA4z8SSH8ioZcXQxxVMxJMkyDuez3sqXEuE/s640/3.jpg&quot; title=&quot;Nasz nowy widok zawartości posta&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Nasz nowy widok zawartości posta&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Widok formularza nowego posta: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
@extends(&#39;layouts.master&#39;)&lt;br /&gt;
&lt;br /&gt;
@section(&#39;content&#39;)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;lt;form method=&quot;POST&quot; action=&quot; {{asset(&#39;/posty&#39;)}} &quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;{{ csrf_field() }}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;div class=&quot;form-group&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;label for=&quot;title&quot;&amp;gt;Tytuł:&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;title&quot; name=&quot;title&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;div class=&quot;form-group&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;label for=&quot;body&quot;&amp;gt;Treść:&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;textarea id=&quot;body&quot; class=&quot;form-control&quot; name=&quot;body&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;div class=&quot;form-group&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&amp;gt;Zapisz&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;li&amp;gt;{{$error}}&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @endforeach&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@endsection&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwjt3lqTpBPgBqAN8BSltiZZirH8eEFvS76rCR-9RUvpet8xLb8FR7qiJKmZ0p03jwIhyj8XlTa4YyTMubIGIc_JM8L8-zgZjMdZA0lLxoG4NeKA6eqVLkI7mAstPPeTnNsFK20sbSlZQ/s1600/4.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Nasz nowy widok tworzenia posta&quot; border=&quot;0&quot; data-original-height=&quot;796&quot; data-original-width=&quot;1600&quot; height=&quot;318&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwjt3lqTpBPgBqAN8BSltiZZirH8eEFvS76rCR-9RUvpet8xLb8FR7qiJKmZ0p03jwIhyj8XlTa4YyTMubIGIc_JM8L8-zgZjMdZA0lLxoG4NeKA6eqVLkI7mAstPPeTnNsFK20sbSlZQ/s640/4.jpg&quot; title=&quot;Nasz nowy widok tworzenia posta&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Nasz nowy widok tworzenia posta&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Jak to działa?&lt;/h2&gt;
&lt;br /&gt;
W widoku głównym umieściłem kilka funkcji PHP. Funkcja include() ma standardowy efekt PHP include(), czyli załącza określoną zawartość w miejscu jej wywołania. Ciekawym rozwiązaniem Laravel&#39;a jest natomiast funkcja yield(), która określa miejsce wstawienia do szablonu zawartości obecnej w określonym bloku kodu, oznaczonym funkcjami section() i endsection() w pliku widoku, który rozszerza zawartość szablonu funkcją extends().&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Podsumowanie&lt;/h2&gt;
&lt;br /&gt;
W tej części szkolenia pokazałem jak korzystać z szablonów w przypadku nieco złożonej struktury witryn internetowych. Na przykładzie szablonu HTML Bootstrap&#39;a zbudowałem szkoleniowy przykładowy szablon, opatrzony w arkusze CSS Bootstrap&#39;a oraz zastosowałem w jego widokach odpowiednie klasy CSS. Efektem jest przykład widoków, ze strukturą złożoną z sekcji stałych oraz dynamicznej zawartości głównej, która się zmienia w zależności od otwieranej podstrony. Jest to oczywiście przykład szkoleniowy, lecz można go swobodnie dostosować do własych potrzeb.&lt;br /&gt;
&lt;br /&gt;
W kolejnych częściach szkolenia powrócę do spraw back-endowych i bardziej złożonych zagadnień Laravel&#39;a.&lt;br /&gt;&lt;br /&gt;
Serdecznie zapraszam do kolejnej części szkolenia Laravel od podstaw, p.t. &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/12/laravel-od-podstaw-kompozytor-widoku.html&quot;&gt;Kompozytor widoku&lt;/a&gt;  
 
 
 
  </description><link>https://informatyka-porady.blogspot.com/2017/12/laravel-od-podstaw-szablony-widokow-i.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBfH9cDxPrcZIWg5dR6NdnCFcr0QYKOdQnTwZnkKlZNRVy-9RsuxndYUjDoUh08EMmZSaDX6laiT_pFOfbV3nyp24L_o0i10_8sA-Qv9GFpJyb_3sAC579OPlqOXc5wZoV12hFOVoHY8c/s72-c/1.jpg" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-8671065057299453486</guid><pubDate>Thu, 30 Nov 2017 15:50:00 +0000</pubDate><atom:updated>2017-12-01T18:25:17.927+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Laravel</category><category domain="http://www.blogger.com/atom/ns#">php</category><title>Laravel od podstaw: zapis danych z formularza</title><description>W &lt;a href=&quot;https://www.blogger.com/blogger.g?blogID=4892242742838504581&quot; https:=&quot;&quot; informatyka-porady.blogspot.com=&quot;&quot; laravel-od-podstaw-kontrolery-zasobow.html=&quot;&quot;&gt;poprzedniej części szkolenia, pt. Kontrolery zasobów&lt;/a&gt; przedstawiłem ogólny zarys kontrolerów zasobów oraz opisałem korzyści płynące z ich stosowania w środowisku Laravel. W tej części skupię się na opisie przykładowej procedury zachowania w tabeli bazy danych informacji wprowadzanych do formularza.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Tworzymy prosty formularz HTML i widok formularza&lt;/h2&gt;
&lt;br /&gt;
Aby rozpocząć przygotuję prosty formularz HTML, bez dodatkowej stylizacji, ponieważ stylami i zaawansowanymi widokami mam zamiar zając się w kolejnych części szkolenia. Zakładając, iż czytelnik zapoznał się z poprzednimi częściami szkolenia i wykonał opisanie w nich czynności, takie jak migracje i wprowadzanie szkoleniowych danych do tabeli, niniejsza część szkolenia stanowi kontynuację poprzednich części. Stworzę więc prosty formularz, poprzez który będzie można wprowadzać nowe posty do tabeli bazy danych.&lt;br /&gt;
&lt;br /&gt;
Nasz szkoleniowy formularz HTML, zachowany w pliku 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
resources/views/posts/nowy.blade.php&lt;/div&gt;
względem katalogu głównego naszej szkoleniowej aplikacji, może wyglądać następująco: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;lt;form method=&quot;POST&quot; action=&quot; {{asset(&#39;/posty&#39;)}} &quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;{{ csrf_field() }}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;label for=&quot;title&quot;&amp;gt;Tytuł:&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;input type=&quot;text&quot; id=&quot;title&quot; name=&quot;title&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;label for=&quot;body&quot;&amp;gt;Treść:&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;textarea id=&quot;body&quot; name=&quot;body&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;lt;div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;button type=&quot;submit&quot;&amp;gt;Zapisz&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;lt;/body&amp;gt;&lt;/div&gt;
&lt;br /&gt;
Są dwa aspekty powyższego formularza, na które należy zwrócić szczególną uwagę, ponieważ są one związane ściśle ze środowiskiem Laravel.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Pole CSRF&lt;/h3&gt;
&lt;br /&gt;
Laravel ułatwia ochronę aplikacji przed atakami polegającymi na fałszowaniu żądań między witrynami (CSRF). Ataki typu &quot;cross-site request&quot; są rodzajem złośliwego exploita polegającego na wykonywaniu nieautoryzowanych poleceń w imieniu uwierzytelnionego użytkownika.&lt;br /&gt;
&lt;br /&gt;
Funkcja csrf_field() wywołana w formularzu, ma za zadanie wstawić do formularza ukryte pole z wartością, która po wysłaniu formularza będzie porównywana z wartością zachowaną w specjalnie stworzoznej w celach kontrolnych zmiennej sesyjnej. Możemy podejrzeć źródło strony formularza, a wówczas zobaczymy, iż w formularzu widnieje element ukrytego pola z wartością w postaci długiego ciągu znaków. Jeśli do naszego formularza nie dodamy tej funkcji, wysłanie go nie będzie możliwe.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Akcja formularza&lt;/h3&gt;
&lt;br /&gt;
Jak zapewne czytelnicy dobrze wiedzą, atrybut action określa w formularzu HTML adres url, na który ma zostać wysłane żądanie HTTP formularza. W naszym przypadku będzie to żądanie typu POST, skierowane do adresu określonego przez funkcję asset(), która zwróci bezwzględny adres URL na podstawie określonego w niech adresu względnego &#39;/posty&#39;.&lt;br /&gt;
&lt;br /&gt;
Po utworzeniu pliku formularza, musimy się zająć utworzeniem widoku. W tym celu do naszego pliku  
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
routes/web.php&lt;/div&gt;
dodajemy wpis, kierujący żądanie HTTP typu GET adresu względnego posty/nowy do funkcji create() naszego kontrolera zasobów PostController: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::get(&#39;/posty/nowy&#39;, &#39;PostController@create&#39;);&lt;/div&gt;
&lt;br /&gt;
Następnie w klasie naszego kontrolera zasobów PostController tworzymy metodę create(), wyświetlającą formularz, czyli zwracającą utworzony widok formularza: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;nbsp;public function create() {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return view(&#39;posts.create&#39;);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;}&lt;/div&gt;
&lt;br /&gt;
Jeśli wszystkie czynności zostały wykonane zgodnie ze wskazówkami, po przejściu na względny adres url /posty/nowy naszej szkoleniowej aplikacji, w przeglądarce powinien się pojawić nasz szkoleniowy formularz html. 

&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgW_FNds9S9w4_Uo_xx3ix3mub8JfOB-k7Ra1DQ_5_dWuo9d9O0w-QFc7TPYxzwIoj2q_z6SFtvtGqncg9rahmOXJWylGExFZI6B70yoX3cd0IGu51wW5kNLb_aFu13_7EAJkF2HWurLqQ/s1600/1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Szkoleniowa wersja przykładowego formularza html&quot; border=&quot;0&quot; data-original-height=&quot;190&quot; data-original-width=&quot;587&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgW_FNds9S9w4_Uo_xx3ix3mub8JfOB-k7Ra1DQ_5_dWuo9d9O0w-QFc7TPYxzwIoj2q_z6SFtvtGqncg9rahmOXJWylGExFZI6B70yoX3cd0IGu51wW5kNLb_aFu13_7EAJkF2HWurLqQ/s1600/1.jpg&quot; title=&quot;Szkoleniowa wersja przykładowego formularza html&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Szkoleniowa wersja przykładowego formularza hrml&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Wyświetlając źródło strony, warto przyjrzeć się efektom funkcji csrf_field(). Pole typu hidden oraz przypisana do niego wartość pojawiły się w efekcie zastosowania tej funkcji w kodzie. 

&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN_e7pATLIREeigmERxwwrg4EZAaN11vfsGWixjN-9dqS1MLfj_cOEmdDcybiwIZLcK1IhqxYVkNFC72hB-Y58ZC3juGj1zbTrdn6iYuOxayNHmGV2YkVtKlE8w49FIXzZ5bVZ_bdtDZc/s1600/2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Efekt działania funkcji csrf()&quot; border=&quot;0&quot; data-original-height=&quot;42&quot; data-original-width=&quot;700&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN_e7pATLIREeigmERxwwrg4EZAaN11vfsGWixjN-9dqS1MLfj_cOEmdDcybiwIZLcK1IhqxYVkNFC72hB-Y58ZC3juGj1zbTrdn6iYuOxayNHmGV2YkVtKlE8w49FIXzZ5bVZ_bdtDZc/s1600/2.jpg&quot; title=&quot;Efekt działania funkcji csrf()&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Efekt działania funkcji csrf()&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;
Tworzymy nową trasę&lt;/h2&gt;
&lt;br /&gt;
Formularz jest już widoczny, lecz musimy utworzyć trasę dla akcji formularza, czyli przypisaną do żądania typu POST na adres /posty. W tym celu wystarczy dodać do naszego szkoleniowego pliku routes/web następującą zawartość, która będzie miała za zadanie przekierowywać takie żądanie do funkcji store() kontrolera PostController, której strukturę za chwilę przedstawię: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::post(&#39;/posty&#39;, &#39;PostController@store&#39;);&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;
Tworzymy metodę store() w klasie kontrolera zasobów&lt;/h2&gt;
&lt;br /&gt;
Nasza metoda o nazwie store() będzie miala za zadanie wykonywać walidację formularza, a następnie zachowywać nowe posty w tabeli bazy danych. Kod naszej szkoleniowej funkcji jest bardzo krótki i przejrzysty: 

&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;nbsp;public function store() {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; // Podstawowa walidacja formularza&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;validate(request(), [&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;title&#39; =&amp;gt; &#39;required|min:3|max:60&#39;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;body&#39;&amp;nbsp; =&amp;gt; &#39;required|min:20|max:5000&#39;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; ]);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; // Zachowuje nowy post, utwrzozony z pól title oraz body przesłanego formularza:
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; Post::create(request([&#39;title&#39;, &#39;body&#39;]));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; /**&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Alternatywnie, zamiast create()&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$post = new Post(request([&#39;title&#39;, &#39;body&#39;]));&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$post-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; */&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; // Przekierowanie do /posty&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; return redirect(&#39;/posty&#39;);&lt;/div&gt;
&lt;br /&gt;
Metoda validate(), służaca do walidacji danych formularza, jest dostępna z poziomu klasy naszego kontrolera i może przyjmować różne reguły. Więcej na temat dostępnych reguł walidacji formularzy można przeczytać w &lt;a href=&quot;https://www.blogger.com/blogger.g?blogID=4892242742838504581&quot;&gt;oficjalnej dokumentacji Laravel&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Metoda create() tworzy nowy post z zapodanej kolekcji danych i zapisuje go w tabeli bazy danych. &lt;br /&gt;
&lt;br /&gt;
Jednak to nie wszystko. Laravel chroni naszą aplikację przed atakami nie tylko opisaną wyżej funkcją csrf_field(), ale także w dodatkowy sposób. Aby dane z formularza zostały zachowane w bazie danych, należy określić w klasie naszego modelu, jakie dane mogą być modyfikowane przez użytkowników. A więc, aby nasz formularz i przygotowane funkcje zadziałały, wewnątrz klasy modelu Post, czyli w pliku app/Post.php należy dodać: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
protected $fillable = [&#39;title&#39;, &#39;body&#39;];&lt;/div&gt;
&lt;br /&gt;
Teraz wszystko powinno już działać. Sprawdźmy to: 

&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg96QrOVUCfqXe4eu_jSe7oEjs8FX17J67WCjeaIEXfPANDFeULb4zW9lo0v866ieaZ_unQRDj_-oOwOXQCWPgLGjw1Mmq2EU5BAUPRUI-vI5wqYR7QlYrbpoh3Q3_md__7QzGme_l0cOg/s1600/3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot; Nasz szkoleniowy formularz HTML&quot; border=&quot;0&quot; data-original-height=&quot;216&quot; data-original-width=&quot;596&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg96QrOVUCfqXe4eu_jSe7oEjs8FX17J67WCjeaIEXfPANDFeULb4zW9lo0v866ieaZ_unQRDj_-oOwOXQCWPgLGjw1Mmq2EU5BAUPRUI-vI5wqYR7QlYrbpoh3Q3_md__7QzGme_l0cOg/s1600/3.jpg&quot; title=&quot; Nasz szkoleniowy formularz HTML&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Nasz szkoleniowy formularz HTML&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTMdJSvsuh8iJzRuzSl1OuNKmOweQNM0mbw5Z0lM_R-UN7DGqNwDuNZB50WorjrM-JBk-CvQ_61K24ZiJ_pKjr3VoqpvQNbCQ7_duTPg388ywMeu3gMYyobimuEgP9Y0OX-uZ2maJJnsc/s1600/4.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Nasza szkoleniowa dynamiczna lista postów&quot; border=&quot;0&quot; data-original-height=&quot;245&quot; data-original-width=&quot;520&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTMdJSvsuh8iJzRuzSl1OuNKmOweQNM0mbw5Z0lM_R-UN7DGqNwDuNZB50WorjrM-JBk-CvQ_61K24ZiJ_pKjr3VoqpvQNbCQ7_duTPg388ywMeu3gMYyobimuEgP9Y0OX-uZ2maJJnsc/s1600/4.jpg&quot; title=&quot;Nasza szkoleniowa dynamiczna lista postów&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Nasza szkoleniowa dynamiczna lista postów&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Wszystko wygląda tak jak powinno, oczywiście w wersji szkoleniowej, a nie produkcyjnej. Ale co z ewentualnymi błędami walidacyjnymi?&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Błędy walidacji&lt;/h2&gt;
&lt;br /&gt;
Gdy korzystamy z metody validate() wewnątrz klas kontrolerów zasobów, zwraca ona ewentualne błędy walidacyjne do specjalnej zmiennej sesyjnej, która jest dostępna w skryptach formularzy w postaci tablicy $errors. Zobaczmy jak to działa w praktyce, dodając do naszego formularza kilka linijek kodu tuż po znaczniku końca formularza: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;nbsp;&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;li&amp;gt;{{$error}}&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @endforeach&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;lt;/ul&amp;gt;&lt;/div&gt;
&lt;br /&gt;
Następnie, mając na uwadze reguły walidacyjne spróbujmy wpisać do pól formularza po jednym znaku, a nstępnie wysłać formularz: 

&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCzMly7gNP54Jo8zbN67KtVre6zRMOE15EjOSrUv2lUTzNxOUK_476VaNghgK9d3RP0Eg7ePS1-Qah1kGoAZDQw6-UYKcZQpGakIIBfpbYyrWY5BGk0to_qgJbbDLY9h7U_3XllXaqkFA/s1600/5.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Testujemy walidację&quot; border=&quot;0&quot; data-original-height=&quot;184&quot; data-original-width=&quot;551&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCzMly7gNP54Jo8zbN67KtVre6zRMOE15EjOSrUv2lUTzNxOUK_476VaNghgK9d3RP0Eg7ePS1-Qah1kGoAZDQw6-UYKcZQpGakIIBfpbYyrWY5BGk0to_qgJbbDLY9h7U_3XllXaqkFA/s1600/5.jpg&quot; title=&quot;Testujemy walidację&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Testujemy walidację&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrfhqYxpig1YTVlvfCs-ydoo4Ek0wUWdjpgjgEO8PM7LyuckPJuOoEEap-QjI-WhCTs3B0eO1fKyQiVN2xPH586PcZkHDsLdUIvlDvTNJ4EpsDIKi7cdV1pQXkMF_iD6jGEjzXJ7noIg4/s1600/6.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Błędy walidacyjne&quot; border=&quot;0&quot; data-original-height=&quot;253&quot; data-original-width=&quot;546&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrfhqYxpig1YTVlvfCs-ydoo4Ek0wUWdjpgjgEO8PM7LyuckPJuOoEEap-QjI-WhCTs3B0eO1fKyQiVN2xPH586PcZkHDsLdUIvlDvTNJ4EpsDIKi7cdV1pQXkMF_iD6jGEjzXJ7noIg4/s1600/6.jpg&quot; title=&quot;Błędy walidacyjne&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Błędy walidacyjne&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;Informacje o błędach są w języku angielskich, ale tym zajmiemy się w kolejnych częściach szkolenia, jak również ładnie sformatowanymi formularzami, złożonymi widokami oraz stylami CSS. &lt;br /&gt;&lt;br /&gt;

Serdecznie zapraszam do kolejnej części szkolenia Laravel od podstaw, p.t. &lt;a href=&quot;http://informatyka-porady.blogspot.com/2017/12/laravel-od-podstaw-szablony-widokow-i.html&quot;&gt;Szablony widoków i style CSS&lt;/a&gt;
</description><link>https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-zapis-danych-z.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgW_FNds9S9w4_Uo_xx3ix3mub8JfOB-k7Ra1DQ_5_dWuo9d9O0w-QFc7TPYxzwIoj2q_z6SFtvtGqncg9rahmOXJWylGExFZI6B70yoX3cd0IGu51wW5kNLb_aFu13_7EAJkF2HWurLqQ/s72-c/1.jpg" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-252691756762638331</guid><pubDate>Wed, 29 Nov 2017 16:08:00 +0000</pubDate><atom:updated>2017-11-30T16:52:29.032+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Laravel</category><category domain="http://www.blogger.com/atom/ns#">php</category><title>Laravel od podstaw: kontrolery zasobów</title><description>W &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-modele.html&quot;&gt;poprzedniej części szkolenia Laravel od Podstaw, p.t. Modele&lt;/a&gt; wyjaśniłem jakie podstawowe funkcje pełnią modele w Laravel, oraz jak mogą one ułatwić pracę z tabelami bazy danych. W niniejszej części przedstawię czytlenikom kontrolery zasobów.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Kontrolery zasobów w Laravel&lt;/h2&gt;
&lt;br /&gt;
W &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-podstawy-routingu.html&quot;&gt;pierwszej części szkolenia, p.t. Podstawy Routingu&lt;/a&gt; omówiłem najprostsze zasady tworzenia tras. Wstępnie zaprezentowałem możliwość przekierowania żądań do kontrolera zasobów, lecz omówienie tematu kontrolerów odłożyłem na kolejną część szkolenia. Nadszedł czas aby lepiej poznać zasady działania kontrolerów zasobów.&lt;br /&gt;
&lt;br /&gt;
Przekazywanie żądań do wyspecjalizowanego kontrolera zasobów ma kilka ważnych zalet. Po pierwsze każdy utworzony w standardowy sposób kontroler zasobów Laravel umożliwia bezpośrednie odwoływanie się do bardzo potężnych metod, takich jak validate, dispatch, czy middleware, które będą omawiane w kolejnych częściach szkolenia. Po drugie, w przypadku rozbudowanych aplikacji, umieszczanie wszystkich metod w pliku routes/web.php to raczej mało efektywne podejście.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Kontrolery zasobów w praktyce&lt;/h2&gt;
&lt;br /&gt;
W poprzedniej &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-modele.html&quot;&gt;części, w której zaprezentowałem modele&lt;/a&gt; przedstawiłem sposób tworzenia modeli za pomocą polecenia 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
php artisan make:model&lt;/div&gt;
&lt;br /&gt;
W celach szkoleniowych wykasujmy teraz poprzednio utworzony model Post i stwórzmy go ponownie, z wiadomych powodów bez opcji –migration, ale tym razem z opcją --controller, z poziomu głównego katalogu naszej szkoleniowej aplikacji:
 
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibC3l0PiDm8bLrJ2VX_DCMngWH9x0CYQnq8JjTBI1OxPm9Z4hoUMomYHhtrYBSog-T_sjcbez2gxJr922PHw8CaSRE7qbqkJiTXia5xRg7OMGcQKGTOFUY2i2yvM96DeFdE-DDYg6hwKs/s1600/1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Tworzenie kontrolera zasobów&quot; border=&quot;0&quot; data-original-height=&quot;76&quot; data-original-width=&quot;564&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibC3l0PiDm8bLrJ2VX_DCMngWH9x0CYQnq8JjTBI1OxPm9Z4hoUMomYHhtrYBSog-T_sjcbez2gxJr922PHw8CaSRE7qbqkJiTXia5xRg7OMGcQKGTOFUY2i2yvM96DeFdE-DDYg6hwKs/s1600/1.jpg&quot; title=&quot;Tworzenie kontrolera zasobów&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Tworzenie kontrolera zasobów&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Świetnie! Mamy już nasz pierwszy kontroler zasobów. Kontrolery zasobów znajdują się w katalogu  
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
app/Http/Controllers&lt;/div&gt;
Zobaczmy teraz co zawiera nasz kontroler o nadanej mu automatycznie nazwie PostController.php: 

&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmuit8kjyw6KDbVB9n650XmPZa5jKjCJV5Y4KnH4xutLoot0SP9w8aVPdXScRMJuKdBUbcOcB_yvT387imH9NLci2Ya6rOpYCPFdsVgyB-QghQsqRn2zeJlol70wdvVd_TK_G6asa2ayU/s1600/2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Przykładowy kontroler zasobów Laravel&quot; border=&quot;0&quot; data-original-height=&quot;212&quot; data-original-width=&quot;581&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmuit8kjyw6KDbVB9n650XmPZa5jKjCJV5Y4KnH4xutLoot0SP9w8aVPdXScRMJuKdBUbcOcB_yvT387imH9NLci2Ya6rOpYCPFdsVgyB-QghQsqRn2zeJlol70wdvVd_TK_G6asa2ayU/s1600/2.jpg&quot; title=&quot;Przykładowy kontroler zasobów Laravel&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Przykładowy kontroler zasobów Laravel&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Następnie dodajmy do niego funkcję przekazującą pozyskane z bazy danych posty do widoku posts/index.blade.php: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use App\Post;&lt;br /&gt;
&lt;br /&gt;
class PostController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;public function index() {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;$posts = Post::all();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;return view(&#39;posts.index&#39;, compact(&#39;posts&#39;));&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;/**&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * Alternatywnie i z takim samym efektem&lt;br /&gt;
&amp;nbsp; &amp;nbsp; *&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * return view(&#39;posts.index&#39;)-&amp;gt;with(&#39;posts&#39;, $posts);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; *&lt;br /&gt;
&amp;nbsp; &amp;nbsp; */&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;/div&gt;
&lt;br /&gt;
Ponieważ za chwilę objaśnię również metodę wyświetlającą treść poszczególnych postów, tak powinien teraz wyglądać nasz plik widoku listy postów resources/views/posts/index.blade.php: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;lt;html lang=&quot;pl&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;title&amp;gt;Szkoleniowe posty&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;h1&amp;gt;Lista postów&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @foreach($posts as $post)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href=&quot;posts/{{ $post-&amp;gt;id }}&quot;&amp;gt;{{ $post-&amp;gt;title }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @endforeach&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;
&lt;br /&gt;
Aby jednak lista tytułów postów mogła się prawidłowo wyświetlać za pomocą utworzonej funkcji kontrolera po przejściu na względny adres /posty, należy w pliku routes/web.php umieścić przekierowanie do funkcji index() kontrolera postów. Nasz plik routes/web.php powinien więc wyglądać następująco: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
Route::get(&#39;/posty&#39;, &#39;PostController@index&#39;);&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;/div&gt;
&lt;br /&gt;
Sprawdźmy teraz czy lista postów, z odnośnikami do treści poszczególnych postów, wyświetla się prawidłowo:
 
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxg1So-EBaFONkiiX9iP_2J7m-SKESqjIthrjubaf2UmWO1d5BaHZ25s5J7LJ0Uj5dyG0sIJIxjR_1Toqy_iq05sviKGicsNEQmuksJ6zu_8ZhW8BkxqJGy0Q64_p75cKX8aJhiGOqnRQ/s1600/3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Szkoleniowy widok listy postów z odnośnikami do treści&quot; border=&quot;0&quot; data-original-height=&quot;221&quot; data-original-width=&quot;501&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxg1So-EBaFONkiiX9iP_2J7m-SKESqjIthrjubaf2UmWO1d5BaHZ25s5J7LJ0Uj5dyG0sIJIxjR_1Toqy_iq05sviKGicsNEQmuksJ6zu_8ZhW8BkxqJGy0Q64_p75cKX8aJhiGOqnRQ/s1600/3.jpg&quot; title=&quot;Szkoleniowy widok listy postów z odnośnikami do treści&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Szkoleniowy widok listy postów z odnośnikami do treści&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Świetnie! Wygląda na to, że wszystko działa, więc dodajmy możliwość wyświetlania treści poszczególnych postów w wyniku kliknięcia w odnośniki do treści.&lt;br /&gt;
&lt;br /&gt;
Do naszego kontrolera PostController dodajmy funkcję o nazwie show(). Jako argument funkcji, w zmiennej $post przekazywany będzie obiekt klasy Post: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
public function show(Post $post) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return view(&#39;posts.show&#39;)-&amp;gt;with(&#39;post&#39;, $post);&lt;br /&gt;
&amp;nbsp; &amp;nbsp;} 
&lt;/div&gt;
&lt;br /&gt;
Do naszego pliku routes/web.php dodajmy trasę prowadzącą do metody show() kontrolera zasobów PostController: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::get(&#39;/posty/{post}&#39;, &#39;PostController@show&#39;);&lt;/div&gt;
&lt;br /&gt;
Następnie stwórzmy widok resources/views/posts/show.blade.php: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;lt;html lang=&quot;pl&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;title&amp;gt;Szkoleniowa treść posta&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;h1&amp;gt;{{$post-&amp;gt;title}}&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;p&amp;gt;{{ $post-&amp;gt;body }}&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;
&lt;br /&gt;
Gotowe! Teraz po wejściu na względny adres /posty i kliknięciu w którykolwiek odnośnik do treści posta, w przeglądarce pojawia się treść wybranego posta, przykładowo: 

&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEishbFW_kw95DgrvmwBUIoUuyfTvyMx8QnsfHNH5XPgBZ91sHu4s2g1wBVPuu4DIefs-p_3OAhaoeFOrQZbYGtNVKBOAvXTGfX4idW9LYQtU9_nq-AA0TobdEep6XkHx79V_uZzDa3ZmKk/s1600/4.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Nasz szkoleniowy widok treści wybranego posta&quot; border=&quot;0&quot; data-original-height=&quot;209&quot; data-original-width=&quot;530&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEishbFW_kw95DgrvmwBUIoUuyfTvyMx8QnsfHNH5XPgBZ91sHu4s2g1wBVPuu4DIefs-p_3OAhaoeFOrQZbYGtNVKBOAvXTGfX4idW9LYQtU9_nq-AA0TobdEep6XkHx79V_uZzDa3ZmKk/s1600/4.jpg&quot; title=&quot;Nasz szkoleniowy widok treści wybranego posta&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Nasz szkoleniowy widok treści wybranego posta&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;
Jak to działa&lt;/h2&gt;
&lt;br /&gt;
Laravel jest bardzo potężnym narzędziem programistycznym i wiele - nie tyle ciężkiej ile żmudnej pracy - potrafi wykonać za nas, pod warunkiem pisania kodu zgodnego z pewnymi regułami.&lt;br /&gt;
&lt;br /&gt;
Aby funkcja show() kontrolera PostKontroler działała prawidłowo, należy zwrócić szczególną uwagę aby nazwa zmiennej parametru $post była zgodna z nazwą parametru {post} w funkcji pliku routes/web.php. Całą resztę skojarzeń wykonuje za nas Laravel!&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Podsumowanie&lt;/h2&gt;
&lt;br /&gt;
W niniejszej części zobaczyliśmy podstawy działania kontrolerów zasobów oraz konkretny przykład przekazywania parametrów do kontrolera. Wiemy już jak pozyskiwać dane z tabeli bazodanowej i potrafimy przekazywać je z kontrolera zasobów do widoku. W kolejnej części pokażę jak zapisywać w tabeli bazy danych wprowadzone do formularza web informacje.&lt;br /&gt;&lt;br /&gt;

Serdecznie zapraszam do kolejnej części niniejszego szkolenia, p.t &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-zapis-danych-z.html&quot;&gt;Zapis danych z formularza&lt;/a&gt; 


 
 
 </description><link>https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-kontrolery-zasobow.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibC3l0PiDm8bLrJ2VX_DCMngWH9x0CYQnq8JjTBI1OxPm9Z4hoUMomYHhtrYBSog-T_sjcbez2gxJr922PHw8CaSRE7qbqkJiTXia5xRg7OMGcQKGTOFUY2i2yvM96DeFdE-DDYg6hwKs/s72-c/1.jpg" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-6795910342660366765</guid><pubDate>Tue, 28 Nov 2017 20:20:00 +0000</pubDate><atom:updated>2017-11-29T17:11:46.613+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Laravel</category><category domain="http://www.blogger.com/atom/ns#">php</category><title>Laravel od podstaw: modele</title><description>W poprzednich częściach szkolenia omówiłem podstawowe sposoby korzystania z bazy danych w środowisku Laravel. W części pt. &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-migracje.html&quot;&gt;Laravel od podstaw: migracje&lt;/a&gt; pokazałem jak tworzy się tabele bazodanowe, natomiast w części pt. &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-tabele-bazodanowe-i.html&quot;&gt;Laravel od podstaw: tabele bazodanowe i dynamiczne widoki&lt;/a&gt; zaprezentowałem metodę DB::table(), która pozwala wykonywać rozmaite zapytania SQL. W tej części szkolenia skupię się na Modelach, które umożliwiają korzystanie z bardziej efektywnych metod bazodanowych.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Modele w Laravel&lt;/h2&gt;
&lt;br /&gt;
W środowisku Laravel każda tabela bazy danych może mieć odpowiedni &quot;Model&quot;, służący do interakcji z tą tabelą za pomocą metod klasy. Modele umożliwiają wykonywanie zapytań SQL na odpowiadających im tabelach w prosty i efektywny sposób. Każdy z modeli jest rozszerzeniem klasy bazodanowej &lt;a href=&quot;https://laravel.com/docs/5.5/eloquent&quot;&gt;Illuminate\Database\Eloquent\Model&lt;/a&gt;, co oznacza, że można w nim korzystać z udostępnianych przez tą klasę metod.&lt;br /&gt;
&lt;br /&gt;
Załóżmy, że chcemy stworzyć stronę internetową, na której mamy zamiar wyświetlać posty użytkowników. Do tego będzie nam potrzebna tabela bazodanowa z postami oraz model, poprzez który będziemy się odnosić do naszej tabeli, zapisywać w niej dane oraz pozyskiwać znajdujące się w niej informacje. Za chwilę omówię pracę z modelami na kilku praktycznych przykładach. Zanim przejdziemy do praktyki, uprzejmie proszę czytelników, którzy śledzili poprzednie części szkolenia o usunięcie z bazy danych utworzonej tabeli o nazwie posts, jeśli oczywiście ją utworzyli.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Cofanie migracji&lt;/h2&gt;
&lt;br /&gt;
Aby przywrócić poprzednią wersje bazy danych, można użyć polecenia php artisan migrate:rollback. To polecenie wycofuje ostatnią &quot;partię&quot; migracji, która może zawierać wiele plików migracji.&lt;br /&gt;
&lt;br /&gt;
Zobaczmy jak taka akcja powinna wyglądać w przypadku naszej szkoleniowej aplikacji: 

&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJN4iKvJUGcuKsyyH4LAmLXRWtobnFo0LHAg3y3rYXw-0CY5fcEDisRhsm4HumKsnQ3I0fskqX5_nfaEfNGHWbb3J7FWmwFvSDoQVrm5j6gelcEe3kuG2X0h9_QohMTrxDpfMb3RiMsGY/s1600/migracje_rollback.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Cofanie migracji&quot; border=&quot;0&quot; data-original-height=&quot;268&quot; data-original-width=&quot;862&quot; height=&quot;198&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJN4iKvJUGcuKsyyH4LAmLXRWtobnFo0LHAg3y3rYXw-0CY5fcEDisRhsm4HumKsnQ3I0fskqX5_nfaEfNGHWbb3J7FWmwFvSDoQVrm5j6gelcEe3kuG2X0h9_QohMTrxDpfMb3RiMsGY/s640/migracje_rollback.jpg&quot; title=&quot;Cofanie migracji&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Cofanie migracji w Laravel&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Aby definitywnie usunąć tabelę posts, należy teraz usunąć skrypt migracji odpowiedzialny za jej tworzenie, co spowoduje, że w następnej migracji tabela nie zostanie utworzona. W naszym przypadku zrobię to tak:  
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
rm database/migrations/2017_11_25_195109_create_posts_table.php -fr&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;
Modele i migracje&lt;/h2&gt;
&lt;br /&gt;
Tworzenie modelu odbywa się za pomocą polecenia 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
php artisan make:model&lt;/div&gt;
Wraz modelem można automatycznie utworzyć odpowiednią migrację, dodając parametr –migration, ale nie jest to koniecznie, gdyż można utworzyć odpowiednią migrację w osobnym kroku, korzystając z omówionego w jednej z poprzednich części szkolenia sposobu.&lt;br /&gt;
&lt;br /&gt;
Zanim przejdziemy do praktyki i utworzymy nasz pierwszy model, wspomnę, że w przypadku tworzenia migracji wraz z tworzonym modelem, Laravel automatycznie tworzy tabele noszącą nazwę w liczbie mnogiej odnośnie do nazwy modelu, oczywiście w języku angielskim. Przykładowo, jeśli model to post, tabela będzie nosiła nazwę posts. Można jednak temu zapobiec i nadać własną nazwę tabeli, określając ją parametrem -–create=nazwa_tabeli w osobnym kroku tworzenia migracji za pomocą polecenia php artisan make:migration&lt;br /&gt;
&lt;br /&gt;
Zobaczmy jak to wszystko wygląda w praktyce. Z wiersza poleceń i z poziomu katalogu naszej szkoleniowej aplikacji nauka, stwórzmy nasz pierwszy model o nazwie Post, wraz ze skryptem migracyjnym, który będzie odpowiedzialny na utworzenie tabeli bazodanowej: 

&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicTJgBRtkH5paqmFRVBLOOMdOassBX9lVEU-O4a8WTT3B8VDbgfjZlXzPTnRXjeXtGWhmV2BnqWP88nXEQx_zvPg2MPySVgP7wxcVXQB7HKAnqt3vh61c9EqWNB-jNlLT4HpXFqmiyvbI/s1600/make_model.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Tworzenie modelu&quot; border=&quot;0&quot; data-original-height=&quot;60&quot; data-original-width=&quot;570&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicTJgBRtkH5paqmFRVBLOOMdOassBX9lVEU-O4a8WTT3B8VDbgfjZlXzPTnRXjeXtGWhmV2BnqWP88nXEQx_zvPg2MPySVgP7wxcVXQB7HKAnqt3vh61c9EqWNB-jNlLT4HpXFqmiyvbI/s1600/make_model.jpg&quot; title=&quot;Tworzenie modelu&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Tworzenie modelu&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Jak widać, model został pomyślnie utworzony. Został również utworzony skrypt migracyjny, który, jak wiadomo z poprzednich części szkolenia, został zapisany w katalogu database/migrations względem katalogu naszej aplikacji.&lt;br /&gt;
&lt;br /&gt;
Zmodyfikujmy teraz skrypt migracyjny i dodajmy do niego linie umożliwiające utworzenie kolumn związanych z tytułem i ciałem postów, podobnie jak we wcześniejszej części szkolenia. Docelowo metoda up() naszego szkoleniowego skryptu migracyjnego powinna wyglądać następująco: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
public function up()&amp;nbsp; {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Schema::create(&#39;posts&#39;, function (Blueprint $table) {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $table-&amp;gt;increments(&#39;id&#39;);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $table-&amp;gt;timestamps();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Tytuł i ciało posta&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $table-&amp;gt;string(&#39;title&#39;);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $table-&amp;gt;text(&#39;body&#39;);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; })&lt;/div&gt;
&lt;br /&gt;
Po zmodyfikowaniu skryptu w wyżej udokumentowany sposób możemy przystąpić do wdrożenia nowej wersji bazy danych: 

&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlaX8UPZkqNt3CeB7jNfA0hp-zf70afPBIyZkK-RNkZXQUd2VTcpw8FC5E230BQH6NQDcR2MIhKSLmy6YoRHPwtcoTB5F3AP1bOtDeZoS29-6D5oLmwaqHxSkE5IcffwF-ajh8KOiEnOE/s1600/nowa_migracja.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;136&quot; data-original-width=&quot;530&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlaX8UPZkqNt3CeB7jNfA0hp-zf70afPBIyZkK-RNkZXQUd2VTcpw8FC5E230BQH6NQDcR2MIhKSLmy6YoRHPwtcoTB5F3AP1bOtDeZoS29-6D5oLmwaqHxSkE5IcffwF-ajh8KOiEnOE/s1600/nowa_migracja.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Świetnie! Tabela powiązana z modele Post została pomyślnie utworzona. Zobaczmy teraz jak wygląda nasz model, który znajduje się w pliku app/Post.php: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Database\Eloquent\Model;&lt;br /&gt;
&lt;br /&gt;
class Post extends Model&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; //&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt; 
&lt;/div&gt;
&lt;br /&gt;
Jak zapewne łatwo czytelnikom wywnioskować z powyższego kodu i o czym już wspomniałem wcześniej, klasa \App\Post jest rozszerzeniem Illuminate\Database\Eloquent\Model, co oznacza, że możemy się poprzez instancje obiektów tej klasy odwoływać do bazodanowych funkcji modelu Eloquenta, jednak ich działania będą skierowane do tabeli posts, ponieważ jest to tabela bazy danych powiązana z modelem Post.&lt;br /&gt;
&lt;br /&gt;
Na początku może się to wydawać trudne do zrozumienia, ale kilka przykładów powinno wszystko wyjaśnić. Zanim posłużę się Modelami w skryptach php naszej szkoleniowej aplikacji, udokumentuję kilka prostych operacji bazodanowych, które wykonam z poziomu interfejsu Laravel php artisan tinker.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Od modelu do tabeli&lt;/h2&gt;
&lt;br /&gt;
W części pt. &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-tabele-bazodanowe-i.html&quot;&gt;Laravel od podstaw: tabele bazodanowe i dynamiczne widoki&lt;/a&gt; zaprezentowałem metodę DB::table() oraz sposób wprowadzania nowych rekordów do tabeli. Wyglądało to tak: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
DB::table(&#39;posts&#39;)-&amp;gt;insert([&#39;title&#39;=&amp;gt;&#39;Nasz pierwszy post&#39;, &#39;body&#39;=&amp;gt;&#39;Lorem ipsum.... blabablabla...&#39;]);&lt;/div&gt;
Natomiast pozyskiwanie rekordów z tabeli wyglądało tak: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
DB::table(&#39;posts&#39;)-&amp;gt;get();&lt;/div&gt;
Te same działania można wykonać odwołując się do metod modelu Eloquent poprzez klasę naszego modelu, w bardziej przejrzysty i skuteczny sposób. Skorzystam z powłoki php artisan tinker, aby na początek wprowadzić kilka przykładowych rekordów do tabeli, a następnie je pozyskać na różne sposoby: 

&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDsstK7aDhV4K9TE1unptrvI9aG6DyNktAYu5Oi4hGjHG36zuErVmpU9Eoqd3sxJ8IId-oBYAzTnLJ_tmGyp1RvTgUiN6MUf7K-9t09KDY9haYa20inI5Lb5KMY2F2MnktVith7Wh0yA8/s1600/posty.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1020&quot; data-original-width=&quot;653&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDsstK7aDhV4K9TE1unptrvI9aG6DyNktAYu5Oi4hGjHG36zuErVmpU9Eoqd3sxJ8IId-oBYAzTnLJ_tmGyp1RvTgUiN6MUf7K-9t09KDY9haYa20inI5Lb5KMY2F2MnktVith7Wh0yA8/s1600/posty.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Więcej przykładów:
 
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXCrIB6CMOnWrpsxTdhdRs3AqV-cS00mgloht5vgr5suRqPao_yyySAuXhM__dxL0uHbfvjEWok8QsbLpWRxKemlMvQwfM8Kafc3pFA7tQywo6m02-Lla4UJXjOvMH75tba5lkw1l8oSc/s1600/posty2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;240&quot; data-original-width=&quot;548&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXCrIB6CMOnWrpsxTdhdRs3AqV-cS00mgloht5vgr5suRqPao_yyySAuXhM__dxL0uHbfvjEWok8QsbLpWRxKemlMvQwfM8Kafc3pFA7tQywo6m02-Lla4UJXjOvMH75tba5lkw1l8oSc/s1600/posty2.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
Wiemy już wystarczająco wiele, aby nasza szkoleniowa funkcja w pliku routes/web.php zwracająca widok z tytułami postów wyglądała następująco:&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::get(&#39;/posty&#39;, function() {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /**&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*&amp;nbsp; Ten sposób został omówiony w poprzedniej części szkolenia&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*&amp;nbsp; $posts = DB::table(&#39;posts&#39;)-&amp;gt;get();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; */&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Tego nauczyliśmy się teraz - widoczny efekt jest taki sam&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $posts = \App\Post::all();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return view(&#39;posts.index&#39;, compact(&#39;posts&#39;));&lt;br /&gt;
&lt;br /&gt;
});&lt;/div&gt;
&lt;br /&gt;
W niniejszej części szkolenia dowiedzieliśmy się czym są modele oraz jaka jest relacja pomiędzy nimi, a tabelami bazy danych. Nauczyliśmy się odwoływać do tabeli bazy danych poprzez klasę modelu, korzystając z metod Eloquent&#39;a. Zobaczyliśmy kilka praktycznych przykładów pracy z modelami w powłoce php artisan tinker oraz praktyczne zastosowanie modelu szkoleniowego Post w funkcji trasy.
W kolejnej części szkolenia mam zamiar zaprezentować kontrolery zasobów oraz zastosować w funkcjach kontrolerów zasobów to czego nauczyliśmy się o modelach i nieco więcej. &lt;br /&gt;&lt;br /&gt;

Serdecznie zapraszam do kolejnej części niniejszego szkolenia, p.t. &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-kontrolery-zasobow.html&quot;&gt;Kontrolery zasobów&lt;/a&gt;
 
</description><link>https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-modele.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJN4iKvJUGcuKsyyH4LAmLXRWtobnFo0LHAg3y3rYXw-0CY5fcEDisRhsm4HumKsnQ3I0fskqX5_nfaEfNGHWbb3J7FWmwFvSDoQVrm5j6gelcEe3kuG2X0h9_QohMTrxDpfMb3RiMsGY/s72-c/migracje_rollback.jpg" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-8025115207358575968</guid><pubDate>Sun, 26 Nov 2017 19:08:00 +0000</pubDate><atom:updated>2017-11-28T21:38:18.216+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Laravel</category><category domain="http://www.blogger.com/atom/ns#">php</category><title>Laravel od podstaw: tabele bazodanowe i dynamiczne widoki</title><description>W &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-migracje.html&quot;&gt;poprzedniej części&lt;/a&gt; niniejszego szkolenia, pt. Migracje, objaśniłem metodę tworzenia tabeli bazy danych MySQL z poziomu środowiska Laravel. W tej części skupię się na metodach wprowadzania danych do tabeli oraz na sposobach ich odczytu i przekazywania do widoków.&lt;br /&gt;
&lt;br /&gt;
Laravel udostępnia wiele sposobów wprowadzania danych do istniejących tabeli bazy danych. Aby początkowo objaśnić najprostszy z nich, uruchomię z głównego katalogu naszej szkoleniowej aplikacji interfejs php artisan tinker. Php artisan tinker jest rozwiązaniem typu repl (read-eval-print loop), umożliwiającym interaktywne działania z aplikacją Laravel.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Metoda DB::table&lt;/h2&gt;
&lt;br /&gt;
Objaśnię na początek, jak wprowadzać dane do tabeli i wykonywać na nich niektóre typowe operacje bazodanowe, korzystając z metody Laravel DB::table() z poziomu php artisan tinker, a potem omówię jeden z podstawowych sposobów przekazywania danych do widoków.&lt;br /&gt;
&lt;br /&gt;
Najprostszym sposobem wykonywania operacji bazodanowych z poziomu środowiska Laravel to korzystanie z metody DB::table(). W kolejnych częściach szkolenia przedstawię bardziej zaawansowane i bardziej efektywne narzędzia bazodanowe, lecz wymaga to wcześniejszego zapoznania się z tematem Modeli.&lt;br /&gt;
&lt;br /&gt;
Przedstawię sposób pracy z metodą DB::table()-&amp;gt;insert(), która jest w przybliżeniu odpowiednikiem SQL &#39;INSERT INTO&#39;. Zaprezentuję także metodę DB::table()-&amp;gt;get, która służy do pozyskiwania wyników, oraz sposób filtrowania wyników za pomocą klauzuli where, odpowiadająca w przybliżeniu SQL&#39;owemu WHERE.&lt;br /&gt;&lt;br /&gt;

Przechodząc z teorii do praktyki wpisuję i zatwierdzam polecenie &lt;div class=&quot;code&quot;&gt;php artisan tinker&lt;/div&gt;

Poniższy kod przedstawia popularne zastosowania metody DB::table na naszej szkoleniowej tabeli. Operacje wykonywane są z poziomu interfejsu php artisan tinker, Warto z góry przeanalizować format w jakim dane są zwracane: 

&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;gt;&amp;gt;&amp;gt; DB::table(&#39;posts&#39;)-&amp;gt;insert([&#39;title&#39;=&amp;gt;&#39;Nasz pierwszy post&#39;, &#39;body&#39;=&amp;gt;&#39;Lorem ipsum.... blabablabla...&#39;]);&lt;br /&gt;
=&amp;gt; true&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; DB::table(&#39;posts&#39;)-&amp;gt;get();&lt;br /&gt;
=&amp;gt; Illuminate\Support\Collection {#741&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;all: [&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{#743&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;id&quot;: 5,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;title&quot;: &quot;Nasz pierwszy post&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;body&quot;: &quot;Lorem ipsum.... blabablabla...&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;created_at&quot;: null,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;updated_at&quot;: null,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;},&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;],&lt;br /&gt;
&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; DB::table(&#39;posts&#39;)-&amp;gt;insert([&#39;title&#39;=&amp;gt;&#39;Nasz drugi post&#39;, &#39;body&#39;=&amp;gt;&#39;Kolejny tekst...&#39;]);&lt;br /&gt;
=&amp;gt; true&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; DB::table(&#39;posts&#39;)-&amp;gt;get();&lt;br /&gt;
=&amp;gt; Illuminate\Support\Collection {#747&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;all: [&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{#736&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;id&quot;: 5,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;title&quot;: &quot;Nasz pierwszy post&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;body&quot;: &quot;Lorem ipsum.... blabablabla...&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;created_at&quot;: null,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;updated_at&quot;: null,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;},&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{#742&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;id&quot;: 6,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;title&quot;: &quot;Nasz drugi post&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;body&quot;: &quot;Kolejny tekst...&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;created_at&quot;: null,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;updated_at&quot;: null,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;},&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;],&lt;br /&gt;
&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; DB::table(&#39;posts&#39;)-&amp;gt;where(&#39;id&#39;, &#39;&amp;gt;&#39;, 5)-&amp;gt;get();&lt;br /&gt;
=&amp;gt; Illuminate\Support\Collection {#758&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;all: [&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{#755&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;id&quot;: 6,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;title&quot;: &quot;Nasz drugi post&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;body&quot;: &quot;Kolejny tekst...&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;created_at&quot;: null,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+&quot;updated_at&quot;: null,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;},&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;],&lt;br /&gt;
&amp;nbsp; &amp;nbsp;}&lt;/div&gt;
&lt;br /&gt;
Metoda DB::table() pozwala wykonywać cały szereg rozmaitych zapytań SQL. Więcej informacji na ten temat znajduje się w &lt;a href=&quot;https://laravel.com/docs/5.5/queries&quot;&gt;oficjalnej dokumentacji Laravel&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Istotnym faktem jest format w jakim dane są zwracane z tabeli w efekcie zastosowania metody get(). Są one zwracane w postaci kolekcji informacji klasy Illuminate\Support\Collection. Ten format można docelowo zmienić, ale jest on w istocie bardzo wygodny i przydatny.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Dynamiczne widoki&lt;/h2&gt;
&lt;br /&gt;
Wiemy już z poprzednich części szkolenia jak tworzyć trasy i widoki. Dowiedzieliśmy się teraz jak pozyskiwać dane z tabeli bazy danych. Możemy teraz to wszysko połączyć razem aby uzyskać dynamiczne widoki.&lt;br /&gt;
&lt;br /&gt;
Otwórzmy teraz plik routes/web.php w ulubionym edytorze i dodajmy do niego następującą zawartość: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::get(&#39;/posty&#39;, function() {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $posts = DB::table(&#39;posts&#39;)-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return $posts;&lt;br /&gt;
&lt;br /&gt;
}); 
&lt;/div&gt;
&lt;br /&gt;
Po przejściu na adres względny /posty naszej aplikacji, zobaczymy w przeglądarce następującą treść: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
[{&quot;id&quot;:5,&quot;title&quot;:&quot;Nasz pierwszy post&quot;,&quot;body&quot;:&quot;Lorem ipsum.... blabablabla...&quot;,&quot;created_at&quot;:null,&quot;updated_at&quot;:null},&lt;br /&gt;
{&quot;id&quot;:6,&quot;title&quot;:&quot;Nasz drugi post&quot;,&quot;body&quot;:&quot;Kolejny tekst...&quot;,&quot;created_at&quot;:null,&quot;updated_at&quot;:null}&lt;br /&gt;
]&lt;/div&gt;
&lt;br /&gt;
Jak widać została nam zwrócona kolekcja wartości. Wiemy już dobrze w jakiej postaci są zwracane dane z tabeli, pozyskując je w wyżej opisany sposób. 
Świetnie! Teraz możemy posunąć się o krok dalej i zastosować poznane przed chwilą metody do pozyskania danych z naszej szkoleniowej tabeli, a następnie przekazać je do widoku.&lt;br /&gt;
&lt;br /&gt;
Stwórzmy szkoleniowy widok w pliku 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
resources/views/posts/index.blade.php&lt;/div&gt;
&lt;br /&gt;
Zawartość pliku widoku może być następująca: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;lt;html lang=&quot;pl&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;title&amp;gt;Szkoleniowe posty&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @foreach($posts as $post)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;li&amp;gt;{{$post-&amp;gt;title}}&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @endforeach&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;
&lt;br /&gt;
Dostosujmy nasz plik routes/web.php w następujący sposób: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::get(&#39;/posty&#39;, function() {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $posts = DB::table(&#39;posts&#39;)-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return view(&#39;posts.index&#39;, compact(&#39;posts&#39;));&lt;br /&gt;
&lt;br /&gt;
});&lt;/div&gt;
&lt;br /&gt;
Po zastosowaniu opisanych zmian, pod względnym adresem /posty widnieje teraz następująca dynamiczna treść: 

&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4bov8lEUrL1dlD4GHpMPTQp5458rWGYNpLbzQ-fqcDYKoashll98VL_hwzM3MAKmRxZAKcAMfxPfHaFLSp37MPqQc9aVSeaMnci4_w67P5NXtquSxA1-xOMKg5Gb_4hFALEiLqMAEDTo/s1600/posty.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;43&quot; data-original-width=&quot;273&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4bov8lEUrL1dlD4GHpMPTQp5458rWGYNpLbzQ-fqcDYKoashll98VL_hwzM3MAKmRxZAKcAMfxPfHaFLSp37MPqQc9aVSeaMnci4_w67P5NXtquSxA1-xOMKg5Gb_4hFALEiLqMAEDTo/s1600/posty.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
W tej części przedstawiłem podstawowe metody pracy z tabelami danych w Laravel. Pokazałem jak wprowadzić proste dane do tabeli oraz jak je z niej odczytać. Wyjaśniłem również jak przekazać dane z tabeli do widoku. W kolejnej części mam zamiar omówić Modele, które udostępniają o wiele skuteczniejsze metody pracy z tabelami danych.&lt;br /&gt;&lt;br /&gt;
Serdecznie zapraszam do kolejnej części niniejszego szkolenia, p.t. &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-modele.html&quot;&gt;Modele&lt;/a&gt;
 
 
 
   </description><link>https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-tabele-bazodanowe-i.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4bov8lEUrL1dlD4GHpMPTQp5458rWGYNpLbzQ-fqcDYKoashll98VL_hwzM3MAKmRxZAKcAMfxPfHaFLSp37MPqQc9aVSeaMnci4_w67P5NXtquSxA1-xOMKg5Gb_4hFALEiLqMAEDTo/s72-c/posty.jpg" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-5633479182683837452</guid><pubDate>Sun, 26 Nov 2017 00:00:00 +0000</pubDate><atom:updated>2017-11-28T21:38:54.659+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Laravel</category><category domain="http://www.blogger.com/atom/ns#">php</category><title>Laravel od Podstaw: migracje</title><description>W poprzednich artykułach z serii Laravel od Podstaw objaśniłem &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-podstawy-routingu.html&quot;&gt;tworzenie tras routingu&lt;/a&gt; oraz &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-widoki-i-szablony.html&quot;&gt;podstawy pracy z widokami i szablonami&lt;/a&gt;. Pokazałem na kilku przykładach w jak prosty, a zarazem efektywny sposób można przekazywać zmienne do widoków. &lt;br /&gt;
&lt;br /&gt;
W niniejszej części szkoleniowej mam zamiar omówić tak zwane migracje. W następnych częściach szkolenia zapiszę i odczytam przykładowe informacje z tabeli bazy danych za pomocą narzędzi Laravel i zaprezentuję sposoby przekazywania danych z bazy danych do widoków. Gdy już wyjaśnię pojęcia związane z Modelami, pokażę jak pracować z danymi z poziomu klasy korzystając w metod Eloquent&#39;a.&lt;br /&gt;
&lt;br /&gt;
Laravel udostępnia sporą ilość sterowników do rozmaitych baz danych, a także daje możliwość pracy z własnymi sterownikami. Aby zapoznać się z obsługiwanymi sterownikami warto zajrzeć do pliku config/database.php 

&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3SpIyWqMiKNJCv7BbX2cBh9EMaXNF3k_fq-l29JtSU_CuA7dsAJMJXinFBz18jGXFOpk7K6QeRRAAHNUGDYvrLNFeQ3XpamWi4BaAbPbLbhkiD4vrucHcKzj2EVmPxuOSQiTplW_TTB0/s1600/config_database.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;487&quot; data-original-width=&quot;502&quot; height=&quot;388&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3SpIyWqMiKNJCv7BbX2cBh9EMaXNF3k_fq-l29JtSU_CuA7dsAJMJXinFBz18jGXFOpk7K6QeRRAAHNUGDYvrLNFeQ3XpamWi4BaAbPbLbhkiD4vrucHcKzj2EVmPxuOSQiTplW_TTB0/s400/config_database.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
W celach szkoleniowych skupię się jednak jedynie na MySQL, choć nie będzie to miało żadnego wpływu na sposób pracy z danymi z poziomu aplikacji. 
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Baza danych, użytkownik i uprawnienia&lt;/h2&gt;
&lt;br /&gt;
Przed rozpoczęciem pracy z bazą danych MySQL należy utworzyć nową bazę danych, utworzyć użytkownika i nadać mu odpowiednie uprawnienia. Zakładam, że osoby zainteresowane nauką Laravel generalnie wiedzą jak to zrobić. Tym wszystkim, którzy jednak nie mają pojęcia jak się za to zabrać, ułatwię nieco sprawę i opiszę jak to wykonać z poziomu klienta MySQL.&lt;br /&gt;
&lt;br /&gt;
Zakładając, że baza danych ma się nazywać nauka, nazwa użytkownika ma brzmieć bob, natomiast hasło to glasses-101, procedura może wyglądać przykładowo następująco: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
MariaDB [(none)]&amp;gt; create database nauka;&lt;br /&gt;
Query OK, 1 row affected (0.00 sec)&lt;br /&gt;
&lt;br /&gt;
MariaDB [(none)]&amp;gt; grant usage on *.* to &#39;bob&#39;@&#39;localhost&#39; identified by &#39;glasses-101&#39;;&lt;br /&gt;
Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;
&lt;br /&gt;
MariaDB [(none)]&amp;gt; grant all on nauka.*&amp;nbsp; to &#39;bob&#39;@&#39;localhost&#39;;&lt;br /&gt;
Query OK, 0 rows affected (0.00 sec)&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;
Praca z bazą danych w Laravel&lt;/h2&gt;
&lt;br /&gt;
Plik znajdujący się w głównym katalogu aplikacji, noszący nazwę .env zawiera zbiór ważnych ustawień, a między innymi, ustawienia związane z dostępem do bazy danych z poziomu aplikacji Laravel.   
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVD99cqcoGdci3qRIn6ZaVjRQwRbFWqLJtdIwReErs3XregZ2YMG576QQybRmfk13Ff3eWdbcfyKJGSkoiSTG3mxlFCxV49InjixQIZL98N0u_yuJQiS02FJauw4d3re0lGltY2YL66TM/s1600/env1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;506&quot; data-original-width=&quot;260&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVD99cqcoGdci3qRIn6ZaVjRQwRbFWqLJtdIwReErs3XregZ2YMG576QQybRmfk13Ff3eWdbcfyKJGSkoiSTG3mxlFCxV49InjixQIZL98N0u_yuJQiS02FJauw4d3re0lGltY2YL66TM/s1600/env1.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Aby umożliwić dostęp do wcześniej utworzonej bazy danych z poziomu Laravel, ustawienia bazodanowe w pliku .env powinny wyglądać następująco: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
DB_CONNECTION=mysql&lt;br /&gt;
DB_HOST=127.0.0.1&lt;br /&gt;
DB_PORT=3306&lt;br /&gt;
DB_DATABASE=nauka&lt;br /&gt;
DB_USERNAME=bob&lt;br /&gt;
DB_PASSWORD=glasses-101&lt;/div&gt;
&lt;br /&gt;
W przypadku konieczności można oczywiście podać prawidłowy port oraz odpowiedni adres IP hosta.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjynsFH8PBU3Qt2wNUuQ1c7cOU6IrwCc7MA3-LDPGl9-bw0-KUiO0U6XlEsCyGfJLpsxZFM_yCVLPCUc_cEqczoZ8O6AJwXJgFRQAug7mI0YeIMtugrkJ-qqopzcZPqlZ_i3faLzB3E-v0/s1600/env2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Laravel - plik ustawień .env&quot; border=&quot;0&quot; data-original-height=&quot;585&quot; data-original-width=&quot;546&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjynsFH8PBU3Qt2wNUuQ1c7cOU6IrwCc7MA3-LDPGl9-bw0-KUiO0U6XlEsCyGfJLpsxZFM_yCVLPCUc_cEqczoZ8O6AJwXJgFRQAug7mI0YeIMtugrkJ-qqopzcZPqlZ_i3faLzB3E-v0/s640/env2.jpg&quot; title=&quot;Laravel - plik ustawień .env&quot; width=&quot;597&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Plik .env&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Laravel 5.4 specified key was too long error&lt;/h2&gt;&lt;br /&gt;
Uwaga! W przypadku Laravel 5.4, aby operacje bazodanowe działały prawidłowo, plik  
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
app/Providers/AppServiceProvider.php&lt;/div&gt;
powinien  zawierać wstępnie następującą treść: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Providers;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\ServiceProvider;&lt;br /&gt;
use Illuminate\Support\Facades\Schema;&lt;br /&gt;
&lt;br /&gt;
class AppServiceProvider extends ServiceProvider&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; public function boot()&lt;br /&gt;
&amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Schema::defaultStringLength(191);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; public function register()&lt;br /&gt;
&amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
}&lt;/div&gt;
&lt;br /&gt;
Jeśli powyższe zmiany nie zostaną wprowadzone, jakakolwiek próba wykonania operacji na bazach danych spowoduje wyświetlenie następującego komunikatu o błędzie:
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
[Illuminate\Database\QueryException]&lt;br /&gt;
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table users add unique users_email_unique(email))&lt;br /&gt;
&lt;br /&gt;
[PDOException]&lt;br /&gt;
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;
PHP artisan&lt;/h2&gt;
&lt;br /&gt;
Do utworzenia tabeli MySQL posłużę się dedykowanymi narzędziami frameworka Laravel.  
Aby wygenerować skrypt tworzący tabelę bazy danych można skorzystać z  php artisan. Czym jest php artisan? Otóż jest to specjalny zestaw poleceń, którym można się posługiwać w celu wykonania bardzo rozmaitych czynności. Aby wstępnie zapoznać się z funkcjami php artisan można wydać następujące polecenie z poziomu głównego katalogu aplikacji: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
php artisan list&lt;/div&gt;
Powyższe polecenie wyświetli całą listę funkcji oferowanych przez interfejs php artisan. &lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Kilka słów o migracjach&lt;/h2&gt;
&lt;br /&gt;
W Laravel pod pojęciem migracji kryją się operacje bazodanowe, takie jak tworzenie i usuwanie tabeli, usuwanie istniejących i ponowne tworzenie czystych tabeli, przywracanie konkretnej wersji struktury bazy danych, czyli konkretnej wersji migracji.&lt;br /&gt;
&lt;br /&gt;
Migracje są jak pewien rodzaj kontroli wersji bazy danych, dzięki czemu zespół programistów może łatwo modyfikować i udostępniać schemat bazy danych aplikacji. Migracje są zazwyczaj sparowane z narzędziem do tworzenia schematów Laravel, aby łatwo budować schemat bazy danych aplikacji.&lt;br /&gt;
&lt;br /&gt;
Przed utworzeniem nowych tabeli należy wygenerować specjalny, służący do tego zadania skrypt migracyjny, który generowany jest wedle ustalonego schematu Laravel. &lt;br /&gt;
&lt;br /&gt;
Więcej informacji o migracjach można znaleźć w &lt;a href=&quot;https://laravel.com/docs/5.5/migrations&quot;&gt;oficjalnej dokumentacji Laravel&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Za każdym razem gdy wykonywane jest polecenie  
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
php artisan migrate&lt;/div&gt;
Laravel uruchamia wszystkie skrypty migracyjne, które znajdują się w katalogu 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
database/migrations&lt;/div&gt;
&lt;br /&gt;
Po świeżej instalacji Laravel w wersji 5.4 w katalogu tym powinny się znajdować 2 skrypty migracyjne: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
2014_10_12_000000_create_users_table.php&lt;br /&gt;
2014_10_12_100000_create_password_resets_table.php&lt;/div&gt;
Skrypty te mają za zadanie utworzenie struktury tabel users i password_resets, związanych z uwierzytelnianiem. Uwierzytelnianie to jeden z tematów, które mam zamiar opisać w kolejnych częściach niniejszego tutorialu. &lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Tworzymy skrypt migracyjny&lt;/h2&gt;
&lt;br /&gt;
Jeśli wykonaliśmy już wszystkie wstępne czynności konfiguracyjne, które opisałem wcześniej i które są związane z umożliwieniem dostępu do bazy danych skryptom Laravel, możemy teraz wydać, z poziomu katalogu głównego naszej aplikacji, następujące polecenie, które ma za zadanie utworzyć skrypty migracyjne służące do wygenerowania tabeli o przykładowej nazwie &#39;posts&#39;: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
php artisan make:migration create_posts_table&lt;/div&gt;
Zakładając, że wykonanie skryptu się powiodło, w katalogu skryptów migracyjnych, o którym pisałem wyżej, powinien widnieć nowy skrypt o nazwie podobnej do: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
2017_11_25_195109_create_posts_table.php&lt;/div&gt;
Jeśłi otworzymy ten plik w naszym ulubionym edytorze, zobaczymy następującą treść: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\Schema;&lt;br /&gt;
use Illuminate\Database\Schema\Blueprint;&lt;br /&gt;
use Illuminate\Database\Migrations\Migration;&lt;br /&gt;
&lt;br /&gt;
class CreatePostsTable extends Migration&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;* Run the migrations.&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;*&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;* @return void&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;br /&gt;
&amp;nbsp; &amp;nbsp; public function up()&lt;br /&gt;
&amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Schema::create(&#39;posts&#39;, function (Blueprint $table) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $table-&amp;gt;increments(&#39;id&#39;);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $table-&amp;gt;timestamps();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;* Reverse the migrations.&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;*&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;* @return void&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;br /&gt;
&amp;nbsp; &amp;nbsp; public function down()&lt;br /&gt;
&amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Schema::dropIfExists(&#39;posts&#39;);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
}&lt;/div&gt;
Osoby mające doświadczenie z SQL na pewno zrozumieją znaczenie tego kodu. Jednak nasza szkoleniowa tabela posts, która docelowo będzie zawierała posty, oprócz samego identyfikatora id i kolumn związanych z czasem utworzenia oraz aktualizacji wierszy, powinna posiadać dodatkowe kolumny, takie jak ciało (czyli treść) i tytuł. W tym celu należy zmodyfikować funkcję up(), czyli metodę tworzącą tabelę, w następujący sposób: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;nbsp;public function up()&lt;br /&gt;
&amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Schema::create(&#39;posts&#39;, function (Blueprint $table) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $table-&amp;gt;increments(&#39;id&#39;);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $table-&amp;gt;string(&#39;title&#39;);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $table-&amp;gt;text(&#39;body&#39;);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $table-&amp;gt;timestamps();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;/div&gt;
Warto tutaj oczywiście zapoznać się z &lt;a href=&quot;https://laravel.com/docs/5.5/migrations#creating-columns&quot;&gt;funkcjami i możliwościami frameworka Laravel związanymi z określaniem typu kolumn&lt;/a&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Uruchomienie migracji i utworzenie nowych tabel&lt;/h2&gt;
&lt;br /&gt;
Wydajmy teraz z poziomu głównego katalogu aplikacji polecenie, które ma za zadanie wykonanie istniejących skryptów migracyjnych: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
php artisan migrate&lt;/div&gt;
&lt;br /&gt;
Po uruchomieniu migracji powinny się wyświetlić informacje o pomyślnym wykonaniu skryptów: 

&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZu_-yRB0KxdwTIL_QGEfz8-BprlK-LJbrVOoJv-oVlGw_0FysB6MMA99Tm_6zFNMBFuWeGF192hkmTTBEyohY3nG2yAfsGdsuBjW7tJABdmzV1JamwZALF1fEgdn8fB5P44yTX0a2jEs/s1600/migrate.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;136&quot; data-original-width=&quot;533&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZu_-yRB0KxdwTIL_QGEfz8-BprlK-LJbrVOoJv-oVlGw_0FysB6MMA99Tm_6zFNMBFuWeGF192hkmTTBEyohY3nG2yAfsGdsuBjW7tJABdmzV1JamwZALF1fEgdn8fB5P44yTX0a2jEs/s1600/migrate.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Można teraz użyć klienta MySQL i sprawdzić czy struktura utworzonej tabeli jest zgodna z oczekiwaniami: 

&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirdQtoz7xgfDBbXSFhOuuSsyyK1gMJrfJrO-tLb9f_BgnHbsDozDK3IOf_B3F4sRix8TyMjE2nmBNGGKpyPMVLaQcClzx3lCNo0qhzm6KtuDLjNDWuChiSmMWEJkzob6M7zYTDcKjZNYE/s1600/describe.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;217&quot; data-original-width=&quot;675&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirdQtoz7xgfDBbXSFhOuuSsyyK1gMJrfJrO-tLb9f_BgnHbsDozDK3IOf_B3F4sRix8TyMjE2nmBNGGKpyPMVLaQcClzx3lCNo0qhzm6KtuDLjNDWuChiSmMWEJkzob6M7zYTDcKjZNYE/s1600/describe.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Dowiedzieliśmy się w tej części szkolenia jak dokonać wstępnych ustawień związanych z dostępem do serwera bazodanowego. Poznaliśmy pojęcie migracji w środowisku Laravel. Zapoznaliśmy się ze sposobem tworzenia skryptów migracyjnych oraz utworzyliśmy naszą pierwszą tabelę bazy danych za pomocą narzędzi Laravel.
W kolejnym artykule omówię podstawowe operacje na utworzonej tabeli bazy danych z poziomu Laravel.&lt;br /&gt;&lt;br /&gt;
Serdecznie zapraszam do kolejnej części niniejszego szkolenia, p.t. &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-tabele-bazodanowe-i.html&quot;&gt;Tabele bazodanowe i dynamiczne widoki&lt;/a&gt; 
 
 
 
 </description><link>https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-migracje.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3SpIyWqMiKNJCv7BbX2cBh9EMaXNF3k_fq-l29JtSU_CuA7dsAJMJXinFBz18jGXFOpk7K6QeRRAAHNUGDYvrLNFeQ3XpamWi4BaAbPbLbhkiD4vrucHcKzj2EVmPxuOSQiTplW_TTB0/s72-c/config_database.jpg" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-7693348967099680304</guid><pubDate>Sat, 25 Nov 2017 12:57:00 +0000</pubDate><atom:updated>2017-11-28T21:38:43.187+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Laravel</category><category domain="http://www.blogger.com/atom/ns#">php</category><title>Laravel od podstaw: widoki i szablony</title><description>Znając już &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-podstawy-routingu.html&quot;&gt;podstawy routingu w Laravel&lt;/a&gt;, możemy teraz przejść do pracy z widokami i uruchomić naszą pierwszą stronę internetową stworzoną w tym świetnym frameworku. Zrobimy to teraz wspólnie krok po kroku.  
Z &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-podstawy-routingu.html&quot;&gt;poprzedniego artykułu&lt;/a&gt; wiemy już, że po dokonaniu świeżej instalacji frameworka mamy jeden gotowy widok przykładowy:  
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
resources/views/welcome.blade.php&lt;/div&gt;
Mamy również wstępnie ustawioną regułę routingu, która jest powiązana z tym widokiem: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::get(&#39;/&#39;, function() {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return view(&#39;welcome&#39;);&lt;br /&gt;
&lt;br /&gt;
});&lt;/div&gt;
Znamy już podstawy działania &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-podstawy-routingu.html&quot;&gt;routingu w Laravel&lt;/a&gt; i wiemy do czego służą powyższa reguła, wraz z powiązanym z nią widokiem. &lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Nasza pierwsza strona internetowa stworzona w Laravel&lt;/h2&gt;
&lt;br /&gt;
Utwórzmy teraz prosty, szkoleniowy plik HTML zawierające następujący kod: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&quot;pl&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;title&amp;gt;Moje pierwsze widoki w Laravel&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;p&amp;gt;Przykładowy paragraf treści&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;
Następnie zapiszmy ten plik jako: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
resources/views/mojastrona.blade.php&lt;/div&gt;
Po zapisaniu pliku przejdży do reguł routingu i dodajmy do pliku  
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
routes/web.php&lt;/div&gt;
Następującą zawartość: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::get(&#39;/mojastrona&#39;, function() {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return view(&#39;mojastrona&#39;);&lt;br /&gt;
&lt;br /&gt;
});&lt;/div&gt;
Po przejściu na względny adres URL /mojastrona, oczywiście względem adresu naszej aplikacji, pojawia się widok HTML związany ze stroną, czyli nic ciekawego poza napisem: 
&lt;br /&gt;
&lt;div style=&quot;margin-bottom: 1em; margin-top: 1em;&quot;&gt;
&quot;Przykładowy paragraf treści&quot;&lt;/div&gt;
Świetnie! Wiemy już jak utworzyć widok i powiązać go z trasą routingu. Teraz zobaczmy jak proste jest dodanie do naszego widoku treści generowanej w PHP.&lt;br /&gt;
&lt;br /&gt;
Laravel jest świetnym środowiskiem programistycznym i pozwala w bardzo przyjazny sposób tworzyć czysty i przejrzysty kod, oddzielając warstwę PHP od warstwy HTML. Do tego właśnie służą szablony z rozszerzeniem .blade.php.&lt;br /&gt;
&lt;br /&gt;
Jak się posługiwać szablonami? Otóż zmienne można przekazywać do widoku na wiele sposobów. Zacznijmy od najprostszego z nich. Aby sprawdzić jak to się robi edytujmy naszą regułę routingu i dodajmy do niej wartość, którą mamy zamiar wyświetlić w powiązanym z nią widoku: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::get(&#39;/mojastrona&#39;, function() {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return view(&#39;mojastrona&#39;)-&amp;gt;with(&#39;tekst&#39;, &#39;Mój przykładowy paragraf&#39;);&lt;br /&gt;
&lt;br /&gt;
});&lt;/div&gt;
Dostosujmy teraz nasz szkoleniowy widok, tak aby mogła się w nim prawidłowo wyświetlać przekazywana przez funkcje php wartość: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&quot;pl&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;title&amp;gt;Moje pierwsze widoki w Laravel&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;p&amp;gt;{{$tekst}}&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;
Jeśli po zapisaniu powyższych zmian w plikach routingu i wodoku widzimy w przeglądarce tekst, który przekazaliśmy do widoku za pomocą funkcji PHP, oznacza to, że ten kolejny krok także się powiódł. 
Predstawię teraz kilka innych podstawowych sposobów przekazywania wartości do widoków w środowisku Laravel.&lt;br /&gt;
&lt;br /&gt;
Oto kilka przykładów, których efekt jest dokładnie taki sam jak we wstępnie omówionym sposobie przekazywania zmiennej do widoku:
 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::get(&#39;/mojastrona&#39;, function() {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return view(&#39;mojastrona&#39;, [&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;tekst&#39; =&amp;gt; &#39;Mój przykładowy paragraf&#39;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]);&lt;br /&gt;
&lt;br /&gt;
});&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::get(&#39;/mojastrona&#39;, function() {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $tekst = &#39;Mój przykładowy paragraf&#39;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return view(&#39;mojastrona&#39;, compact(&#39;tekst&#39;));&lt;br /&gt;
&lt;br /&gt;
});&lt;/div&gt;
&lt;br /&gt;
Wiemy już jak przekazywać zmienne do widoku i w jaki sposób się do nich z widoku odwoływać. Zobaczmy teraz jak przekazywać do widoku kolekcje i w jaki sposób z nimi pracować z poziomu widoku.
Oto jeden ze sposobów przekazywania kolekcji zmiennych do widoku:


&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::get(&#39;/mojastrona&#39;, function() {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $lista = [&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;To jest pierwszy element&#39;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;To jest drugi element&#39;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;To jest trzeci element&#39;,&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return view(&#39;mojastrona&#39;, compact(&#39;lista&#39;));&lt;br /&gt;
&lt;br /&gt;
});
&lt;/div&gt;
&lt;div class=&quot;code&quot;&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&quot;pl&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;title&amp;gt;Moje pierwsze widoki w Laravel&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @foreach ($lista as $element)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;li&amp;gt;{{$element}}&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @endforeach&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/body&amp;gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglGpZzs8OS7IS-7iBkStChdgGSj9mZZ25K79wV0cZJsOhNlgp0Kl65YZu9rYhAt27Oae967ilSnYpu7xsX8wV0iORhv_zcu8GBzHgdIqtfvfM5c0ijjutQ1LZZs7qDoZ7w4oKOqvmai-c/s1600/lista.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Efekt działania powyższego kodu w przeglądarce&quot; border=&quot;0&quot; data-original-height=&quot;140&quot; data-original-width=&quot;694&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglGpZzs8OS7IS-7iBkStChdgGSj9mZZ25K79wV0cZJsOhNlgp0Kl65YZu9rYhAt27Oae967ilSnYpu7xsX8wV0iORhv_zcu8GBzHgdIqtfvfM5c0ijjutQ1LZZs7qDoZ7w4oKOqvmai-c/s1600/lista.jpg&quot; title=&quot;Efekt działania powyższego kodu w przeglądarce&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Efekt działania powyższego kodu w przeglądarce&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Świetnie! Wiemy już jak w podstawowy sposób posługiwać się widokami i przekazywać do nich zmienne. W kolejnych artykułach z tej serii posłużę się rozmaitymi przykładami z wartościami pozyskiwanymi z bazy danych, ale najpierw będzie konieczne omówienie podstaw pracy z bazami danych w środowisku Laravel. Zrobię to w kolejnym artykule.&lt;br /&gt;&lt;br /&gt;
Serdecznie zapraszam do kolejnej części niniejszego szkolenia, p.t. &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-migracje.html&quot;&gt;Migracje&lt;/a&gt;
</description><link>https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-widoki-i-szablony.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglGpZzs8OS7IS-7iBkStChdgGSj9mZZ25K79wV0cZJsOhNlgp0Kl65YZu9rYhAt27Oae967ilSnYpu7xsX8wV0iORhv_zcu8GBzHgdIqtfvfM5c0ijjutQ1LZZs7qDoZ7w4oKOqvmai-c/s72-c/lista.jpg" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-5617173657340145180</guid><pubDate>Fri, 24 Nov 2017 16:46:00 +0000</pubDate><atom:updated>2017-11-28T21:38:27.906+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">html</category><category domain="http://www.blogger.com/atom/ns#">Laravel</category><category domain="http://www.blogger.com/atom/ns#">php</category><title>Laravel od podstaw: podstawy routingu</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikzLGdvM6gXdCOeYyE4i9PYderl8qcoMyIIE78IiGfdqT1NuLVVsEDNscEhi3B9xQmCsM77zPt4HC0fQG4cSJzFxSkzDYBZgLtNXPrKsAPcEagU2iBhJSpqs7n3FtNdOKEgY16vGtQ598/s1600/1501696349laravel-l-slant-1024x499.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;500&quot; data-original-width=&quot;1024&quot; height=&quot;195&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikzLGdvM6gXdCOeYyE4i9PYderl8qcoMyIIE78IiGfdqT1NuLVVsEDNscEhi3B9xQmCsM77zPt4HC0fQG4cSJzFxSkzDYBZgLtNXPrKsAPcEagU2iBhJSpqs7n3FtNdOKEgY16vGtQ598/s400/1501696349laravel-l-slant-1024x499.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Laravel to bardzo rozbudowany, a zarazem prosty w użyciu i przejrzysty framework PHP. Od dłuższego czasu jestem jego zwolennikiem, więc postanowiłem przedstawić ten framework swoim czytelnikom, poświęcając mu całą serię artykułów tematycznych. Mam nadzieję, że moje przedsięwzięcie okaże się przydatne, a pasjonaci języka PHP i opartych na nim frameworków będą mogli czerpać z niego wiele korzyści. 
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Laravel świetnie sobie radzi z tworzeniem witryn internetowych i wszelkiego rodzaju aplikacji webowych. Ponieważ routing, trasy i widoki to podstawowe elementy niemalże każdej współczesnej witryny web, sądzę że warto od nich rozpocząć tą prygodę.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Trasy i widoki w Laravel&lt;/h2&gt;
&lt;br /&gt;
Czym są routing, trasy i widoki?  Otóż w Laravel pod pojęciem routingu kryje się zbiór reguł przypisujących dane funkcje lub widoki do tras. 
Trasa jest częścią adresu URL aplikacji web, a może służyć, między innymi, do prowadzenia użytkownika do konkretnego jej widoku, czyli do tego co wyświetlane jest w przeglądarce po przejściu do wybranego adresu URL. Trasa może także służyć do wywołania konkretnej akcji wewnętrznej, takiej jak przykładowo zapisanie do bazy danych informacji wprowadzonych do formularza przez użytkownika. 
Do podstawowego zarządzania trasami i odpowiadającymi im widokami służy plik, którego ścieżka, względem katalogu aplikacji, jest następująca: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
routes/web.php&lt;/div&gt;
Co się powinno w tym pliku znajdować? Otóż plik ten powinien zawierać definicje tras routingu aplikacji i przypisanych im wartości zwrotnych lub funkcji. W pliku tym można określać akcje przypisane do różnego rodzaju żądań skierowanych do określonych adresów URL. Mogą to być przykładowo żądania typu GET i POST, ale nie tylko.   
&lt;br /&gt;
&lt;br /&gt;
W przypadku świeżej instalacji frameworka Laravel, plik odpowiedzialny za routing w katalogu nowej aplikacji zawiera następujący wpis: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::get(&#39;/&#39;, function () { 
    return view(&#39;welcome&#39;); 
});&lt;/div&gt;
Powyższy wpis oznacza tyle, że po wejściu na główną stronę witryny powinien pojawić się widok o nazwie &#39;welcome&#39;, który jest w tym przypadku oparty o szablon .blade, znajdujący się w głównym katalogu widoków. Szablony typu .blade są bardzo potężnym narzędziem frameworka Laravel, więc omówię je dogłębnie w jednym z kolejnych artykułów. 

&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE6eJPe61x1EurErlOessIo4gt1lURZ6L3o_6T2zmuH_0DWHxSx-gUPagGFZ0KXqx8UjNZbfl5NOnu28GyUUboT6ZNafNasejCrtlFXU8UudaHudfDOO_Zb8mn3b19tZ5xhJHnLCAHK68/s1600/welcome.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Świeża instalacja Laravel: domyślny widok powitania&quot; border=&quot;0&quot; data-original-height=&quot;793&quot; data-original-width=&quot;1600&quot; height=&quot;316&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE6eJPe61x1EurErlOessIo4gt1lURZ6L3o_6T2zmuH_0DWHxSx-gUPagGFZ0KXqx8UjNZbfl5NOnu28GyUUboT6ZNafNasejCrtlFXU8UudaHudfDOO_Zb8mn3b19tZ5xhJHnLCAHK68/s640/welcome.jpg&quot; title=&quot;Świeża instalacja Laravel: domyślny widok powitania&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Świeża instalacja Laravel: domyślny widok powitania&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Glówna ścieżka, pod którą umieszczane są pliki widoków aplikacji to: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
resources/views&lt;/div&gt;
Przytoczę kilka podstawowych przykładów routingu w Laravel. Po przetestowaniu i zrozumieniu poniższych przykładów, zachęcam czytelników do zagłębienia tematu korzystając z oficjalnej dokumentacji frameworka &lt;a href=&quot;https://laravel.com/docs/5.5/routing&quot;&gt;Laravel&lt;/a&gt;
 
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Proste przykłady reguł routingu w Laravel&lt;/h2&gt;
&lt;br /&gt;
Efektem poniższego wpisu, jest wyświetlenie się napisu &#39;Witamy!&#39; po przejściu na względny adres URL /, czyli na główną stronę serwisu web. W odpowiedzi na żądanie HTTP typu GET z adresem strony głównej aplikacji: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::get(&#39;/&#39;, function () {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;return &#39;Witamy!&#39;;&lt;br /&gt;
});&lt;/div&gt;
&lt;br /&gt;
Poniższy wpis routingu powoduje wyświetlenie się napisu &#39;Witamy&#39; w odpowiedzi na każdego rodzaju żądanie HTTP z adresem strony głównej aplikacji web:  
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::any(&#39;/&#39;, function () {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;return &#39;Co tu robić?&#39;;&lt;br /&gt;
});&lt;/div&gt;
&lt;br /&gt;
Definiując reguły routingu możemy również przypisać wewnętrzną nazwę określanej trasy, do której można się w ten sposób odwoływać z poziomu skryptów php, przykładowo: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::get(&#39;/&#39;, function () {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;return &#39;Witamy!&#39;;&lt;br /&gt;
})-&amp;gt;name(&#39;home&#39;);&lt;/div&gt;
&lt;br /&gt;
Poniższy przykład powoduje wyświetlenie się nazwy użytkownika w odpowiedzi na żądanie HTTP GET pod adresem względnym /panel/{login} W tym przypadku parametr URL o nazwie login przyjmuje dowolny ciąg znaków: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::get(&#39;/panel/{login}&#39;, function ($login) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;return &#39;Witamy użytkownika &#39;.$login; &lt;br /&gt;
});&lt;/div&gt;
&lt;br /&gt;
Poniższy wpis przypisuje do względnego adresu URL &#39;/posty&#39; naszej aplikacji i żądania HTTP typu GET metodę index() kontrolera zasobów PostController oraz ustawia nazwę wewnętrzną dla tej reguły. Kontrolery zasobów frameworka Laravel omówię bardziej szczegółowo w jednym z kolejnych artykułów niniejszej serii: 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
Route::get(&#39;/posts&#39;,&#39;PostController@index&#39;)-&amp;gt;name(&#39;home&#39;);&lt;/div&gt;
&lt;br /&gt;
Aby wyświetlić aktualną listę routingu, można wydać następujące polecenie z głównego katalogu aplikacji 
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
php artisan route:list&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtOO86z0vczeffjfs1XdUkS9M6lCfhVrGJ3e0NVck-7x_wb_6L6l5NG6Ox647DeOn3-ONlry2iDT09YB1xo0DLwTKQ-t_vQwrZuFizoCkRg3miGq1TesvQG_dSI7-WmieH6DUD3SFi5lM/s1600/routes.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Przykładowy efekt polecenia php artisan route:list&quot; border=&quot;0&quot; data-original-height=&quot;154&quot; data-original-width=&quot;932&quot; height=&quot;105&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtOO86z0vczeffjfs1XdUkS9M6lCfhVrGJ3e0NVck-7x_wb_6L6l5NG6Ox647DeOn3-ONlry2iDT09YB1xo0DLwTKQ-t_vQwrZuFizoCkRg3miGq1TesvQG_dSI7-WmieH6DUD3SFi5lM/s640/routes.jpg&quot; title=&quot;Przykładowy efekt polecenia php artisan route:list&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Przykładowy efekt polecenia php artisan route:list&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Co dalej?&lt;/h2&gt;
&lt;br /&gt;
Przedstawiłem tutaj kilka podstaw, które okażą się niezbędne do zrozumienia kolejnych tematów. Do routingu, tras i widoków będę nieustannie powracał w kolejnych artykułach z tej serii, poszerzając zakres pojęć o kolejne elementy. &lt;br /&gt;&lt;br /&gt;
Serdecznie zapraszam do kolejnej części niniejszego szkolenia, p.t. &lt;a href=&quot;https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-widoki-i-szablony.html&quot;&gt;Widoki i Szablony&lt;/a&gt;


</description><link>https://informatyka-porady.blogspot.com/2017/11/laravel-od-podstaw-podstawy-routingu.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikzLGdvM6gXdCOeYyE4i9PYderl8qcoMyIIE78IiGfdqT1NuLVVsEDNscEhi3B9xQmCsM77zPt4HC0fQG4cSJzFxSkzDYBZgLtNXPrKsAPcEagU2iBhJSpqs7n3FtNdOKEgY16vGtQ598/s72-c/1501696349laravel-l-slant-1024x499.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-2481516164544974843</guid><pubDate>Mon, 01 May 2017 16:28:00 +0000</pubDate><atom:updated>2017-05-02T22:10:06.989+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Hardware</category><category domain="http://www.blogger.com/atom/ns#">sieci</category><category domain="http://www.blogger.com/atom/ns#">software</category><title>Alternatywne oprogramowanie routera: OpenWRT</title><description>Na większości dostępnych na rynku urządzeń sieciowych, takich jak routery bądź punkty dostępowe Wi-Fi, można w prosty sposób zainstalować alternatywny system operacyjny. Na podstawie mojego doświadczenia w tym zakresie, mogę śmiało stwierdzić, iż pomysł ten jest bardzo dobry, a jego realizacja przeważnie otwiera zupełnie nowe horyzonty jeśli chodzi o funkcjonalność i bezpieczeństwo sprzętu, pod warunkiem umiejętnego podejścia do tego zagadnienia oraz doboru odpowiedniego rozwiązania.   
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Trudny wybór alternatywy&lt;/h2&gt;
&lt;br /&gt;
W sieci można dziś znaleźć bardzo dużo rozwiązań programistycznych, które stanowią alternatywę dla fabrycznego oprogramowania routerów i tym podobnych urządzeń. W śród tak szerokiego zakresu oprogramowania może być dość ciężko podjąć właściwą decyzję odnośnie najlepszego rozwiązania dla danego urządzenia i jego docelowego przeznaczenia. 
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
OpenWRT&lt;/h2&gt;
&lt;br /&gt;
W niniejszym artykule mam zamiar wstępnie przedstawić czytelnikom darmowy system operacyjny OpenWRT, przeznaczony dla routerów i podobnych urządzeń sieciowych oraz zaprezentować jego przykładową instalację na punkcie dostępowym Wi-Fi TP-LINK TL-WA701ND. Celem takiej instalacji ma być znaczne poszerzenie możliwości urządzenia oraz zwiększenie poziomu bezpieczeństwa obsługiwanej przez niego sieci Wi-Fi.
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8UK1mX796h741yHicrfTSczW5sL_XaDXKyDuOdHm8rUZ1TzrHzSVX0tQG9nCGZFXHF32ho3AulKIXWnxtcG9ZSBYdX-93v1yrxwPmH-AZpYX3e6xULjinz4huXO1Aj3PF-GHb0ixiBNU/s1600/IMG_20170430_214608.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Nowe urządzenie TP-LINK TL-WA701ND V2.2&quot; border=&quot;0&quot; height=&quot;257&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8UK1mX796h741yHicrfTSczW5sL_XaDXKyDuOdHm8rUZ1TzrHzSVX0tQG9nCGZFXHF32ho3AulKIXWnxtcG9ZSBYdX-93v1yrxwPmH-AZpYX3e6xULjinz4huXO1Aj3PF-GHb0ixiBNU/s320/IMG_20170430_214608.jpg&quot; title=&quot;Nowe urządzenie TP-LINK TL-WA701ND V2.2&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Nowe urządzenie TP-LINK TL-WA701ND V2.2&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
W przeciwieństwie do większości innych dystrybucji tego typu oprogramowania, OpenWRT jest zbudowany całkowicie od podstaw w sposób taki, aby spełniać rolę w pełni funkcjonalnego i łatwego do modyfikowania systemu operacyjnego, przeznaczonego dla szerokiej gamy aktywnych urządzeń sieciowych. W praktyce oznacza to, że system może zawierać tylko te składniki, które są w danej chwili użytkownikowi potrzebne, bez zbędnego nadmiaru kodu i bez niepotrzebnych modułów obciążających jego działanie. OpenWRT umożliwia bowiem dodawanie i usuwanie pakietów oprogramowania wedle potrzeb użytkownika, który - wbrew sytuacji jaka ma miejsce w przypadku fabrycznego oprogramowania sieciowych urządzeń - może w ten sposób wpływać na przewidywany przez producenta zakres funkcjonalności sprzętu, programowo personalizując i poszerzając jego sposób działania.  
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
OpenWRT: ponad 2000 dostępnych pakietów oprogramowania!&lt;/h2&gt;
&lt;br /&gt;
Na chwilę obecną oficjalne repozytorium OpenWRT udostępnia ponad 2000 pakietów oprogramowania, które mogą być obsługiwane przez zainstalowany na urządzeniu system operacyjny. Użytkownik może więc dowolnie instalować lub usuwać te pakiety, które go w danej chwili interesują lub nie są już mu potrzebne.   
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
OpenWRT: wyższy poziom ochrony sieci&lt;/h2&gt;
&lt;br /&gt;
OpenWRT ponadto umożliwia korzystanie z zaawansowanych funkcji związanych z bezpieczeństwem IT, takich jak inspekcja pakietów danych, bądź funkcji związanych z detekcją włamań do sieci. Tego typu możliwości były dotychczas przeważnie fabrycznie dostępne wyłącznie w bardzo drogich aktywnych urządzeniach sieciowych, a czytelnik raczej nie natknie się na nie w fabrycznym oprogramowaniu domowych routerów bądź punktów dostępowych Wi-Fi. 
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Uwagi wstępne do instalacji OpenWRT&lt;/h2&gt;
&lt;br /&gt;
Oprogramowanie OpenWRT działa na rozmaitych routerach, punktach dostępowych Wi-Fi i tym podobnych aktywnych zarządzalnych urządzeniach sieciowych, lecz niestety nie na wszystkich. Muszę tutaj koniecznie czytelników ostrzec, iż flaszowanie binarnego pliku systemu OpenWRT na urządzeniu, które nie jest wpierane przez jego twórców, a nawet próba instalacji niewłaściwej dla danego sprzętu wersji oprogramowania, to czynności które mogą definitywnie zniszczyć urządzenie. Dlatego przed przystąpieniem do ewentualnego zakupu sprzętu w celu instalacji na nim systemu OpenWRT, warto sprawdzić czy urządzenie sieciowe widnieje na &lt;a href=&quot;https://wiki.openwrt.org/toh/start&quot;&gt;oficjalnej liście sprzętu OpenWRT&lt;/a&gt; i czy w ogóle jego wsparcie jest przewidziane przez twórców systemu. Warto także zapoznać się z informacją dotyczącą aktualnej wersji oprogramowania dla danego urządzenia. Istotny jest nie tylko model, ale także jego wersja. Dokładne informacje o modelu, a także o wersji sprzętu można przeważnie znaleźć na opakowaniu produktu. 
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFcbCajNbSWarH9lZch0M16T-z16QryIabC8YAI0z6eSlodpEnlrxJxiEwjMF-U7a-YkZFIFdjX-A-gyBMy68ABEzleqG1ooZchE3-AeuXLAn8qRTccgC43waf555i74bjYoVhxwvE7j4/s1600/IMG_20170430_125947.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Informacje o modelu i wersji urządzenia&quot; border=&quot;0&quot; height=&quot;138&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFcbCajNbSWarH9lZch0M16T-z16QryIabC8YAI0z6eSlodpEnlrxJxiEwjMF-U7a-YkZFIFdjX-A-gyBMy68ABEzleqG1ooZchE3-AeuXLAn8qRTccgC43waf555i74bjYoVhxwvE7j4/s320/IMG_20170430_125947.jpg&quot; title=&quot;Informacje o modelu i wersji urządzenia&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Informacje o modelu i wersji urządzenia&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Przed przystąpieniem do instalacji oprogramowania OpenWRT należy uważnie przeczytać wszelkie instrukcje, zalecenia, a szczególnie ostrzeżenia opublikowane w &lt;a href=&quot;https://openwrt.org/&quot;&gt;witrynie jego twórców&lt;/a&gt;. Należy również pamiętać o tym, że nikt nie daje jakiejkolwiek gwarancji na to, iż dana instalacja się powiedzie, a sprzęt nie zostanie definitywnie zniszczony w skutek jej przeprowadzenia. Pamiętajmy, że jeśli decydujemy się na instalację na naszym sprzęcie sieciowym jakiegokolwiek oprogramowania alternatywnego, robimy to tylko i wyłącznie na własne ryzyko. Gwarancja producenta nie uwzględnia możliwości naprawy sprzętu uszkodzonego w skutek instalacji alternatywnego oprogramowania.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Pobieranie i instalacja OpenWRT&lt;/h2&gt;
&lt;br /&gt;
Po zapoznaniu się z informacjami wstępnymi możemy rozpocząć procedurą zdobywania właściwego dla naszego urządzenia oprogramowania. 
&lt;br /&gt;
&lt;br /&gt;
Istotną kwestią jest to, iż procedura instalacji systemu OpenWRT może się nieco różnić w zależności od urządzenia. Opisany tutaj sposób podejścia do tej kwestii odnosi się do konkretnego produktu oraz do konkretnej wersji oprogramowania.  
&lt;br /&gt;
&lt;br /&gt;
Aby w prosty sposób znaleźć właściwą dla interesującego nas sprzętu wersję oprogramowania OpenWRT, należy przejść na stronę &lt;a href=&quot;https://wiki.openwrt.org/toh/views/toh_extended_all&quot;&gt;https://wiki.openwrt.org/toh/views/toh_extended_all&lt;/a&gt;. W tym miejscu znajduje się tabela zawierająca listę rozmaitych urządzeń sieciowych różnych producentów.  
&lt;br /&gt;
&lt;br /&gt;
Aby uzyskać większą ilość szczegółów dotyczących danego urządzenia, a w tym ewentualnie odnośnik do pobierania obsługiwanej przez urządzenie wersji oprogramowania, należy ograniczyć ilość wpisów w tabeli, wprowadzając w okienku nagłówka kolumny dotyczącej modelu informacje o modelu urządzenia.  
&lt;br /&gt;
&lt;br /&gt;
Przykładowo, w przypadku opisywanej w niniejszym artykule procedury dotyczącej punktu dostępowego TP-LINK Tl-WA701ND, wystarczy wpisać 701ND, aby uzyskać bardziej szczegółowe informacje o tym modelu oraz wyświetlić odnośnik do pobierania odpowiedniej wersji oprogramowania dla tego sprzętu. 
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaKHfvyStxwJvuid3lEI6vp5SG6yd7YK3TgY8Q_VDZqoO_w6Vc4kLR41kktOpqScxCiGWfnoiSG7vUFVJxCuPJQ9b7R97pDnDLlw60q5yLuoqRzdvmHBjXp_csUYXz5DSz1pNs2-r6qs0/s1600/pobieranie_openwrt.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Wersja systemu OpenWRT dla danego urządzenia&quot; border=&quot;0&quot; height=&quot;198&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaKHfvyStxwJvuid3lEI6vp5SG6yd7YK3TgY8Q_VDZqoO_w6Vc4kLR41kktOpqScxCiGWfnoiSG7vUFVJxCuPJQ9b7R97pDnDLlw60q5yLuoqRzdvmHBjXp_csUYXz5DSz1pNs2-r6qs0/s640/pobieranie_openwrt.jpg&quot; title=&quot;Wersja systemu OpenWRT dla danego urządzenia&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Należy upewnić się, że pobieramy odpowiednią dla urządzenia wersję systemu&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;h2&gt;
Instalacja OpenWRT na urządzeniu TP-LINK TL-WA701ND&lt;/h2&gt;
&lt;br /&gt;
Po pobraniu oprogramowania OpenWRT, w celu rozpoczęcia procedury instalacyjnej należy się ze sprzętem połączyć za pomocą przeglądarki internetowej, korzystając w tym celu koniecznie z sieci przewodowej, a nie z Wi-Fi. Zalecam w tym celu korzystać z przeglądarki Mozilla FireFox. Jeśli urządzenie nie było jeszcze używane, wówczas w celu połączenia się z nim i zalogowania do systemu producenta należy skorzystać z informacji widniejących na spodzie obudowy. W pasku adresów przeglądarki należy zatem wpisać adres 192.168.0.254. Po pojawieniu się okienka z monitem o nazwę użytkownika i hasło należy wpisać admin i admin. To są bowiem standardowe wartości dla tego sprzętu. 
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA4g63H7I4N_dW4g4ji1eKchGdCO4WUW8p6jvpb8aPlAosg-0wJdLnIOPaTJcWYd_kpqXsoejwHjzUrTNelV69Ns0kFlBXuebKfPItWMByN_z5GDK1rcv98Lrc_oUkoQbO5epohwPY0cA/s1600/IMG_20170430_215224.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Informacje na spodzie urządzenia&quot; border=&quot;0&quot; height=&quot;286&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA4g63H7I4N_dW4g4ji1eKchGdCO4WUW8p6jvpb8aPlAosg-0wJdLnIOPaTJcWYd_kpqXsoejwHjzUrTNelV69Ns0kFlBXuebKfPItWMByN_z5GDK1rcv98Lrc_oUkoQbO5epohwPY0cA/s320/IMG_20170430_215224.jpg&quot; title=&quot;Informacje na spodzie urządzenia&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Informacje na spodzie urządzenia&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Po nawiązaniu połączenia z punktem dostępowym oraz pomyślnym zalogowaniu się do fabrycznego systemu producenta, należy z dostępnego w prawej części widoku menu wybrać opcję System Tools a następnie przejść do Firmware Upgrade.  
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi51LYP20wJ7lxn1WiumEXk79Zal53KYM35h9rMwtFcA4rh3MtoPtDYuCWfnH31ZV6h8_mX9wGmrHxDtg71Qo3IzNlfx6YU3pgP_mfJ0lIHzPQeoawJDpqoc3_-VJ1j1zsNnS9EZITQAhc/s1600/zaladowanie_pliku_binarnego.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Wybór i załadowanie pliku binarnego&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi51LYP20wJ7lxn1WiumEXk79Zal53KYM35h9rMwtFcA4rh3MtoPtDYuCWfnH31ZV6h8_mX9wGmrHxDtg71Qo3IzNlfx6YU3pgP_mfJ0lIHzPQeoawJDpqoc3_-VJ1j1zsNnS9EZITQAhc/s320/zaladowanie_pliku_binarnego.jpg&quot; title=&quot;Wybór i załadowanie pliku binarnego&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Wybór i załadowanie pliku binarnego OpenWRT&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Korzystając z widniejącej w głównej części widoku kontrolki plików należy wybrać poprzednio pobrane oprogramowanie oraz kliknąć w przycisk Upgrade w celu rozpoczęcia procedury instalacji nowego systemu.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhanFJR5jp7MACpfXvPmGZJCRfKLm4bVP392gmjcdLCmBHymqxDlA7mi1V1aeXKYlIO5EWq-0SaN8qxc6bz3S0ufdY6F8luZUFN7maZEfhYvU3zuE8RF2CiwTayhrEkWloHB_HjeU6kfC8/s1600/aktualizacja.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Podmiana fabrycznego oprogramowania na OpenWRT&quot; border=&quot;0&quot; height=&quot;165&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhanFJR5jp7MACpfXvPmGZJCRfKLm4bVP392gmjcdLCmBHymqxDlA7mi1V1aeXKYlIO5EWq-0SaN8qxc6bz3S0ufdY6F8luZUFN7maZEfhYvU3zuE8RF2CiwTayhrEkWloHB_HjeU6kfC8/s320/aktualizacja.jpg&quot; title=&quot;Podmiana fabrycznego oprogramowania na OpenWRT&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Podmiana fabrycznego oprogramowania na OpenWRT&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Po udanej instalacji nowego systemu należy poczekać kilkadziesiąt sekund aż router się zrestartuje. Wówczas można rozpocząć konfigurację.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Konfiguracja OpenWRT na urządzeniu TP-LINK TL-WA701ND&lt;/h2&gt;
&lt;br /&gt;
Po restarcie router powinien posiadać adres IP 192.168.1.1, a więc aby się do niego ponownie dostać interfejs sieciowy komputera powinien być ustawiony na tę samą podsieć. 
&lt;br /&gt;
&lt;br /&gt;
Tym razem nazwa użytkownika to root, a hasło jest puste. 
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidxsXsDzY-0uxBmopD837bRvoMk085R119ny4zaYO2r4bXv35hyOzuuJPTWVGwg191KB2mbnqqQ5qoLRHGo7QW7xWNpgqPbG4bLhzE_2s77G59wfTxkk4TUJbYK7ODJvHC5p5C_USKBZM/s1600/open_wrt_logowanie.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Logowanie się do OpenWRT&quot; border=&quot;0&quot; height=&quot;155&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidxsXsDzY-0uxBmopD837bRvoMk085R119ny4zaYO2r4bXv35hyOzuuJPTWVGwg191KB2mbnqqQ5qoLRHGo7QW7xWNpgqPbG4bLhzE_2s77G59wfTxkk4TUJbYK7ODJvHC5p5C_USKBZM/s320/open_wrt_logowanie.jpg&quot; title=&quot;Logowanie się do OpenWRT&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Logowanie się do OpenWRT&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Po zalogowaniu się do OpenWRT, pierwsze co się pojawia to informacje o statusie sprzętu i systemu.   
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheKVCn3fnzv5gZmVIOB2QPL_tx0_EYwXAkVmhyphenhyphenH13LNoi912FE8wbiQS-teLDHF9JvEb-WoUrfPRUAlkuh_x_5yJ7zi1sg8XT2Q64devdqr_FvGvIW11bO1AUwbYheCLhEZSvIglABOKA/s1600/open_wrt_konfiguracja_1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;OpenWRT - status systemu&quot; border=&quot;0&quot; height=&quot;117&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheKVCn3fnzv5gZmVIOB2QPL_tx0_EYwXAkVmhyphenhyphenH13LNoi912FE8wbiQS-teLDHF9JvEb-WoUrfPRUAlkuh_x_5yJ7zi1sg8XT2Q64devdqr_FvGvIW11bO1AUwbYheCLhEZSvIglABOKA/s320/open_wrt_konfiguracja_1.jpg&quot; title=&quot;OpenWRT - status systemu&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;OpenWRT - status systemu&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Ze względów bezpieczeństwa hasło należy oczywiście ustawić natychmiast po pierwszym zalogowaniu się do systemu. W tym celu, aby przejść do związanych z tą czynnością ustawień, z sekcji System menu znajdującego się w górnej części widoku należy wybrać Administration. W sekcji Router Password należy wpisać i potwierdzić nowe hasło.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHQCtuNAfkx0naUfA2HeiCXjyTxtOt4LKi5wYxKLpuQ7G3eDwA1iLRE-isb8FTBqD2nINZJpZIyMc94TJlsQYzeaWG2NnYPe9UZvFubpQ74qbWhaJH9Ao77OQei7MBav5FTWty3HKNXqA/s1600/haslo_openwrt.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;OpenWRT - ustawianie hasła do routera&quot; border=&quot;0&quot; height=&quot;125&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHQCtuNAfkx0naUfA2HeiCXjyTxtOt4LKi5wYxKLpuQ7G3eDwA1iLRE-isb8FTBqD2nINZJpZIyMc94TJlsQYzeaWG2NnYPe9UZvFubpQ74qbWhaJH9Ao77OQei7MBav5FTWty3HKNXqA/s640/haslo_openwrt.jpg&quot; title=&quot;OpenWRT - ustawianie hasła do routera&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;OpenWRT - ustawianie hasła do routera&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Aby korzystanie z podstawowej funkcji urządzenia było teraz możliwe, należy z sekcji Network górnego menu wybrać Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPfP6AG42RvNp6ECxjgrQoL3hzks1VpH9RjgKyZJsjWMClZghcKUiSFVORaHGgDZhc8ZVHvtdNFrQns-HgLZ4FdqdCK6bY9St0MR9d4NQM2y_uuSK-lrX9N8mnUhRYeaYUMcvxG9C7glw/s1600/wireless_overwiev.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;OpenWRT - ustawienia sieci Wi-Fi&quot; border=&quot;0&quot; height=&quot;140&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPfP6AG42RvNp6ECxjgrQoL3hzks1VpH9RjgKyZJsjWMClZghcKUiSFVORaHGgDZhc8ZVHvtdNFrQns-HgLZ4FdqdCK6bY9St0MR9d4NQM2y_uuSK-lrX9N8mnUhRYeaYUMcvxG9C7glw/s320/wireless_overwiev.jpg&quot; title=&quot;OpenWRT - ustawienia sieci Wi-Fi&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;OpenWRT - ustawienia sieci Wi-Fi&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Po pojawieniu się widoku Network Overview należy kliknąć w przycisk Edit aby przejść do ustawień interfejsu Wi-Fi. 
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-RjVfVM4rrlxdNud-uTuNki4gPPAWYv2GWqTV-wERmnfk43-ywtdXT8KgyjgtMcsQVme1gTEB7RQiZHqKq1iW-ENPnPXnxxHj0LZLHWD2iT_KB5Tty_ih_tlaNLQSSSZrxBlmcYgdwls/s1600/wireless_network.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;OpenWRT - ustawienia sieci Wi-Fi&quot; border=&quot;0&quot; height=&quot;250&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-RjVfVM4rrlxdNud-uTuNki4gPPAWYv2GWqTV-wERmnfk43-ywtdXT8KgyjgtMcsQVme1gTEB7RQiZHqKq1iW-ENPnPXnxxHj0LZLHWD2iT_KB5Tty_ih_tlaNLQSSSZrxBlmcYgdwls/s320/wireless_network.jpg&quot; title=&quot;OpenWRT - ustawienia sieci Wi-Fi&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;OpenWRT - ustawienia sieci Wi-Fi&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Ze względów bezpieczeństwa ważne jest aby po przejściu do zakładki Wireless Security, ustawić szyfrowanie WPA2-PSK lub WPA-PSK/WPA2-PSK Mixed Mode i wprowadzić długą i skomplikowaną frazę szyfrującą. To jest podstawą bezpieczeństwa każdej sieci Wi-Fi. Pamiętajmy, że żadne filtrowanie adresów MAC w jakimkolwiek stopniu nie uchroni pred hakerami naszej sieci Wi-Fi, gdyż metoda ta stanowi jedynie lekkie utrudnienie, które haker jest w stanie ominąć w kilkadziesiąt sekund lub kilku minut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3UF44xRkIYLIGmfb-wkjKXaV_kaJl8Fyiyqvu4XvjeNVhy_5AWkqMsEBO4fhwkxAQSeDnvEhW15QEr7d_lA5mtH2g8hIYpGB-wqNHHEZm50fcbWCE7fa-m7Fb6RjM_IrdhRUyazBUii0/s1600/wireless_advanced.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Zabezpieczenia Wi-Fi&quot; border=&quot;0&quot; height=&quot;259&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3UF44xRkIYLIGmfb-wkjKXaV_kaJl8Fyiyqvu4XvjeNVhy_5AWkqMsEBO4fhwkxAQSeDnvEhW15QEr7d_lA5mtH2g8hIYpGB-wqNHHEZm50fcbWCE7fa-m7Fb6RjM_IrdhRUyazBUii0/s320/wireless_advanced.jpg&quot; title=&quot;Zabezpieczenia Wi-Fi&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Zabezpieczenia Wi-Fi&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Kolejną podstawową czynnością jest dostosowanie parametrów interfejsu sieciowego LAN urządzenia, tak aby sprzęt mógł prawidłowo działać w docelowej sieci. W tym celu należy z sekcji menu Network wybrać Interfaces, a następnie kliknąć w przycisk Edit. W widoku ustawień interfejsu LAN należy wprowadzić odpowiednie dla sieci docelowej wartości.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIIdhsqTn4YZ3fPcfUkrarmwi-xNJ3iz5kDMFZ-moFX_7s6qi9KtgbMindmr0PtASp7Z3RLHUCOljygr5gsHyMPhw5UPVXiZjQOuPedfIPU7pt_VAiwJFwBRCygGOHVvrPMYKI44tyjww/s1600/lan_interface.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Ustawienia interfejsu LAN&quot; border=&quot;0&quot; height=&quot;231&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIIdhsqTn4YZ3fPcfUkrarmwi-xNJ3iz5kDMFZ-moFX_7s6qi9KtgbMindmr0PtASp7Z3RLHUCOljygr5gsHyMPhw5UPVXiZjQOuPedfIPU7pt_VAiwJFwBRCygGOHVvrPMYKI44tyjww/s320/lan_interface.jpg&quot; title=&quot;Ustawienia interfejsu LAN&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Ustawienia interfejsu LAN&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;

&lt;h2&gt;Polska wersja językowa interfejsu&lt;/h2&gt;
&lt;br /&gt;
Osoby zainteresowane polską wersją językową interfejsu www OpenWRT powinny zainstalować odpowiedni pakiet językowy. Czynność tą powinno się jednak wykonać dopiero po zakończeniu podstawowej konfiguracji urządzenia, którą opisałem powyżej. Najprostszy sposób instalacji polskiego pakietu językowego polega na przejściu do System / Software, a następnie do zakładki Available Packages. W okienku Download and Install Packages należy wprowadzić nazwę pakietu luci-i18n-ahcp-pl oraz potwierdzić instalację przyciskiem OK.
&lt;br /&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyD55kD2lxO1bVQNJBOk2hK5kJ54sSsLu2KaEAKH9DxL9wrMqIGDfXOEvie5_b4Ot280xaItLPFrPvZdjFKVp8CsjopHdnobyTkZQ7_-iaCqx9Wk8Be_4kezYmVsm-Ph1Gq-r0FZNS4RU/s1600/luci-pl.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyD55kD2lxO1bVQNJBOk2hK5kJ54sSsLu2KaEAKH9DxL9wrMqIGDfXOEvie5_b4Ot280xaItLPFrPvZdjFKVp8CsjopHdnobyTkZQ7_-iaCqx9Wk8Be_4kezYmVsm-Ph1Gq-r0FZNS4RU/s320/luci-pl.jpg&quot; width=&quot;320&quot; height=&quot;242&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;
Można także instalować różnego rodzaju pakiety oprogramowania, w tym oczywiście pakiety językowe, z poziomu shell&#39;a systemu OpenWRT, po uprzednim połączeniu się z urządzeniem i zalogowaniu do systemu poprzez SSH. W takim przypadku, aby zainstalować polski pakiet językowy, należy w wierszu poleceń wpisać:
&lt;br /&gt;
&lt;div class=&quot;code&quot; style=&quot;white-space:pre-wrap;&quot;&gt;root@OpenWrt:~# opkg install luci-i18n-ahcp-pl&lt;/div&gt;
&lt;br /&gt;
Dalsze instrukcje związane z ustawieniami systemu OpenWRT można znaleźć pod adresem &lt;a href=&quot;https://wiki.openwrt.org/&quot;&gt;https://wiki.openwrt.org&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Bezpieczeństwo i funkcjonalność&lt;/h2&gt;
&lt;br /&gt;
System OpenWRT jest naprawdę bardzo elastyczny w konfiguracji, a opcji związanych z różnego rodzaju ustawieniami jest w nim naprawdę wiele. Na szczęście nawigacja po różnych sekcjach interfejsu jest bardzo intuicyjna i nie powinna sprawiać problemów nawet mniej doświadczonym użytkownikom. 
&lt;br /&gt;
&lt;br /&gt;
Wspomnę jeszcze tutaj o kilku ciekawostkach. Po pierwsze istotną sprawą jest to, że po wybraniu opcji Software z sekcji System górnego menu, pojawiają się narzędzia umożliwiające zarządzanie pakietami oprogramowania, które - jak już wspominałem - można dowolnie instalować i usuwać według potrzeb, personalizując zakres funkcji urządzenia. 
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz6W_Z3cY0uJD2aRirjwESJSItr9OSmDFMrobBQdp4HKdDiT-79beiqIrTOcUpq1EHXMlLFIr3AP8oRVlArWUd9CQm4SVdtAwszHvQhY-8BER0Pju6-Fx1E7mLhengI9nrE9sZtxkZZbs/s1600/pakiety.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;OpenWRT - zarządzanie pakietami oprogramowania&quot; border=&quot;0&quot; height=&quot;187&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz6W_Z3cY0uJD2aRirjwESJSItr9OSmDFMrobBQdp4HKdDiT-79beiqIrTOcUpq1EHXMlLFIr3AP8oRVlArWUd9CQm4SVdtAwszHvQhY-8BER0Pju6-Fx1E7mLhengI9nrE9sZtxkZZbs/s320/pakiety.jpg&quot; title=&quot;OpenWRT - zarządzanie pakietami oprogramowania&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;OpenWRT - zarządzanie pakietami oprogramowania&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Drugą ciekawostką jest to, że po kliknięciu w Interfaces z sekcji menu Network pojawia się narzędzie zarządzania interfejsami sieciowymi. W odróżnieniu od fabrycznie instalowanego oprogramowania producenta, mnogość możliwości różnego rodzaju ustawień jest tutaj naprawdę imponująca.
&lt;br /&gt;
&lt;br /&gt;
Kolejną fajną sprawą jest narzędzie tworzące różnego rodzaju wykresy w czasie rzeczywistym. Aby się do niego dostać należy wybrać Realtime Graphs z sekcji menu Status.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb4bhquf6C6BSGocQQcFC9Q8u37CWPmrRrh3zqWOk7NGxSAj56FryJhknncrqZ4fLMn3JttYADIyXTEhFCWkHVBrDuncECUnKd2HalF731DznR11gjbTJ5R5mXvHroR6fLeIAKvbr5O6U/s1600/realtime_graphs.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;OpenWRT - Wykresy w czasie rzeczywistym&quot; border=&quot;0&quot; height=&quot;187&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb4bhquf6C6BSGocQQcFC9Q8u37CWPmrRrh3zqWOk7NGxSAj56FryJhknncrqZ4fLMn3JttYADIyXTEhFCWkHVBrDuncECUnKd2HalF731DznR11gjbTJ5R5mXvHroR6fLeIAKvbr5O6U/s320/realtime_graphs.jpg&quot; title=&quot;OpenWRT - Wykresy w czasie rzeczywistym&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;OpenWRT - Wykresy w czasie rzeczywistym&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;h2&gt;
Podsumowanie&lt;/h2&gt;
&lt;br /&gt;
Zdecydowałem się przygotować ten artykuł głównie w celu przedstawienia czytelnikom możliwości korzystania z alternatywnego oprogramowania routerów i tym podobnych urządzeń. Chciałem również wstępnie zaprezentować ogólny zakres możliwości systemu OpenWRT oraz udokumentować generalną prostotę jego instalacji na urządzeniach sieciowych, na przykładzie popularnego punktu dostępowego Wi-Fi. Mam nadzieję, że mój zamiar się spełnił. Gdyby coś okazało nie jasne, a także w przypadku jakichkolwiek pytań dotyczących tego tematu, bądź chęci wymiany doświadczeń, bardzo proszę o komentarze.
</description><link>https://informatyka-porady.blogspot.com/2017/05/alternatywne-oprogramowanie-routera.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8UK1mX796h741yHicrfTSczW5sL_XaDXKyDuOdHm8rUZ1TzrHzSVX0tQG9nCGZFXHF32ho3AulKIXWnxtcG9ZSBYdX-93v1yrxwPmH-AZpYX3e6xULjinz4huXO1Aj3PF-GHb0ixiBNU/s72-c/IMG_20170430_214608.jpg" height="72" width="72"/><thr:total>16</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-7862007334270946358</guid><pubDate>Fri, 28 Apr 2017 14:57:00 +0000</pubDate><atom:updated>2017-12-03T00:27:43.129+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">bezpieczeństwo LAN</category><category domain="http://www.blogger.com/atom/ns#">Microsoft</category><category domain="http://www.blogger.com/atom/ns#">Windows</category><title>Ataki hakerskie. Jak się chronić?</title><description>Bezpieczeństwo IT jest dziś pojęciem bardzo ogólnym, odnoszącym się do metod stosowanych w celu zapewnienia ochrony przed nieautoryzowanym dostępem zarówno do mediów sieciowych jak i  urządzeń należących do danej infrastruktury informatycznej.  
&lt;br /&gt;
&lt;br /&gt;
Chciałbym już na wstępie tego artykułu zaznaczyć, że w praktyce żaden produkcyjny system informatyczny nie jest dziś zupełnie bezpieczny. Pełne bezpieczeństwo nie jest w tej dziedzinie możliwe do osiągnięcia. Nawet najwyższej klasy sprzętowe firewalle i inne podobne urządzenia, jakie są dziś stosowane w bankach i podobnych instytucjach, nie są w stanie zapewnić pełnego bezpieczeństwa. Dlaczego? Otóż dlatego, że całkowicie bezpieczny system nie był by funkcjonalny, a ochrona systemów informatycznych to dynamiczny proces, w którym ma miejsce nie tylko wdrażanie zabezpieczeń, lecz także ciągły nadzór zdarzeń oraz podejmowanie odpowiednich kroków w przypadku wystąpienia zagrożeń. 
&lt;br /&gt;
&lt;br /&gt;
Fundamentalne znaczenie ma zrozumienie iż przejęcie kontroli przez hakera nad jakimkolwiek z elementów będących częścią danej infrastruktury IT, oznacza w praktyce utratę kontroli nad całym systemem, co wymaga podjęcia natychmiastowych, przewidywanych przez politykę bezpieczeństwa informacji środków. 
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Polityka bezpieczeństwa informacji&lt;/h2&gt;
&lt;br /&gt;
Polityka bezpieczeństwa informacji jest podstawowym elementem bezpieczeństwa IT w instytucjach rządowych i prywatnych. Powinna ona zarówno uwzględniać wszystkie możliwe cele ataków, obecne w danej infrastrukturze IT, jak również przedstawiać metody ochrony przed uwzględnionymi w niej zagrożeniami. Polityka bezpieczeństwa powinna również zawierać wykaz procedur stosowanych w różnego rodzaju sytuacjach podwyższonego ryzyka. Polityka ta jest dziś owszem powszechnie stosowana w różnego rodzaju organizacjach, lecz w praktyce mała jest z niej korzyść, ponieważ użytkownicy na ogół jej nie przestrzegają. I tu mamy duży problem, ponieważ w kwestiach bezpieczeństwa IT na ogół nawala najsłabsze ogniwo, czyli człowiek. Dlatego właśnie tak bardzo skuteczne bywają hakerskie ataki socjotechniczne, czyli te, w których czynnik ludzki odgrywa kluczową rolę.  
&lt;br /&gt;
&lt;br /&gt;
Hakerski framework Metasploit zawiera cały zestaw narzędzi, za pomocą których można w bardzo prosty sposób przeprowadzić złożone i bardzo efektowne ataki socjotechniczne, bez posiadania dogłębnej wiedzy w tej dziedzinie. 
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCBnYjvFCHBIK5s1GR9VgjhsfYkaaV3DaXpSNn-YDp_TsN-dyqM8OohtaXYs7UPZcbYh8apByZGrt_9bBRENfDhMJCavZfooIC8YF-798dNIOWC44uJhvZdSuD5bKRsXe_lCJaChslRk4/s1600/metasploit.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Metasploit&quot; border=&quot;0&quot; height=&quot;188&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCBnYjvFCHBIK5s1GR9VgjhsfYkaaV3DaXpSNn-YDp_TsN-dyqM8OohtaXYs7UPZcbYh8apByZGrt_9bBRENfDhMJCavZfooIC8YF-798dNIOWC44uJhvZdSuD5bKRsXe_lCJaChslRk4/s400/metasploit.jpg&quot; title=&quot;Metasploit&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Metasploit&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Jak się skutecznie chronić przed atakami hakerskimi? W tym zakresie mam zamiar udzielić czytelnikom kilka ważnych wskazówek. Ponieważ temat jest bardzo rozległy,  w tym artykule ograniczę się dosłownie do kilku prostych porad, ponieważ w przeciwnym przypadku musiałbym napisać całą książkę, a na to wyzwanie nie jestem jeszcze gotowy.   
&lt;br /&gt;
&lt;br /&gt;
Ponieważ najpopularniejszym dziś systemem operacyjnym jest rodzina produktów Windows, dla poniższych zaleceń zakładam taki właśnie scenariusz. 
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Bezpieczeństwo komputera&lt;/h2&gt;
&lt;br /&gt;
Zupełnie bezpieczny komputer do niczego by się nam nie przydał gdyż nie mógł by on przechowywać jakichkolwiek informacji, czy być częścią jakiejkolwiek sieci. Taki komputer musiałby być odpięty od sieci, wyłączony, a na dodatek zamknięty w sejfie, do którego nikt nie zna możliwości dostępu. Wówczas można by uznać taki komputer za zupełnie bezpieczny. Bezpieczny, ale oczywiście bezużyteczny. 
&lt;br /&gt;
&lt;br /&gt;
Skoro w praktyce nie da się zapewnić stu procentowego bezpieczeństwa komputera, to jak w takim razie należy chronić tego typu sprzęt? W tym zakresie mogę udzielić kilku przydatnych wskazówek.  
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Bezpieczeństwo komputera – ochrona przed atakami z dostępem fizycznym&lt;/h3&gt;
&lt;br /&gt;
Komputer do którego haker może uzyskać dostęp fizyczny nie jest bezpieczny. Dlaczego? Otóż dlatego, że nawet jeśli system jest chroniony hasłem, to w dużej części przypadków można w prosty sposób takie hasło złamać, korzystając w tym celu z powszechnie dostępnego oprogramowania, takiego jak przykładowo Ophcrack. Haker, który uzyskał fizyczny dostęp do komputera, może uruchomić atakowaną maszynę z płyty CDROM lub z urządzenia USB z systemem Ophcrack bądź podobnym, pomijając wszelkie zabezpieczenia systemu Windows.  
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWyKgRRp_eX8bbaVvv5WUfpAlV-iXWEHg3MTxz72_hDmtmgitZpexTpboK8-pX7qfkDzaJ7MPFzOPtP_XIXPQ9pm-pyakeFprWqeIrMiKnBhyphenhyphenOXg40vSiNmD_tuqhaOM_BwUegBQ5Vhps/s1600/ophcrack.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Łamanie haseł Windows - Ophcrack&quot; border=&quot;0&quot; height=&quot;263&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWyKgRRp_eX8bbaVvv5WUfpAlV-iXWEHg3MTxz72_hDmtmgitZpexTpboK8-pX7qfkDzaJ7MPFzOPtP_XIXPQ9pm-pyakeFprWqeIrMiKnBhyphenhyphenOXg40vSiNmD_tuqhaOM_BwUegBQ5Vhps/s400/ophcrack.jpg&quot; title=&quot;Łamanie haseł Windows - Ophcrack&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Łamanie haseł Windows - Ophcrack&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Ophcrack to oprogramowanie hakerskie, które umożliwia pozyskanie nazw użytkowników systemu Windows oraz skrótów NT ich haseł. Ponadto Ophcrack, na podstawie tęczowych tablic, jest w stanie odszyfrować skróty haseł i wyświetlić hakerowi ich postać jawną, która jest niezbędna do lokalnego zalogowania się do atakowanej maszyny. Jeśli hasło jest dość złożone, wówczas istnieje duże prawdopodobieństwo, że Opcrack nie poradzi sobie z nim tak szybko, a nawet w ogóle nie będzie w stanie wyliczyć jego postaci jawnej. Podczas gdy rozszyfrowanie prostych haseł zajmuje kilka-kilkanaście minut, to z bardziej złożonymi hasłami Ophcrack może sobie dość ciężko radzić, a niekiedy próba ich rozszyfrowania może zająć wiele godzin i dni, czasami nawet bez efektu. Pamiętajmy jednak, że nawet jeśli haker nie będzie w stanie zdobyć jawnej postaci pożądanego hasła, to aby zalogować się do atakowanej maszyny zdalnie, wystarczy mu informacja o nazwie użytkownika oraz o skrócie NT jego hasła. Posiadając te informacje haker może przykładowo skorzystać z narzędzia psexec pakietu frameworka hakerskiego Metaspoit, bądź z setek innych podobnych narzędzi dostępnych na różnych hakerskich portalach.  
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIVknQrERfN7n35TIQ4eKv7Vpo_2KbMBh3AQSUOCE7D7_hU3iIbjop3A3ncBK8GZm0nJKiu6hFyVxZhrg-QIBm0Mq9Mk1i-6rCV85PLOVfckmMy1y1TApwNhNt4PfI-i3d0Hw6TXBTamM/s1600/kali1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Metasploit&quot; border=&quot;0&quot; height=&quot;198&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIVknQrERfN7n35TIQ4eKv7Vpo_2KbMBh3AQSUOCE7D7_hU3iIbjop3A3ncBK8GZm0nJKiu6hFyVxZhrg-QIBm0Mq9Mk1i-6rCV85PLOVfckmMy1y1TApwNhNt4PfI-i3d0Hw6TXBTamM/s400/kali1.jpg&quot; title=&quot;Metasploit&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Metasploit&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Jak więc chronić komputer przed atakami związanymi z nieautoryzowanym dostępem fizycznym? Otóż wyłączenie możliwości uruchamiania maszyny z innych mediów niż dysk z systemem Windows i ustawienie hasła dostępu do systemu BIOS to żadna ochrona, tylko lekkie utrudnienie, które można szybko ominąć wyciągając na chwilę bateryjkę CMOS w celu zresetowania ustawień BIOSa. Dość skuteczną ochronę przed tego typu atakami zapewni jednak szyfrowanie systemowego dysku za pomocą oprogramowania BitLocker. Aby w pełni cieszyć się z ogromnych możliwości jakie oferuje to oprogramowanie nasz sprzęt powinien być wyposażony w moduł TPM. Jednak można korzystać z oprogramowania BitLocker nawet w przypadku nie posiadania tego modułu jeśli administrator systemu na to pozwoli.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf1EZJ2JIsknQqkSrV79CbWnbnQ2OrvO4KBT0qGJZOjwdPZTm9-I41Pu-QsjyHuBnSA7c_jFoIalCJ62PlE2CmEvq62FLvCSPuvgx2f6kRn0SExDuq93BTNkFce9HZRMnHndAxa83v_zs/s1600/bitlocker.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Szyfrowanie dysku - BitLocker&quot; border=&quot;0&quot; height=&quot;316&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf1EZJ2JIsknQqkSrV79CbWnbnQ2OrvO4KBT0qGJZOjwdPZTm9-I41Pu-QsjyHuBnSA7c_jFoIalCJ62PlE2CmEvq62FLvCSPuvgx2f6kRn0SExDuq93BTNkFce9HZRMnHndAxa83v_zs/s320/bitlocker.jpg&quot; title=&quot;Szyfrowanie dysku - BitLocker&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Uniemożliwi to łamanie haseł zapisanych w pliku SAM przy pomocy tęczowych tablic, lecz nie zapewni ochrony przed atakami brute-force. Jeśli hasła użytkowników są dość skomplikowane to metoda brute force raczej się nie powiedzie. Pamiętajmy jednak, że programy typu Ophcrack stają się dla hakera bezużyteczne w przypadku kont użytkowników logujących się do systemu za pomocą konta Microsoft, a także w przypadku kont domenowych, gdyż wówczas lokalny plik SAM nie zawiera ich haseł. 
&lt;br /&gt;
&lt;br /&gt;
W skrócie poziom ochrony przed atakami lokalnymi można zwiększyć poprzez: 
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Wyłączenie w systemie BIOS możliwości bootowania maszyny z urządzeń USB i napędów optycznych oraz zastosowanie hasła dostępu do ustawień BIOS  (utrudnienie);&lt;/li&gt;
&lt;li&gt;Stosowanie kont Microsoft (Microsoft Account);&lt;/li&gt;
&lt;li&gt;Stosowanie długich i złożonych haseł, zawierających duże i małe litery, cyfry oraz znaki specjalne;&lt;/li&gt;
&lt;li&gt;Szyfrowanie dysku systemowego za pomocą oprogramowania BitLocker;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Bezpieczeństwo komputera: ataki zdalne&lt;/h3&gt;
&lt;br /&gt;
Najbardziej skuteczny rodzaj ataków zdalnych na komputery, czyli ataków przeprowadzanych przez sieć, to ataki socjotechniczne. Decydującym elementem w tego typu atakach jest człowiek, czyli najsłabsze ogniwo obrony, a strategia polega na skłonieniu ofiary do zrobienia czegoś, czego normalnie by nie zrobiła. Przykładem takiego ataku może być wysłanie do ofiary wiadomości email z przekonującą treścią oraz zainfekowanym załącznikiem, w który oczywiście ofiara kliknie, a wówczas z dużym prawdopodobieństwem hakerowi uda się przejąć kontrolę nad systemem.  
&lt;br /&gt;
&lt;br /&gt;
Programy antywirusowe owszem zapobiegają wykonaniu podejrzanego kodu, lecz generalnie są skuteczne w przypadku znanych producentowi oprogramowania wirusów i trojanów, czyli tych które widnieją w bazie danych stosowanego programu. Dlatego, swoją drogą, zalecane jest regularne aktualizowanie bazy danych oprogramowania antywirusowego. Lecz to nie wszystko co należy zrobić by się przed tego typu atakami zabezpieczyć. 
&lt;br /&gt;
&lt;br /&gt;
Zawodowi hakerzy są w stanie napisać wrogi kod na konkretne zlecenie. Kod ten nie zostanie wykryty przez większość programów antywirusowych, ponieważ nie będą one miały o nim żadnych informacji. Pomijając wyspecjalizowany kod, pisany przez zawodowców na zlecenie za dość duże pieniądze, prawda jest taka, że od pojawienia się nowego typu wirusa/trojana, mija co najmniej 2-3 tygodnie zanim producenci antywirusów uwzględnią go w swoich bazach danych. Co to wszystko oznacza? Oznacza to, że należy się w dodatkowy sposób chronić przed możliwością wykonania podejrzanego kodu na naszych komputerach. Jak to zrobić? 
&lt;br /&gt;
&lt;br /&gt;
Dość wysoki poziom ochrony przed wykonywaniem podejrzanego kodu można uzyskać włączając w systemie Windows funkcję DEP – Data Execution Prevention. 
&lt;br /&gt;
&lt;br /&gt;
Oto jak to zrobić:  
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Uruchomić eksplorator plików;&lt;/li&gt;
&lt;li&gt;Trzymając myszkę nad ikonką Ten Komputer należy przycisnąć prawy klawisz myszki i wybrać Właściwości; 
&lt;/li&gt;
&lt;li&gt;Z widniejącego w prawej części widoku menu należy wybrać Zaawansowane Ustawienia Systemu;&lt;/li&gt;
&lt;li&gt;W zakładce Zaawansowane należy w sekcji Wydajność kliknąć w Ustawienia;&lt;/li&gt;
&lt;li&gt;Należy wybrać zakładkę Zapobieganie Wykonywaniu Danych;&lt;/li&gt;
&lt;li&gt;Włączyć ochronę DEP w odpowiednim trybie;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI3o0TcRHa6M3EJluV0UmfiL8Xf64rh5r3XJNEfIouYscByG38B_8zsWKgGHD1zqSXvuQlhIeJl1-DLgWroiJJMwUamNx1Xj3Z9rM6hxVY2P3hhKtYMQ6we0u8DP2olAIwtmw2P8bDdQg/s1600/dep1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Jak ustawić funkcję DEP&quot; border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI3o0TcRHa6M3EJluV0UmfiL8Xf64rh5r3XJNEfIouYscByG38B_8zsWKgGHD1zqSXvuQlhIeJl1-DLgWroiJJMwUamNx1Xj3Z9rM6hxVY2P3hhKtYMQ6we0u8DP2olAIwtmw2P8bDdQg/s400/dep1.jpg&quot; title=&quot;Jak ustawić funkcję DEP&quot; width=&quot;352&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Jak ustawić funkcję DEP&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaNebDHa8DPmAvK4q6NEqMBNeFDP1OoMjz0lZSQyBHOJR-pvtUceh_IYb1cwqkjcPX2zHXSttGPXAaUwzg7T7KpvpMhQZ-YCji58eTYadlaEnMaUbMWF_7dqrwsnlyAc8hM1kRWYbAL94/s1600/dep2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Jak ustawić funkcję DEP&quot; border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaNebDHa8DPmAvK4q6NEqMBNeFDP1OoMjz0lZSQyBHOJR-pvtUceh_IYb1cwqkjcPX2zHXSttGPXAaUwzg7T7KpvpMhQZ-YCji58eTYadlaEnMaUbMWF_7dqrwsnlyAc8hM1kRWYbAL94/s400/dep2.jpg&quot; title=&quot;Jak ustawić funkcję DEP&quot; width=&quot;278&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Jak ustawić funkcję DEP&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Zapora ogniowa systemu Windows stanowi dobrą ochronę przed wieloma rodzajami ataków z wykorzystaniem sieci. Oferuje ona bardzo dużo zaawansowanych ustawień. W większości przypadków dobry poziom ochrony zapewniają już standardowe ustawienia oprogramowania. Zapora powinna być zawsze włączona, ewentualnie pod kontrolą oprogramowania antywirusowego. 
&lt;br /&gt;
&lt;br /&gt;
Poziom ochrony w zakresie wrogiego kodu można dodatkowo zwiększyć ograniczając możliwość uruchamiania przez użytkowników dowolnego oprogramowania. W tym celu należy skorzystać z przystawki Zasady Zabezpieczeń Lokalnych secpol.msc, definiując odpowiednie reguły zabezpieczeń w ustawieniach Zasady Ograniczeń Oprogramowania. Na stronach Technet Microsoft można znaleźć szczegółowe instrukcje o tym jak to zrobić. 
&lt;br /&gt;
&lt;br /&gt;
Zasady oprogramowania umożliwiają sporą kontrolę nad tym co jest w systemie uruchamiane. Jednak są to ustawienia bardzo rygorystyczne. O ile wprowadzenie zasad oprogramowania w wielu przedsiębiorstwach napotyka się na duży opór ze strony użytkowników, o tyle w warunkach domowych ograniczenia tego typy przeważnie zupełnie tracą sens, chyba że korzystamy z kilku ulubionych programów i nie zamierzamy niczego innego uruchamiać. 
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSYsrX6Ybu3Zn5a1WluLBJlxvzpMbWD9cGdQ6VQs7jgkuJ2u68n8j9i_OWvjRD6sFqTYeNlQ-zkc_j9YKPj2jK9p8yVfXx4DNABMYErMi1-konZAJg_0tuf42WfgCswJ68RZHfnqyeKvQ/s1600/secpol_msc.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Zasady zapezpieczeń lokalnych&quot; border=&quot;0&quot; height=&quot;288&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSYsrX6Ybu3Zn5a1WluLBJlxvzpMbWD9cGdQ6VQs7jgkuJ2u68n8j9i_OWvjRD6sFqTYeNlQ-zkc_j9YKPj2jK9p8yVfXx4DNABMYErMi1-konZAJg_0tuf42WfgCswJ68RZHfnqyeKvQ/s400/secpol_msc.jpg&quot; title=&quot;Zasady zapezpieczeń lokalnych&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Zasady zapezpieczeń lokalnych&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Innym rodzajem ataków zdalnych są ataki sieciowe, wykorzystujące luki bezpieczeństwa w oprogramowaniu ofiary. Są to bardzo powszechne ataki, ze względu na prostotę ich przeprowadzania. Hakerski framework Metasploit zawiera cały zestaw narzędzi i modułów umożliwiających przeprowadzanie tego typu ataków bez konieczności posiadania gruntownej wiedzy informatycznej. Jak to działa? Otóż od momentu otrzymania przez producenta oprogramowania informacji o potencjalnym problemie do chwili pojawienia się poprawek zawartych w aktualizacjach mija przeważnie wiele miesięcy. Okres ten może być krótszy w przypadku bardzo poważnych problemów, które stanowią realne zagrożenie. Informacje o lukach bezpieczeństwa w oprogramowaniu są publicznie dostępne. Jeśli chodzi o system Windows 10 to całą listę problemów mamy tutaj: https://www.cvedetails.com/vulnerability-list/vendor_id-26/product_id-32238/Microsoft-Windows-10.html 
&lt;br /&gt;
&lt;br /&gt;
Na podstawie publicznie dostępnych informacji o lukach powstają odpowiednie moduły frameworków Hakerskich. W szczegółowych informacjach publicznych o danym problemie technicznym można się dowiedzieć, między innymi, czy został już opracowany związany z nim moduł frameworka Metasploit. Niekiedy jednak jest tak, że hakerzy tworzą własny kod, jeszcze przed pojawieniem się publicznych informacji o danej luce. Są bowiem tacy zawodowi hakerzy, którym wcale nie zależy na nagłośnieniu problemu, lecz bardziej na wykorzystaniu istniejącej luki w celu osiągnięcia zysku. 
&lt;br /&gt;
&lt;br /&gt;
W skrócie poziom ochrony przed atakami zdalnymi można znacznie zwiększyć poprzez: 
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Korzystanie tylko z najnowszych wersji oprogramowania;&lt;/li&gt;
&lt;li&gt;Stosowanie sprawdzonego oprogramowania antywirusowego z zawsze aktualną bazą wirusów;&lt;/li&gt;
&lt;li&gt;Włączenie odpowiedniego poziomu ochrony DEP;&lt;/li&gt;
&lt;li&gt;Stosowanie lokalnych zasad oprogramowania;&lt;/li&gt;
&lt;li&gt;Stosowanie zapory ogniowej systemu Windows;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;h2&gt;
Jak działa typowy atak hakerski&lt;/h2&gt;
Film przedstawia przebieg typowego ataku hakerskiego.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/N6Oae8-l3OY&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;/h2&gt;
&lt;h2&gt;
Bezpieczeństwo IT – monitorowanie aktywności podstawą bezpieczeństwa&lt;/h2&gt;
&lt;br /&gt;
Żadne z opisanych wcześniej zaleceń nie zapewni długoterminowej ochrony systemu, jeśli pominiemy fundamentalną część polityki bezpieczeństwa, związaną z monitorowaniem aktywności w sieci i w samym systemie. Warto zapoznać się w tym celu z możliwościami jakie oferują zaawansowane dzienniki systemu Windows oraz z oprogramowaniem służącym do monitorowania ruchu w sieci. Gorąco polecam program WireShark, którego jestem zwolennikiem od wielu lat. Ciekawe narzędzia umożliwiające dokładny nadzór procesów można znaleźć w darmowym pakiecie Microsoft SysInternal Suite.  
&lt;br /&gt;
&lt;br /&gt;
A więc zaglądajmy do dzienników systemu Windows i monitorujmy procesy oraz ruch w sieci. Gdy już będziemy mieli w tym wprawę, będziemy w stanie dostrzec zagrożenia, które często pozostają niezauważane przez powszechne oprogramowanie mające na celu chronić system. 
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Podsumowanie&lt;/h2&gt;
&lt;br /&gt;
Mam nadzieję, że powyższe wskazówki okażą się czytelnikom przydatne. Są to jednak podstawowe porady, dotyczące samego komputera. Pamiętajmy, że komputery są jednak częścią sieci, w których ważną rolę odgrywają także inne urządzenia, takie jak routery, switche, access pointy i tym podobne. Należy więc pamiętać również o tych urządzeniach i odpowiednio je zabezpieczyć. O tym jak to zrobić postaram się napisać innym razem. 
&lt;br /&gt;
Jeśli są jakieś pytania lub wątpliwości, lub ktoś pragnie się podzielić własną wiedzą w tym zakresie, bardzo proszę o komentarze. 

 

 </description><link>https://informatyka-porady.blogspot.com/2017/04/ataki-hakerskie-jak-sie-chronic.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCBnYjvFCHBIK5s1GR9VgjhsfYkaaV3DaXpSNn-YDp_TsN-dyqM8OohtaXYs7UPZcbYh8apByZGrt_9bBRENfDhMJCavZfooIC8YF-798dNIOWC44uJhvZdSuD5bKRsXe_lCJaChslRk4/s72-c/metasploit.jpg" height="72" width="72"/><thr:total>6</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-8611405582822676305</guid><pubDate>Mon, 24 Apr 2017 20:29:00 +0000</pubDate><atom:updated>2017-04-25T20:15:01.610+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MariaDB</category><category domain="http://www.blogger.com/atom/ns#">mysql</category><category domain="http://www.blogger.com/atom/ns#">php</category><title>PHP a połączenie z serwerem MySQL</title><description>Php i MySQL stanowią podstawę funkcjonalności większości rozbudowanych aplikacji web oraz firmowych witryn internetowych. Każdy zawodowy twórca aplikacji web dobrze wie jak ważny jest wybór odpowiedniej platformy bazodanowej dla swoich projektów. Kluczowe znaczenie w tym zakresie ma także sposób łączenia się z serwerem baz danych z poziomu skryptów php, tak aby interakcja użytkowników z tabelami danych była efektywna i nie stanowiła zagrożeń.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitKkUYuUNJy-iPGy49pYleV3V1x3G6wd2WnJK3hjHGW7gvsttxQQU4fB49fJYgVpP5nhi-4v4VwKq_6IFxRr89Bpre1axXNgdjAPQKsf5QjBU0n3K0QNPs_Pxe86DUTGRyGxBqCRf3R2U/s1600/mysql_php.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;PHP a połączenie z serwerem MySQL&quot; border=&quot;0&quot; height=&quot;370&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitKkUYuUNJy-iPGy49pYleV3V1x3G6wd2WnJK3hjHGW7gvsttxQQU4fB49fJYgVpP5nhi-4v4VwKq_6IFxRr89Bpre1axXNgdjAPQKsf5QjBU0n3K0QNPs_Pxe86DUTGRyGxBqCRf3R2U/s640/mysql_php.jpg&quot; title=&quot;PHP a połączenie z serwerem MySQL&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;PHP a połączenie z serwerem MySQL&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Z poziomu skryptów php można ustanowić połączenie z serwerem bazodanowym MySQL na kilka sposobów. W tym artykule postaram się omówić zalety i wady każdej z tych metod. Przedstawię również porównanie podstawowych cech każdego z tych rozwiązań.&lt;br /&gt;
&lt;br /&gt;
W celach dydaktycznych przygotowałem kilka przykładowych skryptów, które pojawiają się w tym artykule. Jeśli któryś z czytelników będzie miał ochotę przetestować ich działanie, do czego oczywiście gorąco zachęcam, dołączam wspólny fragment skryptów, zawierający zmienne dotyczące nazwy hosta, użytkownika, hasła i nazwy bazy danych, które należy ustawić w pierwszych liniach kodu wedle własnych potrzeb: 
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot; style=&quot;white-space: pre-wrap;&quot;&gt;
$host = &#39;localhost&#39; ;   // nazwa hosta 
$user = &#39;uzytkownik&#39; ;  // użytkownik
$password = &#39;haslo&#39; ;  // hasło 
$db = &#39;bazadanych &#39;;  // baza danych&lt;/div&gt;
&lt;br /&gt;
Z góry zaznaczam, że zawarte w artykule skrypty mają charakter czysto szkoleniowy i nie są opatrzone w zabezpieczenia charakterystyczne dla środowisk produkcyjnych.  
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Połączenie z serwerem MySQL za pomocą funkcji mysql_connect() - nie stosować&lt;/h2&gt;
&lt;br /&gt;
Łączenie się z serwerem MySQL za pomocą funkcji php mysql_connect() to na dziś dzień już archaiczny sposób uzyskania tego typu połączenia z poziomu skryptu php. 
Niestety spora ilość nieświadomych entuzjastów proceduralnego PHP wciąż z niego korzysta. 

Poniżej przedstawiony szkoleniowy skrypt php jest prostym przykładem użycia funkcji mysql_connect(). Skrypt ustanawia połączenie z serwerem, wybiera bazę danych oraz wykonuje prostą kwerendę dopasowującą użytkownika i hasło. Tego typu procedura bywa często stosowana w celach związanych z uwierzytelnianiem: 
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot; style=&quot;white-space: pre-wrap;&quot;&gt;
$conn = mysql_connect($host, $user, $password); 

if (!$conn) { 
    die(&#39;Nie połączono: &#39; . mysql_error()); 
} 

$db = mysql_select_db($db, $conn); 

if (!$db) { 
    die (&#39;Nie można wybrać bazy danych: &#39; . mysql_error()); 
} 

$query = sprintf(&quot;SELECT * FROM users WHERE login=&#39;%s&#39; AND pwd=&#39;%s&#39;&quot;, 
            mysql_real_escape_string($login), 
            mysql_real_escape_string($pwd));&lt;/div&gt;
&lt;br /&gt;
Metoda ta, choć dziś raczej przestarzała, ma jedną wielką zaletę, a mianowicie stanowi świetny materiał historyczno-szkoleniowy dla początkujących programistów. Czemu? Otoż zapoznanie się ze starymi metodami ochrony przed atakami sql-injection może nie tylko okazać się niemałą ciekawostką, lecz może być bardzo przydatne w zrozumieniu natury tych ataków. Metoda ta ma bowiem jedną poważną wadę: nie udostępnia bezpośrednio narzędzi programistycznych chroniących przed atakami typu sql-injection, przez co jej stosowanie w środowisku produkcyjnym a priori odpada. Programista musi tutaj zawsze pamiętać o zabezpieczaniu serwera MySQL poprzez funkcje mysql_real_escape_string(), co może okazać się bardzo uciążliwe, a zarazem nie zupełnie skuteczne, szczególnie przy dużej ilości kodu związanego z zapytaniami. Kolejną wadą tej funkcji jest konieczność stosowania proceduralnego kodu, co samo w sobie stanowi wielką przeszkodę w tworzeniu profesjonalnych rozwiązań. 
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Połączenie z serwerem MySQL za pomocą klasy PDO&lt;/h2&gt;
&lt;br /&gt;
Stosowanie klasy PDO w celu łączenia się z serwerem MySQL z poziomu php gwarantuje ochronę przed atakami typu sql-injection, pod warunkiem stosowania metod tej klasy zgodnie z zaleceniami podręcznika. Metody klasy PDO są łatwe do zrozumienia i bardzo proste w użyciu. Duża elastyczność tej klasy względem obsługi różnorodnych serwerów baz danych, możliwość bezpiecznego wiązania parametrów zapytań z określeniem typu parametru PDO oraz szybkość działania metod, mogą być decydującymi argumentami w kwestii wyboru odpowiedniej opcji dla projektowanej aplikacji.&lt;br /&gt;
&lt;br /&gt;
Możliwość obsługi serwera bazodanowego innego niż MySQL to mocny atut elastyczności, umożliwiający generalnie bezproblemową migrację serwera bazy danych, bez konieczności dużych ingerencji w kod php aplikacji klienckiej. Głównie ze względu na tą cechę moim wyborem, szczególnie w przypadku złożonych aplikacji php, jest zawsze PDO.&lt;br /&gt;
&lt;br /&gt;
Na chwilę obecną klasa php PDO wspiera sterowniki obsługujące następujące serwery bazodanowe:  
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;CUBRID&lt;/li&gt;
&lt;li&gt;MS SQL Server &lt;/li&gt;
&lt;li&gt;Firebird&lt;/li&gt;
&lt;li&gt;IBM&lt;/li&gt;
&lt;li&gt;Informix&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;MS SQL Server&lt;/li&gt;
&lt;li&gt;Oracle&lt;/li&gt;
&lt;li&gt;ODBC i DB2&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;SQLite&lt;/li&gt;
&lt;li&gt;4D&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Jedynym mankamentem klasy PDO, oczywiście jeśli można taką cechę uznać za mankament, jest brak proceduralnego API, co może być sporym utrudnieniem dla początkujących programistów. Aby korzystać z klasy PDO programista musi mieć doświadczenie z programowaniem obiektowym. Jednak stabilność  i elastyczność działania miewają przeważnie swoją cenę, a ewentualny wkład w naukę programowania obiektowego ze strony nowicjuszy php pragnących rozpocząć przygodę z PDO przyniesie tak czy inaczej ogromną satysfakcję i wielkie korzyści.&lt;br /&gt;
&lt;br /&gt;
Poniżej przedstawiam typowy skrypt php wykorzystujący klasę PDO do nawiązania połączenia z bazą danych serwera MySQL w celu zapisania prostego wiersza danych do tabeli. Zobaczmy jak to się robi obiektowo za pomocą metod klasy PDO: 
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot; style=&quot;white-space: pre-wrap;&quot;&gt;
// ## Połączenie php PDO MySql i prosty zapis wiersza danych 

try {  
     
     $conn = new \PDO(&quot;mysql:host={$host};dbname={$db}&quot;, $user, $password,
                    array(
                          PDO::MYSQL_ATTR_INIT_COMMAND=&gt;&quot;SET NAMES utf8&quot;,
                          PDO::ATTR_ERRMODE =&gt; PDO::ERRMODE_EXCEPTION
                          )
                    );

      $stm = $conn-&amp;gt;prepare(&quot;insert 
                               into kontrahenci (imie, nazwisko, kodKraju) 
                               values (:imie, :nazwisko, :kodKraju)
                              &quot;);  
 
      $stm-&amp;gt;bindValue(&#39;:imie&#39;, $_POST[&#39;imie&#39;], PDO::PARAM_STR);  
      $stm-&amp;gt;bindValue(&#39;:nazwisko&#39;, $_POST[&#39;nazwisko&#39;], PDO::PARAM_STR);  
      $stm-&amp;gt;bindValue(&#39;:kodKraju&#39;, $_POST[&#39;kodKraju&#39;], PDO::PARAM_INT);  

      $stm-&amp;gt;execute();  

   } catch (PDOException $e) {  

 echo &quot;Wystąpił błąd PDO&quot;;  

} &lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Połączenie z serwerem MySQL za pomocą MySQLi&lt;/h2&gt;
&lt;br /&gt;
MySQLi jest nie tylko świetnym rozwiązaniem dla początkujących programistów, ze względu na możliwość wyboru zarówno obiektowego jak i proceduralnego API, ale zapewnia optymalną ochronę przed atakami sql-injection, podobnie do klasy PDO. Kolejnym atutem MySQLi jest jego szybkość i w tym zakresie MySQLi ma przewagę nad PDO. Niestety MySQLi jest o wiele trudniejsze do opanowania niż PDO. Dodatkowym mankamentem, w przeciwieństwie do możliwości jakie oferuje klasa PDO, jest tutaj brak możliwości wiązania parametrów zapytań po nazwach. Przykładowy skrypt pokazuje jak nawiązać połączenie korzystając z MySQLi w zakresie API obiektowego oraz jak wygląda tutaj kwestia wiązania parametrów kwerend: 
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot; style=&quot;white-space: pre-wrap;&quot;&gt;
mysqli_report(MYSQLI_REPORT_STRICT); 

try { 

     $conn = new mysqli($host, $user, $password, $db) ; 

     $stm = $conn-&amp;gt;prepare(&quot;
                            insert into kontrahenci (imie, nazwisko, kodKraju) 
                            values (?, ?, ?)
                          &quot;);  

     $stm-&amp;gt;bind_param(&#39;Jan&#39;, &#39;Kowalski&#39;, 1); 

     $stm-&amp;gt;execute();  

} catch (Exception $e ) { 

     echo &quot;Wystąpił błąd Mysqli&quot;; 

     exit; 

}&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Co wybrać&lt;/h2&gt;
&lt;br /&gt;
Najlepszy wybór zazwyczaj wywodzi się z doświadczenia. Aby jednak czytelnikom ułatwić zrozumienie generalnych możliwości każdego z omawianych tutaj rozwiązań, przygotowałem poniższą tabelę:
 
&lt;br /&gt;
&lt;style&gt;
 .demo {
  width:100%;
  border:1px solid #C0C0C0;
  border-collapse:collapse;
  padding:5px;
 }
 .demo th {
  border:1px solid #C0C0C0;
  padding:5px;
  background:#F0F0F0;
 }
 .demo td {
  border:1px solid #C0C0C0;
  text-align:center;
  padding:5px;
 }
&lt;/style&gt;

&lt;table class=&quot;demo&quot;&gt;
 &lt;caption&gt;Porównanie cech mysql_connect(), PDO oraz MySQLi&lt;/caption&gt;
 &lt;thead&gt;
&lt;tr&gt;
  &lt;th&gt;Cecha&lt;/th&gt;
  &lt;th&gt;mysql_connect()&lt;/th&gt;
  &lt;th&gt;PDO&lt;/th&gt;
  &lt;th&gt;MySQLi&lt;/th&gt;
 &lt;/tr&gt;
&lt;/thead&gt;
 &lt;tbody&gt;
&lt;tr&gt;
  &lt;td&gt;Ochrona przed sql-injection&lt;/td&gt;
  &lt;td&gt;NIE&lt;/td&gt;
  &lt;td&gt;TAK&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;TAK&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;Styl proceduralny&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;TAK&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;NIE&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;TAK&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;&amp;nbsp;Styl obiektowy&lt;/td&gt;
  &lt;td&gt;NIE&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;TAK&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;TAK&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;Różne sterowniki (nie tylko MySQL)&lt;/td&gt;
  &lt;td&gt;NIE&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;TAK&lt;/td&gt;
  &lt;td&gt;NIE&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;&amp;nbsp;Wartości parametrów po nazwie&lt;/td&gt;
  &lt;td&gt;NIE&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;TAK&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;NIE&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;&amp;nbsp;Łatwość użytkowania&lt;/td&gt;
  &lt;td&gt;TAK&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;TAK&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;NIE&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;&amp;nbsp;Przygotowywanie zapytań po stronie klienta&lt;/td&gt;
  &lt;td&gt;NIE&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;TAK&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;NIE&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;&amp;nbsp;Przygotowywanie zapytań po stronie serwera&lt;/td&gt;
  &lt;td&gt;NIE&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;TAK&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;TAK&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;&amp;nbsp;PHP 5.x&lt;/td&gt;
  &lt;td&gt;TAK&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;TAK&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;TAK&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;&amp;nbsp;PHP 7.x&lt;/td&gt;
  &lt;td&gt;NIE&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;TAK&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;TAK&amp;nbsp;&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;tbody&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Test szybkości kwerend oraz kody php&lt;/h2&gt;
&lt;br /&gt;
Osoby pragnące sprawdzić szybkość działania opisanych tutaj rozwiązań, zachęcam do przetestowania mojego skryptu, który mierzy czas wykonania dowolnej kwerendy oraz czas wykonania kodu php odpowiedzialnego za nawiązanie połączenia z serwerem, ustawienie bazy danych, wykonanie zapytania i zwrócenie wyników w 3 omawianych wariantach łączenia się z serwerem MySQL:
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot; style=&quot;white-space: pre-wrap;&quot;&gt;
// Porównanie szybkości odczytu danych z serwera MySQL
// dla mysql_connect(), PDO oraz MySQLi
// Autor: informatyka-porady.blogspot.com
// Licencja: friko
//

// Tutaj należy ustawić odpowiednie dla własnego serwera wartości
$host = &quot;&quot;;     // np. localhost lub 127.0.0.1
$user = &quot;&quot;;  
$password = &quot;&quot;;  
$db = &quot;&quot;;  

echo &amp;quot;&amp;lt;pre&amp;gt;&amp;quot;;

// Kwerenda odczytu lub zapisu danych bez wiązania parametrów zapytania
// Można klasycznie użyć np. &quot;SELECT BENCHMARK(1000000,ENCODE(&#39;hello&#39;,RAND()))&quot;
// Lub zastosować dowolną kwerendę...
// W celach testowych warto wyłączyć caching
// Stosując w kwerendach frazę SQL_NO_CACHE: np. &quot;SELECT SQL_NO_CACHE * from abc&quot;

$query = &quot;&quot;; 

// mysql_connect()
$time_start = microtime(true);
$easyconn = mysql_connect($host, $user, $password);
if (!$easyconn) {
    die(&#39;Nie udało się nawiązać połączenia: &#39; . mysql_error());
}

$easyconn_db = mysql_select_db($db, $easyconn);
if (!$easyconn_db) {
    die (&#39;Nie można wybrać bazy danych: &#39; . mysql_error());
}

mysql_query(&#39;set profiling=1&#39;);

mysql_query($query);
$q = mysql_query(&#39;show profiles&#39;);
$result = mysql_fetch_assoc($q);
$time_end = microtime(true);

echo &quot;Połączenie mysql_connect(). Czas wykonania zapytania: &quot;.$result[&#39;Duration&#39;].&quot;\n&quot;;
echo &quot;Czas wykonania skryptu php zapytania sql:&quot;.(($time_end - $time_start)/60).&quot;\n\n&quot;;

$easyconn = null;

try {
     
  // PDO
  $time_start = microtime(true);
 
  $conn = new \PDO(&quot;mysql:host={$host};dbname={$db}&quot;, $user, $password,
                    array(
                          PDO::MYSQL_ATTR_INIT_COMMAND=&gt;&quot;SET NAMES utf8&quot;,
                          PDO::ATTR_ERRMODE =&gt; PDO::ERRMODE_EXCEPTION
                          )
                    );
        
  $conn-&amp;gt;query(&#39;set profiling=1&#39;);    
  $conn-&amp;gt;query($query);
  $data = $conn-&amp;gt;query(&#39;show profiles&#39;);
  $result = $data-&amp;gt;fetchAll(PDO::FETCH_ASSOC);
  $time_end = microtime(true);
  
  echo &quot;Połączenie PDO. Czas wykonania zapytania:&quot;.$result[0][&#39;Duration&#39;].&quot;\n&quot;;
  echo &quot;Czas wykonania skryptu php zapytania sql:&quot;.(($time_end - $time_start)/60).&quot;\n\n&quot;;
    
  $conn = null; 
  
  // MySQLi
  mysqli_report(MYSQLI_REPORT_STRICT);
  
  $time_start = microtime(true);
  $conn = new mysqli($host, $user, $password, $db) ;
  $conn-&amp;gt;query(&#39;set profiling=1&#39;);
  
  $conn-&amp;gt;query($query);
  $data = $conn-&amp;gt;query(&#39;show profiles&#39;);
  $result = $data-&amp;gt;fetch_assoc();
  $time_end = microtime(true);
 
  echo &quot;Połączenie MySQLi. Czas wykonania zapytania:&quot;.$result[&#39;Duration&#39;].&quot;\n&quot;;
  echo &quot;Czas wykonania skryptu php zapytania sql:&quot;.(($time_end - $time_start)/60).&quot;\n\n&quot;;
  $conn = null;   
  
  } catch (PDOException $e) {
  echo &quot;Nie udało się nawiązać połączenia PDO&quot;;

}

echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;

&lt;/div&gt;
&lt;br /&gt;
Na moim serwerze wykonanie powyższego skryptu z zapytaniem SQL 
&lt;br /&gt;&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
SELECT BENCHMARK(1000000,ENCODE(&#39;hello&#39;,RAND()))
&lt;/div&gt;
&lt;br /&gt;
poskutowało wyświetleniem poniżej przedstawionych wyników:
&lt;br /&gt;&lt;br /&gt;
&lt;div class=&quot;code&quot; style=&quot;white-space:pre-wrap;&quot;&gt;Połączenie mysql_connect(). Czas wykonania zapytania: 17.36685392
Czas wykonania skryptu php zapytania sql:0.28945664962133

Połączenie PDO. Czas wykonania zapytania:17.36803179
Czas wykonania skryptu php zapytania sql:0.28948030074437

Połączenie MySQLi. Czas wykonania zapytania:17.38116807
Czas wykonania skryptu php zapytania sql:0.28969765106837
&lt;/div&gt;
&lt;br /&gt;
A więc MySQLi okazało się najbardziej powolne :-)
&lt;br /&gt;&lt;br /&gt;
Czy któryś z czytelników zna inny sposób na wykonanie tego typu testów, oczywiście z poziomu skryptu PHP? Jeśli tak, to będę wdzięczny za komentarze. 
</description><link>https://informatyka-porady.blogspot.com/2017/04/php-poaczenie-z-serwerem-mysql.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitKkUYuUNJy-iPGy49pYleV3V1x3G6wd2WnJK3hjHGW7gvsttxQQU4fB49fJYgVpP5nhi-4v4VwKq_6IFxRr89Bpre1axXNgdjAPQKsf5QjBU0n3K0QNPs_Pxe86DUTGRyGxBqCRf3R2U/s72-c/mysql_php.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4892242742838504581.post-1813343087647039974</guid><pubDate>Mon, 17 Apr 2017 14:25:00 +0000</pubDate><atom:updated>2018-01-26T09:49:00.088+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Hardware</category><title>Serwis Lenovo: uszkodzenie mechaniczne laptopa</title><description>W połowie zeszłego roku zdecydowałem się na zakup laptopa dla graczy Lenovo Y700-17. Laptop sprawował się świetnie przez wiele miesięcy, lecz w lutym tego roku sprzęt zdecydowanie zaczął odmawiać posłuszeństwa. Niedowierzając w to, że praktycznie nowy i mało używany sprzęt za ponad 4000 zł mógł się tak szybko popsuć, postanowiłem spróbować przywrócić system Windows 10, lecz okazało się to niemożliwe do wykonania ze względu na problemy z zapisem danych na dysk.&lt;br /&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4Vf86UkuF6uDqEbGdn2KsdLZV4CiKE6YgLz1r86sWn6KBXDqkcePRTJ-O8mV_3FyAmkYikaem6QwKBVYGyhC-l6ob-cEewbh31NAI57GdFomGCybccmeuByMfCJJiflX3-eRn9JIA5ZA/s1600/laptop-broken-screen-lenovo.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4Vf86UkuF6uDqEbGdn2KsdLZV4CiKE6YgLz1r86sWn6KBXDqkcePRTJ-O8mV_3FyAmkYikaem6QwKBVYGyhC-l6ob-cEewbh31NAI57GdFomGCybccmeuByMfCJJiflX3-eRn9JIA5ZA/s640/laptop-broken-screen-lenovo.png&quot; width=&quot;640&quot; height=&quot;480&quot; data-original-width=&quot;1024&quot; data-original-height=&quot;768&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;h2&gt;Laptop Lenovo na gwarancji&lt;/h2&gt;
&lt;br /&gt;
Ponieważ najwidoczniej dysk twardy uległ awarii, oddałem laptopa do serwisu Saturn - gdzie sprzęt został zakupiony – w celu dokonania naprawy gwarancyjnej. 
&lt;br /&gt;&lt;br /&gt;
&lt;h2&gt;Serwis Lenovo: bardzo negatywne opinie klientów!&lt;/h2&gt;
&lt;br /&gt;
Dlaczego jednak oddałem sprzęt do punktu serwisowego Saturn, zamiast wysłać go bezpośrednio do serwisu Lenovo, co teoretycznie znacznie przyśpieszyłoby przebieg procedury? Otóż szukając w sieci informacji o serwisie Lenovo i sposobie załatwienia procedury reklamacyjnej, natknąłem się na sporą ilość bardzo negatywnych opinii osób, które oddały sprzęt Lenovo do autoryzowanego serwisu w ramach gwarancji. Na podstawie komentarzy i opinii znajdujących się w sieci, serwis Lenovo rzekomo słynie z odmawiania naprawy gwarancyjnej z powodu tak zwanego &quot;uszkodzenia mechanicznego&quot;. Po zapoznaniu się z treścią licznych negatywnych opinii dotyczących autoryzowanego serwisu Lenovo, znajdujących się nie tylko na różnych portalach społecznościowych, lecz także na kilku znanych forach prawnych, zdecydowałem się oddać sprzęt do serwisu Saturn aby uzyskać niezależne od autoryzowanego serwisu Lenovo pisemne potwierdzenie – w postaci protokołu przyjęcia sprzętu do naprawy - braku widocznych usterek mechanicznych w moim laptopie. Mój laptop nie był nawet lekko zarysowany i wolałem uzyskać pisemne i niezależne potwierdzenie takiego stanu rzeczy! Na wszelki wypadek, po przeczytaniu komentarzy osób, które postanowiły złożyć sądowy pozew przeciwko autoryzowanemu serwisowi Lenovo, postanowiłem się z góry dobrze zabezpieczyć przed niemiłymi niespodziankami.   
&lt;br /&gt;&lt;br /&gt;
&lt;h2&gt;Prawnie istotne potwierdzenie stanu sprzętu: protokół przyjęcia do naprawy&lt;/h2&gt;
&lt;br /&gt;
Pracownik serwisu Saturn dokładnie obejrzał sprzęt, po czym sporządził protokół przyjęcia reklamacyjnego, na którym mi zależało i który przedstawiam poniżej: 
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYq9vpl9wQBeMnRghodVWNjs3pVTQH6_s-1HmY1ODUEPEictPMvyeiV683ORktJNWLzSKtnzJscj-34yRwOtgcPUbsQheEa8pmEiCX8VH-8v1JBF8eDFVUtSAK_WiAafuGI_knFwTEeXY/s1600/protokol_przyjecia_sprzetu_do_serwisu.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Protokół przyjęcia sprzętu do naprawy gwarancyjnej&quot; border=&quot;0&quot; height=&quot;266&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYq9vpl9wQBeMnRghodVWNjs3pVTQH6_s-1HmY1ODUEPEictPMvyeiV683ORktJNWLzSKtnzJscj-34yRwOtgcPUbsQheEa8pmEiCX8VH-8v1JBF8eDFVUtSAK_WiAafuGI_knFwTEeXY/s640/protokol_przyjecia_sprzetu_do_serwisu.jpg&quot; title=&quot;Protokół przyjęcia sprzętu do naprawy gwarancyjnej&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Protokół przyjęcia sprzętu do naprawy gwarancyjnej&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;h2&gt;Serwis Lenovo: uszkodzenie mechaniczne!&lt;/h2&gt;
&lt;br /&gt;
Serwis Saturn oczywiście przekazał laptop do serwisu producenta po czym – ku mojemu kompletnemu zaskoczeniu – ze strony serwisu Lenovo otrzymałem odmowę naprawy gwarancyjnej! Oczywiście powodem było... uszkodzenie mechaniczne! Serwis Lenovo przygotował wycenę naprawy i skrupulatnie załączył dowody uszkodzenia mechanicznego w postaci kilku zdjęć. 

Żadnego uszkodzenia tego typu oczywiście nie było w chwili przekazania laptopa do punktu serwisowego Saturn. Gdybym wiedział o istnieniu jakiegokolwiek uszkodzenia mechanicznego, to skorzystał bym z góry z ochrony G-Max, którą wykupiłem wraz z laptopem i za którą słono zapłaciłem, bo ponad 700zł.  Oto dokumentacja, którą otrzymałem ze serwisu Lenovo za pośrednictwem firmy Saturn: 
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM9OQXyTe0CjgyJ6PNjuCEtuwVsUzdG8GhKIX_mtYzr1cikc6b-GXm0UQNFRjlAbIUa5pNhdLq4wR88PfRLt2HcmDXPLohfZHur_jihe67yYFfqOrve-M7ctdkrH56siNRh5rCJ3RclBY/s1600/uszkodzenie_mechaniczne_1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Uszkodzenie mechaniczne którego wcześniej nie było&quot; border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM9OQXyTe0CjgyJ6PNjuCEtuwVsUzdG8GhKIX_mtYzr1cikc6b-GXm0UQNFRjlAbIUa5pNhdLq4wR88PfRLt2HcmDXPLohfZHur_jihe67yYFfqOrve-M7ctdkrH56siNRh5rCJ3RclBY/s640/uszkodzenie_mechaniczne_1.jpg&quot; title=&quot;Uszkodzenie mechaniczne którego wcześniej nie było&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Uszkodzenie mechaniczne którego wcześniej nie było&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg00-Uj20qSy48iQqH2IPuipTtdWh88dsZtSsRsxh5Up_hc5j7somzWy2YOFKqro1m3GjqQIl9Jpe4uludsyWvW9yND6tBJJgDE0GCVENT3ZLR2oF_amuYDTU6ZAOzbd3GoGWpjMGFylDw/s1600/uszkodzenie_mechaniczne_2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Uszkodzenie mechaniczne którego wcześniej nie było&quot; border=&quot;0&quot; height=&quot;518&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg00-Uj20qSy48iQqH2IPuipTtdWh88dsZtSsRsxh5Up_hc5j7somzWy2YOFKqro1m3GjqQIl9Jpe4uludsyWvW9yND6tBJJgDE0GCVENT3ZLR2oF_amuYDTU6ZAOzbd3GoGWpjMGFylDw/s640/uszkodzenie_mechaniczne_2.jpg&quot; title=&quot;Uszkodzenie mechaniczne którego wcześniej nie było&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Uszkodzenie mechaniczne którego wcześniej nie było&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3m1MG0ozUEHPAulocZwj7GzTLK2qAmvV4GSp2y_Tba52cfuchytums3ap-P_AHlBXdK-g0bWNfPyemobfh9xw3hjIt8RnKYHU5Ue829gq3asJLBYtXjmnftbzlGYeWbprp1qi5BJgcvE/s1600/uszkodzenie_mechaniczne_3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Panowie serwisanci Lenovo zdejmują klawisze i szukają cieczy!&quot; border=&quot;0&quot; height=&quot;414&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3m1MG0ozUEHPAulocZwj7GzTLK2qAmvV4GSp2y_Tba52cfuchytums3ap-P_AHlBXdK-g0bWNfPyemobfh9xw3hjIt8RnKYHU5Ue829gq3asJLBYtXjmnftbzlGYeWbprp1qi5BJgcvE/s640/uszkodzenie_mechaniczne_3.jpg&quot; title=&quot;Panowie serwisanci Lenovo zdejmują klawisze i szukają cieczy!&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Panowie serwisanci Lenovo zdejmują klawisze i szukają cieczy!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM2tKKaYFqN7_J0-_fKw-vMbC04aIPYLozf_V6llFWpALiR88IiMmgz788lL0y5W8X48oV-oSZRxps_9Ew_x8Bbei6lMLi_E6XZMJUNVnrnPf5vUYfUENfJGH9dy0nxdcCQY4nxn9vXYo/s1600/wycena_naprawy_laptopa.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Sprzęt na gwarancji: wycena naprawy z powodu uszkodzenia mechanicznego!&quot; border=&quot;0&quot; height=&quot;486&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM2tKKaYFqN7_J0-_fKw-vMbC04aIPYLozf_V6llFWpALiR88IiMmgz788lL0y5W8X48oV-oSZRxps_9Ew_x8Bbei6lMLi_E6XZMJUNVnrnPf5vUYfUENfJGH9dy0nxdcCQY4nxn9vXYo/s640/wycena_naprawy_laptopa.jpg&quot; title=&quot;Sprzęt na gwarancji: wycena naprawy z powodu uszkodzenia mechanicznego!&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Sprzęt na gwarancji: wycena naprawy z powodu uszkodzenia mechanicznego!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;h2&gt;Walka z wiatrakami&lt;/h2&gt;
&lt;br /&gt;
Skoro serwis Saturn wystawił protokół przyjęcia sprzętu, w którym nie było mowy o jakichkolwiek uszkodzeniach mechanicznych, to skąd nagle wzięły się uszkodzenia udokumentowane przez serwis Lenovo? Ktoś najwidoczniej musiał przyczynić się do ich powstania! Skoro jednak sprzęt przekazałem osobiście do serwisu Saturn, to właśnie ta firma była prawnie odpowiedzialna za jakiekolwiek niezgodności sprzętu z opisem widniejącym w protokole przyjęcia sprzętu do naprawy.  
Próbowałem wyjaśnić okoliczności powstania uszkodzeń mechanicznych dzwoniąc, pisząc i kilkakrotnie udając się osobiście do punktu serwisowego Saturn. Moje wysiłki w tym kierunku poszły jednak na marne. Dodam jeszcze, że jedna z konsultantek telefonicznych firmy Saturn próbowała mnie nakłonić do skorzystania z wykopionej ochrony G-Max w celu załatwienia całej sprawy w prosty sposób. Ani firma Saturn, ani autoryzowany serwis Lenovo nie czuli się odpowiedzialni za powstałe uszkodzenia mechaniczne.
&lt;br /&gt;&lt;br /&gt;
&lt;h2&gt;Adwokat i magiczna naprawa sprzętu w ramach gwarancji&lt;/h2&gt;
&lt;br /&gt;
Czując się nieco bezsilnie i niezręcznie w zaistniałej sytuacji, postanowiłem przestać walczyć z wiatrakami i udać się do dobrego adwokata. 

Adwokat do którego się wybrałem, uznając ewentualny proces w Sądzie z góry za wygrany, wysłał do firmy Saturn krótkie i zwięzłe pismo, za co zapłaciłem około 200zł, po czym - jakby w skutek magicznego zaklęcia - otrzymałem od serwisu Lenovo informację, iż zgłoszenie reklamacyjne zostało zrealizowane.  

Poniżej przedstawiam potwierdzenie wykonania bezpłatnej naprawy gwarancyjnej. Na dokumentacji widnieje również informacja o wykupionej przeze mnie ochronie G-Max, z której jednak nie miałem powodu korzystać, skoro uszkodzenia powstały po oddaniu sprzętu do naprawy!&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgosWZFZM5ozkXsMH8YsWS2y70bW87qrgsZOSbKWb7SkryRLZzVH78D5OTWoA9Y8LOUh44nu6Z1gHvu_undyockXa2U66puwEApXxs6D5LVOVg3zlD1RaNASu9PYn8rVSHNQLP83fSo9ok/s1600/zalatwienie_reklamacji.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Sprzęt Lenovo naprawiony bezpłatnie&quot; border=&quot;0&quot; height=&quot;366&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgosWZFZM5ozkXsMH8YsWS2y70bW87qrgsZOSbKWb7SkryRLZzVH78D5OTWoA9Y8LOUh44nu6Z1gHvu_undyockXa2U66puwEApXxs6D5LVOVg3zlD1RaNASu9PYn8rVSHNQLP83fSo9ok/s640/zalatwienie_reklamacji.jpg&quot; title=&quot;Sprzęt Lenovo naprawiony bezpłatnie&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Sprzęt Lenovo naprawiony bezpłatnie&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Można jednak zauważyć, iż naprawa gwarancyjna nie objęła wszystkich elementów znajdujących się we wcześniejszym kosztorysie serwisu Lenovo. Nie dość, że sposób powstania uszkodzeń mechanicznych pozostaje do dziś niewyjaśniony - winni są prawdopodobnie pracownicy Saturn, kurierzy, bądź serwisanci Lenovo, to najwidoczniej wstępna wycena naprawy okazała się zwykłym naciąganiem klienta na wydatki, skoro naprawę udało się wykonać o wiele niższym kosztem! 
&lt;br /&gt;&lt;br /&gt;
Na dodatek panowie serwisanci zgubili gdzieś klawisz, o którym mowa w protokole przyjęcia sprzętu i który dołączyłem z prośbą o przymocowanie, wraz z jego elementami mocującymi.
&lt;br /&gt;&lt;br /&gt;
&lt;h2&gt;Czy ktoś z Was ma podobne doświadczenie?&lt;/h2&gt;
&lt;br /&gt;
Jeśli ktoś z Was ma podobne doświadczenie z serwisem Lenovo to bardzo proszę o komentarze. Nie dajmy się naciągać na bezpodstawne koszty!</description><link>https://informatyka-porady.blogspot.com/2017/04/serwis-lenovo-uszkodzenie-mechaniczne.html</link><author>noreply@blogger.com (Lelio Michele Lattari)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4Vf86UkuF6uDqEbGdn2KsdLZV4CiKE6YgLz1r86sWn6KBXDqkcePRTJ-O8mV_3FyAmkYikaem6QwKBVYGyhC-l6ob-cEewbh31NAI57GdFomGCybccmeuByMfCJJiflX3-eRn9JIA5ZA/s72-c/laptop-broken-screen-lenovo.png" height="72" width="72"/><thr:total>79</thr:total></item></channel></rss>