yii和jquery-UI制作能够切割图片的上传页面

最近boss让我用jqueryUI结合Yii写一个图片上传的东西,能切割图片之类的。
虽然用过jquery写ajax,但是因为以前比较少接触UI开发,在这一方面了解得不多,还得从零起步。一点一点来吧。

列一个git的repo:
[email protected]:casatwy/saejs.git
所有的源代码都在这儿了。

主要是类似 http://meiwei.me/recipe/post的菜谱添加里面的东西。插播一个问题:我很奇怪boss的chromium在上传图片之后可以切割,而我用chrome,鼠标放在图片上却没有显示图片操作之类的工具栏。试了好多遍都不行,很纠结。


yii和jqueryUI的结合:
要先加载jquery.js,然后再加载jquery-UI.js,否则就会出现jqueryUI找不到jquery的问题。
   
   
   
   
[php] view plain copy
  1. //在view中和yii的结合  
  2. Yii::app()->clientScript->registerCoreScript('jquery');  
[php] view plain copy
  1. $cs = Yii::app()->clientScript;  
[php] view plain copy
  1. //引用外部网址  
  2. $cs->registerScriptFile('http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js');  
  3.   
  4. //引入本地站点  
  5. $cs->registerScriptFile(Yii::app()->baseUrl . '/themes/comm/js/upload.js', CClientScript::POS_HEAD);  
  6.   
  7. //引入css  
  8. $cs->registerCssFile(Yii::app()->baseUrl . '/js/star-rating/jquery.rating.css');  
01-13 13:07
刚刚在翻阅yii手册的时候,发现yii已经封装好了jUI的相关函数,待我尝试一下。

14:36
   
   
   
   
[html] view plain copy
  1. <?php   
  2.     $this->beginWidget('zii.widgets.jui.CJuiDroppable', array(  
  3.         'options'=>array(  
  4.                 'scope'=>'myScope',  
  5.                     ),  
  6.                     ));  
  7. ?>  
  8.     <div style='height: 500px;width: 500px;background: green;'>drop me </div>  
  9. <?php  
  10.     $this->endWidget();  
  11. ?>  
  12.   
  13.   
  14.   
  15. <?php  
  16.     $this->beginWidget('zii.widgets.jui.CJuiDraggable', array(  
  17.         'options'=>array(  
  18.                 'scope'=>'myScope',  
  19.                     ),  
  20.                     ));  
  21. ?>  
  22. <div style='height: 90px;width: 90px;background: red;' >drag me </div>  
  23. <?php      
  24.     $this->endWidget();  
  25. ?>  

大致就是这样,在beginWidget和endWidget之间放入要起到相应效果的div就好了。
接下来要做的事情就是如何获得被拖放进入droppable范围的对象的各种属性以及对它进行处理。因为到时候拖放进去的是一个图片,并且上传它。这个决定先放一放,去研究一下valums的ajax上传插件。


15:02
看来只要直接添加js插件就好了,不复杂,做个demo出来玩玩。

15:45
在yii里面使用第三方库的时候,在相应的controller之前加入以下代码:
[php] view plain copy
  1. Yii::import('application.vendors.*');  
  2. require_once('path/to/object.php');  

将相应的php对象文件放入protected/vendors文件夹之后,controller就能调用对应的对象了。
现在遇到一个问题,如何在ajax下访问到具体的action.问题已解决。
在yii里面发现了一个基于valums ajaxupload的插件,于是上传图片的demo做好了。接下来就是要做对图片的切割之类的操作了。
01-15 14:45
能够剪切了,但是剪切的虚线框出不来,很郁闷。
15:00
找到原因了,CSS文件也要包含进去。总结一下:
首先要在view里面包含以下下文件:
[php] view plain copy
  1. $cs->registerCssFile(Yii::app()->baseUrl.'/js/imgareaselect/css/imgareaselect-default.css');  
  2. $cs->registerScriptFile(Yii::app()->baseUrl.'/js/test.js');  
  3. $cs->registerScriptFile(Yii::app()->baseUrl.'/js/imgareaselect/scripts/jquery.imgareaselect.pack.js');  

那个test.js是用来放置图片上传和切割的各种回调函数的。加载这些文件之后,view里面放置一个图片标签:
[html] view plain copy
  1. <p>  
  2. <img id='imageUploaded' src='' width=400 height=300 ></img>  
  3. </p>  

这个图片的长和宽涉及切割预览的计算,下面要贴出来的preview函数就是来计算预览图的
[javascript] view plain copy
  1. function preview(img, selection)   
  2. {     
  3.     var scaleX = 100 / (selection.width || 1);  
  4.     var scaleY = 100 / (selection.height || 1);  
  5.                     
  6.     $('#imageUploaded + div > img').css({  
  7.         width: Math.round(scaleX * 400) + 'px',//这里的宽和高必须和view里面imageUploaded的宽和高相等,否则预览图错位。  
  8.         height: Math.round(scaleY * 300) + 'px',  
  9.         marginLeft: '-' + Math.round(scaleX * selection.x1) + 'px',  
  10.         marginTop: '-' + Math.round(scaleY * selection.y1) + 'px'  
  11.                                                                  });  
  12. }  
在view里面再添加以下js:
[javascript] view plain copy
  1. $(document).ready(function () {  
  2.     $("<div><img id='imagePreview'  src='' style='position: relative;' /><div>")  
  3.         .css({  
  4.             float'left',  
  5.             position: 'relative',  
  6.             overflow: 'hidden',  
  7.             width: '100px',  
  8.             height: '100px'  
  9.             }).insertAfter($('#imageUploaded'));  
  10.     $('#imageUploaded').imgAreaSelect({ aspectRatio: '1:1', onSelectChange: preview });  
  11. });  

以上代码是在页面加载时调用imgselect,css里面设置的style是关于预览图片的。
此时图片的部分选择就已经做好了。接下来就是要获得切分好的图片的相关信息,四个角的坐标。虽然是四个角,其实是两个点,一个是左上角的点(X1,Y1),另外一个是右上角的点(X2,Y2)
需要在页面中添加一个表格,将这四个变量上传到服务端。
服务端暂时还没什么想法,来一句var_dump($_POST)看看是不是都接收到就算了。
客户端这边要添加一个表单:
[html] view plain copy
  1.  <form action="coordinate" method="post">  
  2.      <input type="hidden" name="x1" value="" />  
  3.      <input type="hidden" name="y1" value="" />  
  4.      <input type="hidden" name="x2" value="" />  
  5.      <input type="hidden" name="y2" value="" />  
  6.      <input type="submit" name="submit" value="Submit" />  
  7. </form>  
然后加载插件的时候多注册一个事件:onSelectEnd
[javascript] view plain copy
  1. $('#imageUploaded').imgAreaSelect({ aspectRatio: '1:1', onSelectChange: preview, onSelectEnd: postCoordinate });  

去test.js里面补充一个函数:postCoordinate(img, selection)
[javascript] view plain copy
  1. function postCoordinate(img, selection)  
  2. {  
  3. //    alert('here i am');  
  4.     $('input[name="x1"]').val(selection.x1);  
  5.     $('input[name="y1"]').val(selection.y1);  
  6.     $('input[name="x2"]').val(selection.x2);  
  7.     $('input[name="y2"]').val(selection.y2);  
  8. }  

这个函数是用来在切割完毕时候给表单中的各项input设置值用的。点击submit之后就会跳转到coordinate这个action。
到此为止,ajax上传图片和上传图片之后的切割就已经都完成了,服务端也能获得切割后的具体坐标。
15:46
接下来就是要在服务器端切割图片了,我还不知道php有没有这样的函数能够切割图片的。boss说不着急弄,正好这时候把前面的代码重构一下,小view里面乱七八糟的。起码也得把CSS独立出来,让美工方便点。
上传页面的按钮的样式和拖放区的样式都在protected/extensions/EAjaxUpload/assets/fileuploader.css里面

出自: casahama的专栏

你可能感兴趣的:(图片,源代码,chrome,工具栏,切割)