Почему я не могу использовать функции PHP в Drupal? - PullRequest
0 голосов
/ 30 января 2012

Я понял это!

@ Марк Б предложил мне использовать include_once () для моего файла, а не include. Это исправило ошибку, которую я получал.

Однако у меня все еще была проблема с тем, что моя функция проверки работала некорректно. Я понял, что он не передает мои переменные в функцию.

Очевидно, что что-то с Drupal не позволяет функции получать переменные, просто запрашивая глобальные переменные $ внутри одной и той же функции. Мне пришлось объявить переменные $ глобальными вне функции, где $ переменные - это мой массив.

Оригинальный вопрос ниже:



У меня есть файл PHP, который я создал, чтобы редактировать информацию о компании для компаний в моей базе данных. Все прекрасно работает, когда я получаю доступ к странице за пределами drupal, но когда я включаю ее в страницу drupal (или даже вставляю код в страницу drupal, я получаю свои ошибки проверки, потому что он не может запустить мою функцию проверки (или если я удаляю проверка, моя функция процесса не работает.) Я могу закомментировать функции и вызвать свой сценарий процесса в таком выражении, как if (isset ($ _ POST ['submit'])) , и оно работает в Drupal , но я бы хотел использовать свои функции.

Если я иду редактировать страницу в Drupal, я вижу следующую ошибку:

Неустранимая ошибка: невозможно повторно объявить validate () (ранее объявленный в /home/content/84/6649484/html/commons/profiles/drupal_commons/custom/editcompany/editcompany.php:416) в / home / content /84/6649484/html/commons/profiles/drupal_commons/custom/editcompany/editcompany.php в строке 452

(416 - это то, где я вызываю первое, что есть в моей функции проверки, 452 - закрытие того же самого)

Почему я не могу использовать функции при включении страницы PHP в Drupal? Что вызывает зависание с моими функциями, и есть ли способ это исправить? Вот мой код:

<?php
//connect to database
include('db.php');



////////////////////////////////////////////////////
////////////////////////////////////////////////////
////                                            ////
//// Validate   /   Process Form                ////
////                                            ////
////////////////////////////////////////////////////
////////////////////////////////////////////////////

//set form variables
    $form['accountnumber'] = $_POST['accountnumber'];
    $form['companyname'] = $_POST['companyname'];
    $form['address'] = $_POST['address'];
    $form['address2'] = $_POST['address2'];
    $form['city'] = $_POST['city'];
    $form['state'] = $_POST['state'];
    $form['zip'] = $_POST['zip'];
    $form['beds'] = $_POST['beds'];



if(isset($_POST['submit'])) {

    //run the validate function
    $validated = validate();

    //if one of the validations returned false, let's declare $errors as true and we'll display a message
    if($validated[0] == false) {
        $v_errors = true;
    } else {
        $processed = process();

        //see if there were errors adding it to the database
        if($processed == false) {
            $db_errors = true;
        }

        if($processed == true) {
            $success = true;
        }
    }

}



?>





<?php
////////////////////////////////////////////////////
////////////////////////////////////////////////////
////                                            ////
//// Form                                       ////
////                                            ////
////////////////////////////////////////////////////
////////////////////////////////////////////////////


//choose company
?>

<form id="choosecompany" action="" method="get">


<?php

//get company from url
$company_id = $_GET['id'];



//get all active companies
$result = mysql_query("SELECT account_num AS 'a', name AS 'n', city AS 'c', state AS s FROM company_profiles WHERE type = 'Customer' ORDER BY name ASC");

?>

<select name="id" style="display: block; position: relative; margin: 5px auto;">

    <?
    while($row = mysql_fetch_array($result)) {
        ?>

        <option value="<?php echo $row['a']; ?>" <?php if($row['a'] == $company_id) { echo 'selected="selected"'; } ?>>
        <strong><?php echo  $row['n'] 
        . ' - ' . $row['c'];
        if($row['c']) { echo ', '; }
        echo $row['s']; ?></strong>
        <?php echo ' (' . $row['a'] . ')';?></option>

        <?php
    }
    ?>

</select>

<input type="submit" name="submit" value="Edit" style="display: block; position: relative; margin: 0 auto;" />


</form>


<?php
if($company_id) {
    //get company info from db
    $result = mysql_query("SELECT * FROM company_profiles WHERE account_num = '$company_id'");

    while($row = mysql_fetch_array($result)) {
        $form['accountnumber'] = $row['account_num'];
        $form['companyname'] = $row['name'];
        $form['address'] = $row['address'];
        $form['address2'] = $row['address2'];
        $form['city'] = $row['city'];
        $form['state'] = $row['state'];
        $form['zip'] = $row['zip'];
        $form['beds'] = $row['beds'];
    }

}

?>





<form id="editcompany" action="" method="post">

    <h1>Edit Company</h1>

    <?php

    if($v_errors) {
        echo '<span id="errors"> Company not updated. Please enter required information.';
        echo '</span>';
    }

    if($db_errors) {
        echo '<span id="errors"> Company not updated. Please contact your system admin. </span>';
    }

    if($success) {
        echo '<span id="success"> Company information successfully updated. </span>';
    }

    ?>


    <ul id="block1">
        <li id="accountnumber">
            <label>Account #</label>
            <input readonly type="text" name="accountnumber" value="<?php echo $form['accountnumber']; ?>" <?php if($validated[1] == 'error') { echo 'class="error"'; } ?> />
        </li>


        <li id="companyname">
            <label>Company Name</label>
            <input type="text" name="companyname" value="<?php echo $form['companyname']; ?>" <?php if($validated[2] == 'error') { echo 'class="error"'; } ?> />
        </li>



        <li id="address">
            <label>Address</label>
            <input type="text" name="address" value="<?php echo $form['address']; ?>" />
            <input type="text" name="address2" value="<?php echo $form['address2']; ?>" />
        </li>




        <li id="csz">
            <label>City, State, Zip</label>
            <input id="city" type="text" name="city" value="<?php echo $form['city']; ?>" <?php if($validated[3] == 'error') { echo 'class="error"'; } ?> />

            <input id="state" type="text" name="state" maxlength="2" value="<?php echo $form['state']; ?>" <?php if($validated[4] == 'error') { echo 'class="error"'; } ?> />

            <input id="zip" type="text" name="zip" maxlength="5" value="<?php echo $form['zip']; ?>" />
        </li>


    </ul>



    <ul id="block2">
        <li id="products">
            <label>Products</label>
            <ul>
           <?php 

           //get all products from database
            $getproducts = mysql_query("SELECT id, name, url FROM products ORDER BY weight ASC");

            while ($rowproducts = mysql_fetch_array($getproducts)) {

                $product_id = $rowproducts['id'];
                $product_name = $rowproducts['name'];
                $product_url = $rowproducts['url'];

                $getuserhasproduct = mysql_query("SELECT DISTINCT product_id FROM products_accounts WHERE account_number = '$form[accountnumber]' AND product_id = '$product_id'");
                $user_has_product = mysql_num_rows($getuserhasproduct);

                if($user_has_product){
                    $hasproduct = true;
                }



            //list all products 
            ?>
                <li>
                    <label><?php echo $product_name; ?></label>
                    <input type="checkbox" name="<?php echo $product_id; ?>" value="TRUE" <?php if($user_has_product) { echo 'checked'; } ?> />
                </li>
            <?php



            //end while
            }
            ?>



            </ul>
        </li>


        <li id="demographics">
            <ul>
                <li id="beds">
                    <label>Beds</label>
                    <input type="text" name="beds" value="<?php echo $form['beds']; ?>" />
                </li>

            </ul>
        </li>


    </ul>


    <input type="submit" name="submit" value="Update" />


</form>





<?php
////////////////////////////////////////////////////
////////////////////////////////////////////////////
////                                            ////
//// Validate Function                          ////
////                                            ////
////////////////////////////////////////////////////
////////////////////////////////////////////////////

function validate() {
    //get variables
    global $form;

    $v = true;

    //validate account number

    if(!$form['accountnumber']) {
        $v = false;
        $v1 = 'error';
    }

    if(!$newaccount) {
        $v5 = 'error';
    }

    //validate company name
    if(!$form['companyname']) {
        $v = false;
        $v2 = 'error';
    }

    //validate city
    if(!$form['city']) {
        $v = false;
        $v3 = 'error';
    }

    //validate state
    if(!$form['state']) {
        $v = false;
        $v4 = 'error';
    }

    $validated = array($v,$v1,$v2,$v3,$v4,$v5);
    return $validated;

}








////////////////////////////////////////////////////
////////////////////////////////////////////////////
////                                            ////
//// Process Function                           ////
////                                            ////
////////////////////////////////////////////////////
////////////////////////////////////////////////////

function process() {
    //get variables
    global $form;
    global $_POST;

    //set variables for clean entry into database
    $an = mysql_real_escape_string($form['accountnumber']);
    $n = mysql_real_escape_string($form['companyname']);
    $a = mysql_real_escape_string($form['address']);
    $a2 = mysql_real_escape_string($form['address2']);
    $c = mysql_real_escape_string($form['city']);
    $s = mysql_real_escape_string($form['state']);
    $z = mysql_real_escape_string($form['zip']);
    $b = mysql_real_escape_string($form['beds']);




    //get all products from database
            $getproducts = mysql_query("SELECT id, name, url FROM products ORDER BY weight ASC");

            while ($rowproducts = mysql_fetch_array($getproducts)) {

                $product_id = $rowproducts['id'];
                $product_name = $rowproducts['name'];
                $product_url = $rowproducts['url'];

                $getuserhasproduct = mysql_query("SELECT DISTINCT product_id FROM products_accounts WHERE account_number = '$form[accountnumber]' AND product_id = '$product_id'");
                $user_has_product = mysql_num_rows($getuserhasproduct);

                //if the user has the product, let's delete it if we need to delete it, otherwise leave it alone.
                if($user_has_product){

                    if($_POST[$product_id] == false) {
                        mysql_query("DELETE FROM products_accounts WHERE account_number = '$form[accountnumber]' AND product_id = '$product_id'");
                    }

                //if the user doesn't have the product, let's add it if we need to add it, otherwise leave it alone.
                } else {

                    if($_POST[$product_id] == true) {
                        mysql_query("INSERT INTO products_accounts (account_number, product_id) VALUES ('$form[accountnumber]', '$product_id')");
                    }
                }


            }




    $result = mysql_query("UPDATE company_profiles SET name = '$n', address = '$a', address2 = '$a2', city = '$c', state = '$s', zip = '$z', beds = '$b' WHERE account_num = '$an'");

    if(!$result) {
        $processed = false;
        die('Could not connect: ' . mysql_error());
    } else {
        $processed = true;
    }


    return $processed;

}



?>

Ответы [ 3 ]

4 голосов
/ 30 января 2012

Вы можете использовать любую функцию PHP в Drupal. Проблема в том, что вы определяете функцию в файле include(), который включается несколько раз. Сообщение об ошибке очень конкретное: «Невозможно повторно объявить validate ()` »- после объявления функции вы не можете повторно объявить ее.

Поместите функцию в отдельный файл библиотеки, который загружается через include_once() или require_once(), чтобы она загружалась только ОДИН раз.

1 голос
/ 30 января 2012

Drupal может иметь собственную функцию validate ().Стандартная практика в drupal - добавлять имена функций к имени вашего модуля, например: editcompany_validate ().Попробуйте и посмотрите, не прояснит ли это конфликт.Вы должны быть в состоянии сделать простой поиск и замену.

0 голосов
/ 30 января 2012

Вы можете добавить к своим функциям любой уникальный префикс, чтобы убедиться, что с внутренними структурами Drupal нет конфликтов, или вы можете использовать пространства имен PHP, если вы используете 5.3 и выше.

Использование пространств имен может потребовать некоторых измененийв коде, когда вы вызываете глобальные функции.Тем не менее, это хорошо задокументировано.http://ca3.php.net/manual/en/language.namespaces.fallback.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...