PDA

Zobacz pełną wersję : Własny plugin -> nie działa



maverickoti
26-05-2014, 10:20
Witam.

Napisałem jeden ze swoich pierwszych puginów. Zainstalował się poprawnie ale nie działą:)

<?php

defined('_JEXEC') or die;

class PlgUserKonto extends JPlugin
{
public function onUserAfterSave($user, $isnew, $success, $msg){
if($isnew){
$punkty = 13;
$opis = "350MB gratis na start";
$date = date("Y-n-j H:i:s");
$query = "INSERT INTO #__djcf_users_points p VALUES (null,'".$user['username']."','$punkty','$opis','$date')";
mysql_query($query);
}
}
}

XML:

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="user">
<name>plg_user_pktgratis</name>
<author>Piotr Balicki</author>
<creationDate>05.2014</creationDate>
<copyright>(C) 2015. Piotr Balicki All rights reserved.</copyright>
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
<authorEmail></authorEmail>
<authorUrl></authorUrl>
<version>3.0.0</version>
<description>Przekazuje nowo zarejestrowanemu użytkownikowi punkty gratis</description>
<files>
<filename plugin="pktgratis">pktgratis.php</filename>
<filename>index.html</filename>
</files>
<languages>
</languages>
<config>
<fields name="params">
<fieldset name="basic">
</fieldset>
</fields>
</config>
</extension>



Plugin ma dopisać 12pkt w komponencie DJ-Classifieds (tabela: #__djcf_users_points). Czy ktoś widzi jakiś znaczący błąd w moich wypocinach?

KES
26-05-2014, 15:26
A po zainstalowaniu tego pluginu włączyłeś go?

Poczytaj również o JFactory::getDbo();

maverickoti
27-05-2014, 10:53
Tak po zainstalowaniu pluginu włączyłem go. Poczytałem o JFactory::getDbo(); i teraz jak spojrze na ten kod to rozumiem, zę nie miałracji bytu. Poprawiłemgo, ale problem nadal istnieje. Mianowicie podczas logowania wyskakuje błąd 500. Poprawiony plik php. Czy ktoś widzi tym razem jakieś błedy?


defined('_JEXEC') or die;

class PlgUserKonto extends JPlugin
{
public function onUserAfterSave($user, $isnew, $success, $msg){
if($isnew){

$db = JFactory::getDbo();
$query = $db->getQuery(true);

$data =new stdClass();
$data->id = null;
$data->field1 = 'TestName';//$user['username']
$data->field2 = '13';
$data->field3 = 'gratis na start';
$data->field3 = 'date("Y-n-j H:i:s")';

$db->insertObject( '#__djcf_users_points', $data, id );
$db->setQuery($query);
}
}
}

KES
27-05-2014, 13:15
Włącz raportowanie błędów abyś widział jaki to błąd masz.
Co do:

$data =new stdClass();
$data->id = null;
$data->field1 = 'TestName';//$user['username']
$data->field2 = '13';
$data->field3 = 'gratis na start';
$data->field3 = 'date("Y-n-j H:i:s")';

Nie musisz podawać `id` ponieważ Joomla wie że chcesz stworzyć nowy rekord.
Co do field1..3 to czy takie columny są w tej tabeli '#__djcf_users_points'?


$db->insertObject( '#__djcf_users_points', $data, id );
Jeżeli kluczem głównym w tabeli jest id to to zamknij to w string 'id' bo tak to masz błąd.

maverickoti
27-05-2014, 16:17
Dokształciłem się już w tej materii i nadal nic. Błąd nadal się pojawia:
"Jak chcę się zalogować do Joomla jako użytkownik, albo administrator to pojawia się biała strona z komunikatem w Firebug: "NetworkError: 500 Internal Server Error - http://www.pobieralnia24.com/index.php""

Mod po modyfikacjach wygląda następująco:


<?php

defined('_JEXEC') or die;

class PlgUserGratis extends JPlugin
{
public function onUserAfterSave($user, $isnew, $success, $msg){
if($isnew){
//Tworzenie połączenia z bazy danych
$db = JFactory::getDbo();

//Tworzenie oraz wypełnienie obiektu
$data =new stdClass();
$data->id = null;
$data->user_id = $user['id'];
$data->points = 13;
$data->description = 'gratis na start';
$data->date = date("Y-n-j H:i:s");

$result->JFactory::getDbo()->insertObject( '#__djcf_users_points', $data);
}
}
}

KES może masz jeszcze jakieś wskazówki. Walcze walcze,ale jest opór.

KES
27-05-2014, 23:04
Włącz raportowanie błędów PHP aby zamiast białej strony pojawiał Ci się błąd.


$data->id = null;
To możesz wywalić jest zbędne.


$data->date = date("Y-n-j H:i:s");
Sprawdź też czy formatowanie daty wpisane tutaj jest poprawne z tym co baza oczekuje.

maverickoti
28-05-2014, 12:25
1. Usunąłem
$data->id = null;
2. Format daty w tabeli to: 2014-03-29 15:26:53 więc
$data->date = date("Y-n-j H:i:s"); powinno być poprawnie
3. Jeśli chodzi o włączenie raportowania błędów to za bardzo nie wiem jak je włączyć w PHP. Ja sprawdzam błędy na stronie dzięki Firebug. Strona tak samo zachowuje się w przeglądarce Firefox jak i Chrome. Taki mam błąd: >Błąd< (http://www.cosmopolitanka.pl/Capture.JPG)
Jak usunę ten mój magiczny plugin po przez Filezilla to logowanie z poziomu frontu jak i administratora działa. Czyli mój plugin musi coś kopać.
NOTA: Plugin usuwam z poprzez Filezilla, ponieważ nie mogę się zalogować jak on (plugin) jest włączony i usunąć z poziomu zarządzania w Joomla.

Jola
28-05-2014, 22:46
Zwróć uwagę na nazwę pliku i nazwę klasy -> wzoruj się na wbudowanych dodatkach: joomla -> PlgUserJoomla
Co to jest:
$result->JFactory::getDbo()->insertObject(...


$db = JFactory::getDbo();
$db->setQuery('INSERT INTO .......');
$db->execute();

maverickoti
29-05-2014, 10:24
Dzięki Jola za reakcję na mojego prv. Jak widzisz męczy mnie ten problem już kilka dni, a przecież to nie jest moduł odsługujący start wachadłowca.
Więc tak.

1. Jeśli chodzi o nazwy:
Folder: pktgratis
W nim trzy pliki: index.html, pktgratis.php, pktgratis.xml
Plik XML:

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="user">
<name>plg_user_pktgratis</name>
<author>Piotr Balicki</author>
<creationDate>December 2014</creationDate>
<copyright>(C) 2015. Piotr Balicki All rights reserved.</copyright>
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
<authorEmail></authorEmail>
<authorUrl></authorUrl>
<version>3.0.0</version>
<description>Przekazuje nowo zarejestrowanemu uzytkownikowi punkty gratis</description>
<files>
<filename plugin="pktgratis">pktgratis.php</filename>
<filename>index.html</filename>
</files>
<languages>
</languages>
<config>
<fields name="params">
<fieldset name="basic">
</fieldset>
</fields>
</config>
</extension>


Plik PHP:

<?php
defined('_JEXEC') or die;

class PlgUserPktgratis extends JPlugin
{
public function onUserAfterSave($user, $isnew, $success, $msg)
{
if($isnew)
{
//Tworzenie połączenia z bazy danych
$db = JFactory::getDbo();

//Tworzenie oraz wypełnienie obiektu
$data =new stdClass();
$data->user_id = $user['id'];
$data->points = 13;
$data->description = 'gratis na start';
$data->date = date("Y-n-j H:i:s");

$result->JFactory::getDbo()->insertObject( '#__djcf_users_points', $data);
}
}
}
?>

Plik PHP to pktgratis.php w nazwa plasy to PlgUserPktgratis. Jak widać jest taki sam jak tylko klasa posiada przedrostek: PlgUser.

2. Składnia zapisu do bazy

Wzorowałem się na dokumentacji Joomla:http://wiki.joomla.pl/Dost%C4%99p_do_bazy_z_wykorzystaniem_JDatabase
Takiej składni użyto w Wstawianie rekordu -> Używając obiektu

// tworzenie i wypełnianie obiektu
$profile = new stdClass();
$profile->user_id = 1001;
$profile->profile_key='custom.message';
$profile->profile_value='Wstawianie rekordu przy użyciu insertObject()';
$profile->ordering=1;

// Wstawiaie obiektu do odpowiedniej tabeli
$result = JFactory::getDbo()->insertObject('#__user_profiles', $profile);

KES
29-05-2014, 10:25
Jola dobrze zauważyła, nie powinno być

$result->JFactory::getDbo()->insertObject( '#__djcf_users_points', $data);
tylko

JFactory::getDbo()->insertObject( '#__djcf_users_points', $data);

Co do włączenia wyśwetlania błędów PHP (to firefox ani chrome Ci nie pomoże).
Możesz je włączyć w pliku konfiguracyjnym joomla lub/i na serwerze.
Ale o tym poczytaj na forum bo już było wiele tematów na ten temat.

maverickoti
29-05-2014, 10:51
Super. Działa :) Dziękuje bardzo za pomoc. Chętnie bym was zaprosił na piwo. Jednakże jesteśmy rozstrzeleni po Polsce więc podajcie mi swoje nr kont bym mógł wam KES i Jola postawić piwo/drinka.
Błędem było to "$result->". Bez tego wszystko działa dobrze.

maverickoti
06-06-2014, 15:02
Witam ponownie. Nadal mam problem z tym pluginem. Dokłądnie z zapisem wartości do bazy danych. Mianowicie chcę zapisać wartość 0,35 a do bazy zapisuje 0. Reasumując zaokrągla mi wartość przy zapisie. Typ kolumny to float więc dobrze. A kod wygląda tak:

defined('_JEXEC') or die;

class PlgUserPktgratis extends JPlugin
{ //onUserAfterSave - zdarzenie typu user
public function onUserAfterSave($user, $isnew, $success, $msg)
{
if($isnew)
{
//Tworzenie połączenia z bazy danych
$db = JFactory::getDbo();

//Tworzenie oraz wypełnienie obiektu
$data =new stdClass();
$data->user_id = $user['id'];
$points = $this->params->get('MB_gratis');
$data->points = $points;
$data->description = 'gratis na start NEW';
$data->date = date("Y-n-j H:i:s");

JFactory::getDbo()->insertObject( '#__djcf_users_points', $data);
}
}
}

XML:

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="user">
<name>plg_user_pktgratis</name>
.
.
.
<files>
<filename plugin="pktgratis">pktgratis.php</filename>
<filename>index.html</filename>
</files>
<languages>
</languages>
<config>
<fields name="params">
<fieldset name="basic">
<field name="MB_gratis"
type="text"
size="10"
default="0,35"
/>
</fieldset>
</fields>
</config>
</extension>

zwiastun
06-06-2014, 15:13
0.35 - użyj kropki nie przecinka

maverickoti
06-06-2014, 15:43
Zwiastun dziękuje Ci bardzo. Oczywiście miałeś racje :)

Co śmieszne w Joomla wpisałęm 0.35 a w bazie danych wpisało 0,35.