Quantcast
Channel: Yii Framework Forum
Viewing all articles
Browse latest Browse all 18717

Help With Ajaxbutton

$
0
0
I have a textarea where users submit URLs to our database. The problem is that my scripts are timing out when a user submits over 1000 URLs. So I need to use some javascript and split up the data before it gets sent to the php script. I have a very basic model working outside of Yii but need some help writing the code in Yii. Any help would be appriciated.

Here's the code outside of yii

<?php
if(isset($_POST['urls'])):
    print_r($_POST);
else:
?>
<script type="text/javascript" src="jquery.min.js"></script>
<form action="form.php" method="post" id="target">
    <textarea name="urls" id="urls" style="width:300px;height:200px">test.com
test2.com
test3.com
test4.com
test5.com
test6.com
test7.com
test8.com
test9.com
test10.com
test11.com
test12.com
test13.com
test14.com
test15.com
test16.com
test17.com
test18.com
test19.com
test20.com
    </textarea>
    <br>
    <input type="submit">
</form>

<script type="text/javascript">
    $('#target').submit(function() {
        var urls = $('#urls').val().trim().split("\n");
        var splitArray = chunk(urls,10);
        for (var ary in splitArray){
            $.post('form.php',{'urls[]':splitArray[ary]})
        }

        return false;
    })


    function chunk (arr, len) {
        var chunks = [],
            i = 0,
            n = arr.length;
        while (i < n) {
            chunks.push(arr.slice(i, i += len));
        }
        return chunks;
    }
</script>
<?php
endif;
?>


My model is just a basic gii generated model - nothing really special there

Here's my controller:

public function actionAdd()
	{
        $this->seoAuthenticate();
        $model=new Urls;
        if(isset($_POST['Urls'])):
            $model->attributes=$_POST['Urls'];

            $urls = explode("\n", $model->urlList);
            $success = 0;
            $error = 0;
            foreach($urls as $url)
                if(!empty($url)): // don't save empty lines
                    $newUrl=new Urls; //That's what you want: an extra model for each name
                    $newUrl->url = trim($url);
                    $newUrl->statusID = 1;
                    $newUrl->date = date("Y-m-d");
                    $newUrl->posts = 0;
                    $newUrl->clientID = Yii::app()->user->getId();
                    if($newUrl->validate()):
                        if($newUrl->save()):
                            $success++;
                        endif;
                    else:
                        $error++;
                    endif;
                endif;
            if($success > 0)
                Yii::app()->user->setFlash('success', $success . ' URLs added.');
            if($error > 0)
                Yii::app()->user->setFlash('error', $error . ' duplicate or malformed URLs were not added.');
            $this->redirect('/urls/new/');
            /*$this->render('add',array(
                'model'=>$model,
            ));*/
        else:
            $this->render('add',array(
                'model'=>$model,
            ));
        endif;
	}


And my view (using yii-bootstrap)

<?php
/* @var $this UrlsController */
/* @var $model Urls */

?>
<div class="span12" style="margin: 50px 0 10px"><?php
    $this->widget('ext.widgets.controlBar');?>
</div>
<h1 class="title">Add Urls</h1>

<?php $this->widget('bootstrap.widgets.TbAlert', array(
    'block'=>true, // display a larger alert block?
    'fade'=>true, // use transitions?
    'closeText'=>'×', // close link text - if set to false, no close link is displayed
    'alerts'=>array( // configurations per alert type
        'success'=>array('block'=>true, 'fade'=>true, 'closeText'=>'×'), // success, info, warning, error or danger
    ),
)); ?>

<div class="form">

    <?php $form=$this->beginWidget('CActiveForm', array(
        'id'=>'urls-form',
        'enableAjaxValidation'=>false,
        'htmlOptions'=>array(
            'onsubmit'=>'return false',
        ),
    )); ?>

    <p class="note">Add 1 URL per line</p>

    <?php echo $form->errorSummary($model); ?>

    <div class="row" style="margin-left:0">
        <?php echo $form->labelEx($model,'urlList'); ?>
        <?php echo $form->textArea($model,'urlList',array('style' => 'width:90%;height:500px')); ?>
        <?php echo $form->error($model,'urlList'); ?>
    </div>

    <div class="row buttons" style="margin-left:0">
        <?php $this->widget('bootstrap.widgets.TbButton', array('buttonType'=>'submit', 'label'=>'Submit')); ?>
        <?php //echo CHtml::submitButton('Save'); ?>
    </div>

    <?php $this->endWidget(); ?>

</div>&lt!-- form -->


This currently returns an alert for the number of URLs submitted - will want to use some form of real time feedback between calls - probably a progress bar from bootstrap.

Thanks for your help

Viewing all articles
Browse latest Browse all 18717

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>