I'm in traineeship in a company and I need to used the program of another trainee who programmed it in 2012. So I have done some update but I have a some problems :
When I press a button, I have a JS that make a xhr.get to recover a JSON. But I have this message on my firefox console :
Object { message: "Unable to load /query/?typeForm=com…", stack:".cache["dojo/errors/create"]/</</g#…", response: Object, status: 0,responseText: "", xhr: XMLHttpRequest }
My JS :
function queryDataGrid(map, stringForm) {
var test = "pouet";
require(["dojox/grid/DataGrid",
"dojo/store/Memory",
"dojo/data/ObjectStore",
"dojo/_base/xhr",
"dojo/domReady!",
"dojo/dom",
"dojo/_base/array"],
function(DataGrid, Memory, ObjectStore, xhr, arrayUtil, dom) {
var nodeDomGrid = dom.byId("datagrid");
window.alert("hey");
xhr.get({
url: "/query/",
form: dom.byId(stringForm),
handleAs: "json",
load: function(data) {
var nodeDomGrid = dom.byId("datagrid");
var nodeGrid = dijit.byId("datagrid");
var gridLayout = [];
var dataStore = new ObjectStore({ objectStore:new Memory({ data: data.fields }) });
console.log("store");
console.log(data.fields[0][1]);
globalData = data;
for(i in data.columns) {
gridLayout.push({
name: data.columns[i],
field: data.columns[i],
width: "auto"
})
}
nodeGrid.setStructure(gridLayout);
nodeGrid.setStore(dataStore);
var nodeMap = dom.byId("map");
columns = data.columns;
columnsToDisplay = []
numberColumn = 0;
for (i in columns) {
if (columns[i] == "Distance Fin") {
numberColumn = i
}
if (parseInt(i) > parseInt(numberColumn) && numberColumn != 0) {
columnsToDisplay.push({ value: columns[i], label: columns[i]});
}
}
dijit.byId("dataToColor").addOption(columnsToDisplay);
var vectorLayer = map.getLayersByName("KML")[0];
vectorLayer.removeAllFeatures();
var kmlFile = createKMLFile(data.kmldata, dom.byId("hiddenColor").value, dom.byId("sizeLine").value, dom.byId("colourPR").style.backgroundColor, dom.byId("sizePR").value);
var features = KMLToFeatures(kmlFile);
var bounds;
for(var i=0; i<features.length; ++i) {
if (!bounds) {
bounds = features[i].geometry.getBounds();
} else {
bounds.extend(features[i].geometry.getBounds());
}
}
vectorLayer.addFeatures(features);
console.log(vectorLayer);
map.zoomToExtent(bounds);
refreshLayer(vectorLayer);
if (stringForm == "commonQueriesForm" && dijit.byId("table").get("value") == "location") {
dom.byId("colourPalette").style.display = "block";
dom.byId("styleKML").style.display = "none";
}
else {
dom.byId("colourPalette").style.display = "none";
dom.byId("styleKML").style.display = "block";
}
},
// Message d'erreur à modifier
error: function() {
nodeDomGrid.innerHTML = "La requête a engendré une erreur.";
}
})
});
console.log(stringForm);
};
My Form :
<form id="commonQueriesForm" data-dojo-type="dijit.form.Form" onload="alert('test')">
<p>
<div id="commonDataTitlePane" data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Requêtes'">
<input type="text" name="typeForm" id="typeForm" value="common" style="display:none" />
<select name="table" id="table" class="cSelect" data-dojo-type="dijit/form/Select"
data-dojo-props="onChange:function(){ if (dijit.byId('table').get('value') == 'location') {dijit.byId('age').set('disabled', true); } else {dijit.byId('age').set('disabled', false); }}">
{% for key, value in dictTablesDatabase.items %}
<option value="{{ key }}">{{ key }}</option>
{% endfor %}
<option value="location">Repérages</option>
</select><br />
<select name="road" id="road" class="cSelect" data-dojo-type="dijit.form.Select" data-dojo-props="">
<option value="all">Toutes les routes</option>
{% for road in listRoad %}
<option value="{{ road|first|cut:' ' }}">{{ road|first|cut:' ' }}</option>
{% endfor %}
</select><br />
<select name="age" id="age" class="cSelect" data-dojo-type="dijit.form.Select" data-dojo-props="">
{% for age in arrayNumber %}
<option value="{{ age }}">{{ age }}</option>
{% endfor %}
</select>
</div>
<button type="executeButton" data-dojo-type="dijit.form.Button" onClick="queryDataGrid(map, 'commonQueriesForm');">Lancer la requête</button>
</p>
</form>
urls.py :
from django.conf.urls import include, url
from GSRBaseWeb.Home import views as myapp_views
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()
urlpatterns = [
# Examples:
# url(r'^$', 'GSRBaseWeb.views.home', name='home'),
# url(r'^GSRBaseWeb/', include('GSRBaseWeb.foo.urls')),
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
# url(r'^admin/', include(admin.site.urls)),
url(r'^home/$',myapp_views.home, name='home'),
url(r'^home/query', myapp_views.queryDataGrid, name='queryDataGrid'),
]
views.py :
# -*- coding: utf-8 -*-
from django.shortcuts import render
from django.http import HttpResponse
from GSRBaseWeb.Utils.utils import Utils
from GSRBaseWeb.DataAccess.databaseAccess import DatabaseAccess
from GSRBaseWeb.DataAccess.GSRBaseDLLAccess import GSRBaseDLLAccess
from ctypes import *
# Envoie les données nécessaires aux différents formulaires
def home(request):
dictToSend = {}
data = DatabaseAccess()
dictTablesDatabase = data.dataToDisplay()
dictToSend["dictTablesDatabase"] = dictTablesDatabase
# Sélection de l'ensemble des routes
queryRoads = "SELECT id_route, nom FROM routes"
listRoad = data.executeQuery(queryRoads)
dictToSend["listRoad"] = listRoad
# Liste pour les âges
arrayNumber = []
i = 0
while i < 20:
arrayNumber.append(i)
i += 1
arrayNumber.append("Tous")
dictToSend["arrayNumber"] = arrayNumber
# Liste pour les emplacements
arrayLocation = ["Tous", " ", "D", "C", "G"]
dictToSend["arrayLocation"] = arrayLocation
return render(request, 'Home/home.html', context=dictToSend)
# Récupère le contenu d'un formulaire et le traite en fonction du type de formulaire (commun, simple ou complexe)
def queryDataGrid(request):
# request.GET renvoie un QueryDict (objet Django)
print("YOLO")
parametersContent = request.GET
whatForm = parametersContent.getlist("typeForm")[0]
print(type(whatForm))
try:
accessDLL = GSRBaseDLLAccess()
except:
print(Exception.message())
if whatForm == "common":
table = parametersContent.getlist("table")[0]
road = parametersContent.getlist("road")[0]
if table != "location":
if parametersContent.getlist("age")[0] == "Tous":
age = 20
print("True")
else:
print("False")
age = int(unicode(parametersContent.getlist("age")[0]))
if road == "all":
road = ""
# on fait une requête sur les repérages
if table == "location":
result, number = accessDLL.requete_reperage(road)
else:
result, number = accessDLL.requete_table(table, road, age)
elif whatForm == "simple":
"""
On fait le traitement du formulaire de requêtes simples
Prendre en compte des ajouts des formulaires
On va prendre en compte les différentes lignes du formulaire et leur nombre """
listConditions = []
# Lignes des données
listQueries = dataProcessingForm("Simple", parametersContent)
# Checkout et les routes
conditionCheckout = parametersContent.getlist("conditionCheckout")[0]
conditionRoad = parametersContent.getlist("conditionRoad")[0]
conditionRoad = 'ROUTE()="' + conditionRoad + '"'
listConditions.append(conditionRoad)
# Lignes des conditions
j = 1
while j < 6:
if parametersContent.__contains__("conditionData" + str(j)) == True:
data = parametersContent.getlist("conditionData" + str(j))[0]
# On récupère la table de la condition
table = data.split(":")[0]
location = parametersContent.getlist("conditionLocation" + str(j))[0]
age = parametersContent.getlist("conditionAge" + str(j))[0]
condition = parametersContent.getlist("condition" + str(j))[0]
value = parametersContent.getlist("valueCondition" + str(j))[0]
conditionLine = "(" + data + condition
if (str(value).isdigit()):
conditionLine += str(value)
else:
conditionLine += '"' + str(value) + '"'
conditionLine += ' ET ' + table + ':generation=' + str(age) + ' ET ' + table + ':emplacement="' + location + '")'
if conditionCheckout == "anything":
conditionLine += "NON" + conditionLine
listConditions.append(conditionLine)
else:
break;
j += 1
##todo modifier la condition pour la Route(), ajouter un ET tout le temps
if conditionCheckout == "atLeast":
conditionQuery = ' OR '.join(listConditions)
elif conditionCheckout == "all":
conditionQuery = ' ET '.join(listConditions)
result, number = accessDLL.requete_avancee(listQueries, conditionQuery)
elif whatForm == "complex":
# On fait le traitement du formulaire de requêtes complexes
listQueries = dataProcessingForm("Complex", parametersContent)
conditionQuery = parametersContent.getlist("textareaConditions")[0]
result, number = accessDLL.requete_avancee(listQueries, conditionQuery)
json = ""
if number[0] > 0:
# json à renvoyer en fonction des données des formulaires
listResult = []
i = 0
while i <= number[0]:
listResult.append(result[i])
i += 1
json = Utils.jsonSerializeQueryResult(listResult)
print(json)
return HttpResponse(content=json,
status=200,
mimetype="text/plain")
def dataProcessingForm(form, parametersContent):
""" Mise en forme des données des formulaires pour les requêtes
La mise en forme est faite pour la DLL utilisée qui effectue le plus gros des requêtes
"""
listQueries = []
i = 1
while i < 6:
if parametersContent.__contains__("data" + form + str(i)) == True:
data = parametersContent.getlist("data" + form + str(i))[0]
location = parametersContent.getlist("location" + form + str(i))[0]
if parametersContent.getlist("age" + form + str(i))[0] == "Tous":
age = 20
else:
age = int(unicode(parametersContent.getlist("age" + form + str(i))[0]))
contentToAdd = data + "," + location + "," + str(age)
print(contentToAdd)
listQueries.append(contentToAdd)
else:
break;
i += 1
return ";".join(listQueries)
The JS code is trying to load the absolute path /query/, but your Django patterns are setup to respond to ^home/query. Try using /home/query as your xhr URL.
Related
I had another post with my project (container bound script) but this time I've tried to do the other way when I modify a Google Doc table section (when I tick in column J) it will modify the line in the Google Sheet because each line corresponds to a Google Doc project. It's the column J; I set a trigger to view the Google Doc in the same window and I can modify inside the thing is that when I close the Google Doc it's not modifying instantly the line of the Google Sheet.If I tick another time ; this is the one moment it modifies the line so the problem is that it has a delay of a tick. To see it :
1) log google make copy Tools -> Script editor set trigget view_doc_and_edit -> from spreadsheet on edit >>>
2) now if you click for a doc in the colum J you can see the google doc corresponding and we can modify it
3) we close we look in the table nothing changed and if we click another time the same place(row) it will change the row.
I know that for the Google Doc onEdit doesn't exist and I've tried to do by this way any idea is welcomed to modify in the same time to have an interactive tool
This is my project
https://docs.google.com/spreadsheets/d/1k_kj98U__0Bk44gh0qRFpaVx0ru3sN1pSPGiMQwimxo/edit?usp=sharing
var TITLE = 'Show Google Doc';
var SPREADSHEET_ID = "1k_kj98U__0Bk44gh0qRFpaVx0ru3sN1pSPGiMQwimxo"; // = assign your spreadsheet id to this variable
var column_name_project ;
var column_code_project ;
var column_chef_project;
var column_service ;
var column_other_services ;
var column_type_of_project ;
var column_perimeter ;
var column_date_project ;
var COLUMN_URL ;
/** will return the number of the column correspondant **/
function find_columns_in_projet(){
var tss = SpreadsheetApp.openById(SPREADSHEET_ID);
var sheet = tss.getSheets()[0];
var lastColumn = sheet.getLastColumn();
var data = sheet.getRange(1,1,1,lastColumn).getValues()[0];
for(var n=0;n<data.length;n++){
if(data[n].toString().indexOf('Name project') > -1)
column_name_project = n+1;
else if(data[n].toString().indexOf('Code') > -1)
column_code_project = n + 1;
else if(data[n].toString().indexOf('Chef') > -1)
column_chef_project= n + 1;
else if(data[n].toString().indexOf('Service') > -1)
column_service = n +1 ;
else if(data[n].toString().indexOf('Other services') > -1)
column_other_services = n + 1;
else if(data[n].toString().indexOf('Type of the project') > -1)
column_type_of_project = n + 1;
else if(data[n].toString().indexOf('Perimeter') > -1)
column_perimeter = n + 1;
else if(data[n].toString().indexOf('Date') > -1)
column_date_project = n + 1;
else if(data[n].toString().indexOf('URL') > -1)
COLUMN_URL = n +1 ;
}
}
/** pour visualiser le document sur la meme page **/
function view_doc_and_edit(event) {
find_columns_in_projet();
Logger.log("!! La colonne URL est: !!" + COLUMN_URL );
if( ( event.range.getSheet().getName() === "Sheet1" ) && ( event.range.getColumnIndex() == COLUMN_URL +1 ) ) {
if( event.value === "TRUE" ) {
try {
var URL = event.range.offset(0,-1,1,1).getValue();
Logger.log('The URL is : ' + URL );
var google_doc = DocumentApp.openByUrl(URL) ;
var body = google_doc.getBody();
Logger.log('The body is ' + body );
// Add this line
var ui = HtmlService.createTemplateFromFile('ModeLessDialog');
ui.body = URL; // Pass url to template
ui = ui.evaluate().setWidth(1000).setHeight(500);
SpreadsheetApp.getUi().showModalDialog(ui, TITLE);
var insertion_position = event.range.getRow() ;
var tss_bis = SpreadsheetApp.openById(SPREADSHEET_ID);
var sheet_bis = tss_bis.getSheets()[0];
var numRows_bis = sheet_bis.getLastRow();
var lastColumn_bis = sheet_bis.getLastColumn();
//from the second line car the first line we have the headers
var data_sheet = sheet_bis.getRange(1,1,numRows_bis,lastColumn_bis).getDisplayValues();
if(body)
{
var ok = 0; //pour l'instant il n'y a pas de tableau trouvé (avec 8 lignes) qui nous interesse pour mettre à jour dans la feuille de calcul
var numChildren=body.getNumChildren();
var compteur=0;
//tant qu'on n'a pas du tableau on va parcourir (car on n'est pas sur d'avoir le 4 comme enfant (Numero_Enfant_Tableau_Template) car l'utilisateur pourra modifier/insérer un prargraphe une image etc.
while(ok ==0 && compteur<numChildren)
{
var child=body.getChild(compteur);
/** ============On est concerné par le premier tableau seulement qui a au plus 8 lignes d'information ================**/
Logger.log('Le type dans la boucle ' + child.getType());
//on a trouvé un tableau qui nous interesse et qui a au plus 8 lignes d'information **/
if(child.getType()==DocumentApp.ElementType.TABLE && child.asTable().getNumRows() >= 8)
{
//on a trouve notre premier tableau la variable ok = 1
ok=1;
/** Le nombre de lignes dans le premier tableau avec au plus 8 lignes qui nous interessent **/
var numrows = child.asTable().getNumRows();
Logger.log('Le nombre de lignes dans notre Google Doc ' + numrows);
/** on va parcourir notre tableau pour récuperer les champs qui nous interessent **/
var k = 1; //on sait que c'est l'information à droite qui nous interessent on va éviter une boucle inutile
var celltxt,trange;
/** On va mettre la valeur du celltxt dans le spreadsheet et on va ajuster automatiquement la colonne avec la méthode autoResizeColumn **/
celltxt=child.asTable().getCell(0, k).editAsText().getText();
Logger.log('La valeur (à droite) dans le tableau ' + celltxt);
trange = sheet_bis.getRange(insertion_position, column_name_project); //l'emplacement correspondant
trange.setValue(celltxt);
celltxt=child.asTable().getCell(1, k).editAsText().getText();
Logger.log('La valeur (à droite) dans le tableau ' + celltxt);
trange = sheet_bis.getRange(insertion_position, column_code_project); //l'emplacement correspondant
trange.setValue(celltxt);
celltxt=child.asTable().getCell(2, k).editAsText().getText();
Logger.log('La valeur (à droite) dans le tableau ' + celltxt);
trange = sheet_bis.getRange(insertion_position, column_chef_project); //l'emplacement correspondant
trange.setValue(celltxt);
celltxt=child.asTable().getCell(3, k).editAsText().getText();
Logger.log('La valeur (à droite) dans le tableau ' + celltxt);
trange = sheet_bis.getRange(insertion_position, column_service); //l'emplacement correspondant
trange.setValue(celltxt);
celltxt=child.asTable().getCell(4, k).editAsText().getText();
Logger.log('La valeur (à droite) dans le tableau ' + celltxt);
trange = sheet_bis.getRange(insertion_position, column_other_services); //l'emplacement correspondant
trange.setValue(celltxt);
celltxt=child.asTable().getCell(5, k).editAsText().getText();
Logger.log('La valeur (à droite) dans le tableau ' + celltxt);
trange = sheet_bis.getRange(insertion_position, column_type_of_project); //l'emplacement correspondant
trange.setValue(celltxt);
celltxt=child.asTable().getCell(6, k).editAsText().getText();
Logger.log('La valeur (à droite) dans le tableau ' + celltxt);
trange = sheet_bis.getRange(insertion_position, column_perimeter); //l'emplacement correspondant
trange.setValue(celltxt);
celltxt=child.asTable().getCell(7, k).editAsText().getText();
Logger.log('La valeur (à droite) dans le tableau ' + celltxt);
trange = sheet_bis.getRange(insertion_position, column_date_project); //l'emplacement correspondant
trange.setValue(celltxt);
}
compteur++; /** on va incrementer le compteur jusqu'à on trouve le tableau qui nous interessent **/
}
}
event.range.setValue("FALSE");
}
catch(err) {
Logger.log(err);
}
}
}
google_doc.saveAndClose();
}
can you guys help me, I am not really a JS dev so i am polling my hair out with this one.
i'm working with Ajax to display data from a json file...but it doesn't work, i put console.log almost everywhere to see result but it won't work, here's my code:
encode data:
// Inclusion du ficher de fonction permettant de démarrage du contexte de l'applicaiton
Include $_SERVER["DOCUMENT_ROOT"].DIRECTORY_SEPARATOR."Includes".DIRECTORY_SEPARATOR."Functions".DIRECTORY_SEPARATOR."functions.php";
// Initialisation des variables
$action = '';
$pValue = '';
$pType = '';
$pRegion = '';
$currenthyperviseur = new hyperviseur();
$currentregion = new region();
// Récupération de l'action passée au webservice
if(isset($_REQUEST['action']) && $_REQUEST['action']!= "") {$action = $_REQUEST['action']; }
if(isset($_REQUEST['pValue']) && $_REQUEST['pValue']!= "") {$pValue = base64_decode($_REQUEST['pValue']); }
if(isset($_REQUEST['pType']) && $_REQUEST['pType']!= "") {$pType = $_REQUEST['pType']; }
if(isset($_REQUEST['pRegion']) && $_REQUEST['pRegion']!= "") {$pRegion = $_REQUEST['pRegion']; }
// Gestion de l'ensemble des cases du web service
switch($action)
{
//
// Permet la récupération de données dans l'Hyperviseur (GET)
//
case 'H_getAlmBacPFull' : echo json_encode($currenthyperviseur->getListAlarmeBac(1)); break;
case 'H_getAlmBacTFull' : echo json_encode($currenthyperviseur->getListAlarmeBac(2)); break;
case 'H_getGrpBacTFull' : echo json_encode($currenthyperviseur->getListAlarmeQualifBac()); break;
case 'H_getAlmDetails' : echo json_encode($currenthyperviseur->getAlarmeDetails($pValue)); break;
case 'H_getGrpDetails' : echo json_encode($currenthyperviseur->getGroupeDetails($pValue)); break;
//
// Permet la MAJ de données dans l'Hyperviseur (SET)
//
case 'H_setCheckAlm' : echo $currenthyperviseur->setAlarmeCheckAction($pValue); break;
case 'H_setGroupAlm' : echo $currenthyperviseur->setGroupAlarme($pValue); break;
case 'H_setAlmIdGrp' : echo $currenthyperviseur->setAlarmeIdGrp($pValue); break;
//
// Permet la récupération de données pour le module 'HyperViseur MoreDetails' (GET)
//
case 'HVMD_getContentBloc' : echo json_encode($currenthyperviseur->getContentBloc($pType, $pValue)); break;
//
// Permet la récupération de données pour le module 'Region' (GET)
//
case 'R_getListContentBloc' : echo json_encode($currentregion->getListContentBloc($pType)); break;
case 'R_getContentBloc' : echo json_encode($currentregion->getContentBloc($pType, $pRegion)); break;
//
// Permet la récupération de données pour le module la map des régions
//
case 'dashMap_getSite' : echo json_encode($dashMap_getSite($pRegion); break;
}
function dashMap_getSite($pRegion) to get data:
$dataArray = array();
if($pRegion == 'all')
{
$dataLine = array();
$dataLine['codeSite'] = "01014";
$dataLine['latitude'] = '46.2625';
$dataLine['longitude'] = '5.6380';
$dataLine['nom'] = 'Oyonnax 2';
$dataLine['nbAlm'] = 10;
$dataLine['critilevel'] = 2;
array_push($dataArray, $dataLine);
$dataLine = array();
$dataLine['codeSite'] = "04025";
$dataLine['latitude'] = '44.4242';
$dataLine['longitude'] = '6.7533';
$dataLine['nom'] = 'Barcelonette 3 Est TDF';
$dataLine['nbAlm'] = 0;
$dataLine['critilevel'] = 1;
array_push($dataArray, $dataLine);
}
return $dataLine;
And this second function getArrayOfSiteAjax() to display it with ajax
console.log(gWsProviderUrl);
$.ajax({
url: gWsProviderUrl + '?action=dashMap_getSite&pRegion=all',
type: 'POST',
dataType: 'json',
success:function(data){
console.log('arrayOfSite');
arrayOfSite = data;
$.each(arrayOfSite, function(currentIdx, currentValue){
console.log('codeSite => ' + currentValue.codeSite );
console.log('latitude => ' + currentValue.latitude );
console.log('longitude => ' + currentValue.longitude );
console.log('nom => ' + currentValue.nom );
console.log('nbAlm => ' + currentValue.nbAlm );
console.log('critilevel => ' + currentValue.critilevel);
});
console.log('heyy');
}
});
Thank you !
case 'dashMap_getSite' : echo json_encode($dashMap_getSite($pRegion); break;
That's a syntax error and should probably be
case 'dashMap_getSite' : echo json_encode(dashMap_getSite($pRegion)); break;
Because there was an error, the success callback didn't get called, an you don't get a message.
To display the data, you could do something like this:
// ...
success: function (data) {
var container = $('#container'); // the element in which you want to display the data
// loop over each item in the array
$.each(data, function (index, element) {
var outer = $('<div />');
// element is an object, loop over its properties
$.each(element, function (key, value) {
var inner = $('<div />');
inner.text(key + ': ' + value);
outer.append(inner);
})
container.append(outer);
});
}
// ...
I have documents in which i need to highlight that a person was quoted. So I'm looking for all text that's enclosed by quotes...I'm using the below code, which works but it only captures the first occurence..
var str = 'L\'armée sud-coréenne accuse la Corée du Nord d\'avoir lancé \"plusieurs\" missiles \"balistiques interdits qui ont franchi une distance\" d\'environ 1000 kilomètres avant de tomber au \"large de la côte est du pays communiste.\" '
var reg = new RegExp(/"(.*?)"/);
var matches = str.match(reg);
for (var i = 0; i < matches.length; i++) {
var s = matches[i];
str = str.replace(matches[i], '<span style="color:blue">' + matches[i] + '</span>');
matches[i] = s;
}
Make your Regex global:
The g modifier is used to perform a global match (find all matches rather than stopping after the first match).
var str = 'L\'armée sud-coréenne accuse la Corée du Nord d\'avoir lancé \"plusieurs\" missiles \"balistiques interdits qui ont franchi une distance\" d\'environ 1000 kilomètres avant de tomber au \"large de la côte est du pays communiste.\" '
var reg = new RegExp(/"(.*?)"/g); //notice /g, making the expression global
var matches = str.match(reg);
for (var i = 0; i < matches.length; i++) {
var s = matches[i];
str = str.replace(matches[i], '<span style="color:blue">' + matches[i] + '</span>');
matches[i] = s;
}
document.getElementById("myDiv").innerHTML = str;
Making your expression global guarantees all instances of the quotes match.
JSFiddle: https://jsfiddle.net/zjxjub96/
To illustrate what #Casimir says in his comment, here is a little example:
var str = 'L\'armée sud-coréenne accuse la Corée du Nord d\'avoir lancé \"plusieurs\" missiles \"balistiques interdits qui ont franchi une distance\" d\'environ 1000 kilomètres avant de tomber au \"large de la côte est du pays communiste.\" '
str = str.replace(/"(.*?)"/g, '<span style="color:blue">$&</span>')
document.getElementById("myDiv").innerHTML = str;
<div id="myDiv">
</div>
Notice that this way is easier, and doesn't require a for loop.
JSFiddle: https://jsfiddle.net/zjxjub96/1/
I've searching and trying other suggestions in StackOverflow.
Unfortunately the answers are not working for me. They are suggesting to use 'foreach' instead of 'for', but how could I... if I want to iterate just 50 times? :<
Well, I'll just paste the code and let's see if some good folk can help me.
JSLint was unable to finish.
Unexpected 'for'. for (var i=1;i<=50;i+=1){
line 6 column 8
Unexpected 'var'. for (var i=1;i<=50;i+=1){
line 6 column 13
"use strict";
var campo = [];
var ronda = 0;
// Llenamos el campo de 50 humanos/maquinas/extraterrestres = 150 jugadores
for (var i=1;i<=50;i+=1){
campo.push(new Human("h"+i));
campo.push(new Machine("m"+i));
campo.push(new Alien("e"+i));
}
// Array.prototype.suffle para barajar el Array
Array.prototype.shuffle = function() {
var input = this;
for (var i=input.length-1;i>=0;i-=1){
var randomIndex = Math.floor(Math.random()*(i+1));
var itemAtIndex = input[randomIndex];
input[randomIndex]=input[i];
input[i] = itemAtIndex;
}
};
// Barajamos el Array campo
campo.shuffle();
// Comprobamos que quedan más de 1 jugador por ronda
while (campo.length>1) {
console.log("Iniciando ronda: " + ++ronda);
console.log(campo.length + " jugadores luchando.");
// Recorremos el campo, y luchamos
var muertos = 0;
for (var i=0; i<campo.length-1; i+=2){
// Caso de numero impar de jugadores:
// Por ejemplo cuando solo quedan 3 jugadores. Pelean 1 vs 2. El 3 se libra.
// - Si siguen vivos y aguantan otra ronda, se barajan las posiciones otra vez y
// vuelven a pelear dos. Y el nuevo tercero no pelea.
// - Si uno de los dos muere, en la siguiente ronda ya solo quedan 2, y pelean normal.
campo[i].fight(campo[(i+1)]);
// # descomentar solo la siguiente linea para hacer comprobaciones #
// console.log("["+ campo[i].username + "] VS ["+ campo[(i+1)].username + "]");
if (campo[i].health<=0) {
console.log("El " + campo[i].constructor.name + " llamado " + campo[i].showName() + " ha sido asesinado :<");
var fallecido = campo.splice(i, 1);
// # descomentar solo la siguiente linea para hacer comprobaciones #
//console.log(fallecido[0]);
i--; // como el array se hace pequeño, hay que corregir el error para que no se salte jugadores
muertos++;
} else {
if (campo[(i+1)].health<=0) {
console.log("El " + campo[(i+1)].constructor.name + " llamado " + campo[(i+1)].showName() + " ha sido asesinado :<");
var fallecido = campo.splice((i+1), 1);
// # descomentar solo la siguiente linea para hacer comprobaciones #
// console.log(fallecido[0]);
i--; // como el array se hace pequeño, hay que corregir el error para que no se salte jugadores
muertos++;
}
else {
// # descomentar solo la siguiente linea para hacer comprobaciones #
// console.log("Siguen vivos");
}
}
}
console.log("Fin de ronda!")
if (muertos === 1) {
console.log("Ha muerto " + muertos + " jugador.");
} else {
console.log("Han muerto " + muertos + " jugadores.");
}
// Al final de la ronda barajamos de nuevo
campo.shuffle();
}
if (campo.length === 1) {
console.log("Vaya!! Ha sido una memorable batalla!");
console.log("Después de tantos bits derramados y de " + ronda + " rondas... el jugador '" + campo[0].constructor.name + "' llamado '" + campo[0].showName() + "' se ha alzado con la victoria!!");
}
There are some other for in the code, but It seems to stop at the first one.
Thank you in advance!
Forgot to say, the code works PERFECT. But I was just validating it with JSLint, also 'tolerating' for warnings in JSLint doesn't work.
When you choose to tolerate for, the next thing it's warning you about is the global declaration of the var i. Since you've got the for-loop at the top-level, i becomes available everywhere in your program.
I'd just tolerate for and wrap it up an in IIFE. That way, i is only available inside this function, and doesn't leak out to the global scope.
(function() {
var i = 0;
for (i=1;i<=50;i+=1) {
campo.push(new Human("h"+i));
campo.push(new Machine("m"+i));
campo.push(new Alien("e"+i));
}
})();
You could also, barring using an existing implementation out there, create a function that generalizes the "repeat n times" definition.
function repeat(fn, n) {
var i = 0;
for (;i < n; i += 1) {
fn();
}
}
Use in your case would look like:
function initialize() {
campo.push(new Human("h"+i));
campo.push(new Machine("m"+i));
campo.push(new Alien("e"+i));
}
// then later
repeat(initialize, 50);
jslint is being overzealous (some would say), it expects all var statements to be at the top of a function.
You can tell jslint that you don't care about that rule by adding an instruction comment on the line above where you are declaring the variable.
// Llenamos el campo de 50 humanos/maquinas/extraterrestres = 150 jugadores
/*jslint for:true */
for (var i=1;i<=50;i+=1){
Or you can move all your var i; to the top of the file/function
For over a week I can not solve a problem with ajax . I have a form where the customer chooses the product to buy , the amount you are going to buy , and to what extent ( 1kg, 5kg, etc ) . Everything works properly, when you choose the product, the other two fields with the corresponding quantities and units will auto . When sending the form, tells me the following error:
The controller must return a response (null given). Did you forget to add a return statement somewhere in your controller?
I'll put all code , but actually the problem should be in the driver. To that reading is not so difficult to do , I will be commenting on each step.
1°: First, sending the form to the view. (obviously , first passes through the routing, but do not go if)
TablasController.php
public function pedidoAction()
{
$em = $this->getDoctrine()->getManager();
$prodped= new ProdPedido();//creo la entidad de los productos
$form = $this->createForm(new ProdPedidoType(), $prodped);
$nombres = $em->getRepository('ProyectoAdminBundle:Catalogo')->findByArticulo();
return $this->render('AtajoBundle:General:pedido.html.twig', array('form' => $form->createView(), 'nombres' => $nombres));
}
2°: I reduced a little code so that not so long . Here , I present the form, and make the corresponding javascript that handles dynamically add fields , and that I mentioned above, the auto-complete fields. Although this does not go much to the case , since the problem would be in the controller.
pedido.html.twig
{% block content %}
<section class="pedido">
<form id="formulario" action="{{ path('crear_pedido', { 'id': app.user.id } ) }}" method="post" {{ form_enctype(form) }}>
{{ form_start (form) }}
{{ form_errors(form) }}
<div id="agrega">
<ul>
<li>{{ form_label(form.producto, 'Nombre del producto: ') }}</li>
<li>{{ form_label(form.cantidad, 'Cantidad que va a llevar: ') }}</li>
<li>{{ form_label(form.valor, 'Valor en numero (KGS/LTS): ') }}</li>
</ul>
<ul class="ul_0">
<li>{{ form_widget(form.producto, { 'attr': {'class': 'producto_0'} }) }}</li>
<li>{{ form_widget(form.cantidad, { 'attr': {'class': 'cantidad_0'} }) }}</li>
<li>{{ form_widget(form.valor, { 'attr': {'class': 'medida_0'} }) }}</li>
</ul>
</div>
<div ><input id="agregarCampo" type="button" value="Agregar Producto"/></div>
<div ><input id="quitarCampo" type="button" value="Quitar Producto"/></div>
<div ><input id="enviar" type="submit" id="submit"/></div>
{{ form_end (form) }}
</section>
{% endblock %}
{% block javascripts %}
{{ parent() }}
<script type="text/javascript" src=" {{ asset('bundles/MICARPETA/js/jquery-2.1.4.min.js') }} "></script>
<script type="text/javascript">
$(document).ready(function() {
var loqueagrego;
var busqueda = $('#busqueda');
var contenedor = $("#agrega"); //ID del contenedor
var AddButton = $("#agregarCampo"); //ID del Botón Agregar
var QuitButton = $("#quitarCampo");
var productos = '{% for nombre in nombres %}<option value="{{ nombre.articulo }}"> {{ nombre.articulo }} </option>{% endfor %}';
var x = 1;
//agregar boton
$(AddButton).click(function (e) {
//el html que voy a agregar
loqueagrego = '<ul>';
loqueagrego = loqueagrego + '<li><label>Nombre del producto: </label></li>';
loqueagrego = loqueagrego + '<li><label>Cantidad que va a llevar: </label></li>';
loqueagrego = loqueagrego + '<li><label>Valor en numero (KGS/LTS): </label></li>';
loqueagrego = loqueagrego + '</ul>';
loqueagrego = loqueagrego + '<ul class="ul_'+x+'">';
loqueagrego = loqueagrego + '<li><select class="producto_0" name="producto[]">'+ productos +'</select></li>';
loqueagrego = loqueagrego + '<li><select class="cantidad_0" name="cantidad[]"></select></li>';
loqueagrego = loqueagrego + '<li><select class="medida_0" name="medida[]"></select></li>';
loqueagrego = loqueagrego + '</ul>';
//lo agrego
$(contenedor).append(loqueagrego);
x++; //sumo la cantidad de campos que hay
return false;
});
//quitar boton
$(QuitButton).click(function (e){
if (x !== 1){ // si es distinto a 1, remuevo los input que no deseo
$("#agrega ul:last-child").remove();
$("#agrega ul:last-child").remove();
x--;
}
return false;
});
//le digo que todos los que se agreguen dinamicamente tambien van a ser afectados
$('#agrega').on("change",".producto_0", function(e){
var elegido = $(this).val();
var medidahermano = $(this).parent().parent().attr("class");
var cantidadhermano = medidahermano;
medidahermano = $('.'+ medidahermano +' li:last-child');//recupero el ultimo hijo
medidahermano = medidahermano.children(1); //recupero el primer hijo
cantidadhermano = $('.'+ cantidadhermano +' li:nth-child(2)');
cantidadhermano = cantidadhermano.children(1);
var solido;
var liquido;
solido = '<option value="1">1</option>';
solido = solido + '<option value="5">5</option>';
solido = solido + '<option value="10">10</option>';
solido = solido + '<option value="15">15</option>';
solido = solido + '<option value="20">20</option>';
solido = solido + '<option value="30">30</option>';
solido = solido + '<option value="50">50</option>';
solido = solido + '<option value="100">100</option>';
liquido = '<option value="6">6</option>'
liquido = liquido + '<option value="12">12</option>';
liquido = liquido + '<option value="24">24</option>';
liquido = liquido + '<option value="48">48</option>';
liquido = liquido + '<option value="12">96</option>';
$.ajax({
type: "POST",
url: "{{ path('que_unidad') }}",
data: { 'id' : ' ' + elegido + ' ' },
error: function(){
alert("Error petición Ajax");
},
success: function(data){
alert(data);
if(data == 'KG' | data == 'unidad'){
$(cantidadhermano).html(solido);
}
else if(data == 'LTS'){
$(cantidadhermano).html(liquido);
}
$.ajax({
type: "POST",
url: "{{ path('medidas_y_unidades') }}",
data: { 'id' : ' ' + elegido + ' ' },
error: function(){
alert("Error petición ajax");
},
success: function(data){
$(medidahermano).html(data);
}
});
}
});
});
});
</script>
{% endblock %}
3°: This is where it is assumed that this error. For me it is the way to return the information to the ajax , but not really , because it seems like it's okay . Return information through a view, everything works fine , the fields will auto . But sending the form , I get this error.
TablasController.php
public function recuperarMedidasyUnidadesAction(){
$id = $_POST['id'];
$em = $this->getDoctrine()->getManager();
// busco las diferentes unidades que existen (1kg, 5kg, 10kg, etc)
$medidas = $em->getRepository('ProyectoAdminBundle:Unidades')->findByUnidadesJoinCatalogo($id);
return $this->render('AtajoBundle:Ajax:medidasYUnidades.html.twig', array('medidas' => $medidas));
}
public function recuperarUnidadAction(){
$id = $_POST['id'];
$em = $this->getDoctrine()->getManager();
// busco las diferentes unidades que existen (1kg, 5kg, 10kg, etc)
$unidad = $em->getRepository('ProyectoAdminBundle:Categoria')->findByUnidad($id);
return $this->render('AtajoBundle:Ajax:unidad.html.twig', array('unidad' => $unidad));
}
4°:views
medidasYUnidades.html.twig
{% for medida in medidas %}
<option value="{{ medida.medida }}">{{ medida.medida }}</option>
{% endfor %}
unidad.html.twig
{{ unidad.unidad }}
a response object requires data in an associative array. Your code gives an entity object. You have to convert that entity to an array.
If you would like to convert all the entity data into an array then you could use JMSSerializer. See also this other stackoverflow topic
Try modifying the code as given below. It includes changes to your controller actions as well as the ajax call in the
template.
public function recuperarMedidasyUnidadesAction(){
$id = $_POST['id'];
$em = $this->getDoctrine()->getManager();
// busco las diferentes unidades que existen (1kg, 5kg, 10kg, etc)
$medidas = $em->getRepository('ProyectoAdminBundle:Unidades')->findByUnidadesJoinCatalogo($id);
//modified code
$status = 'error';
$html = '';
if($medidas){
$data =$this->render('AtajoBundle:Ajax:medidasYUnidades.html.twig', array('medidas' => $medidas));
$status = 'success';
$html = $data->getContent();
}
$jsonArray = array(
'status' => $status,
'data' => $html,
);
$response = new Response(json_encode($jsonArray));
$response->headers->set('Content-Type', 'application/json; charset=utf-8');
return $response;
}
public function recuperarUnidadAction(){
$id = $_POST['id'];
$em = $this->getDoctrine()->getManager();
// busco las diferentes unidades que existen (1kg, 5kg, 10kg, etc)
$unidad = $em->getRepository('ProyectoAdminBundle:Categoria')->findByUnidad($id);
//modified code
$status = 'error';
$html = '';
if($unidad){
$data = $this->render('AtajoBundle:Ajax:unidad.html.twig', array('unidad' => $unidad));
$status = 'success';
$html = $data->getContent();
}
$jsonArray = array(
'status' => $status,
'data' => $html,
);
$response = new Response(json_encode($jsonArray));
$response->headers->set('Content-Type', 'application/json; charset=utf-8');
return $response;
}
JavaScript in template:
$.ajax({
type: "POST",
url: "{{ path('medidas_y_unidades') }}",
data: { 'id' : ' ' + elegido + ' ' },
error: function(){
alert("Error petición ajax");
},
success: function(result, request) {
var parsedData =JSON.parse(result);
if(parsedData.status ==='success'){
userListDiv.html(parsedData.data);
$(medidahermano).html(parsedData.data);
}else{
//handle no result case
}
}
});