Witam
Szukałem w Google rozwiązania po polsku oraz angielsku. Zapewne rozwiązanie mojego problemu jest, ale nie potrafię go znaleźć. Zaznaczę jeszcze, że w PHP jestem bardzo początkujący i dopiero się uczę.
1. Sytuacja wygląda tak:
Chciałbym utworzyć około 900 plików *.php o konkretnych nazwach z podstawioną zmienną z listy (listę mogę mieć w dowolnym formacie - to nie problem).
Nazwa pliku będzie wyglądała tak: (to oczywiście przykład) szkola-warszawa.php ; szkola-wroclaw.php ; szkola-stalowa-wola.php ; czyli wzór wygląda tak: szkola-$zmienna.php
Natomiast zawartość na każdej stronie będzie taka sama, czyli HTML z odpowiednimi zmiennymi w PHP. Te zmienne będą generowane z innego pliku i tutaj nie mam większych problemów, tak samo potrafię wyciągnąć wyciągnąć nazwę miejscowości z już utworzonego pliku, tak aby odpowiednio na każdej stronie zachodziły zmiany. Nie mam zielonego pojęcia jak ugryźć ten temat.
2. Drugim moim problemem, jest to, że chciałbym utworzyć formularz kontaktowy z możliwością wysyłania załączników (6szt). Nie do końca rozumiem PHPMailer, tak więc próbowałem stworzyć prosty formularz korzystając z metody POST i wiadomości dochodzą bez problemu na moją skrzynkę jednak nie dochodzą załączniki. Czy jest jakaś możliwość, aby nie korzystając z PHPMailer stworzyć taki formularz? Ew. czy jest ktoś w prosty sposób nakierować mnie jak to zrobić w PHPMailer, ponieważ na ten moment nie mogę zrozumieć działania PHPMailer - a też nie chcę bezwiednie kopiować rozwiązań z internetu. Formularz po wysłaniu przez użytkownika powinien przesłać na moją pocztę wiadomość z załącznikami oraz wcześniej przygotowana odpowiedź do nadawcy z podziękowaniem.
Bardzo prosiłbym o pomoc w tych kwestiach, ponieważ w tym temacie ciężko mi cokolwiek znaleźć (zapewne dlatego, że źle szukam). Siedzę nad tym już kilka dni i wszystko co napiszę ląduje w koszu.
ad.1 Źle do tego podchodzisz. Powinieneś mieć utworzoną regułę w .htaccess, która kieruje wszystkie żądania szkola-xxxx.php na jeden plik (na plik php). Tam sprawdzasz z jaką miejscowością masz do czynienia i na podstawie tej wartości generujesz zmieniony wynik w HTML. W przypadku kiedy ktoś wpisał adres z niechcianą nazwą miejscowości, to generujesz ogólny HTML lub przekierowujesz użytkownika gdzie indziej. Warto by było przetrzymywać gdzieś (tablica w php lub w bazie danych) listę obsługiwanych miejscowości.
Problem #1.
Pytanie ode mnie. Na pewno potrzebujesz mieć fizycznie utworzone 900 (prawie) identycznych plików? Problem można rozwiązać prostym routingiem i plików będzie znacznie mniej.
Problem #2.
Możesz skorzystać z "gotowca". Nie musisz w pełni implementować formularza po swojej stronie. Możesz skorzystać z: https://formspree.io/. A tutaj info jak wdrożyć załączniki: https://help.formspree.io/hc/en-us/articles/115008380088-File-uploads
Pozostanie jedynie ogranie "wiadomości-podziękowania".
PS. Czego nie rozumiesz z dokumentacji PHPMailera?
Dziękuję Wam za odpowiedzi!
Do trueblue:
Rzeczywiście, jest do dużo prostsze rozwiązanie niż tworzenie tylu plików, tylko pytanie jak na to zareaguje Google z indeksowaniem, podejrzewam, że nie zaliczy tych stron, a tutaj chodzi o pozycjonowanie na daną miejscowość. Z drugiej jednak strony czy nie będzie to duplikat wtedy... Treści będą zmienne, ale przy tak ogromnej liczbie i tak się sporo powtórzy. Muszę jedynie odnaleźć informacje jak to wpłynie na indeksowanie, bo jeżeli okaże się to ok, to z przyjemnością wykorzystam.
Do Salvation:
Jak powyżej, chodzi mi o pozycjonowanie strony pod konkretne miejscowości, więc nie do końca wiem czy potrzebuję. Na logikę wydaje mi się, że tak - spróbuję doedukować się na szybko w tym temacie.
Co do PHPMailer, to chciałbym wysyłać wiadomości bez wpisywanie ustawień SMTP. Próbowałem na różne sposoby to omijać i niestety nic nie działało. Gdzieś w internecie znalazłem informację, że aby wysłać dodatkową wiadomość podziękowania należy utworzyć nową instancję, tą także wcześniej tworzyłem, ale skoro i tak wiadomości nie dochodzą, no to nie mam jak sprawdzić. Chyba, że nie ma możliwości pominięcia serwera SMTP.
Jeżeli piszę niejasno, to przepraszam, jednak w tym temacie na chwilę obecną jestem jak dziecko we mgle - cały czas staram się uczyć(głównie z dokumentacji) i powoli prę do przodu, jednak niestety powoli.
ad1 tak sie wlasnie robi jak koledzy ci powiedzieli. Zamast robic milion plikow szkola-warszawa.php, szkola-wroclaw.php itd to robisz dynamiczny rotuing, ala
/szkola-warszawa, /szkola-wroclaw itd
i taki routing jest przekierowywany do jednego pliku szkola.php
Google nadal widzie twoje warszawa, wroclaw itd i wszystko sie indeksuje jak ma sie indeksowac
ad2
Co to znaczy bez SMTP? Czy to znaczy ze masz serwer pocztowy skonfigurowany na serwerze i nie potrzebujesz SMTP? Jesli tak to prosze, tu masz przyklad gdzie PHPMailer korzysta z konfigurowanego mail()
https://github.com/PHPMailer/PHPMailer/blob/master/examples/mail.phps
Do nospor:
Ad.1
Wspaniale!! To rozwiązanie jest po prostu idealne dla mnie, tak więc dzięki za potwierdzenie o indeksowaniu.
Ad.2
Czyli prościej mówiąc, muszę stworzyć maila na swoim hostingu (np. kontakt@domena.pl), pobrać dane smtp do tego konta i po prostu je wrzucić w konfigurację PHPMailer. Teraz to tak rozumiem.
Jeżeli tak jest to dalej nasuwają się pytania.
Czy na tego maila mogę także odbierać wiadomości oraz normalnie posługiwać się nim jako głównej skrzynki?
Poniżej podam przykład, czy o takie coś chodzi:
<?php //Import PHPMailer classes into the global namespace //These must be at the top of your script, not inside a function use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; //Create an instance; passing `true` enables exceptions $mail = new PHPMailer(true); try { <---- tutaj ustawienia SMTP utworzonego maila? //Server settings $mail->SMTPDebug = SMTP::DEBUG_SERVER; //Enable verbose debug output $mail->isSMTP(); //Send using SMTP $mail->Host = 'smtp.example.com'; //Set the SMTP server to send through $mail->SMTPAuth = true; //Enable SMTP authentication $mail->Username = 'user@example.com'; //SMTP username $mail->Password = 'secret'; //SMTP password $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; //Enable implicit TLS encryption $mail->Port = 465; //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS` <----------- koniec ustawień <----------- Czy w sekcji poniżej mogę normalnie wpisać wartości z formularza z "name"? jeżeli input name="name" np. $mail->from($name); //Recipients $mail->setFrom('from@example.com', 'Mailer'); $mail->addAddress('joe@example.net', 'Joe User'); //Add a recipient $mail->addAddress('ellen@example.com'); //Name is optional $mail->addReplyTo('info@example.com', 'Information'); $mail->addCC('cc@example.com'); $mail->addBCC('bcc@example.com'); <------------ Czy w sekcji poniżej mogę normalnie wpisać wartości z formularza z "name"? jeżeli input name="file1" (będę miał 6 pól) np. $mail->attachment1($file1); //Attachments $mail->addAttachment('/var/tmp/file.tar.gz'); //Add attachments $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); //Optional name <------------ Tutaj rozumiem jak działa ta sekcja //Content $mail->isHTML(true); //Set email format to HTML $mail->Subject = 'Here is the subject'; $mail->Body = 'This is the HTML message body <b>in bold!</b>'; $mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; <------------ Czy zaraz po $mail->send(); zamiast http://www.php.net/echo... mogę zastosować takie coś: <------------ $messageStatus = "Wiadomość została wysłana"; <------------ tak aby została nadana ta wartość, a jeżeli mogę użyć Fetch w JS to po prostu po otrzymaniu poprawnej odpowiedzi wyskoczy komunikat z wiadomością $messageStatus $mail->send(); http://www.php.net/echo 'Message has been sent'; <------------ a czy w tej sekcji zamiast http://www.php.net/echo mogę zastosować ponownie $messageStatus = "Upsss... coś poszło nie tak" } catch (Exception $e) { http://www.php.net/echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; } <------------ Co to odpowiedzi, czy to powinno wyglądać tak?; <------------ Poniżej już tylko moje wypociny $response = new PHPMailer(true); <------------ Tutaj dane nadawcy $response->name('$name"); itd..... i na końcu: $response->Send(); tu bez komunikatów, ponieważ będą zbędne, jedynie catch (Exception $e) { echo "Nie działa"; }
ad2) No tak, wszystkie komenty z kody sa ok. Nadawca/name moze pochodzic skad chcesz. Czy to form, czy to dostawca z pizzy. To nie ma znaczenia. Co podasz to pojdzie
Tak, zalczniki tak samo i cala reszta. Ale zalaczik musisz wpiero uploadowac na serwer, ale to zakladam wiesz jak zrobic?
to samo echo mozesz zastopic wpisanie do zmiennej i tp. No to sa podstawy php
Podstrony będą się indeksować, ale ze względu na małą różnorodność treści możesz być wyrzucony z indeksu Google za Duplicate Content. Nie ma to znaczenia czy miałbyś 900 odrębnych plików czy jeden generujący różną zawartość.
Wiem, że to są podstawy PHP, ale się dopiero uczę tego języka. Więc moja wiedza jest na ten moment mocno ograniczona i sprowadza się do podmiany zmiennych na stronach... Tak więc jeszcze dużo przede mną.
Co do wrzucenia plików na serwer to nie mam pojęcia jak to zrobić. Znalazłem w dokumentacji:
https://github.com/PHPMailer/PHPMailer/blob/master/examples/send_file_upload.phps
Jednak próbuję rozgryźć gdzie w tym kodzie jest funkcja odpowiedzialna za wrzucenie plików. Zdaję sobie sprawę, że muszę utworzyć osobny katalog do trzymania tych plików, jednak nie mam pojęcia jak stworzyć funkcję, która będzie najpierw pobierała te pliki, zapisywała na serwerze a następnie wysyłała na wskazany email.
T a funkcja
move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)
kopiuje plik z formularza do twojego katalogu do ktorego wrzucasz pliki uzytkownikow.
To jest naprawde proste. Wiec moze zamiast od razu brac sie nie wiadomo za co, to poprostu przeledz wpierw przez tydzien/dwa podstawy php. Bo troche mija sie z celem tlumaczenie kazdej linijki kodu w paro linijkowym przykladzie. Mowie to bez zlosliwosci
Wiem, o tym. Cały czas się szkolę i ćwiczę w tym języku. Pewnie jeszcze trochę czasu minie zanim wszystko w pełni zrozumiem...
Jednak bardzo dziękuję wszystkim za pomoc, pomysły i nakierowanie!!
Jestem niesamowicie wdzięczny i już wiem na czym stoję i co mogę dalej robić. Co do PHPMail to z pewnością przerobię wszystkie przykłady, tak aby go w pełni zrozumieć.
Dzięki wszystkim raz jeszcze!
Hej,
Jeszcze raz dziękuję za poprzednią pomoc. Nadrobiłem nieco zaległości i już formularz bez problemu działa. I nawet rozumiem już co się tam dzieje.
Jednak utknąłem na dalszym etapie. Na pliku .htaccess
Mam w głównym katalogu plik post.php, w którym napiszę reguły dotyczące wczytywanych treści. Chcę go oprzeć na zasadzie odczytania adresu URL (dla przykładu https://mojadomena.pl/blog/szkola-warszawa) i dla "szkola-warszawa" wyświetli się odpowiedni tekst poprzez zastosowanie warunków - to bez problemu zrobię. Jednak mam problem z napisanie reguły w .htaccess, szukam wszędzie (i znając życie odpowiedź już widziałem - jednak nie potrafię jej dostrzec)
Chciałbym aby po wejściu na stronę https://mojadomena.pl/blog/szkola-warszawa została wczytana strona https://mojadomena.pl/post.php?szkola-warszawa tak aby nazwa w pasku adresu się nie zmieniła.
RewriteEngine on RewriteBase / RewriteRule ^blog/([0-9a-zA-z]+)/?$ post.php?id=$1[L]
Jak zastosowałem Twoje rozwiązanie to cała strona padła (błąd 500) poza tymi regułami w pliku .htaccess nie mam nic
A co jest w pliku post.php?
dawno w htaccess nie siedzialem ale masz kilka bledow logicznych. niby chcesz przekierowywac szkola-warszawa, ale w warunku nie uwzglednils myslnika.
niby chcesz to przekierowac na post.php?szkola-warszawa ale w warunku przekierowujesz na post.php?id=szkola-warszawa itd itd
Generalnie powinienies to przekierowywac na post.php?id=warszawa. po grzyba dodawac stala koncowke szkola do przekierowania?
czyli cos takiego:
RewriteRule ^blog/szkola-([0-9a-zA-z]+)/?$ post.php?id=$1[L]
a potem w post.php pod $_GET['id'] powinna byc warszawa
Na ten moment tylko struktura HTML i dorzucony Header i Footer (poprzez include).
Z tym, że cała strona przestała funkcjonować.
nospor - to przekierowanie działa dokładnie tak jak chciałem
Dzięki wielkie za kolejną pomoc!
Mam jeszcze tylko pytanie
Czy pod takie przekierowanie mogę na przykład dodać listę?
np.
warszawa
poznan
wroclaw itp
tak, żeby cała reszta miast wywalała 404?
Powinno być raczej:
Faktycznie, masz absolutną rację. Podałeś już wcześniej mi tą informację. Już wiem co mam robić.
Bardzo Wam dziękuję za pomoc i poświęcony czas.
Pozdrawiam serdecznie
A jest możliwość aby nie było ograniczeń następnych myslników?
bo na ten moment szkola-warszawa działa, a szkola-zielona-gora już nie, czy jest możliwość aby działało to z jakąkolwiek frazą po szkola- ? niezależnie od liczby myślników
Już rozwiązane.
Dodałem "." przed plusem
Kropka oznacza dowolny znak, co równie dobrze można sprowadzić do: (.+)
A tak z myślnikiem: ([0-9a-zA-Z\-]+)
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)