Wypowiedzi
-
Witam,
Problem: zmiany struktury bazy danych
Pytanie: jak przygotować, gdzie wrzucic i jak odpalać skrypt migracyjny starej bazy danych do nowej, w oparciu o modele z cakephp.
na razie stworzylem sobie skrypcik odpowiedzialny za tworzenie/zmiany nazw obecnych tabel, wszelkie altery na tabelach jako controller, ale zdję sobie sprawę ze jest to bardzo nieeleganckie podejscie do tematu i chciałbym zrobić to jak nalezy więc potrzebuje fachowej rady od czego powinienem zacząć. Część danych agreguje w pliku sql (nowo dodawane rekordy w bazach w związku z rozbudową aplikacji).
Pozdrawiam -
Witam,
Mam problem, z którym sobie po części poradziłęm, ale trochę na około i chcę to poprawić jak należy, żeby wszystko działało jak należy.
Mam sobie stronę, do której zacząłem pisać panel administracyjny oparty o plugin o nazwie admin (APP/plugins/admin) i teraz chcę, aby po wpisaniu adresu admin.mojastrona.pl automatycznie ładował mi się np. mojastrona.pl/admin/users/index
Moje rozwiązanie polega na tym, że w bootstrapie mam coś takiego:
if (preg_match("/admin\.mojastrona\.lc/",env("HTTP_HOST")))
{
$_GET["url"] = "admin/" . (isset($_GET["url"]) ? $_GET["url"] : 'index');
}
else if (isset($_GET["url"]) and strpos($_GET["url"], "admin") === 0)
{
header ("Location: /");
}
Rozwiązanie to działa(ło) do momentu kiedy doszedłem do Autoryzacji. Chcę skorzystać z Componentu Auth do uwierzytelniania. Dla panelu admina mam odrębne tabele z prefixem 'admin_' etc.
Oczywiście plugin posiada pełną strukturę z widokami, modelami i innymi, ale nie o to chodzi.
route mam ustawione w ten sposób:
// dla zwyklego logowania uzytkownikow na stronie
Router::connect('/login/*', array('plugin'=>null,'controller' => 'users', 'action' => 'login'));
Router::connect('/logout/*', array('plugin'=>null,'controller' => 'users', 'action' => 'logout'));
// dla logowania do panelu admina
Router::connect('/users/login/*', array('plugin'=>'admin', 'controller' => 'users', 'action' => 'login'));
Kiedy ustawiam w admin_app_controller.php to:
$this->Auth->userModel = 'AdminUser';
$this->Auth->loginAction = array('plugin' => 'admin', 'controller' => 'users', 'action' => 'login');
Teraz mam dwa problemy 1st, jeżeli ktoś na normalnej domenie wejdzie na adres mojadomena.pl/users/login odpala się formularz logowania admina, a tego nie chcę, bo ma to być rozdzielone
Druga sprawa to jak juz jestem na admin.mojadomena.pl/users/login i wypełnię formularz który ma action na '/users/login' to nic się nie dzieje. Autoryzacja nie wykonuje się, w sesji nic się nie dopisuje - dodam, że korzystam z auth.php w APP/controllers/components - przeniosłem sobie tutaj bo potrzebowałem dopisać małą rzecz do Auth...
Z góry dziękuję za podpowiedzi co moge zrobić żeby to rozwiązać, bo powiem, że trochę utknąłem z tym :/ -
Ja akurat takiego roziązania używam.
Na serwerze w /home/cake mam cały core cake'owy a w /home/user/domains/ poszczególne domeny pod którymi chodzą odpowiednie aplikacje. Jedyne co trzeba w takim wypadku pozmieniać to w webroot/index.php ścieżkę do cake'a ustawić na bezwzględną '/home/cake' i wszystko śmiga cacy. Ja mam w ten sposób postawione 3 strony + 4 develove projekty i działa elegancko :D -
exit'owanie nie pomaga, wyłaczenie javascriptu też nie.
Z ciekawości w AppControllerze w metodzie afterFilter też wyprintowałem _SESSION i już auth'a nie było... Pomału zaczynam sie wkurzac na to, bo nie wiem co moze być tutaj nie tak, tymbardziej, że zwykły setFlash i session->flash() działa bez problemów, problematyczny jest jedynie auth...
Jezeli chodzi o przeladowywanie strony to firebug nie wskazuje na jakies redirecty, laduje sie strona tylko raz...Paweł Ługowski edytował(a) ten post dnia 27.11.10 o godzinie 11:53 -
No to zagwostka, w controllerze jak wywołuje var_dump($this->Session->read());
dostaje:
'Message' =>
array
'auth' =>
array
'message' => string 'No, you fool! That's not the right password!' (length=44)
'element' => string 'default' (length=7)
'params' =>
array
...
Natomiast pr($_SESSION) w layoucie zwraca mi:
[Message] => Array
(
)
[Auth] => Array
(
[redirect] => /account
)
i mała ciekawostka, jak wejde w /cake/libs/views/helpers/session.php
i zakomentuje w linii 158 - parent::delete('Message.' . $key); (metoda flash() )
To komunikat wyswietla mi się prawidłowo (oczywiście bez kasowania wpisu z sesji) i po pr($_SESSION) w layoucie mam:
[Message] => Array
(
[auth] => Array
(
[message] => No, you fool! That's not the right password!
[element] => default
[params] => Array
(
)
)
)
AppModel::beforeFilter() wyglada u mnie tak:
Security::setHash("md5");
$this->Auth->fields = array('username' => 'login', 'password' => 'password');
$this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
$this->Auth->userScope = array('User.status' => array('confirmed','active','hidden'));
$this->Auth->authError = "Sorry, you are lacking access.";
$this->Auth->loginError = "No, you fool! That's not the right password!";
Any idea? -
Mam zagwostkę.
Korzystam z komponentu Auth do autoryzacji i mam ustawione:
$this->Auth->authError = "Sorry, you are lacking access.";
$this->Auth->loginError = "No, you fool! That's not the right password!";
Natomiast w default.ctp - layout, wywołuje:
echo $session->flash();
echo $session->flash('auth');
i tutaj jest problem, bo w sesje wrzucane jest Message.auth ale nie komunikat sie nie wyswietla.
jakies pomysły co jest grane? -
OK, to teraz pytanie. Oczywiscie ostatnia ramka rozwiąązała mój probem, ale w przypadku kiedy mam kilka prefixów np.
account, gallery, profile
to jezeli nie chce w innych linkach uzywac tych prefixow to musze po kolei wpisywac account => false, gallery => false itp itd? -
Witam,
Mam kolejną zagwostkę. Otóż próbuje przepiąć routsy z prefixami i mam menu uzytkownika, które powinno kierowac na:
details::account_index()
photos::account_index()
itp.
Ustawiam sobie w routes.php:
Router::connect('/account/:controller/:action/*', array('prefix' => 'account'));
I teraz mam problem otóż jak jestem na stronie głównej ( / ) i mam menu tworzone tak:
<?php echo $html->link(___("Edytuj swoje dane"),
array('controller' => 'details', 'action' => 'account_')); ?>
otrzymuje linki w postaci:
/details/account_
zamiast:
account/details/
jak wpisze z palca jakiś adres z account na końcu to linki chodzą już lepiej, ale _wszystkie_ linki dostają prefix account, a jest mi to niepotrzebne ponieważ na stronie jest menu glówne strony i np.:
<?php echo $html->link(___("Strona Główna"), array('controller' => '/')); ?>
Zwraca mi:
/account/index
zamiast po prostu :
/
Ktoś ma jakiś pomysł na rozwiązanie tego problemu :D
Pozdrawiam,
Paweł -
Dzięki za pomoc, pomogło :D
-
$this->params['paging'] (czyli tablica generowana przez paginate() ) zwraca mi:
array
'UsersComment' =>
array
'page' => int 0
'current' => int 1
'count' => boolean false
'prevPage' => boolean false
'nextPage' => boolean false
'pageCount' => int 0
'defaults' =>
array
'limit' => int 1
'step' => int 1
'conditions' =>
array
...
'order' => string 'created DESC' (length=12)
'options' =>
array
'page' => int 0
'limit' => int 1
'conditions' =>
array
...
'order' => string 'created DESC' (length=12)
I nadal głowię się dlaczego, skoro powinno być at least page 1 (czyli standardowo jezeli nie zaznaczona inna strona) oraz pages = 3...
W modelu mam dopisane:
Joiny z kolumnami
function beforeFind($queryData)
{
$queryData['joins'] = array(
array(
'table' => 'users',
'alias' => 'Commenter',
'type' => 'LEFT',
'foreignKey' => false,
'conditions'=> array('UsersComment.commenter_id = Commenter.id')
),
array(
'table' => 'photos',
'alias' => 'Thumbnail',
'type' => 'LEFT',
'foreignKey' => false,
'conditions'=> array('Commenter.thumbnail = Thumbnail.id')
)
);
$queryData['fields'] = '*';
return $queryData;
}
co dziwne, zakomentowanie beforeFind'a naprawia problem, ale ja potrzebuje te joiny do poprawnego dzialania a nie chce korzystać z hasOne itp...Paweł Ługowski edytował(a) ten post dnia 19.10.10 o godzinie 10:24 -
ad1. w bootsrrap mam zadeklarowana funkcję
function ___($string)
{
return __($string,true);
}
zatem liczba podkreślników jest jak najbardziej odpowiednia.
ad2. co zas tyczy sie $paginator->params to z tego co mi wiadomo jeżeli nie ma żadnych to przyjmuje domyslne, czyli sort:asc itp. Problem w tym, że nie wyswietla mi sie nic. Jak to samo przeniose do widoku (zamiast odwołania do elementu) to paginacja sie wyswietla - wtedy tylko wywalam z kontrolera ClassRegistry... -
Witam,
Mam małą zagwostkę.
Otóż ładuje sobie na strone komentarze do profilu i wyswietlane sa one jako element (user_portfolio_comments) - jako element dlatego, że wykorzystuje go do ladowania poszczegółnych stron komentarzy ajaxem.
W kontrolerze mam coś takiego:
$this->paginate = array(
'conditions' => array(
'UsersComment.status' => 'active',
'UsersComment.user_id' => $id
),
'order' => 'created DESC',
'limit' => $this->s['Settings']['comments_perpage']
);
$data = $this->paginate('UsersComment');
ClassRegistry::getObject('view')->loaded['paginator']->params = $this->params;
return $data;
w widoku:
<?php echo $this->element('user_portfolio_comments'); ?>
w elemencie:
<?php $comments = $this->requestAction('comments/get_user_comments/'.$user['User']['id']); ?>
<?php foreach ($comments as $c) : ?>
<div class="content">
<div><b><?php echo $c['Commenter']['login']; ?> </b>
<?php echo $c['UsersComment']['created']; ?>
</div>
<?php echo $c['UsersComment']['content']; ?>
</div>
<?php endforeach; ?>
<div class="paginate">
<?php
echo $paginator->prev(___("« Poprzednia"), null, null, array('class' => 'disabled'));
echo $paginator->numbers(array('before'=>null,'after' => null, 'separator'=>null));
echo $paginator->next('Następna »', null, null, array('class' => 'disabled'));
?>
<div style="float: right">
<?php echo $paginator->counter(array('format' => ___("Strona %page% z %pages% (%count%)"))); ?>
</div>
</div>
Wszystko "niby" działa, komentarze wyswietlaja się według zadanego limitu, natomiast paginator nie pokazuje żadnych stron, nie sypie błędami a $paginator->couner() pokazuje 0 of 1... -
Edit---
Tutaj w aukcji jest to o co mi chodzi, natomiast nie mogę znaleźć samego tego urządzenia: http://cgi.ebay.com/NEW-Atomic-PIQ-JUNIOR-Snowboard-Bi... Działą to w ten sposób, że odchyla się różową dźwignię i można sobie ustwaiać kąt wiązań bez koniecznośći wykręcania całego mocowania... -
Witam,
Mam pytanie i po licznych wyszukiwaniach w sieci nie udało mi się odnaleźć odpowiedzi na nie. Otóż rok temu wyjeżdżając na deskę wypożyczyłem sobie sprzęt i podobał mi się w nim system regulacji kątów wiązań, gdzie odbywało się to bez użycia śrubokręta. Otóż dysk przykręcony był na stałe do deski ale miał po środku taki skobelek, który po wyjęciu buta z wiązań można było wychylić i nastepnei przekręcić wiązania w pod dogodnym kątem. Tym razem zakupiłem już sobie własny sprzet i wiązania Raven i jako jeszcze nie zawodowy zawodnik chciałbym mieć takie ustrojstwo, aby stwierdzić jakie ustawienia są dla mnie najwygodniejsze bez zbędnego kręcenia śrubokrętem na stoku.
Czy ktoś wie jak nazywa się taki dysk? Oraz gdzie mogę znaleźć (jak pewnie nazwe poznam to i na allegro może się znaleźć :).
Pozrawiam,
Paweł -
ok, posłuchałęm Przemysłąwa i przeprojektowałem db, połączyłem modelke i fotografa w jedną tabele (na początku nad tym się zastanawiałęm, ale chciałęm mieć jakiś porządek w db, co, jak widać nie do końca było dobre) natomiast typ w tym momencie moge zastąpić jakimś group_id i mam problem z kolejnymi tabelami rozwiązany :D
Dzięki za wszystkie uwagi :D -
Ok, tutaj zrzuty tabel które mam:
CREATE TABLE IF NOT EXISTS `fotograf` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`firstname` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`lastname` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`company` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`phone` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
`address` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`city` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`state` int(11) NOT NULL,
`portfolio_url` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE IF NOT EXISTS `modelka` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`firstname` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`lastname` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`birthdate` date NOT NULL,
`phone` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL,
`city` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`state` int(11) DEFAULT NULL,
`height` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`weight` int(11) NOT NULL,
`chest` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`waist` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`hips` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`eyes` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`hairs` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`clothes` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`bra` varchar(3) COLLATE utf8_unicode_ci NOT NULL,
`shoes` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type` enum('m','f') COLLATE utf8_unicode_ci NOT NULL,
`login` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
I tak jak pisałem wcześniej chciałbym aby w zależności od users.type joinowało się albo z jedną tabelą, albo z drugą po user_id tak, abym miał wszystkie pola albo z jednej albo z drugiej tabeli z nagłówkami jakie faktycznie są... -
No a jezeli tabela modelka i fotograf mają totalnie rózne pola i typy?
Na razie robię left joina z jedną i drugą tabelą po user_id, ale mam zawsze jednego joina całego NULL wiec rozwiązanie połowicznie dobre i niepotrzebne joinowanie się robi... -
Witam,
Mam małą zagwostkę i zastanawiam się jak ją rozwiązać.
Mam trzy tabele (w przyszłości może więcej) pierwsza z nich `users` przechowuje najważniejsze informacje w tym `typ` która może przechowywać wartości 'm', 'f'. teraz w zależności od tego jaka jest wartość, chciałbym joinować tabelę 'modelka' / 'fotograf'.
Próbowałęm robić to UNIONem, ale obie tabele (modelka/fotograf) mają różne kolumny (nagłówki) oraz różną ilość. O ile z ilością można sobie poradzić robiąc w select'cie ('','') o tyle nagłówki pozostają z pierwszej części SELECTA z UNIONEM, czy ma ktoś pomysł jak to rozwiązać?
Dzięki z odpowiedzi :D -
Ja korzystam z klasy mpdf, która korzysta bodajrze z fpdf. Ogólnie zaczynałem działanie na klasie jakiś rok temu i jak widzę dzisiaj nieźle się rozbudowała. Generowanie pdfów bezpośrednio z kodu html, rozróżniane są style i możliwość dodawania CSS.
Polecam do poczytania na stronie projektu http://mpdf.bpm1.com/ -
Działa! I kolejne pojęcie z dziedziny MySQL opanowane :D
U mnie wygląda to tak :D
INSERT INTO db1.temp_dok (id_wysylki , nazwa , pesel , numer , uwagi)
SELECT ch_id , name , CASE 1 WHEN p_n REGEXP '^[0-9]{11}$' THEN p_n END, CASE 1 WHEN p_n REGEXP '^[a-zA-Z]{3}[0-9]{9}$' THEN p_n END , uwagi FROM db2.dokumenty;
Dzięki wielkie, a byłby ktoś w stanie pomóc na drugi problem z listy?
Jak próbuję (wg. podpowiedzi kolegi z forum php.pl) wysołać procedurę wg. SELECT procedura(id) FROM...., to faktycznie nie działa, bo MySQL traktuje to jako funkcję. Czy można w takim bądź razie napisać funkcję wywołującą procedurę? Próbowałem coś tam spłodzić, ale mi nie wyszło, może jakieś sugestie?
Pozdrawiam,Paweł Ługowski edytował(a) ten post dnia 06.12.08 o godzinie 14:24