• Как найти строку, длинна которой максимально близка нужной?

    Falseclock
    @Falseclock
    в примере пользовательская база, там во многих городах пробелы в конце, поэтому надо будет еще и TRIM делать, чтобы без пробелов считалось.
  • Как найти строку, длинна которой максимально близка нужной?

    Falseclock
    @Falseclock
    SELECT
    	city_id
    	city_name, 
    	CASE WHEN length(city_name) = 5 THEN 1 
    		WHEN length(city_name) = 4 THEN 2 
    		WHEN length(city_name) = 6 THEN 3 
    	ELSE 1000 END AS ord 
    FROM 
    	cities 
    ORDER BY 
    	ord ASC 
    LIMIT 20;


    На выходе получаем то что надо. Порядок что лучше, длиньше или короче можно указать

    city_id | city_name | ord
    ---------+-----------+-----
       35238 | Темир     |   1
       35176 | Абай      |   1
       35184 | Арыс      |   1
       35180 | Актау     |   1
        9754 | Париж     |   1
       35178 | Аксай     |   1
       35195 | Есиль     |   1
       35188 | Аягоз     |   1
       35249 | Эмба      |   2
       35194 | Есик      |   2
       35182 | Алга      |   2
       35251 | Шар       |   2
       35179 | Аксу      |   2
       35243 | Ушарал    |   3
       35236 | Тараз     |   3
       35244 | Уштобе    |   3
       35234 | Талгар    |   3
       35257 | Астана    |   3
       35177 | Акколь    |   3
       35187 | Атырау    |   3
    (20 строк)
  • Как внедрить собственный счет на сате?

    Falseclock
    @Falseclock
    ну сперва надо задаться вопросом как он платить и как вы об этом узнаете
  • Как обмениваться данными с web сайта и 1c?

    Falseclock
    @Falseclock
    Илья: да незачто... вообще можно сделать что угодно, было бы желание.

    Из того что сейчас делаю или уже реализовал

    1. Создание счетов в 1С через CRM
    2. Выгрузка отчетов по Оборотно-сальдовой ведомости или по Карточке счета различные данные как в виде JSON, так и в виде XML, HTML, XLS и Plain Text.
    3. автоматическое информирование о создании, изменении или удалении в 1с любых документов в сторону сервера. То есть кто-то создал новый счет - у всех в вебе он тут же появился. Реализовано через WebSocket. Оплатили счет, внесли в 1С платежку, тут же в CRM статус заказа меняется на Оплачен. Складовщику тут же в вебе прилетает уведомлялка, что надо собрать товар и отгрузить.
    Отгрузили товар и выписали Накладную - сразу через WebSocket автоматом в CRM меняется статус заказа на отгружено. Выписали СФ - у всех менеджеров в CRM в реальном времени обновляется интерфейс. Не то чтобы обновляется, а именно динамически меняется. Мало того, сами заказчики автоматически получают информацию о всех движениях своих заказов: когда счет выписан, когда оплата получена, когда отгружено... может либо через веб смотреть, также автоматически, либо на почту подписываться, либо через SMS уведомление.
  • Как обмениваться данными с web сайта и 1c?

    Falseclock
    @Falseclock
    Илья: ну для тестов я поднял на Linux тестовую базу и на ней тренируюсь как на кошках. Серверная линуксовая 1с не требует лицензий и допускает до 10 одновременных пользователей.
  • Как обмениваться данными с web сайта и 1c?

    Falseclock
    @Falseclock
    Илья: да.. вполне реально. я у себя реализовал, чтобы мои сотрудники могли формировать счета прям из CRM системы на вебе напрямую в 1С. Для этого нужно сделать две вещи.

    1. Со стороны 1С запустить внешнюю обработку https://drive.google.com/open?id=0B2lAfZOYZcTxMXFE... которая влючить в конфигурации ODATA интерфейс. Ссылка на ODATA по HTTP конфигурируется через Конфигуратор.

    2. со стороны сервера сформировать XML файл и через POST запрос его отправить на опубликованный ODATA интерфейс.

    Вот пример кода как я формирую счет в 1C

    Это код JS, со стороны веба

    function InvoiceCreate()
    {
    	$('invoice_create').disabled = true;
    	$('invoice_create').setAttribute("style","-webkit-filter:grayscale(100%);");
    	$('InvoiceDisabler').style.display = "";
    	
    	if (!$('rate').value || $('rate').value == 0) {smoke.alert('Укажите курс'); return; }
    	if (!$('Организация_Key').value) {smoke.alert('Укажите органиазацию'); return; }
    	if (!$('КодНазначенияПлатежа').value) {smoke.alert('Укажите КНП'); return; }
    	if (!$('СтруктурнаяЕдиница').value) {smoke.alert('Укажите банковский счет'); return; }
    	if (!$('Контрагент_Key').value) {smoke.alert('Укажите контрагента'); return; }
    	if (!$('Склад_Key').value) {smoke.alert('Укажите склад'); return; }
    	if (!$('ДоговорКонтрагента_Key').value) {smoke.alert('Укажите договор с контрагентом'); return; }
    	if (!$('Автор_Key').value || $('Автор_Key').value == 0) {smoke.alert('Укажите ответственное лицо'); return; }
    	
    	var data = {
    		'Организация_Key' : $('Организация_Key').value,
    		'КодНазначенияПлатежа' : $('КодНазначенияПлатежа').value,
    		'СтруктурнаяЕдиница' : $('СтруктурнаяЕдиница').value,
    		'Склад_Key' : $('Склад_Key').value,
    		'Контрагент_Key' : $('Контрагент_Key').value,
    		'ДоговорКонтрагента_Key' : $('ДоговорКонтрагента_Key').value,
    		'Комментарий' : $('Комментарий').value,
    		'Автор_Key' : $('Автор_Key').value,
    		'НомерЗаказа' : "Заказ №" + DATA[0].order_number,
    		'rows' : []
    	};
    	var interrelation = new Array();
    	
    	for (var i=0; i < $('goods').children.length; i++){
    		
    		var tr = $('goods').children[i];
    
    		var elem = {
    			'Номенклатура_Key' : '',
    			'СтавкаНДС_Key' : '',
    			'ЕдиницаИзмерения_Key' : '',
    			'Количество' : '',
    			'Цена' : '',
    			'Сумма' : '',
    			'СуммаНДС' : '',
    		};
    		
    		var inter = {
    			invoice_uuid : '',
    			item_uuid : '',
    			quantity : '',
    			price : '',
    			order_data_id : ''
    		};
    				
    		for (var l=0; l < tr.cells.length; l++) {
    			var td = tr.cells[l];
    			
    			if (td.hasAttribute('data-element')) {
    				for (var h=0; h < td.childNodes.length; h++) {
    					if (td.childNodes[h].nodeName == "INPUT" && td.childNodes[h].name == "good") {
    						if (!td.childNodes[h].value || td.childNodes[h].value == '') {
    							smoke.alert('Не указан товар из списка'); return;
    						}
    						elem.Номенклатура_Key = td.childNodes[h].value;
    						
    						var agood = FindGood(elem.Номенклатура_Key);
    
    						elem.СтавкаНДС_Key = agood.СтавкаНДС_Key;
    						elem.ЕдиницаИзмерения_Key = agood.БазоваяЕдиницаИзмерения_Key;
    						
    						inter.item_uuid = elem.Номенклатура_Key;
    						inter.order_data_id = td.childNodes[h].getAttribute('data-order_data_id');
    					}
    				}
    			}
    			
    			if (td.hasAttribute('data-quantity')) {
    				elem.Количество = parseInt(td.getAttribute('data-quantity'));
    			}
    			
    			if (td.hasAttribute('data-price')) {
    				for (var k=0; k < td.childNodes.length; k++) {
    					if (td.childNodes[k].nodeName == "INPUT" && td.childNodes[k].name == "price") {
    						elem.Цена = parseFloat(td.childNodes[k].value);
    					}
    				}
    			}
    		}
    		elem.Сумма = elem.Цена * elem.Количество;
    		elem.СуммаНДС = FormatNumberBy3(roundNumber((elem.Сумма / 112 * 12),2),'.', '', true);
    		data.rows.push(elem);
    
    		inter.quantity = elem.Количество;
    		inter.price = elem.Цена;
    		
    		interrelation.push(inter);
    	}
    	
    	new (Ajax.Request)
    	(
    		"/", 
    		{
    			method: "POST",
    			parameters: { 
    				'Motion' : '<?=Motion::ADD_INVOICE?>', 
    				'data' : Base64.encode(Object.toJSON(data)),
    				'interrelation': Base64.encode(Object.toJSON(interrelation)),
    				'order_id' : $('order_id').value
    			},
    			encoding: 'UTF-8',
    			onComplete: function (a) {
    				resp = a.responseJSON;
    				
    				if (resp.result == 'success') {
    					updateInvoiceTable(resp);
    				} else {
    					alert('Обновление номера счета в заказе не выполнено. Обратитесь к разработчику.');
    				}
    
    			},  
    			onFailure: function (a) {alert('Во время работы произошла ошибка, пожалуйста сообщите администратору!');}
    		}
    	);
    }


    Вот это то место, куда прилетает AJAX запрос

    protected function addInvoice()
    	{
    		$db = $this->db;
    		$site = $this->site;
    
    		$data = json_decode(base64_decode($site->getInputVar('data')),true);
    		$interrelation = json_decode(base64_decode($site->getInputVar('interrelation')),true);
    		
    		require_once (__DIR__."/../lib/vendor/autoload.php");
    		
    		$xml = LSS\Array2XML::createXML('xml', Structure1c::Invoice($data));
    
    		//print_r($data);
    		//print_r($xml->saveXML());
    		$result = Data1c::RequestODATA("Document_СчетНаОплатуПокупателю", $xml->saveXML(), "POST");
    		//print_r($result);
    		
    		$array = LSS\XML2Array::createArray($result);
    		$entry = $array['entry']['content']['m:properties'];
    		
    		$invoice = array(
    			'invoice_uuid' => $entry['d:Ref_Key'],
    			'invoice_number' => $entry['d:Number'],
    			'invoice_date' => $entry['d:Date'],
    			'invoice_amount' => $entry['d:СуммаДокумента'],
    			'invoice_customer' => $entry['d:Контрагент_Key'],
    			'order_id' => $site->getInputVarInt('order_id')
    		);
    		
    		$db->insert("invoices",$invoice);
    		
    		foreach ($interrelation as $row) {
    			$row['invoice_uuid'] = $entry['d:Ref_Key'];
    			
    			$db->insert("invoice_data",$row);
    		}
    		
    		$data = Data1c::InvoiceData($entry['d:Ref_Key']);
    		
    		$this->setSkin(JSONSkin::create());
    		
    		$viewResolver = MultiPrefixPhpViewResolver::create()->addPrefix( PATH_SHARED_TEMPLATE );
    		$partViewer = new PartViewer($viewResolver, $this);
    		$html = $partViewer->content('invoice', SimpleModule::create()->setVar('data', $data) );
    
    		//BUGFIX for 1C, while ODATA, onSave does not happen
    		
    		$structure = array
    		(
    			'action' => "update",
    			'order_id' => $site->getInputVarInt('order_id'),
    			'order_data' => array(),
    			'document' => array(
    				'type' => 'invoice',
    				'uuid' => $entry['d:Ref_Key'],
    				'date' => $entry['d:Date'],
    				'number' => $entry['d:Number'],
    				'amount' => $entry['d:СуммаДокумента']
    			),
    			'parent' => array()
    		);
    		$socket = "Driver1c:".json_encode($structure, JSON_UNESCAPED_UNICODE);
    		new WebSocketClient(array($socket));
    
    		return $this->setVar( 
    			'json', array
    			(
    				'result' => 'success',
    				'invoice_number' => $entry['d:Number'], 
    				'invoice_uuid' => $entry['d:Ref_Key'], 
    				'invoice_amount' => $entry['d:СуммаДокумента'], 
    				'html' => base64_encode($html), 
    				'data' => $data
    			) 
    		);
    		
    	}


    А вот здесь вот формируется XML данные в Structure1c::Invoice

    public static function Invoice($data)
    	{
    		$array = Array 
    		(
    			'entry' => Array
    				(
    					'content' => Array
    						(
    							'm:properties' => Array
    								(
    									'd:СтруктурнаяЕдиница'				=> $data['СтруктурнаяЕдиница'],
    									'd:СтруктурнаяЕдиница_Type'			=> "StandardODATA.Catalog_БанковскиеСчета",
    									'd:ВалютаДокумента_Key'				=> "9af5b7f8-e570-11e1-b16a-6431507e6097", // TODO: get by ODATA
    									'd:ДоговорКонтрагента_Key'			=> $data['ДоговорКонтрагента_Key'],
    									'd:Автор_Key'						=> $data['Автор_Key'],
    									'd:Ответственный_Key'				=> $data['Автор_Key'],
    									'd:Контрагент_Key'					=> $data['Контрагент_Key'],
    									'd:Организация_Key'					=> $data['Организация_Key'],
    									'd:Склад_Key'						=> $data['Склад_Key'],
    									'd:ТипЦен_Key'						=> "00000000-0000-0000-0000-000000000000",
    									'd:СтруктурноеПодразделение_Key'	=> "00000000-0000-0000-0000-000000000000",
    									'd:КодНазначенияПлатежа'			=> $data['КодНазначенияПлатежа'],
    									//'d:СуммаДокумента'					=> "111111111",//$data['СуммаДокумента'],
    									'd:Date'							=> date("c"),
    									'd:Комментарий'						=> $data['НомерЗаказа']."\n".$data['Комментарий'],
    									'd:АдресДоставки'					=> "",
    									
    									'd:УчитыватьНДС'					=> "true",
    									'd:УчитыватьАкциз'					=> "false",
    									'd:СуммаВключаетАкциз'				=> "false",
    									'd:СуммаВключаетНДС'				=> "true",
    									'd:DeletionMark'					=> "false",
    									'd:Posted'							=> "false",
    									'd:КратностьВзаиморасчетов'			=> "1",
    									'd:КурсВзаиморасчетов'				=> "1",
    									'd:Number'							=> "",
    									'd:DataVersion'						=> "",
    									
    									'd:Услуги' => Array
    										(
    											'@value' => "",
    											'@attributes' => Array
    												(
    													'm:type' => "Collection(StandardODATA.Document_СчетНаОплатуПокупателю_Услуги_RowType)"
    												)
    										),
    
    									'd:ОС' => Array
    										(
    											'@value' => "",
    											'@attributes' => Array
    												(
    													'm:type' => "Collection(StandardODATA.Document_СчетНаОплатуПокупателю_ОС_RowType)"
    												)
    
    										),
    
    									'd:Товары' => Array
    										(
    											'd:element' => Array (),
    											'@attributes' => Array
    												(
    													'm:type' => "Collection(StandardODATA.Document_СчетНаОплатуПокупателю_Товары_RowType)"
    												)
    
    										),
    									'@attributes' => array
    										(
    											'xmlns:d' => "http://schemas.microsoft.com/ado/2007/08/dataservices",
    											'xmlns:m' => "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
    										)
    								),
    
    							'@attributes' => Array
    								(
    									'type' => "application/xml"
    								)
    
    						)
    
    				)
    
    		);
    		
    		$i=1;
    		foreach ($data['rows'] as $row)
    		{
    			$element = Array
    			(
    				'd:LineNumber' => $i,
    				'd:СтавкаАкциза_Key' => "00000000-0000-0000-0000-000000000000",
    				'd:СуммаАкциза' => "0",
    				'd:Коэффициент' => 1,
    				'd:Номенклатура_Key' => $row['Номенклатура_Key'],
    				'd:СтавкаНДС_Key' => $row['СтавкаНДС_Key'],
    				'd:ЕдиницаИзмерения_Key' => $row['ЕдиницаИзмерения_Key'],
    				
    				'd:Количество' => $row['Количество'],
    				'd:Цена' => $row['Цена'],
    				'd:Сумма' => $row['Сумма'],
    				'd:СуммаНДС' => $row['СуммаНДС'],
    				'@attributes' => Array
    				(
    					'm:type' => "StandardODATA.Document_СчетНаОплатуПокупателю_Товары_RowType"
    				)
    			);
    			
    			$array['entry']['content']['m:properties']['d:Товары']['d:element'][] = $element;
    			$i++;
    		}
    		
    		return $array;
    	}
  • Как правильно проверять заполненность формы на Javascript?

    Falseclock
    @Falseclock
    беглый взгляд на ваши исходники... а если домен в почте будет .рф?
  • Почему гугл карты загружаются не сразу?

    Falseclock
    @Falseclock
    либо, через JS инициировать карту ПОСЛЕ того, как там установился параметр display:inline
  • Почему гугл карты загружаются не сразу?

    Falseclock
    @Falseclock
    и кстати, если у таба в стиле display:none, и он не первый открытый таб, то ничего и не будет грузиться. Вместо этого надо ставить visibility:hidden и дальше через CSS менять значения, как правило ставят или z-index в нижний порог, либо height в 1 или 0 и через transparency делают прозрачным... как-то так
  • Почему гугл карты загружаются не сразу?

    Falseclock
    @Falseclock
    dllweb: а что вы вставили вместо // put your code here?
  • Как обмениваться данными с web сайта и 1c?

    Falseclock
    @Falseclock
    Илья: а может здесь обсудим? ведь всем полезно будет
  • Как обмениваться данными с web сайта и 1c?

    Falseclock
    @Falseclock
    1 соапа есть одно основное преимущество: он описан в XML и мы можем применять к нему XSLT. Но за такую хорошую фишку приходится платить большим объемом передачи данных. Другое дело JSON, например. Но там чтобы описать нормально поле, то есть integer или string значение, тоже надо изобретать велосипед. Например у всех интерпретаторов есть флаги, где можно указать как парсить те или иные значения, но проблема в том, что флаг применяется ко всем данным без разбора. А увеличивая объем передаваемых данных - мы не можем контролировать везде ли мы позаботились о том, чтобы данные правильно трактовались. JSON - это по сути тот же самый SOAP, только укороченный и более понятен, но не имеет параметров. Так что SOAP более универсален между разными средами и легко подстраивается если правильно описать данные в XSLT.
  • Как обмениваться данными с web сайта и 1c?

    Falseclock
    @Falseclock
    Антон: я вообще про SOAP. OData REST API - это другая тема и даже песня.
  • Как обмениваться данными с web сайта и 1c?

    Falseclock
    @Falseclock
    Отличный протокол... Универсален! Не надо придумывать велосипеды и изобретать космолеты. В работе по AJAX или WebSocket - просто песня! Быстро, информативно, легко интегрируемо.
  • Как обмениваться данными с web сайта и 1c?

    Falseclock
    @Falseclock
    Вот часть класса, и один из методов, который вытаскивает единицы измерения из 1С

    Info::me()->vars - это обращение к конфигу где хранятся значения
    $INFO['erp_url'] 				=   'http://crm.beta/odata/';
    $INFO['erp_service'] 			=   'http://crm.beta/service/';
    $INFO['erp_user'] 				=   'admin';
    $INFO['erp_password'] 			=   'password';


    class Data1c extends Singleton implements Instantiatable
    {
    	private static $retry = 0;
    
    	public static function Units()
    	{
    		$url = 'Catalog_КлассификаторЕдиницИзмерения?$format=application/json';
    		$url .= '&$select=Ref_Key, Description, НаименованиеПолное';
    		$data = self::_getJsonData($url);
    		
    		$struct = [];
    		
    		foreach ($data['value'] as $row)
    		{
    			$new  = [];
    
    			$new['id'] = $row['Ref_Key'];
    			$new['name'] = $row['НаименованиеПолное'] . " ({$row['Description']})";
    			$new['desc'] = $row['Description'];
    			
    			if ($row['НаименованиеПолное']) {
    				$struct[] = $new;
    			}
    		}
    		
    		return $struct;
    	}
    
    	public static function finish()
    	{
    		if (Info::me()->vars['erp_sessions']) { 
    			self::RequestODATA("",null,"GET","finish");
    		}
    	}
    	
    	private static function _getJsonData($url,$service="odata")
    	{
    		if ($service == "hs") {
    			return json_decode(self::RequestSERVICE($url),true);
    		} else {
    			return json_decode(self::RequestODATA($url),true);
    		}
    	}
    	
    	public static function RequestODATA($url, $content=null, $method="GET", $state = "start")
    	{
    		$url = Info::me()->vars['erp_url'] . self::myUrlEncode($url);
    		
    		return self::Request($url, $content, $method, $state);
    	}
    	
    	public static function RequestSERVICE($url, $content=null, $method="GET", $state = "start")
    	{
    		$url = Info::me()->vars['erp_service'] . self::myUrlEncode($url);
    		
    		return self::Request($url, $content, $method, $state);
    	}
    	
    	// функция обращения к сайту
    	private static function Request($url, $content, $method, $state)
    	{
    		//FIXME: вывод эксепшина при получении нулевой длины
    		$ch = curl_init();
    
    		curl_setopt($ch, CURLOPT_URL, $url);
    		curl_setopt($ch, CURLOPT_USERAGENT, 'CRM Internal');
    		curl_setopt($ch, CURLOPT_HTTPGET, true);
    
    		if ($content !== null) {
    			curl_setopt($ch, CURLOPT_POSTFIELDS, $content );
    		}
    		
    		switch ($method) {
    			case "POST":
    				curl_setopt($ch, CURLOPT_POST, true);
    				break;
    			case "PATCH":
    				curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PATCH');
    				break;
    			case "PUT":
    				curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
    				break;
    			case "GET":
    				curl_setopt($ch, CURLOPT_POST, false);
    				break;
    			default:
    				throw new Exception("Unknown method");
    				break;
    		}
    		
    		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    		curl_setopt($ch, CURLOPT_HEADER, 1);
    		curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    		curl_setopt($ch, CURLOPT_USERPWD, Info::me()->vars['erp_user'].":".Info::me()->vars['erp_password']);
    		
    		if (Info::me()->vars['erp_sessions']) { 
    			switch ($state) {
    				case "start":
    					self::$retry++;
    					
    					if (self::$retry > 3) {
    						throw new Exception("Too many connection retiries. Can't initiate session");
    					}
    					
    					if ($_SERVER['IBSession'] != null) {
    						curl_setopt($ch, CURLOPT_COOKIE, "ibsession=".$_SERVER['IBSession']);
    //						echo("Reusing session: ".$_SERVER['IBSession']."\n");
    					} else {
    						curl_setopt($ch, CURLOPT_HTTPHEADER, array('IBSession: start'));
    //						echo("Starting session\n");
    					}
    					$response  = curl_exec($ch);
    
    					$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    					$header = substr($response, 0, $header_size);
    					$body = substr($response, $header_size);
    					
    					$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    					
    //					echo("HTTP code: $httpcode\n\n");
    					
    					if ($httpcode == 0) { throw new Exception("No connection"); }
    					if ($httpcode == 406) { throw new Exception("406 Not Acceptable. ERP can't initiate new session"); }
    					if ($httpcode == 400 ) {$_SERVER['IBSession'] = null; return self::Request($url,$content,$method,"start"); } 
    					
    					preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $header, $matches);
    					
    					$cookies = array();
    					foreach($matches[1] as $item) {
    						parse_str($item, $cookie);
    						$cookies = array_merge($cookies, $cookie);
    					}
    					if ($cookies['ibsession']) {
    //						echo("Cookie: ".$cookies['ibsession']."\n");
    						$_SERVER['IBSession'] = $cookies['ibsession'];
    					}
    					
    					curl_close($ch);
    					self::$retry = 0;
    					return ($httpcode>=200 && $httpcode<300) ? $body : false;
    					
    					break;
    				case "finish":
    					if ($_SERVER['IBSession'] != null) {
    						curl_setopt($ch, CURLOPT_COOKIE, "ibsession=".$_SERVER['IBSession']);
    						curl_setopt($ch, CURLOPT_HTTPHEADER, array('IBSession: finish'));
    						curl_exec($ch);
    						curl_close($ch);
    						$_SERVER['IBSession'] = null;
    					}
    					break;
    				default:
    					throw new Exception("Non standart IBSession header");
    					break;
    			}
    		} else {
    			$response  = curl_exec($ch);
    
    			$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    			$header = substr($response, 0, $header_size);
    			$body = substr($response, $header_size);
    			
    			$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    			
    			if ($httpcode == 0) { throw new Exception("No connection"); }
    			
    			curl_close($ch);
    			
    			return ($httpcode>=200 && $httpcode<300) ? $body : false;
    		}
    	 }
    	 
    	 private static function myUrlEncode($string) {
    		$entities = array('%20', '%27');
    		$replacements = array(' ', "'");
    		$string =  str_replace($replacements, $entities, $string);
    		
    		return $string;
    	}
    }
  • Как сделать подтверждение отправки формы?

    Falseclock
    @Falseclock
    Вот функция проверки почты на валидность.
    Но проверяет только почту на английском. Можно добавить директивы в регулярку А-Яа-я, так появились домены на русском
    function MailCheck(str) {
    
    	var at="@"
    	var dot="."
    	var lat=str.indexOf(at)
    	var lstr=str.length
    	var ldot=str.indexOf(dot)
    	var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
    
    	if (reg.test(str) == false)													{ return false; }
    	if (str.indexOf(at)==-1)													{ return false; }
    	if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr)		{ return false; }
    	if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr)	{ return false; }
    	if (str.indexOf(at,(lat+1))!=-1)											{ return false; }
    	if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot)		{ return false; }
    	if (str.indexOf(dot,(lat+2))==-1)											{ return false; }
    	if (str.indexOf(" ")!=-1)													{ return false; }
    
     	return true;
    }
    </code
  • Как правильно подключить JS?

    Falseclock
    @Falseclock
    Kejin: не в курсе где у вас загружается код, то нужно его обернуть, чтобы он срабатывал, когда страница полностью загрузилась

    document.observe
    (
    	"dom:loaded", 
    	function()
    	{
    		$("#newsticker").jCarouselLite({
    				vertical: true,
    				btnPrev: "#news-prev",
    				btnNext: "#news-next",
    				visible: 3,
    				auto:3000,
    				speed:500    
    			}); 
    			
    		$("#style-grid").click(function(){
    
    		});
    		$("#style-list").click(function(){
    			
    		$("#block-tovar-grid").hide();    
    			
    			
    		});
    	} 
    );
  • Как сделать запоминание положения блока?

    Falseclock
    @Falseclock
    только надо учесть, что после рестарта сервера переменная будет пустая. Если нужно постоянное хранение, то в базе или в файле как посоветовал Максим Тимофеев
  • Как сделать запоминание положения блока?

    Falseclock
    @Falseclock
    Максим Тимофеев: самый простой и не требующий ничего лишнего - сохранять в переменной сервера. В случае с PHP это $_SERVER['BoxPosition'] = "x;y";
  • Как правильно подключить JS?

    Falseclock
    @Falseclock
    Kejin: Uncaught TypeError: Cannot read property 'offsetHeight' of undefined означает, что жаваскрипт не может найти поле с id newsticker и еще раз повторю: hoverPause - нет такого параметра в указанной библиотеке