Hirdetés
Új hozzászólás Aktív témák
-
Peter Kiss
őstag
válasz Tele von Zsinór #5408 üzenetére
Ez rendben van, de ha van valaki annyira gyökér, hogy pl. regisztrációt, belépést GET-tel valósít meg, akkor az látszik az URL-ben, könnyebben visszakereshető a felhasználói név + jelszó.
GET-nek az is hátránya, hogy kevesebb adatot lehet vele átnyomni, plusz fájlok küldésére alkalmatlan. Emellett az URL encode & decode (elhagyása) jelenthet gondot.
-
Peter Kiss
őstag
Sziasztok!
MVC-vel küzdök, mint disznó a jégen, most épp azt nem tudom, hogyan szokás a menüket építeni benne. MVC-n kívül kellene felépíteni a menüt, aztán, mikor töltődik a View, előhúzni a farzsebből? Most úgy működök, hogy van egy Application osztályom, ami létrehozza a Controller-t [minden lefut, return view], majd meghívja a View Render metódusát. Ezzel kapcsolatban azt sem értem, hogy hogyan oldjam meg az oldal konzisztens szerkezetét (pl. adott helyre adott jellegű menü kerüljön).
ASP.NET MVC nagyon jól működik ilyen szempontból, de most saját PHP-sat akarok.
Köszi!
-
Peter Kiss
őstag
Kicsit pontosítok a problémámon:
Van egy action-öm, legyen a neve 'edit';
Megvan a hozzá tartozó View, amiben egy HTML form van, de semmi többHogyan oldjam meg, hogy a top level HTML elemeket tartalmazó View darabok, és esetleg pl. a menüt tartalmazó részeket berántsa magának?
Készítsek egy olyan alapállományt, ami mondjuk elkülönít 9 részt a komplett oldalon (minden View alapja ez lenne), és mindegyikbe tegyek adatott, ami:
kifejezetten az adott action-nek megfelelő (ez lenne az edit form),
vagy include-dal húzzam be a közös elemeket (top level HTML elemek, menü)
vagy esetleg üresen marad---
Még egy gond
Az MVC mappastruktúrám ilyen:
/Application
/Areas
/csillamponi
/Controllers
/Models
/Views
/Controllers
/Models
/ViewsArra kellene valami jó megoldás, hogy miként töltse be az adott részeket a cucc. Ugyan van automata osztálybehúzóm, de az elég bénán működik, akkor lenne csak normálisan működőképes, ha nem lenne az 'Areas' rész. Mivel van, valahogyan ki kellene erőszakolnom, hogy ha egy Area-ba lép valaki, akkor lehetőleg az Area-hoz tartozó dolgokat keresse előbb. Ezzel, ami személyes problémám, hogy nem tudom, minek mit szokás átadni, nálam pl. most az aktuális Controller megkapja a konstruktorában a végrehajtandó action-t (de nem a konstruktor hívja meg!). A paraméterátadást azért szeretném minimálisra csökkenteni, hogy a konkrét elemek létrehozásakor ne kelljen sokat szöszölni ezekkel (pl. megfelelő parent::__construct hívás).
Köszi!
-
Peter Kiss
őstag
Utána néztem az 'inherit' módú View-gyártásnak, ez sokkal jobban tetszik, mert könnyebben és szebben valósítható meg (plusz hasonlít az egész az ASP.NET MVC 2-höz). Azt hiszem, ez jelenti a jobb megoldást, találtam is egy kis mutatványt, ami megvalósítja ezt mindenféle trükkölés nélkül tisztán PHP-ban (nem kell semmilyen template language-t használni), átírtam OO-ra is már, ki is próbáltam, működik. Az 'Output Control Function'-ök jelentik az alját, ezeket még nem használtam, van-e valami hasznos megjegyzés hozzájuk?
Area == logikai egység, példák:
/felhasznalok/felhasznalo/bombadil_toma/edit
/felhasznalok/csoport /tlotr /editItt a 'felhasznalok' képvisel egy area-t. Ehhez hasonlóan lehet admin area-t hegeszteni (elképzeléseim szerint), pl. a CakePHP (ha jól emlékszem) NEM használ ilyet, hanem metódus prefixumokkal operál, ami kicsit nevetségesen fest számomra, de az ötlet persze nem rossz.
M "mappa" nem lenne lényeges az area-ba, hiszen a Model az egész rendszerben megtalálható, de esetleg lehet valamilyen örökléses csavart betenni, ha arra van szükség.Autoload-ra tudsz mutatni valami hardcore-abb példát? Mert van egy rakás faék egyszerű tutorial a neten, de mikor valami komolyabb kellene, akkor megáll a tudomány. Jó, mondjuk nagy csavar nem lehet benne, nálam is csak az a gond, hogy az elemek nem tudják magukról, hogy area-ban vannak (ha).
Saját frameworkot szeretnék, semmi durvát, csak legyen jól használható.
Nálam a Controller azért kapja meg az action nevét a konstruktorban, mert már ekkor létrejön egy View objektum, aminek tudnia kell, mit renderel. Ez azért szükséges megint, hogy minél több mindent tudjon megvalósítani magától a rendszer (action végén csak return $this->_view van). Ez a viselkedés egyébként "felülírható", a Controller-nek van egy View-gyártó metódusa.
-
Peter Kiss
őstag
Szerintem ezt nehéz überelni:
<?php require(dirname(dirname(__FILE__)) . DS . 'Shared' . DS . 'defaultmaster.html'); ?>
<?php self::startblock('head') ?>
<script src="/js/libs/modernizr-2.0.6.js"></script>
<?php self::endblock() ?>
<?php self::startblock('teszt') ?>
Tudja, az a fura, hogy valamire emlékszik az ember, valamire nem.
<?php self::endblock() ?>
Mondjuk még megbukhat.---
'csába, az URL-eket elírtam, úgy lenne, ahogyan írtad is a javaslatodban.
---
Ezt az Area-átszervezést ki fogom próbálni, köszi!
---
Az autoloader ennyit csinál nálam is, ami elég is lenne, csak a belekevert area dolog miatt még nem az igazi, de rajta vagyok.
---
A folyamat nálam is majdnem ilyen. Azért örülök, hogy nem vagyok annyira elveszve, talán, remélem.
[ Szerkesztve ]
-
Peter Kiss
őstag
PHP MVC keretrendszerben hogyan érdemes kezelni az AJAX hívásokat? View-ban kellene elintézni azt, ami kell, vagy a Controller-nek kellene egy eltérő View-t kitolnia magából, ha AJAX hívás érkezik? És ezen belül, ha nem a teljes View frissül, akkor azt hogyan oldom meg?
-
Peter Kiss
őstag
Persze, ez világos, csak az nem mindegy, hol dől el, mit tol ki magából a rendszer.
Ilyesmi a terv (útvonalakon ne akadjon fent senki):
/Views/Shared/ez_egy_view_darab.html
/Views/valami/index.htmlIndex.html tudja használni a View darabot, mikor sima kérés van. Ha AJAX, akkor a Controller nem fogja visszaadni a teljes lapot, csak azt a darabkát. Így nincs megírva semmi sem kétszer, könnyen használható/módosítható.
Készítettem egy metódust, amivel le lehet kérdezni, hogy IsAsyncCallback történik-e, és akkor ezzel el lehet dönteni, melyik kell.Még nem próbáltam ki, de bízok benne, hogy menni fog.
-
Peter Kiss
őstag
Ez a terv. Már csak írni kell egy tesztet AJAX-hívásra, mert egyébként a részek felhasználása már megy a View-ban. Amúgy csak annyi zavart meg, hogy nem tudtam hirtelen eldönteni, hogy a View maga dönthet-e arról, mit renderel, de arra jutottam, hogy nem.
Így néz ki egy View fájl nálam most:
<?php self::MasterPage('defaultmaster.html'); ?>
<?php self::Content('title'); ?>
az oldal címe!!!
<?php self::ContentEnd() ?>
<?php self::Content('head'); ?>
ide lehet pakolni css-t vagy mást
<?php self::ContentEnd() ?>
<?php self::Content('content1'); ?>
homeindex
mindenféle tartalom
egy view darab:
<?php self::Control('teszt_user_control.html'); ?>
<?php self::ContentEnd() ?>A 'teszt_user_control.html' a közös darabka, vidáman behúzza, HTML-ben ilyen lesz a kimenete:
<div class="control" id="control_teszt_user_control_0">tesztusercontrol</div>
Ha még egyszer beraknám a közös darabot, akkor a div id attribútuma végén található számláló nőne (mondjuk másik darabnál is, de ott a név is más, ugye). A 'tesztusercontrol' szöveg van most csak benne a 'teszt_user_control.html'-ben.
-
Peter Kiss
őstag
Teljesen jól működik.
Készítettem egy új osztályt (PartialView), amit a meglévő View osztályomból származtattam, felül kellett írnom annak a konstruktorát (az autoloaderem még nem tökéletes, emiatt van). Ez a felépítés nem biztos, hogy így marad, de nem tűnik rossznak.Kicsi gagyi példa:
class homeController extends Controller {
// többi controller rész
public function index() {
if ($this->_context()->IsAsyncCallback()) {
return $this->PartialView('teszt_user_control.html');
}
return $this->View('index');
}
}De simán megy az is, amit cucka írt természetesen.
-
Peter Kiss
őstag
válasz Peter Kiss #7028 üzenetére
Ezzel a technikával meg tudom csinálni azt, hogy PHP kódból tudjak külön regisztráltatni kliensoldali kódot:
</head> előtt:
CSS fájlt
CSS blockot
</body> előtt:
JavaScript állományt
JavaScript kódot, ami azonnal lefut
Egyéb JavaScript kódotA View Render metódusába kell az előzőekben látható Content-ContentEnd kódot rakni, és kész is.
-
Peter Kiss
őstag
válasz Peter Kiss #7059 üzenetére
public function index() {
if ($this->_httpContext->IsAsyncCallback()) {
ScriptManager::StartupScript("window.alert('bu')");
ScriptManager::StyleBlock("a{font-size:70px;}");
ScriptManager::StyleInclude("/mymvc/css/teszt.css");
return $this->PartialView('teszt_user_control.html');
}
ScriptManager::StyleInclude("/css/ultrabrutal.css");
return $this->View('index');
}Tehát akár így is, ez a kód egy Controller-ből való (fent már szerepelt egyszer). Ha AJAX-szal belehívok, akkor a PartialView mellett leküld még egy pár apróságot. Amin megjött a válasz kliensoldalra, azonnal lefut a window.alert(), bezárása után pedig alkalmazódnak a stílusok (a teszt.css-ben lévők is persze, végrehajtási sorrend böngészőnként eltérő).
---
Találkoztam egy lényeges dologgal is tegnap este: az ob_ függvények nem multibyte safe-ek! Nekem konkrétan a ob_get_length()-tel kellett megküzdenem.
[ Szerkesztve ]
-
Peter Kiss
őstag
válasz Speeedfire #7076 üzenetére
Kiküldéshez készítesz egy buffertáblát. Mikor megvan írva a levél, rányomnak a kiküldésre, akkor ebbe belekerül minden szükséges adat (e-mail cím és a hírlevél ID-je mindenképp), majd elkezdi a rendszer kiküldeni. Lehet cron-nal, de én pl. AJAX-ot használtam automata újrahívással. Rányomnak a küldésre --> táblát felépíteni --> kiszedi pl. az első 50-et (törli is a táblából) --> elküldi --> visszahív a szerveroldalra az újabb 50-es adatért. A kérések között eltelik mindig egy kis idő. Ha ezt a módszert választod, akkor a buffertáblába be kell rakni, hogy ki intézi az aktuális kiküldést, így el lehet kerülni azt, hogy ha egyszerre 2 küldés van folyamatban, hogy összeakadjanak.
-
Peter Kiss
őstag
válasz Speeedfire #7079 üzenetére
Az általam elmesélt rendszerben mentve vannak a levelek. A buffertábla azért kellett nekem, hogy 1 levelet 1 ember nehogy 2-szer kapjon meg, mivel az emberek különböző csoportokba iratkoznak fel, levelet küldeni pedig csoportoknak lehet.
-
Peter Kiss
őstag
válasz Speeedfire #7081 üzenetére
Buffertábla arra is kell, hogy ne legyen nagy gáz abból, ha megszakadna a művelet, lehessen folytatni.
-
Peter Kiss
őstag
válasz Speeedfire #7090 üzenetére
$lekerdez = mysql_query($lekerdez);
Ha itt egy tök új változóba rakod be az eredményt, akkor mi történik?
-
Peter Kiss
őstag
válasz Speeedfire #7093 üzenetére
var_dump()-pal lesd meg a típusát, szerintem nem mysql_resource lesz (vagy minek is kellene lennie), hanem string (tömb).
-
Peter Kiss
őstag
válasz Speeedfire #7102 üzenetére
Át kell szokni! Ráadásul jobb lenne OO módon használni.
-
Peter Kiss
őstag
válasz Speeedfire #7111 üzenetére
function levag($source, $maxLength = 20) {
$ext = "";
if (($extPos = mb_strrpos($source, '.')) !== false) {
$ext = mb_substr($source, $extPos);
$filename = mb_substr($source, 0, $extPos);
} else {
$filename = $source;
}
$filenameLength = mb_strlen($filename);
if ($filenameLength <= $maxLength) {
return $source;
}
return mb_substr($filename, 0, $maxLength) . "..." . $ext;
}Teszt:
echo levag("qwertzuiopasdfghjklyxcvbnm.bubu", 10);Eredmény:
qwertzuiop....bubu[ Szerkesztve ]
-
Peter Kiss
őstag
válasz Speeedfire #7113 üzenetére
Igen, mert úgy értelmeztem, hogy a kiterjesztés nem számít bele a maximális hosszba.
-
Peter Kiss
őstag
válasz Speeedfire #7115 üzenetére
$filename = $source;
return $filename;Helyett:
return $source;
-
Peter Kiss
őstag
válasz Brown ügynök #7127 üzenetére
Egyszerűbb a kliensoldali dolgokat átrakni latin2 kódolásba.
-
Peter Kiss
őstag
válasz Brown ügynök #7157 üzenetére
Fake mappába kell tenni (mod_rewrite-ot alkalmazni kell), amivel eléred azt, hogy le kelljen futnia egy szkriptnek, hogy elérhető legyen. Ennek pedig az lenne a dolga, hogy egyszer használatos token-t generálna, amivel le lehetne tölteni a fájlt.
[ Szerkesztve ]
-
Peter Kiss
őstag
válasz Speeedfire #7221 üzenetére
Van.
/^(ez)|(vagyemez)$/ui
Itt az egész inputra nézi, hogy egyenlő-e valamivel. Mindebből a ()-ek és a | jel használata a lényeg.
-
Peter Kiss
őstag
válasz Speeedfire #7385 üzenetére
Miért?
-
Peter Kiss
őstag
Kriptográfiai kulcsokat hova szokás pakolni?
-
Peter Kiss
őstag
válasz Sk8erPeter #7507 üzenetére
A header() hívás akkor kellhet, ha a címeket nem mod_rewrite-tal írjuk át, hanem elkapjuk a 404-es hibákat. Gondolom, ez kavarodhatod meg.
-
Peter Kiss
őstag
válasz Sk8erPeter #7511 üzenetére
Jön Pistabá: domain.com/user_friendly_url
HTTP 404 (nincs mod_rewrite, nincs meg fizikailag ez a tartalom)
Egyéni hibaoldal ba van álltva
Ebben megnézem az URI alapján, tudok-e tartalmat szolgáltatni
Ha igen
HTTP 200 + tartalom
Egyébként
Tovább engedem 404-gyelÉn erre gondoltam.
-
Peter Kiss
őstag
válasz Speeedfire #7623 üzenetére
IP, SessionID, DateTime, URL, ezeket, ha lemented, mindent megkaphatsz belőle.
-
Peter Kiss
őstag
válasz Speeedfire #7653 üzenetére
A mysql_result elállítja a pointert 0-ról 1-re szerintem. Mielőtt fetch-elnél, állítsd be 0-ra.
-
Peter Kiss
őstag
válasz Speeedfire #7656 üzenetére
[ Szerkesztve ]
-
Peter Kiss
őstag
válasz wolandino #7664 üzenetére
Az SQL szerver cache-ébe nem nagyon szól bele a PHP, szóval tuti, hogy nem ez a baj.
Pár dolgot meg kellene nézni:
Mennyi "vas" is van a szerver alatt (és mi fut még azon)?
Elképzelhető, hogy index-hiányos a lekérdezés.
Optimalizálatlan a lekérdezés.Persze az adatokat PHP-val dolgozod fel, így a programkód is gyenge lehet.
-
Peter Kiss
őstag
Van valaki, akinek sikerült MySQL stored procedure-t futtatni prepared statement-tel multiple query result mellett hibátlanul?
Már nálam egyszer működik, egyszer nem. Amikor nem működik, akkor az eredményben teljes káosz van mindenféle oda nem illő karakterrel. Máskor meg hibátlanul lejön 2 teljesen független eredményhalmaz.
INOUT és OUT paraméterek írása és visszaszedése is hibátlan.
Ami még fontos lehet, hogy mysqli-t használok.
[ Szerkesztve ]
-
Peter Kiss
őstag
válasz Peter Kiss #7819 üzenetére
Ez meg kb. a lehetetlen. Multi query-t nem támogatják a prepared statement-ek, szóval ez elég bukta. Vagy nem használok prepared statement-et, vagy nem kérek le multiple result-ot. Biztonsági okokból a másodikra szavazok. E' van.
-
Peter Kiss
őstag
válasz wolandino #7862 üzenetére
Magyarul alapból van egy nagy táblázatod, de, ha változtatják a dátumot, akkor más az eredményhalmazod (első oldalletöltéskor dátumfüggetlen jön le minden)? Mert ekkor lehet AJAX-szolni nyilván, az a legszebb megoldás (de illik biztosítani egy elküldő gombot arra az esetre, ha nincs Javascript).
-
Peter Kiss
őstag
Adatbázisod, adattáblád, oszlopaid nem UTF-8-asok és/vagy az importnál szúrtad el a kódolást. PHP fájljaidnak is UTF-8-nak kellene lennie, illetve futás közben PHP-val be kell állítani a default karakterkódolást UTF-8-ra. Utolsónak marad az adatbáziskapcsolat ellenőrzése, HTTP header-ben meg látom, hogy UTF-8-cal operálsz.
-
Peter Kiss
őstag
A téma iránt érdeklődőknek: PHP 5.4 - trait
Új hozzászólás Aktív témák
- AMD Ryzen 9 / 7 / 5 7***(X) "Zen 4" (AM5)
- Következő lett a következő HarmonyOS verzió neve
- Hálózati / IP kamera
- iPhone topik
- Kerékpárosok, bringások ide!
- Internet Rádió építése (hardver), és programozása
- Ubiquiti hálózati eszközök
- Tőzsde és gazdaság
- Apple iPhone 16 Pro - rutinvizsga
- Milyen légkondit a lakásba?
- További aktív témák...
- Figyelőkamera (autóba, lakásba) + 32GB SD kártya
- Raptor PC / Xeon E5-1660 - 16 szál / RTX 4060 / 64GB RAM / 2db Intel Ipari SSD / Foxpost
- Samsung telefonok felvásárlás! +36203990877
- Apple készülék felvásárlás azonnal! Iphone, Ipad, Apple Watch, MacBook +36203990877
- RÉSZLETFIZETÉS.SZLA.GAR. LENOVO LEGION SLIM 5 16AHP9 Ryzen 7-8845HS , RTX 4060 közel 3 év garancia
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest