it-swarm-eu.dev

PHP funzione con query JDatabase

Ho questi due blocchi di codice identico in uno dei miei PHP. L'unica differenza tra questi due blocchi è che nel primo blocco è ... active = ' .$db->q('1')); e nel secondo blocco la sua ... active = ' .$db->q('0'));

Posso fare un comune PHP dire subjectlist () per entrambi questi blocchi e quindi passare argomenti 0 E 1 Rispettivamente a abbreviare il codice.

Come in, subjectlist(0);subjectlist(1);

Primo blocco

<?php

// getting branch, semester and subject code of present classes of the teacher

$query1 = $db->getQuery(true);
$query1->select('sem,code')
->from('iust_teachers_classes')
->where('teacher = '. $db->q($user->username). 'and active = ' .$db->q('1'));

$db->setQuery($query1);
$sem_code = $db->loadObjectlist(); 

echo "<h3>List of present classes : </h3> <br>";

// Loop to populate the list of all present classes of the teacher

foreach ($sem_code as $rows) {

   $query2 = $db->getQuery(true);
   $query2->select('subject')
          ->from('iust_subjects')
          ->where('sem = '. $db->q($rows->sem). 'and code = ' .$db->q($rows->code));
   $db->setQuery($query2);
   $sub_list = $db->loadObjectlist();

    // echoing the active subject list

   foreach ($sub_list as $rows) {
        echo $rows->subject;
        echo "<br>";     
   }
}

?>

Secondo blocco

<?php

// getting branch, semester and subject code of previous classes of the teacher

$query3 = $db->getQuery(true);
$query3->select('sem,code')
       ->from('iust_teachers_classes')
       ->where('teacher = '. $db->q($user->username). 'and active = ' .$db->q('0'));

$db->setQuery($query3);
$sem_code = $db->loadObjectlist();

echo "<h3>List of previous classes : </h3> <br>";

// Loop to populate the list of all previous classes of the teacher

foreach ($sem_code as $rows) {

    $query4 = $db->getQuery(true);
    $query4->select('subject')
           ->from('iust_subjects')
           ->where('sem = '. $db->q($rows->sem). 'and code = ' .$db->q($rows->code));
    $db->setQuery($query4);
    $sub_list = $db->loadObjectlist();

// echoing the previous subject list

    foreach ($sub_list as $rows) {
        echo $rows->subject;
        echo "<br>"; 
    }
}

?>

L'aiuto sarebbe apprezzato.

1
saibbyweb

Sembra che potresti utilizzare un join nella query per utilizzare 1 query anziché 2, ma penso che desideri qualcosa di simile al seguente.

function subjectlist($username,$active){

    $html = "";
    // getting branch, semester and subject code of present classes of the teacher
    $db = JFactory::getDbo();
    $query = $db->getQuery(true);
    $query->select('sem,code')
        ->from('iust_teachers_classes')
        ->where('teacher = '. $db->q($username). 'AND active = ' .$db->q($active));

    $db->setQuery($query);
    $sem_codes = $db->loadObjectlist(); 

    // Loop to populate the list of all present classes of the teacher
    foreach ($sem_codes as $sem_code) {
       $query = $db->getQuery(true);
       $query->select('subject')
              ->from('iust_subjects')
              ->where('sem = '. $db->q($sem_code->sem). 'AND code = ' .$db->q($sem_code->code));
       $db->setQuery($query);
       $sub_list = $db->loadObjectlist();

        // build the html to return
        $html .= "<h3>List of present classes : </h3> <br>";

        foreach ($sub_list as $sub_item) {
            $html .= $sub_item->subject . "<br>";
       }
       return $html;
    }
}

// best to pass the username to make the function more reusable
$username = JFactory::getUser()->username;
echo subjectlist($username,0); 
echo subjectlist($username,1);
1
jamesgarrett

Suggerirei di inserire questa funzione nel tuo file helper.php, supponendo che appartenga a un'estensione. Userò solo un modulo come esempio in questo caso:

helper.php:

class MyHelperFile
{
    public function subjectlist($active)
    {
        $db   = JFactory::getDbo();
        $user = JFactory::getUser();
        $html = '';

        $query = $db->getQuery(true);
        $query->select('sem, code')
              ->from($db->qn('iust_teachers_classes'))
              ->where($db->qn('teacher') . ' = ' . $db->q($user->username))
              ->where($db->qn('active') . ' = ' . (int)$active);
        $db->setQuery($query);
        $rows = $db->loadObjectlist(); 

        $html .= '<h3>List of present classes :</h3>';
        $html .= '<ul>';

        // Loop to populate the list of all present classes of the teacher
        foreach ($rows as $row)
        {
            $query = $db->getQuery(true);
            $query->clear();
            $query->select('subject')
                  ->from($db->qn('iust_subjects'))
                  ->where($db->qn('sem') . ' = ' . $db->q($row->sem))
                  ->where($db->qn('code') . ' = ' . $db->q($row->code));
            $db->setQuery($query);
            $rows = $db->loadObjectlist();

            // echoing the active subject list
            foreach ($rows as $row)
            {
                $html .= '<li>' . $row->subject . '</li>';
            }
        }
        $html .= '</ul>';

        return $html;
    }
}

mod_mymodule.php

require_once dirname(__FILE__) . '/helper.php';

$helper = new MyHelperFile();
$subjectlist_0 = $helper->subjectlist(0);
$subjectlist_1 = $helper->subjectlist(1);

Come mostrato nel codice, suggerirei di chiamare l'oggetto utente e ottenere il nome utente all'interno della funzione anziché passarlo come parametro.

Ho anche apportato alcuni miglioramenti al codice.

Ovviamente, sarebbe meglio usare una clausola join() in 1 query anziché eseguirne una seconda in un ciclo foreach.

1
Lodder

Bene, potrebbe essere nella tua fase di sviluppo che ci sia troppo tardi per esaminare qualcosa da cui partire, ma puoi guardare l'implementazione di un metodo specifico di Modello della Biblioteca JooYii .

Esiste un metodo per generare una query per la tabella passando i valori delle colonne come array "condizioni".

Questa classe non solo consente di generare query, ma insieme ad altre funzioni consente di ottenere l'elenco con l'impaginazione.

0
Alexandr