web-dev-qa-db-fra.com

PHP Fonctionne avec les requêtes JDatabase

J'ai ces deux blocs de code identique dans l'un de mes PHP modules). La seule différence entre ces deux blocs est que, dans le premier bloc, il s'agit de ... active = ' .$db->q('1')); et dans le deuxième bloc sa ... active = ' .$db->q('0'));

Puis-je faire une commune PHP fonction dire subjectlist () pour ces deux blocs, puis passer les arguments 0 Et 1 Respectivement à raccourcir le code.

Comme dans, subjectlist(0);subjectlist(1);

Premier bloc

<?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>";     
   }
}

?>

Deuxième bloc

<?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'aide serait appréciée.

1
saibbyweb

Il semble que vous pourriez utiliser une jointure dans la requête pour utiliser 1 requête au lieu de 2, mais je pense que vous voulez quelque chose comme ce qui suit.

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

Je suggérerais de mettre cette fonction dans votre fichier helper.php, en supposant qu'elle appartient à une extension. Je vais juste utiliser un module comme exemple dans ce cas:

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);

Comme le montre le code, je suggérerais d'appeler l'objet utilisateur et d'obtenir le nom d'utilisateur dans la fonction plutôt que de le transmettre en tant que paramètre.

J'ai également apporté quelques améliorations au code.

Il va de soi que vous feriez mieux d’utiliser une clause join() dans une requête plutôt que d’en exécuter une deuxième dans une boucle foreach.

1
Lodder

Eh bien, il est peut-être trop tard pour en arriver à votre stade de développement, mais vous pouvez également regarder la mise en œuvre d’une méthode spécifique de Modèle de la bibliothèque JooYii .

Il existe une méthode pour générer une requête pour la table en transmettant les valeurs de colonnes sous forme de tableau "conditions".

Cette classe vous permet non seulement de générer une requête, mais avec d’autres fonctions, vous permet d’obtenir une liste avec pagination.

0
Alexandr