0

PHP、jQuery、および mysql を使用したカスケード メニューがあります。それは魅力のように機能しますが、記事としてJoomlaにインポートしようとすると(記事でPHPコードをアクティブにするJoomla拡張機能を使用して)正しく機能しません。問題は、問題の原因がどこにあるかさえわからないことです... カテゴリを選択できますが、選択するたびに、カスケード ドロップダウン メニューの 2 番目のレベル (カテゴリ -> タイプ -> モデルがorder) がロードされず、実際には「お待ちください...」と表示され、数秒後に選択オプションが空白になります。Joomlaフレームワークにないカスケードメニューのみがローカルホストでテストされ、機能しました...

私はいくつかのファイルを持っています:

script.php -> jQuery の効果とドロップダウンを処理します。

<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.10.2.min.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        $("select#type").attr("disabled","disabled");
        $("select#model").attr("disabled","disabled");
        $("select#category").change(function(){
        $("select#type").attr("disabled","disabled");
        $("select#type").html("<option>Please wait...</option>");
        var id = $("select#category option:selected").attr('value');
        $.post("select_type.php", {id:id}, function(data){
            $("select#type").removeAttr("disabled");
            $("select#type").html(data);
        });
    });
    $("select#type").change(function(){
        $("select#model").attr("disabled","disabled");
        $("select#model").html("<option>Please wait...</option>");
        var id2 = $("select#type option:selected").attr('value');
        $.post("select_model.php", {id2:id2}, function(data){
            $("select#model").removeAttr("disabled");
            $("select#model").html(data);
        });
    });
    $("select#model").change(function(){
        var cat = $("select#category option:selected").attr('value');
        var type = $("select#type option:selected").attr('value');
        var model = $("select#model option:selected").attr('value');
        if(cat>0 && type>0 && model >0)
        {
            var model = $("select#model option:selected").html();
            var type = $("select#type option:selected").html();
            $("#result").html('<br>Your choice: ' + type + ' ' + model + '.');
        }
        else
        {
            $("#result").html("<br>One of the inputs is empty!");
        }
        return false;
    });
});
</script>

<form id="select_form">
Choose category: <select id="category">
<?php echo $opt->ShowCategory(); ?>
</select><br />
Choose type: <select id="type">
<option value="0">Please select...</option>
</select>
<br />
Choose model: <select id="model">
<option value="0">Please select...</option>
</select></form>
<div id="result"></div>
<br><br>

select_type.php -> ユーザーがカテゴリを選択すると、2 番目のメニューにそのカテゴリのタイプが表示されます。

<?php
include "class.php";
echo $opt->ShowType();
?>

select_model.php -> select type と同じですが、type 選択の下にあるため、これはカスケード メニューの最後のレベルです。

<?php
include "class.php";
echo $opt->ShowModel();
?>

そして最後に、データを取得して選択メニューにロードするデータベースに接続する class.php です。

<?php
class SelectList
{
protected $conn;

    public function __construct()
    {
        $this->DbConnect();
    }

    protected function DbConnect()
    {
        $host = "localhost";
        $user = "root";
        $password = "usbw";
        $db = "test";
        $this->conn = mysql_connect($host,$user,$password) OR die("error!");
        mysql_select_db($db,$this->conn) OR die("error!");
        return TRUE;
    }

    public function ShowCategory()
    {
        $sql = "SELECT * FROM categories";
        $res = mysql_query($sql,$this->conn);
        $category = '<option value="0">Please select a category...</option>';
        while($row = mysql_fetch_array($res))
        {
            $category .= '<option value="' . $row['id_cat'] . '">' . $row['name'] . '</option>';
        }
        return $category;
    }

    public function ShowType()
    {
        $sql = mysql_query( "SELECT * FROM type WHERE id_cat=$_POST[id]");
        $res = mysql_query($sql,$this->conn);
        $type = '<option value="0">Please select a type...</option>';
        while($row = mysql_fetch_array($sql))
        {
            $type .= '<option value="' . $row['id_type'] . '">' . $row['name'] . '</option>';
        }
        return $type;
    }

    public function ShowModel()
    {
        $sql = "SELECT * FROM model WHERE id_model=$_POST[id2]";
        $res = mysql_query($sql,$this->conn);
        $model = '<option value="0">Please select a model...</option>';
        while($row = mysql_fetch_array($res))
        {
            $model .= '<option value="' . $row['id_model'] . '">' . $row['name'] . '</option>';
        }
        return $model;
    }
}

$opt = new SelectList();
?>
4

1 に答える 1

0

通過するいくつかのポイント:

  1. mysql_connectデータベースに接続するこの方法は非推奨であり、安全でもありません。
  2. データベースに手動で接続する必要はありません。メソッドを使用できますJFactory::getDBO();。詳細については、こちらをご覧ください
  3. このカスタム コードをどのように記事に追加しているのかわかりませんが、Sourcerer などのプラグインを使用する必要があることを理解していただければ幸いです
  4. このコードをすべて記事に追加するよりも、カスタム モジュールを作成した方がよいのではないかと思います。つまり、実際には開発してコードを使用することを意味します。それほど時間はかかりません。その後、モジュールを記事に埋め込むことができます。
  5. タグを使用して jQuery をインポートするのではなく、Joomla コーディング標準を使用してインポートする最良の方法に関する私の回答を参照してください
  6. Joomla Extensions Directoryをまだ見ていない場合は、自分の好みに合わせてインストールおよび編集できるメニュー モジュールがたくさんあるので、見ておくことをお勧めします。

お役に立てれば

于 2013-08-15T10:23:47.440 に答える