0
votes

I know there were some questions related to this, but there are c ++ or other languages. I get this error and I'm not sure what's wrong with my function. This is my Error

Fatal error: Uncaught ArgumentCountError: Too few arguments to function Admincategory::deletecategory(), 0 passed in F:\xampp\htdocs\digikalamvc\core\app.php on line 34 and exactly 1 expected in F:\xampp\htdocs\digikalamvc\controllers\admincategory.php:50 Stack trace: #0 F:\xampp\htdocs\digikalamvc\core\app.php(34): Admincategory->deletecategory() #1 F:\xampp\htdocs\digikalamvc\index.php(6): App->__construct() #2 {main} thrown in F:\xampp\htdocs\digikalamvc\controllers\admincategory.php on line 50

And my function is:

<?php

class Admincategory extends Controller
{


    function __construct()
    {
        parent::__construct();
    }


    function index()
    {

        $category = $this->model->getChildren(0);
        $data = ['category' => $category];
        $this->view('admin/category/index', $data);
    }


    function showchildren($idcategory)
    {

        $categoryInfo = $this->model->categoryInfo($idcategory);
        $children = $this->model->getChildren($idcategory);
        $parents = $this->model->getParents($idcategory);
        $data = ['categoryInfo' => $categoryInfo, 'category' => $children, 'parents' => $parents];

        $this->view('admin/category/index', $data);
    }


    function addcategory($categoryId = 0, $edit = '')
    {

        if (isset($_POST['title'])) {
            $title = $_POST['title'];
            $parent = $_POST['parent'];
            $this->model->addCategory($title, $parent, $edit, $categoryId);
        }
        $category = $this->model->getCategory();
        $categoryInfo = $this->model->categoryInfo($categoryId);

        $data = ['category' => $category, 'parentId' => $categoryId, 'edit' => $edit, 'categoryInfo' => $categoryInfo];
        $this->view('admin/category/addcategory', $data);
    }


    function deletecategory($parentId)
    {
        $ids = $_POST['id'];
        $this->model->deletecategory($ids);
        header('location:'.URL.'admincategory/showchildren/'.$parentId);
    }

}

?>

app.php file


<?php


class App
{

    public $controller = 'index';
    public $method = 'index';
    public $params = [];


    function __construct()
    {
        if (isset($_GET['url'])){
            $url = $_GET['url'];
            $url = $this->parseUrl($url);
            $this->controller = $url[0];
            unset($url[0]);
            if (isset($url[1])){
                $this->method = $url[1];
                unset($url[1]);
            }

            $this->params = array_values($url);
        }
        $controllerUrl = 'controllers/' . $this->controller . '.php';
        if (file_exists($controllerUrl)) {
            require($controllerUrl);
            $object = new $this->controller;

            $object->model($this->controller);

            if (method_exists($object, $this->method)) {
                call_user_func_array([$object, $this->method], $this->params);
            }
        }


    }

    function parseUrl($url)
    {
        $url = filter_var($url, FILTER_SANITIZE_URL);
        $url=rtrim($url,'/');
        $url = explode('/', $url);
        return $url;
    }

}



?>

and index.php


<?php

require('views/admin/layout.php');
$category = $data['category'];

$categoryInfo = [];
if (isset($data['categoryInfo'])) {
    $categoryInfo = $data['categoryInfo'];
}
$parents = [];
if (isset($data['parents'])) {
    $parents = $data['parents'];
    $parents = array_reverse($parents);
}

?>

<style>

    .w400 {
        width: 600px;
    }

</style>

<div class="left">

    <p class="title">
        مدیریت دسته ها

        (
        <?php foreach ($parents as $row) { ?>

            <a href="admincategory/showchildren/<?= $row['id']; ?>">
                <?= $row['title']; ?>
            </a>
            -

        <?php } ?>

        <a href="admincategory/<?php if (isset($categoryInfo['id'])) {
            echo 'showchildren/' . $categoryInfo['id'];
        } else {
            echo 'index';
        } ?>">
            <?php
            if (isset($categoryInfo['title'])) {
                echo $categoryInfo['title'];
            } else {
                echo 'دسته های اصلی';
            }
            ?>
        </a>

        )

    </p>

    <a class="btn_green_small" href="admincategory/addcategory/<?= @$categoryInfo['id']; ?>">
        افزودن
    </a>


    <a class="btn_red_small" onclick="submitForm();">
        حذف
    </a>

    <form action="admincategory/deletecategory/<?= @$categoryInfo['id']; ?>" method="post">

        <table class="list" cellspacing="0">

            <tr>
                <td>
                    ردیف
                </td>

                <td>
                    عنوان دسته
                </td>

                <td>
                    مشاهده زیر دسته ها
                </td>

                <td>
                    ویرایش
                </td>

                <td>
                    انتخاب
                </td>

            </tr>

            <?php

            foreach ($category as $row) {
                ?>

                <tr>

                    <td>
                        <?= $row['id']; ?>
                    </td>

                    <td class="w400">
                        <?= $row['title']; ?>
                    </td>

                    <td>
                        <a href="admincategory/showchildren/<?= $row['id']; ?>">
                            <img src="public/images/view_icon.png" class="view">
                        </a>
                    </td>

                    <td>
                        <a href="admincategory/addcategory/<?= $row['id']; ?>/edit">
                            <img src="public/images/edit_icon.ico" class="view">
                        </a>
                    </td>

                    <td>
                        <input type="checkbox" name="id[]" value="<?= $row['id']; ?>">
                    </td>

                </tr>

            <?php } ?>

        </table>

    </form>

</div>

</div>


============

Thank you for trying to help!

1
error seems clear to meuser6763587

1 Answers

0
votes

Sometimes it happen that AdminCategory::deletecategory($parentId) is called without a parameter but prototype do not have a default value for it and therefore exception is thrown. Since you get data from a post request and there is always a possibility that a category do not have a parent you can refactor your method to looks like:

function deletecategory($parentId = null)
{
    $ids = $_POST['id'];
    $this->model->deletecategory($ids);
    if (null !== $parentId) {
        header('location:'.URL.'admincategory/showchildren/'.$parentId);
    }
    // PUT MORE OF YOUR LOGIC HERE, I DO NOT KNOW WHAT SHOULD HAPPEN
}

If you are using typing hints more appropriate would be to make method looks like

 function deletecategory(string $parentId = ''): void //void is for php7.1
 {
    $ids = $_POST['id'];
    $this->model->deletecategory($ids);
    if ('' !== $parentId) {
        header('location:'.URL.'admincategory/showchildren/'.$parentId);
    }
    // AGAIN LOGIC HERE
 }

If you REALLY expect that parentId MUST be passed then instead wrap method caller with try catch

if (method_exists($object, $this->method)) {
    try {
        call_user_func_array([$object, $this->method], $this->params);
    } catch (\Exception $ex) {
        // HANDLE EXCEPTION HERE
    }
}