/** * Сохранить инфомацию о файле в базу * @param Z_File_Storage_File $file * @return bool */ public function save(Z_File_Storage_File $file) { $id = $file->get('id'); if ($id == null) { $item = $this->getModel()->createRow($file->get()); } else { $item = $this->getModel()->fetchRow(array('id=?' => $id)); $item->setFromArray($file->get()); } return $item->save(); }
protected function renderCropped($crop_options) { $this->initCropoptions(); $previews = $headers = $footer = ''; $img = $this->getValue(); //id обрезаемой картинки $layout = Zend_Layout::getMvcInstance(); $view = $layout->getView(); $sizes = $cropped_coord = null; $i = -1; $image_size = getimagesize($this->_file->getFullName()); //размер обрезаемой картинки foreach ($crop_options as $copt) { //цикл нужен для того, чтобы выдать все возможные превью генерируемые по входной картинке например 200х150 на главной странице и 300х250 на внутренней $i++; if (!isset($copt['label']) || !$copt['label']) { continue; } if (!isset($copt['width']) || (int) $copt['width'] == 0) { continue; } if (!isset($copt['height']) || (int) $copt['height'] == 0) { continue; } $headers .= '<td rel="' . $i . '" class="h">' . $copt['label'] . '</td>'; $image = $view->z_Preview($img, array('w' => $copt['width'], 'h' => $copt['height']), true); $hoverer = '<div class="hoverer" style="width:' . $copt['width'] . 'px;height:' . $copt['height'] . 'px;overflow:hidden;display:none;"><img src="' . $this->_file->getSiteName() . '"></div>'; $previews .= '<td rel="' . $i . '" valign="middle">' . '<img id="init_preview" rel="' . $i . '" src="' . $image . '"/>' . $hoverer . '</td>'; $footer .= '<td rel="' . $i . '"><a href="#" class="z-button ui-button ui-state-default ui-corner-all ui-button-text-only select_preview" rel="' . $i . '"><span class="ui-button-text">Изменить</span></a></td>'; $cropped_coord = $this->getCroppedParamsFromCroppedFile($image); //анализирует имя обрезанного вручную файла и вычленяет параметры обрезки x,y - начальные координаты верхнего левого угла обрезки, w,h - высоту и ширину вырезаемой области, if (!$cropped_coord) { //если координаты не получены значит файл не является обрезанным вручную $cropped_coord = $this->getCroppedCoordinates($copt['width'], $copt['height'], $image_size[0], $image_size[1]); } //пытаемся получить параметры обрезки которые делаются в автоматическом режиме при вызове скрипта generatepreview.php $sorted_coord['x'] = $cropped_coord['x']; //порядок параметров очень важен $sorted_coord['y'] = $cropped_coord['y']; $sorted_coord['w'] = $cropped_coord['w']; $sorted_coord['h'] = $cropped_coord['h']; $sizes[] = "[" . $copt['width'] . "," . $copt['height'] . ",[" . str_replace(',', '.', implode('|', $sorted_coord)) . "]]"; //[[100,50,[0,2.445,100.2,100.4]],[150,200,[0,3,400,500]]]; [ширина выходной картинки, высота выходной картинки [параметры обрезки в автоматическом режиме или в ручном если есть обрезанный файл с такой шириной и высотой]] замену , на . делаем потому что при конвертации в float (полученный из json серилизованного массива параметров обрезки), цифры имеют вид 100,2 а нам нужны точки } if (!$headers) { return ''; } $sizes = str_replace('|', ',', $sizes); $js_sizes = '[' . implode(',', $sizes) . ']'; //var_dump($js_sizes); $previews = '<table class="previews"><tr>' . $headers . '</tr><tr>' . $previews . '</tr><tr>' . $footer . '</tr></table>'; jQuery::evalScript("\n\t\tvar sizes = " . $js_sizes . ";\n\t\tvar k = 0;\t\n \t\t \$(function(){\n \t\t var sizes = " . $js_sizes . ";\n\t\t\t//initCropbox();\n\t\t\t\$(\".select_preview\").click(function(){\n\t\t\t\tvar rel = \$(this).attr('rel');\n\t\t\t\tvar r = parseInt(rel, 0);\n\t\t\t\tvar w =sizes[rel][0];\n\t\t\t\tvar h = sizes[rel][1]; \n\t\t\t\t\$(\"#thumb_w\").val(w);\n\t\t\t\t\$(\"#thumb_h\").val(h);\n\t\t\t\t\$(\".accordion\").attr('sel',r);\n\t\t\t\tk=r;\n\t\t\t\t\$(\".accordion\").show();\n\t\t\t\tvar selectr_img = \"img[rel!='\"+rel+\"']\";\n\t\t\t\tvar selectr_td = \"td[rel='\"+rel+\"']\";\n\t\t\t\t\$(\"table.previews\").find(\"img\").removeClass('opacity');\n\t\t\t\t\$(\"table.previews\").find(selectr_img).addClass('opacity');\n\t\t\t\t\$(\"table.previews\").find(\"td\").removeClass('selected');\n\t\t\t\tvar active_td = \$(\"table.previews\").find(selectr_td);\n\t\t\t\t\$(active_td).addClass('selected');\n\t\t\t\t\n\t\t\t\t\$(\"img#init_preview\").show();\n\t\t\t\t\$(active_td).find(\"img#init_preview\").hide();\n\t\t\t\t\$(\".hoverer\").hide();\n\t\t\t\tvar active_hoverer = \$(active_td).find(\".hoverer\");\n\t\t\t\t\$(active_hoverer).show();\n\t\t\t\t\$(active_hoverer).find(\"img\").removeClass('opacity');\n\t\t\t\t\$(\".hoverer\").find(\"img\").removeClass('preview');\n\t\t\t\t\$(active_hoverer).find(\"img\").addClass('preview');\n\t\t\t\t\n\t\t\t\t\$(this).parent().parent()\n\t\t\t\tinitCropbox();\n\t\t\t\t\$(\"#hoverer\").css({\n\t\t\t\t\twidth:w+'px',\n\t\t\t\t\theight:h+'px',\n\t\t\t\t\toverflow:'hidden'\n\t\t\t\t});\t\n\t\t\t\treturn false;\n\t\t\t});\n\t\t\t\n\t\t\t\$(\"#cancel\").click(function (){\n\t\t\t\t\$(\".accordion\").hide();\n\t\t\t\t\$(\"table.previews\").find(\"img\").removeClass('opacity');\n\t\t\t\t\$(\"table.previews\").find(\"td\").removeClass('selected');\n\t\t\t\tclearValues(true);\n\t\t\t\t\n\t\t\t})\n\t\t });\n\t\t\tfunction initCropbox(){\n\t\t\t\t\$(\"#cropbox\").Jcrop({\n\t\t\t\t\taspectRatio: sizes[k][0]/sizes[k][1],\n\t\t\t\t\tonChange: showPreview,\n\t\t\t\t\tonSelect: showPreview,\n\t\t\t\t\tonRelease: clearValues,\n\t\t\t\t\tsetSelect:sizes[k][2],\n\t\t\t\t\tboxWidth: 1000, \n\t\t\t\t\tboxHeight: 1000 ,\n\t\t\t\t\tbgOpacity: 0.4,\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t\tclearValues(false);\n\t\t\t}\t\t\nfunction clearValues(thumb_size){\n\t\$('#x').val('');\n\t\t\t\t\$('#y').val('');\n\t\t\t\t\$('#w').val('');\n\t\t\t\t\$('#h').val('');\n\tif(thumb_size){\n\t\t\$(\"#thumb_w\").val('');\n\t\t\$(\"#thumb_h\").val('');\n\t}\n\t\t\t\t\n}\t\t\t\nfunction showPreview(coords)\n{\n\tvar rx = sizes[k][0] / coords.w;\n\tvar ry = sizes[k][1] / coords.h;\n\n\t\$('.preview').css({\n\t\twidth: Math.round(rx * " . $image_size[0] . ") + 'px',\n\t\theight: Math.round(ry * " . $image_size[1] . ") + 'px',\n\t\tmarginLeft: '-' + Math.round(rx * coords.x) + 'px',\n\t\tmarginTop: '-' + Math.round(ry * coords.y) + 'px'\n\t});\n\t//updateCoords();\n\t\$('#x').val(coords.x);\n\t\t\t\t\$('#y').val(coords.y);\n\t\t\t\t\$('#w').val(coords.w);\n\t\t\t\t\$('#h').val(coords.h);\n}\n\t\t\tfunction updateCoords(c)\n\t\t\t{\n\t\t\t\t\$('#x').val(c.x);\n\t\t\t\t\$('#y').val(c.y);\n\t\t\t\t\$('#w').val(c.w);\n\t\t\t\t\$('#h').val(c.h);\n\t\t\t};\n\n "); return $this->_style . '<br/>' . $previews . '<div class="accordion"> <div class="buttons_group z_form_buttons"> <input type="submit" name="apply" id="apply" value="Вырезать" class="z-form-apply ui-button ui-state-default ui-corner-all z-button"> <a href="#" id="cancel" class="z-button ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"> <span class="ui-button-text">Отмена</span> </a> </div> <img src="' . $this->_file->getSiteName() . '" id="cropbox"/> <input type="hidden" id="image" name="get_cropped_options[]" value="' . $this->getValue() . '"/> <input type="hidden" id="thumb_w" name="get_cropped_options[]" /> <input type="hidden" id="thumb_h" name="get_cropped_options[]" /> <input type="hidden" id="x" name="get_cropped_options[]" /> <input type="hidden" id="y" name="get_cropped_options[]" /> <input type="hidden" id="w" name="get_cropped_options[]" /> <input type="hidden" id="h" name="get_cropped_options[]" /> </div>'; }