MyBB.de Forum

Normale Version: Erstes Task zum Test programmieren
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

da mein neues Forum in einer Woche hochgeladen wird (wer meine Beiträge etwas verfolgt hat, weiß, was ich meine), wollte ich aus ein paar alten Scripts, die sich lediglich in die Datenbank hacken, saubere Tasks machen.

Ich habe mich daher daran versucht ein erstes Test-Task zu programmieren, das einfach einen Testpost in einem Thema macht. Die manuelle Ausführung im Browser funktioniert und das Script tut was es soll, aber über den Taskmanager nicht.

PHP-Code:
<?php

define
('IN_MYBB'1);
require_once 
MYBB_ROOT '/global.php';
require_once 
MYBB_ROOT '/inc/datahandlers/post.php';

function 
createTestPost()
{
    global 
$mybb$db$cache;

    
// Hier kannst du auf $mybb, $db und $cache zugreifen

    // Beispiel: Daten für den Testpost vorbereiten
    
$threadId 18575;
    
$postMessage "Dies ist ein Testbeitrag von Nummer1. Hier kann der Inhalt des Posts stehen.";

    
// Postdaten vorbereiten
    
$posthandler = new PostDataHandler('insert');
    
$posthandler->action 'thread';

    
$post_info = array(
        
'tid' => $threadId,
        
'fid' => 55,
        
'subject' => '',
        
'icon' => 2,
        
'uid' => 1,
        
'username' => 'Nummer1',
        
'dateline' => TIME_NOW,
        
'message' => $postMessage,
        
'ipaddress' => '',
        
'options' => array(
            
'signature' => 1,
            
'subscriptionmethod' => 0,
            
'disablesmilies' => 0
        
)
    );

    
// Daten für den Post festlegen
    
$posthandler->set_data($post_info);

    
// Post validieren
    
if ($posthandler->validate_post()) {
        
// Post einfügen, wenn die Validierung erfolgreich war
        
if ($posthandler->insert_post()) {
            echo 
"Testpost erfolgreich erstellt.";
        } else {
            echo 
"Fehler beim Einfügen des Posts: " $posthandler->get_error();
        }
    } else {
        echo 
"Fehler beim Validieren des Posts: " $posthandler->get_error();
    }
}

// Funktion ausführen
createTestPost();

?>

Jetzt frage ich mich natürlich, warum. Leider wird auch kein Fehler angezeigt. "Die ausgewählte Aufgabe wurde ausgeführt." erscheint und ansonsten passiert nichts. Kein Testbeitrag zu sehen.

Hat vielleicht jemand auf die schnelle einen Tipp, ob ich irgendetwas vergessen habe oder sieht das Script in euren Augen auch in Ordnung aus?

Viele Grüße
SkrilaxRev
Wenn dein Script manuell funktioniert, ist es technisch gesehen doch korrekt.

Ist der Task tatsächlich aktiviert und stimmen die geplanten Zeiten?

Ist dein Forum nach dem Aktivieren des Tasks einmal aufgerufen worden?
Ein Task kann nur ausgeführt werden, wenn auch ein Seitenaufruf stattfindet (von allein wird niemals ein Task ausgeführt - es braucht den Trigger des Seitenaufrufs - daher könnten geplante Zeiten nicht immer mit dem tatsächlichen Ausführen übereinstimmen)

Befindet sich diese Zeile in deinem Footer-Templates (am Seitenende)?
<img src="https://www.mybb.de/forum/task.php" width="1" height="1" alt="" />
Diese startet die Aufgaben.

[ETS]
Das Problem ist, dass die Datei überhaupt nicht wie ein Task aufgebaut ist. Es gibt keine task_... Funktion und echo sollte man auch nicht nutzen. Schau dir mal die anderen Tasks als Vorlage an.
(01.07.2024, 15:12)StefanT schrieb: [ -> ]Das Problem ist, dass die Datei überhaupt nicht wie ein Task aufgebaut ist. Es gibt keine task_... Funktion und echo sollte man auch nicht nutzen. Schau dir mal die anderen Tasks als Vorlage an.

Hallo Stefan,

die Echos hatte ich nur zum Test für den Direktaufruf hinzugefügt.

Andere Tasks habe ich mir vorher angesehen, konnte aber nichts besonders entdecken.

Der Code sieht momentan so aus.

PHP-Code:
<?php

// Disallow direct access to this file for security reasons
if(!defined("IN_MYBB"))
{
    die(
"Direct initialization of this file is not allowed.<br /><br />Please make sure IN_MYBB is defined.");
}

require_once 
MYBB_ROOT '/global.php';
require_once 
MYBB_ROOT '/inc/datahandlers/post.php';

function 
task_createTestPost($task)
{
    global 
$mybb$db$cache;

    
// Beispiel: Daten für den Testpost vorbereiten
    
$threadId 22668;
    
$postMessage "Dies ist ein Testbeitrag von Nummer1. Hier kann der Inhalt des Posts stehen.";

    
// Postdaten vorbereiten
    
$posthandler = new PostDataHandler('insert');
    
$posthandler->action 'thread';

    
$post_info = array(
        
'tid' => $threadId,
        
'fid' => 55,
        
'subject' => '',
        
'icon' => 2,
        
'uid' => 1,
        
'username' => 'Nummer1',
        
'dateline' => TIME_NOW,
        
'message' => $postMessage,
        
'ipaddress' => '',
        
'options' => array(
            
'signature' => 1,
            
'subscriptionmethod' => 0,
            
'disablesmilies' => 0
        
)
    );

    
// Daten für den Post festlegen
    
$posthandler->set_data($post_info);

    
// Post validieren und einfügen
    
if ($posthandler->validate_post())
    {
        
$posthandler->insert_post();
        
add_task_log($task"Testpost erfolgreich erstellt.");
    }
    else
    {
        
add_task_log($task"Fehler beim Validieren des Posts.");
    }


Ergebnis ist dasselbe: Erfolgsmeldung, aber kein Testpost.

Es gibt auch keinen Eintrag im Log.

(01.07.2024, 14:14)[ExiTuS] schrieb: [ -> ]Wenn dein Script manuell funktioniert, ist es technisch gesehen doch korrekt.

Ist der Task tatsächlich aktiviert und stimmen die geplanten Zeiten?

Ist dein Forum nach dem Aktivieren des Tasks einmal aufgerufen worden?
Ein Task kann nur ausgeführt werden, wenn auch ein Seitenaufruf stattfindet (von allein wird niemals ein Task ausgeführt - es braucht den Trigger des Seitenaufrufs - daher könnten geplante Zeiten nicht immer mit dem tatsächlichen Ausführen übereinstimmen)

Befindet sich diese Zeile in deinem Footer-Templates (am Seitenende)?
<img src="https://www.mybb.de/forum/task.php" width="1" height="1" alt="" />
Diese startet die Aufgaben.

[ETS]

Hallo ExiTuS,

danke für den Tipp, aber ich habe die Aufgabe manuell ausgeführt. Optionen -> Aufgabe ausführen.

Darum geht es ja, dass nicht einmal das funktioniert.

Höre mir gerne an, was ich vergessen habe. Wenn jemand ein einfaches selbst-geschriebenes Task rumliegen hat, wäre das vielleicht eine Hilfe.

Viele Grüße
SkrilaxRev
Erst einmal solltest du keinen Code außerhalb der task-function haben. Da du die global.php einbindest, wird das wahrscheinlich in einen Fehler laufen.

Außerdem würde ich auf die Mischung von Groß- und Kleinschreibung verzichten. Weicht das an einer Stelle (Task-Einstellungen, Dateiname, Code) ab, wird deine Funktion nie ausgeführt.

Als Beispiel kannst du eine beliebige Aufgabe des MyBB nehmen. Dise sollten eigentlich alles beinhalten, was du aktuell benötigst. Fang am besten simpel an, in dem du nur einen Log-Eintrag einfügst.

Bedenke außerdem, dass ein Task gesperrt wird, wenn er nicht sauber beendet wird und dann erst mal gar nicht mehr ausgeführt werden kann bis die Sperre abläuft. Das soll verhindern, dass eine lang laufende Aufgabe mehrfach gestartet werden kann.
Hallo Stefan,

danke für die Tipps.

Wo kann ich denn diese Sperre sehen?

Die Global.php habe ich entfernt. Ich hatte angenommen, dass ich die einbinden muss.

Großschreibung habe ich auch entfernt, obwohl ich jetzt nicht verstanden habe, wieso das zu Problem führen sollte, da der Code beim manuellen Aufruf im Browser funktioniert hat. In den Task-Einstellungen wählt man ja nur die Datei aus.

PHP-Code:
<?php

// Disallow direct access to this file for security reasons
if(!defined("IN_MYBB"))
{
    die(
"Direct initialization of this file is not allowed.<br /><br />Please make sure IN_MYBB is defined.");
}

require_once 
MYBB_ROOT '/inc/datahandlers/post.php';

function 
task_createtestpost($task)
{
    global 
$mybb$db$cache;

    
// Beispiel: Daten für den Testpost vorbereiten
    
$thread_id 18575;
    
$post_message "Dies ist ein Testbeitrag von nummer1. Hier kann der Inhalt des Posts stehen.";

    
// Postdaten vorbereiten
    
$posthandler = new postdatahandler('insert');
    
$posthandler->action 'thread';

    
$post_info = array(
        
'tid' => $thread_id,
        
'fid' => 55,
        
'subject' => '',
        
'icon' => 2,
        
'uid' => 1,
        
'username' => 'nummer1',
        
'dateline' => time_now,
        
'message' => $post_message,
        
'ipaddress' => '',
        
'options' => array(
            
'signature' => 1,
            
'subscriptionmethod' => 0,
            
'disablesmilies' => 0
        
)
    );

    
// Daten für den Post festlegen
    
$posthandler->set_data($post_info);

    
// Post validieren und einfügen
    
if ($posthandler->validate_post())
    {
        
$posthandler->insert_post();
        
add_task_log($task"Testpost erfolgreich erstellt.");
    }
    else
    {
        
add_task_log($task"Fehler beim Validieren des Posts.");
    }


Funktioniert so auch nicht. Hätte mich auch gewundert, weil das Script vorher bereits funktioniert hat, nur eben nicht über den Taskmanager.

Zu den anderen Tasks: Die fangen z.B. so an...

PHP-Code:
if(!defined("IN_MYBB"))
{
    die(
"Direct initialization of this file is not allowed.<br /><br />Please make sure IN_MYBB is defined.");
}

require_once 
MYBB_ROOT."/inc/functions_massmail.php";
require_once 
MYBB_ROOT."inc/datahandlers/pm.php"

...und zum Schluss gibt es noch sowas:

PHP-Code:
add_task_log($task$lang->task_massmail_ran); 

Dazwischen befindet sich die Funktion und das war's. Bei mir sieht das nicht groß anders aus.

Etwas viel Einfacheres als einen Testpost kann ich mir auch nicht vorstellen.

Hoffe also mal, dass es an der Sperre liegt.
(02.07.2024, 14:48)skrilaxrev schrieb: [ -> ]Wo kann ich denn diese Sperre sehen?
Im Cache "tasks".
(02.07.2024, 14:48)skrilaxrev schrieb: [ -> ]Großschreibung habe ich auch entfernt, obwohl ich jetzt nicht verstanden habe, wieso das zu Problem führen sollte, da der Code beim manuellen Aufruf im Browser funktioniert hat. In den Task-Einstellungen wählt man ja nur die Datei aus.
Ausschlussverfahren. Es wäre ungünstig, wenn es an so etwas Einfachem scheitert. Wink